annotate mcabber/src/commands.c @ 147:7571de4aed73

[/trunk] Changeset 159 by mikael * Fix a bug in buddylist_build() * We now lock the current buddy even not when being in chat mode. For example, if we're writing to s.o. and he leaves just before we press enter, we won't write to the wrong buddy... If the current_buddy is a group, we lock it too. * Remove MCABBER_TESTUNIT ifdef in roster.h (test program isn't up-to-date anymore...)
author mikael
date Fri, 29 Apr 2005 19:56:28 +0000
parents 6531bcf030ae
children faf534be8ff0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
47
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
1 /*
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
2 * commands.c -- user commands handling
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
3 *
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
4 * Copyright (C) 2005 Mikael Berthe <bmikael@lists.lilotux.net>
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
5 *
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
6 * This program is free software; you can redistribute it and/or modify
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
7 * it under the terms of the GNU General Public License as published by
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
8 * the Free Software Foundation; either version 2 of the License, or (at
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
9 * your option) any later version.
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
10 *
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
11 * This program is distributed in the hope that it will be useful, but
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
12 * WITHOUT ANY WARRANTY; without even the implied warranty of
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
14 * General Public License for more details.
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
15 *
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
16 * You should have received a copy of the GNU General Public License
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
17 * along with this program; if not, write to the Free Software
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
18 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
19 * USA
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
20 */
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
21
95
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
22 #include <string.h>
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
23
47
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
24 #include "commands.h"
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
25 #include "jabglue.h"
81
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 47
diff changeset
26 #include "roster.h"
47
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
27 #include "screen.h"
95
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
28 #include "compl.h"
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 108
diff changeset
29 #include "hooks.h"
81
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 47
diff changeset
30 #include "utf8.h"
47
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
31 #include "utils.h"
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
32
104
fe7257d251ac [/trunk] Changeset 118 by mikael
mikael
parents: 103
diff changeset
33 // Commands callbacks
fe7257d251ac [/trunk] Changeset 118 by mikael
mikael
parents: 103
diff changeset
34 void do_roster(char *arg);
108
7fb72bc13732 [/trunk] Changeset 122 by mikael
mikael
parents: 104
diff changeset
35 void do_clear(char *arg);
116
1e7e59775f12 [/trunk] Changeset 130 by mikael
mikael
parents: 113
diff changeset
36 void do_status(char *arg);
124
6d2122c003c4 [/trunk] Changeset 137 by mikael
mikael
parents: 120
diff changeset
37 void do_add(char *arg);
128
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 127
diff changeset
38 void do_group(char *arg);
132
6531bcf030ae [/trunk] Changeset 145 by mikael
mikael
parents: 130
diff changeset
39 void do_say(char *arg);
47
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
40
104
fe7257d251ac [/trunk] Changeset 118 by mikael
mikael
parents: 103
diff changeset
41 // Global variable for the commands list
95
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
42 static GSList *Commands;
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
43
104
fe7257d251ac [/trunk] Changeset 118 by mikael
mikael
parents: 103
diff changeset
44
95
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
45 // cmd_add()
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
46 // Adds a command to the commands list and to the CMD completion list
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
47 void cmd_add(const char *name, const char *help,
104
fe7257d251ac [/trunk] Changeset 118 by mikael
mikael
parents: 103
diff changeset
48 guint flags_row1, guint flags_row2, void (*f)())
95
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
49 {
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
50 cmd *n_cmd = g_new0(cmd, 1);
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
51 strncpy(n_cmd->name, name, 32-1);
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
52 n_cmd->help = help;
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
53 n_cmd->completion_flags[0] = flags_row1;
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
54 n_cmd->completion_flags[1] = flags_row2;
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
55 n_cmd->func = f;
102
2b4cc6bc5bf2 [/trunk] Changeset 116 by mikael
mikael
parents: 101
diff changeset
56 Commands = g_slist_append(Commands, n_cmd);
95
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
57 // Add to completion CMD category
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
58 compl_add_category_word(COMPL_CMD, name);
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
59 }
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
60
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
61 // cmd_init()
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
62 // ...
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
63 void cmd_init(void)
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
64 {
124
6d2122c003c4 [/trunk] Changeset 137 by mikael
mikael
parents: 120
diff changeset
65 cmd_add("add", "Add a jabber user", COMPL_JID, 0, &do_add);
108
7fb72bc13732 [/trunk] Changeset 122 by mikael
mikael
parents: 104
diff changeset
66 cmd_add("clear", "Clear the dialog window", 0, 0, &do_clear);
95
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
67 //cmd_add("del");
128
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 127
diff changeset
68 cmd_add("group", "Change group display settings", COMPL_GROUP, 0, &do_group);
127
0f7ec11efd06 [/trunk] Changeset 140 by mikael
mikael
parents: 124
diff changeset
69 cmd_add("help", "Display some help", COMPL_CMD, 0, NULL);
95
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
70 //cmd_add("info");
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
71 //cmd_add("move");
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
72 //cmd_add("nick");
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
73 cmd_add("quit", "Exit the software", 0, 0, NULL);
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
74 //cmd_add("rename");
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
75 //cmd_add("request_auth");
128
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 127
diff changeset
76 cmd_add("roster", "Manipulate the roster/buddylist", COMPL_ROSTER, 0,
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 127
diff changeset
77 &do_roster);
132
6531bcf030ae [/trunk] Changeset 145 by mikael
mikael
parents: 130
diff changeset
78 cmd_add("say", "Say something to the selected buddy", 0, 0, &do_say);
95
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
79 //cmd_add("search");
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
80 //cmd_add("send_auth");
116
1e7e59775f12 [/trunk] Changeset 130 by mikael
mikael
parents: 113
diff changeset
81 cmd_add("status", "Show or set your status", COMPL_STATUS, 0, &do_status);
95
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
82
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
83 // Status category
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
84 compl_add_category_word(COMPL_STATUS, "online");
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
85 compl_add_category_word(COMPL_STATUS, "avail");
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
86 compl_add_category_word(COMPL_STATUS, "invisible");
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
87 compl_add_category_word(COMPL_STATUS, "free");
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
88 compl_add_category_word(COMPL_STATUS, "dnd");
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
89 compl_add_category_word(COMPL_STATUS, "busy");
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
90 compl_add_category_word(COMPL_STATUS, "notavail");
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
91 compl_add_category_word(COMPL_STATUS, "away");
103
93dcc4e15d4a [/trunk] Changeset 117 by mikael
mikael
parents: 102
diff changeset
92
93dcc4e15d4a [/trunk] Changeset 117 by mikael
mikael
parents: 102
diff changeset
93 // Roster category
93dcc4e15d4a [/trunk] Changeset 117 by mikael
mikael
parents: 102
diff changeset
94 compl_add_category_word(COMPL_ROSTER, "bottom");
93dcc4e15d4a [/trunk] Changeset 117 by mikael
mikael
parents: 102
diff changeset
95 compl_add_category_word(COMPL_ROSTER, "hide_offline");
93dcc4e15d4a [/trunk] Changeset 117 by mikael
mikael
parents: 102
diff changeset
96 compl_add_category_word(COMPL_ROSTER, "show_offline");
93dcc4e15d4a [/trunk] Changeset 117 by mikael
mikael
parents: 102
diff changeset
97 compl_add_category_word(COMPL_ROSTER, "top");
127
0f7ec11efd06 [/trunk] Changeset 140 by mikael
mikael
parents: 124
diff changeset
98
0f7ec11efd06 [/trunk] Changeset 140 by mikael
mikael
parents: 124
diff changeset
99 // Group category
0f7ec11efd06 [/trunk] Changeset 140 by mikael
mikael
parents: 124
diff changeset
100 compl_add_category_word(COMPL_GROUP, "expand");
0f7ec11efd06 [/trunk] Changeset 140 by mikael
mikael
parents: 124
diff changeset
101 compl_add_category_word(COMPL_GROUP, "shrink");
130
60694c9ddde3 [/trunk] Changeset 143 by mikael
mikael
parents: 129
diff changeset
102 compl_add_category_word(COMPL_GROUP, "toggle");
95
9e6b7897ec37 [/trunk] Changeset 109 by mikael
mikael
parents: 94
diff changeset
103 }
94
9a4aa2797f02 [/trunk] Changeset 108 by mikael
mikael
parents: 81
diff changeset
104
102
2b4cc6bc5bf2 [/trunk] Changeset 116 by mikael
mikael
parents: 101
diff changeset
105 // cmd_get
2b4cc6bc5bf2 [/trunk] Changeset 116 by mikael
mikael
parents: 101
diff changeset
106 // Finds command in the command list structure.
2b4cc6bc5bf2 [/trunk] Changeset 116 by mikael
mikael
parents: 101
diff changeset
107 // Returns a pointer to the cmd entry, or NULL if command not found.
2b4cc6bc5bf2 [/trunk] Changeset 116 by mikael
mikael
parents: 101
diff changeset
108 cmd *cmd_get(char *command)
2b4cc6bc5bf2 [/trunk] Changeset 116 by mikael
mikael
parents: 101
diff changeset
109 {
2b4cc6bc5bf2 [/trunk] Changeset 116 by mikael
mikael
parents: 101
diff changeset
110 char *p1, *p2;
2b4cc6bc5bf2 [/trunk] Changeset 116 by mikael
mikael
parents: 101
diff changeset
111 char *com;
2b4cc6bc5bf2 [/trunk] Changeset 116 by mikael
mikael
parents: 101
diff changeset
112 GSList *sl_com;
2b4cc6bc5bf2 [/trunk] Changeset 116 by mikael
mikael
parents: 101
diff changeset
113 // Ignore leading '/'
2b4cc6bc5bf2 [/trunk] Changeset 116 by mikael
mikael
parents: 101
diff changeset
114 for (p1 = command ; *p1 == '/' ; p1++)
2b4cc6bc5bf2 [/trunk] Changeset 116 by mikael
mikael
parents: 101
diff changeset
115 ;
2b4cc6bc5bf2 [/trunk] Changeset 116 by mikael
mikael
parents: 101
diff changeset
116 // Locate the end of the command
2b4cc6bc5bf2 [/trunk] Changeset 116 by mikael
mikael
parents: 101
diff changeset
117 for (p2 = p1 ; *p2 && (*p2 != ' ') ; p2++)
2b4cc6bc5bf2 [/trunk] Changeset 116 by mikael
mikael
parents: 101
diff changeset
118 ;
2b4cc6bc5bf2 [/trunk] Changeset 116 by mikael
mikael
parents: 101
diff changeset
119 // Copy the clean command
2b4cc6bc5bf2 [/trunk] Changeset 116 by mikael
mikael
parents: 101
diff changeset
120 com = g_strndup(p1, p2-p1);
2b4cc6bc5bf2 [/trunk] Changeset 116 by mikael
mikael
parents: 101
diff changeset
121
2b4cc6bc5bf2 [/trunk] Changeset 116 by mikael
mikael
parents: 101
diff changeset
122 // Look for command in the list
2b4cc6bc5bf2 [/trunk] Changeset 116 by mikael
mikael
parents: 101
diff changeset
123 for (sl_com=Commands; sl_com; sl_com = g_slist_next(sl_com)) {
2b4cc6bc5bf2 [/trunk] Changeset 116 by mikael
mikael
parents: 101
diff changeset
124 if (!strcasecmp(com, ((cmd*)sl_com->data)->name))
2b4cc6bc5bf2 [/trunk] Changeset 116 by mikael
mikael
parents: 101
diff changeset
125 break;
2b4cc6bc5bf2 [/trunk] Changeset 116 by mikael
mikael
parents: 101
diff changeset
126 }
2b4cc6bc5bf2 [/trunk] Changeset 116 by mikael
mikael
parents: 101
diff changeset
127 g_free(com);
2b4cc6bc5bf2 [/trunk] Changeset 116 by mikael
mikael
parents: 101
diff changeset
128
2b4cc6bc5bf2 [/trunk] Changeset 116 by mikael
mikael
parents: 101
diff changeset
129 if (sl_com) // Command has been found.
2b4cc6bc5bf2 [/trunk] Changeset 116 by mikael
mikael
parents: 101
diff changeset
130 return (cmd*)sl_com->data;
2b4cc6bc5bf2 [/trunk] Changeset 116 by mikael
mikael
parents: 101
diff changeset
131 return NULL;
2b4cc6bc5bf2 [/trunk] Changeset 116 by mikael
mikael
parents: 101
diff changeset
132 }
2b4cc6bc5bf2 [/trunk] Changeset 116 by mikael
mikael
parents: 101
diff changeset
133
47
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
134 // send_message(msg)
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
135 // Write the message in the buddy's window and send the message on
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
136 // the network.
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
137 void send_message(char *msg)
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
138 {
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
139 char *buffer;
81
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 47
diff changeset
140 const char *jid;
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 47
diff changeset
141
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 47
diff changeset
142 if (!current_buddy) {
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 47
diff changeset
143 scr_LogPrint("No buddy currently selected.");
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 47
diff changeset
144 return;
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 47
diff changeset
145 }
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 47
diff changeset
146
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 47
diff changeset
147 jid = CURRENT_JID;
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 47
diff changeset
148 if (!jid) {
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 47
diff changeset
149 scr_LogPrint("No buddy currently selected.");
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 47
diff changeset
150 return;
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 47
diff changeset
151 }
47
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
152
113
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 108
diff changeset
153 // local part (UI, logging, etc.)
8ac67e951eab [/trunk] Changeset 127 by mikael
mikael
parents: 108
diff changeset
154 hk_message_out(jid, 0, msg);
47
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
155
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
156 // Network part
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
157 buffer = utf8_encode(msg);
81
0bd578421ce9 [/trunk] Changeset 95 by mikael
mikael
parents: 47
diff changeset
158 jb_send_msg(jid, buffer);
47
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
159 free(buffer);
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
160 }
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
161
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
162 // process_line(line)
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
163 // Process a command/message line.
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
164 // If this isn't a command, this is a message and it is sent to the
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
165 // currently selected buddy.
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
166 int process_line(char *line)
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
167 {
101
4f3ad00b5187 [/trunk] Changeset 115 by mikael
mikael
parents: 98
diff changeset
168 char *p;
104
fe7257d251ac [/trunk] Changeset 118 by mikael
mikael
parents: 103
diff changeset
169 cmd *curcmd;
fe7257d251ac [/trunk] Changeset 118 by mikael
mikael
parents: 103
diff changeset
170
132
6531bcf030ae [/trunk] Changeset 145 by mikael
mikael
parents: 130
diff changeset
171 if (!*line) { // User only pressed enter
129
03be1cc94560 [/trunk] Changeset 142 by mikael
mikael
parents: 128
diff changeset
172 if (current_buddy) {
132
6531bcf030ae [/trunk] Changeset 145 by mikael
mikael
parents: 130
diff changeset
173 scr_set_chatmode(TRUE);
129
03be1cc94560 [/trunk] Changeset 142 by mikael
mikael
parents: 128
diff changeset
174 buddy_setflags(BUDDATA(current_buddy), ROSTER_FLAG_LOCK, TRUE);
132
6531bcf030ae [/trunk] Changeset 145 by mikael
mikael
parents: 130
diff changeset
175 scr_ShowBuddyWindow();
6531bcf030ae [/trunk] Changeset 145 by mikael
mikael
parents: 130
diff changeset
176 }
6531bcf030ae [/trunk] Changeset 145 by mikael
mikael
parents: 130
diff changeset
177 return 0;
6531bcf030ae [/trunk] Changeset 145 by mikael
mikael
parents: 130
diff changeset
178 }
129
03be1cc94560 [/trunk] Changeset 142 by mikael
mikael
parents: 128
diff changeset
179
132
6531bcf030ae [/trunk] Changeset 145 by mikael
mikael
parents: 130
diff changeset
180 if (*line != '/') {
6531bcf030ae [/trunk] Changeset 145 by mikael
mikael
parents: 130
diff changeset
181 do_say(line);
47
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
182 return 0;
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
183 }
101
4f3ad00b5187 [/trunk] Changeset 115 by mikael
mikael
parents: 98
diff changeset
184
4f3ad00b5187 [/trunk] Changeset 115 by mikael
mikael
parents: 98
diff changeset
185 /* It is a command */
4f3ad00b5187 [/trunk] Changeset 115 by mikael
mikael
parents: 98
diff changeset
186 // Remove trailing spaces:
4f3ad00b5187 [/trunk] Changeset 115 by mikael
mikael
parents: 98
diff changeset
187 for (p=line ; *p ; p++)
4f3ad00b5187 [/trunk] Changeset 115 by mikael
mikael
parents: 98
diff changeset
188 ;
4f3ad00b5187 [/trunk] Changeset 115 by mikael
mikael
parents: 98
diff changeset
189 for (p-- ; p>line && (*p == ' ') ; p--)
4f3ad00b5187 [/trunk] Changeset 115 by mikael
mikael
parents: 98
diff changeset
190 *p = 0;
4f3ad00b5187 [/trunk] Changeset 115 by mikael
mikael
parents: 98
diff changeset
191
4f3ad00b5187 [/trunk] Changeset 115 by mikael
mikael
parents: 98
diff changeset
192 // Command "quit"?
116
1e7e59775f12 [/trunk] Changeset 130 by mikael
mikael
parents: 113
diff changeset
193 if (!strncasecmp(line, "/quit", 5))
1e7e59775f12 [/trunk] Changeset 130 by mikael
mikael
parents: 113
diff changeset
194 if (!line[5] || line[5] == ' ')
1e7e59775f12 [/trunk] Changeset 130 by mikael
mikael
parents: 113
diff changeset
195 return 255;
104
fe7257d251ac [/trunk] Changeset 118 by mikael
mikael
parents: 103
diff changeset
196
47
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
197 // Commands handling
104
fe7257d251ac [/trunk] Changeset 118 by mikael
mikael
parents: 103
diff changeset
198 curcmd = cmd_get(line);
47
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
199
104
fe7257d251ac [/trunk] Changeset 118 by mikael
mikael
parents: 103
diff changeset
200 if (!curcmd) {
fe7257d251ac [/trunk] Changeset 118 by mikael
mikael
parents: 103
diff changeset
201 scr_LogPrint("Unrecognized command, sorry.");
fe7257d251ac [/trunk] Changeset 118 by mikael
mikael
parents: 103
diff changeset
202 return 0;
fe7257d251ac [/trunk] Changeset 118 by mikael
mikael
parents: 103
diff changeset
203 }
fe7257d251ac [/trunk] Changeset 118 by mikael
mikael
parents: 103
diff changeset
204 if (!curcmd->func) {
fe7257d251ac [/trunk] Changeset 118 by mikael
mikael
parents: 103
diff changeset
205 scr_LogPrint("Not yet implemented, sorry.");
fe7257d251ac [/trunk] Changeset 118 by mikael
mikael
parents: 103
diff changeset
206 return 0;
fe7257d251ac [/trunk] Changeset 118 by mikael
mikael
parents: 103
diff changeset
207 }
fe7257d251ac [/trunk] Changeset 118 by mikael
mikael
parents: 103
diff changeset
208 // Lets go to the command parameters
fe7257d251ac [/trunk] Changeset 118 by mikael
mikael
parents: 103
diff changeset
209 for (line++; *line && (*line != ' ') ; line++)
fe7257d251ac [/trunk] Changeset 118 by mikael
mikael
parents: 103
diff changeset
210 ;
fe7257d251ac [/trunk] Changeset 118 by mikael
mikael
parents: 103
diff changeset
211 // Skip spaces
fe7257d251ac [/trunk] Changeset 118 by mikael
mikael
parents: 103
diff changeset
212 while (*line && (*line == ' '))
fe7257d251ac [/trunk] Changeset 118 by mikael
mikael
parents: 103
diff changeset
213 line++;
fe7257d251ac [/trunk] Changeset 118 by mikael
mikael
parents: 103
diff changeset
214 // Call command-specific function
fe7257d251ac [/trunk] Changeset 118 by mikael
mikael
parents: 103
diff changeset
215 (*curcmd->func)(line);
47
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
216 return 0;
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
217 }
7259a61e1a4b [/trunk] Changeset 63 by mikael
mikael
parents:
diff changeset
218
104
fe7257d251ac [/trunk] Changeset 118 by mikael
mikael
parents: 103
diff changeset
219 /* Commands callback functions */
fe7257d251ac [/trunk] Changeset 118 by mikael
mikael
parents: 103
diff changeset
220
fe7257d251ac [/trunk] Changeset 118 by mikael
mikael
parents: 103
diff changeset
221 void do_roster(char *arg)
fe7257d251ac [/trunk] Changeset 118 by mikael
mikael
parents: 103
diff changeset
222 {
fe7257d251ac [/trunk] Changeset 118 by mikael
mikael
parents: 103
diff changeset
223 if (!strcasecmp(arg, "top")) {
fe7257d251ac [/trunk] Changeset 118 by mikael
mikael
parents: 103
diff changeset
224 scr_RosterTop();
128
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 127
diff changeset
225 update_roster = TRUE;
104
fe7257d251ac [/trunk] Changeset 118 by mikael
mikael
parents: 103
diff changeset
226 } else if (!strcasecmp(arg, "bottom")) {
fe7257d251ac [/trunk] Changeset 118 by mikael
mikael
parents: 103
diff changeset
227 scr_RosterBottom();
128
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 127
diff changeset
228 update_roster = TRUE;
104
fe7257d251ac [/trunk] Changeset 118 by mikael
mikael
parents: 103
diff changeset
229 } else if (!strcasecmp(arg, "hide_offline")) {
120
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 118
diff changeset
230 buddylist_set_hide_offline_buddies(TRUE);
104
fe7257d251ac [/trunk] Changeset 118 by mikael
mikael
parents: 103
diff changeset
231 if (current_buddy)
fe7257d251ac [/trunk] Changeset 118 by mikael
mikael
parents: 103
diff changeset
232 buddylist_build();
128
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 127
diff changeset
233 update_roster = TRUE;
104
fe7257d251ac [/trunk] Changeset 118 by mikael
mikael
parents: 103
diff changeset
234 } else if (!strcasecmp(arg, "show_offline")) {
120
cfd3df636d5f [/trunk] Changeset 133 by mikael
mikael
parents: 118
diff changeset
235 buddylist_set_hide_offline_buddies(FALSE);
124
6d2122c003c4 [/trunk] Changeset 137 by mikael
mikael
parents: 120
diff changeset
236 buddylist_build();
128
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 127
diff changeset
237 update_roster = TRUE;
104
fe7257d251ac [/trunk] Changeset 118 by mikael
mikael
parents: 103
diff changeset
238 } else
fe7257d251ac [/trunk] Changeset 118 by mikael
mikael
parents: 103
diff changeset
239 scr_LogPrint("Unrecognized parameter!");
fe7257d251ac [/trunk] Changeset 118 by mikael
mikael
parents: 103
diff changeset
240 }
108
7fb72bc13732 [/trunk] Changeset 122 by mikael
mikael
parents: 104
diff changeset
241
7fb72bc13732 [/trunk] Changeset 122 by mikael
mikael
parents: 104
diff changeset
242 void do_clear(char *arg)
7fb72bc13732 [/trunk] Changeset 122 by mikael
mikael
parents: 104
diff changeset
243 {
7fb72bc13732 [/trunk] Changeset 122 by mikael
mikael
parents: 104
diff changeset
244 scr_Clear();
7fb72bc13732 [/trunk] Changeset 122 by mikael
mikael
parents: 104
diff changeset
245 }
7fb72bc13732 [/trunk] Changeset 122 by mikael
mikael
parents: 104
diff changeset
246
116
1e7e59775f12 [/trunk] Changeset 130 by mikael
mikael
parents: 113
diff changeset
247 void do_status(char *arg)
1e7e59775f12 [/trunk] Changeset 130 by mikael
mikael
parents: 113
diff changeset
248 {
1e7e59775f12 [/trunk] Changeset 130 by mikael
mikael
parents: 113
diff changeset
249 enum imstatus st;
1e7e59775f12 [/trunk] Changeset 130 by mikael
mikael
parents: 113
diff changeset
250
1e7e59775f12 [/trunk] Changeset 130 by mikael
mikael
parents: 113
diff changeset
251 if (!arg || (*arg == 0)) {
1e7e59775f12 [/trunk] Changeset 130 by mikael
mikael
parents: 113
diff changeset
252 scr_LogPrint("Your status is: %c", imstatus2char[jb_getstatus()]);
1e7e59775f12 [/trunk] Changeset 130 by mikael
mikael
parents: 113
diff changeset
253 return;
1e7e59775f12 [/trunk] Changeset 130 by mikael
mikael
parents: 113
diff changeset
254 }
1e7e59775f12 [/trunk] Changeset 130 by mikael
mikael
parents: 113
diff changeset
255
130
60694c9ddde3 [/trunk] Changeset 143 by mikael
mikael
parents: 129
diff changeset
256 if (!strcasecmp(arg, "offline")) st = offline;
60694c9ddde3 [/trunk] Changeset 143 by mikael
mikael
parents: 129
diff changeset
257 else if (!strcasecmp(arg, "online")) st = available;
60694c9ddde3 [/trunk] Changeset 143 by mikael
mikael
parents: 129
diff changeset
258 else if (!strcasecmp(arg, "avail")) st = available;
60694c9ddde3 [/trunk] Changeset 143 by mikael
mikael
parents: 129
diff changeset
259 else if (!strcasecmp(arg, "away")) st = away;
60694c9ddde3 [/trunk] Changeset 143 by mikael
mikael
parents: 129
diff changeset
260 else if (!strcasecmp(arg, "invisible")) st = invisible;
60694c9ddde3 [/trunk] Changeset 143 by mikael
mikael
parents: 129
diff changeset
261 else if (!strcasecmp(arg, "dnd")) st = dontdisturb;
60694c9ddde3 [/trunk] Changeset 143 by mikael
mikael
parents: 129
diff changeset
262 else if (!strcasecmp(arg, "busy")) st = occupied;
60694c9ddde3 [/trunk] Changeset 143 by mikael
mikael
parents: 129
diff changeset
263 else if (!strcasecmp(arg, "notavail")) st = notavail;
60694c9ddde3 [/trunk] Changeset 143 by mikael
mikael
parents: 129
diff changeset
264 else if (!strcasecmp(arg, "free")) st = freeforchat;
116
1e7e59775f12 [/trunk] Changeset 130 by mikael
mikael
parents: 113
diff changeset
265 else {
1e7e59775f12 [/trunk] Changeset 130 by mikael
mikael
parents: 113
diff changeset
266 scr_LogPrint("Unrecognized parameter!");
1e7e59775f12 [/trunk] Changeset 130 by mikael
mikael
parents: 113
diff changeset
267 return;
1e7e59775f12 [/trunk] Changeset 130 by mikael
mikael
parents: 113
diff changeset
268 }
1e7e59775f12 [/trunk] Changeset 130 by mikael
mikael
parents: 113
diff changeset
269
1e7e59775f12 [/trunk] Changeset 130 by mikael
mikael
parents: 113
diff changeset
270 // XXX special case if offline??
1e7e59775f12 [/trunk] Changeset 130 by mikael
mikael
parents: 113
diff changeset
271 jb_setstatus(st, NULL); // TODO handle message (instead of NULL)
1e7e59775f12 [/trunk] Changeset 130 by mikael
mikael
parents: 113
diff changeset
272 }
1e7e59775f12 [/trunk] Changeset 130 by mikael
mikael
parents: 113
diff changeset
273
124
6d2122c003c4 [/trunk] Changeset 137 by mikael
mikael
parents: 120
diff changeset
274 void do_add(char *arg)
6d2122c003c4 [/trunk] Changeset 137 by mikael
mikael
parents: 120
diff changeset
275 {
6d2122c003c4 [/trunk] Changeset 137 by mikael
mikael
parents: 120
diff changeset
276 if (!arg || (*arg == 0)) {
6d2122c003c4 [/trunk] Changeset 137 by mikael
mikael
parents: 120
diff changeset
277 scr_LogPrint("Wrong usage");
6d2122c003c4 [/trunk] Changeset 137 by mikael
mikael
parents: 120
diff changeset
278 return;
6d2122c003c4 [/trunk] Changeset 137 by mikael
mikael
parents: 120
diff changeset
279 }
6d2122c003c4 [/trunk] Changeset 137 by mikael
mikael
parents: 120
diff changeset
280
6d2122c003c4 [/trunk] Changeset 137 by mikael
mikael
parents: 120
diff changeset
281 // FIXME check arg =~ jabber id
6d2122c003c4 [/trunk] Changeset 137 by mikael
mikael
parents: 120
diff changeset
282 // 2nd parameter = optional nickname (XXX NULL for now...)
6d2122c003c4 [/trunk] Changeset 137 by mikael
mikael
parents: 120
diff changeset
283 jb_addbuddy(arg, NULL);
6d2122c003c4 [/trunk] Changeset 137 by mikael
mikael
parents: 120
diff changeset
284 }
128
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 127
diff changeset
285
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 127
diff changeset
286 void do_group(char *arg)
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 127
diff changeset
287 {
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 127
diff changeset
288 gpointer group;
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 127
diff changeset
289
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 127
diff changeset
290 if (!arg || (*arg == 0)) {
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 127
diff changeset
291 scr_LogPrint("Missing parameter");
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 127
diff changeset
292 return;
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 127
diff changeset
293 }
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 127
diff changeset
294
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 127
diff changeset
295 if (!current_buddy)
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 127
diff changeset
296 return;
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 127
diff changeset
297
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 127
diff changeset
298 group = BUDDATA(current_buddy);
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 127
diff changeset
299 if (!(buddy_gettype(group) & ROSTER_TYPE_GROUP)) {
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 127
diff changeset
300 scr_LogPrint("For now you need to select a group "
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 127
diff changeset
301 "before using /group");
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 127
diff changeset
302 return;
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 127
diff changeset
303 }
130
60694c9ddde3 [/trunk] Changeset 143 by mikael
mikael
parents: 129
diff changeset
304 if (!strcasecmp(arg, "expand")) {
128
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 127
diff changeset
305 buddy_setflags(group, ROSTER_FLAG_HIDE, FALSE);
130
60694c9ddde3 [/trunk] Changeset 143 by mikael
mikael
parents: 129
diff changeset
306 } else if (!strcasecmp(arg, "shrink")) {
128
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 127
diff changeset
307 buddy_setflags(group, ROSTER_FLAG_HIDE, TRUE);
130
60694c9ddde3 [/trunk] Changeset 143 by mikael
mikael
parents: 129
diff changeset
308 } else if (!strcasecmp(arg, "toggle")) {
60694c9ddde3 [/trunk] Changeset 143 by mikael
mikael
parents: 129
diff changeset
309 buddy_setflags(group, ROSTER_FLAG_HIDE,
60694c9ddde3 [/trunk] Changeset 143 by mikael
mikael
parents: 129
diff changeset
310 !(buddy_getflags(group) & ROSTER_FLAG_HIDE));
128
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 127
diff changeset
311 } else {
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 127
diff changeset
312 scr_LogPrint("Unrecognized parameter!");
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 127
diff changeset
313 return;
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 127
diff changeset
314 }
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 127
diff changeset
315
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 127
diff changeset
316 buddylist_build();
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 127
diff changeset
317 update_roster = TRUE;
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 127
diff changeset
318 }
81ccb1091dd8 [/trunk] Changeset 141 by mikael
mikael
parents: 127
diff changeset
319
132
6531bcf030ae [/trunk] Changeset 145 by mikael
mikael
parents: 130
diff changeset
320 void do_say(char *arg)
6531bcf030ae [/trunk] Changeset 145 by mikael
mikael
parents: 130
diff changeset
321 {
6531bcf030ae [/trunk] Changeset 145 by mikael
mikael
parents: 130
diff changeset
322 gpointer bud = BUDDATA(current_buddy);
6531bcf030ae [/trunk] Changeset 145 by mikael
mikael
parents: 130
diff changeset
323
6531bcf030ae [/trunk] Changeset 145 by mikael
mikael
parents: 130
diff changeset
324 scr_set_chatmode(TRUE);
6531bcf030ae [/trunk] Changeset 145 by mikael
mikael
parents: 130
diff changeset
325 if (current_buddy) {
6531bcf030ae [/trunk] Changeset 145 by mikael
mikael
parents: 130
diff changeset
326 if (!(buddy_gettype(bud) & ROSTER_TYPE_USER)) {
6531bcf030ae [/trunk] Changeset 145 by mikael
mikael
parents: 130
diff changeset
327 scr_LogPrint("This is not a user");
6531bcf030ae [/trunk] Changeset 145 by mikael
mikael
parents: 130
diff changeset
328 return;
6531bcf030ae [/trunk] Changeset 145 by mikael
mikael
parents: 130
diff changeset
329 }
6531bcf030ae [/trunk] Changeset 145 by mikael
mikael
parents: 130
diff changeset
330 buddy_setflags(bud, ROSTER_FLAG_LOCK, TRUE);
6531bcf030ae [/trunk] Changeset 145 by mikael
mikael
parents: 130
diff changeset
331 send_message(arg);
6531bcf030ae [/trunk] Changeset 145 by mikael
mikael
parents: 130
diff changeset
332 } else {
6531bcf030ae [/trunk] Changeset 145 by mikael
mikael
parents: 130
diff changeset
333 scr_LogPrint("Who are you talking to??");
6531bcf030ae [/trunk] Changeset 145 by mikael
mikael
parents: 130
diff changeset
334 }
6531bcf030ae [/trunk] Changeset 145 by mikael
mikael
parents: 130
diff changeset
335 }
6531bcf030ae [/trunk] Changeset 145 by mikael
mikael
parents: 130
diff changeset
336