1 /*  chat_cmnd.c
2  *
3  *  copyright (c) 2000-2003 SeaD
4  *  see GPL for copying info
5  *
6  */
7 
8 #include <string.h>
9 #include <unistd.h>
10 #include "echat.h"
11 #include "chat_cmnd.h"
12 
cmnd_next(void)13 void cmnd_next(void) {
14     register int n, m;
15 
16     for (n = 0; n < STR_SIZE; n++) if (buf[n] == '\0') break;
17     for (m = ++n, n = 0; m < STR_SIZE-NICK_MAXLEN; n++, m++) buf[n] = buf[m];
18 }
19 
cmnd_help(void)20 void cmnd_help(void) {
21     if (!strncasecmp(buf, CMD_QUIT, CMD_MAXLEN) || !strncasecmp(buf, CMD_QUIT1, CMD_MAXLEN) || !strncasecmp(buf, CMD_QUIT2, CMD_MAXLEN)) {
22         snprintf(message, STR_SIZE, CMND_HQUIT, time_get(), CMD_QUIT, CMD_QUIT1, CMD_QUIT2, NAME);
23         write_str(status->room->name, COL_SYSTEM);
24         return;
25     }
26     if (!strncasecmp(buf, CMD_HELP, CMD_MAXLEN) || !strncasecmp(buf, CMD_HELP1, CMD_MAXLEN) || !strncasecmp(buf, CMD_HELP2, CMD_MAXLEN)) {
27         snprintf(message, STR_SIZE, CMND_HHELP, time_get(), CMD_HELP, CMD_HELP1, CMD_HELP2);
28         write_str(status->room->name, COL_SYSTEM);
29         return;
30     }
31     if (!strncasecmp(buf, CMD_VERSION, CMD_MAXLEN) || !strncasecmp(buf, CMD_VERSION1, CMD_MAXLEN)) {
32         snprintf(message, STR_SIZE, CMND_HVERSION, time_get(), CMD_VERSION, CMD_VERSION1);
33         write_str(status->room->name, COL_SYSTEM);
34         return;
35     }
36     if (!strncasecmp(buf, CMD_STATUS, CMD_MAXLEN) || !strncasecmp(buf, CMD_STATUS1, CMD_MAXLEN)) {
37         snprintf(message, STR_SIZE, CMND_HSTATUS, time_get(), CMD_STATUS, CMD_STATUS1);
38         write_str(status->room->name, COL_SYSTEM);
39         return;
40     }
41     if (!strncasecmp(buf, CMD_KEYS, CMD_MAXLEN) || !strncasecmp(buf, CMD_KEYS1, CMD_MAXLEN)) {
42         snprintf(message, STR_SIZE, CMND_HKEYS, time_get(), CMD_KEYS, CMD_KEYS1);
43         write_str(status->room->name, COL_SYSTEM);
44         return;
45     }
46     if (!strncasecmp(buf, CMD_VERBOSE, CMD_MAXLEN) || !strncasecmp(buf, CMD_VERBOSE1, CMD_MAXLEN)) {
47         snprintf(message, STR_SIZE, CMND_HVERBOSE, time_get(), CMD_VERBOSE, CMD_VERBOSE1);
48         write_str(status->room->name, COL_SYSTEM);
49         return;
50     }
51     if (!strncasecmp(buf, CMD_CLEAR, CMD_MAXLEN) || !strncasecmp(buf, CMD_CLEAR1, CMD_MAXLEN)) {
52         snprintf(message, STR_SIZE, CMND_HCLEAR, time_get(), CMD_CLEAR, CMD_CLEAR1);
53         write_str(status->room->name, COL_SYSTEM);
54         return;
55     }
56     if (!strncasecmp(buf, CMD_SHELL, CMD_MAXLEN)) {
57         snprintf(message, STR_SIZE, CMND_HSHELL, time_get(), CMD_SHELL);
58         write_str(status->room->name, COL_SYSTEM);
59         return;
60     }
61     if (!strncasecmp(buf, CMD_LOAD, CMD_MAXLEN)) {
62         snprintf(message, STR_SIZE, CMND_HLOAD, time_get(), CMD_LOAD);
63         write_str(status->room->name, COL_SYSTEM);
64         return;
65     }
66     if (!strncasecmp(buf, CMD_SAVE, CMD_MAXLEN)) {
67         snprintf(message, STR_SIZE, CMND_HSAVE, time_get(), CMD_SAVE);
68         write_str(status->room->name, COL_SYSTEM);
69         return;
70     }
71 
72     if (!strncasecmp(buf, CMD_ANSWER, CMD_MAXLEN) || !strncasecmp(buf, CMD_ANSWER1, CMD_MAXLEN)) {
73         snprintf(message, STR_SIZE, CMND_HANSWER, time_get(), CMD_ANSWER, CMD_ANSWER1);
74         write_str(status->room->name, COL_SYSTEM);
75         return;
76     }
77     if (!strncasecmp(buf, CMD_GENDER, CMD_MAXLEN) || !strncasecmp(buf, CMD_GENDER1, CMD_MAXLEN)) {
78         snprintf(message, STR_SIZE, CMND_HGENDER, time_get(), CMD_GENDER, CMD_GENDER1);
79         write_str(status->room->name, COL_SYSTEM);
80         return;
81     }
82     if (!strncasecmp(buf, CMD_MY, CMD_MAXLEN)) {
83         snprintf(message, STR_SIZE, CMND_HMY, time_get(), CMD_MY);
84         write_str(status->room->name, COL_SYSTEM);
85         return;
86     }
87     if (!strncasecmp(buf, CMD_IGNORE, CMD_MAXLEN) || !strncasecmp(buf, CMD_IGNORE1, CMD_MAXLEN)) {
88         snprintf(message, STR_SIZE, CMND_HIGNORE, time_get(), CMD_IGNORE, CMD_IGNORE1);
89         write_str(status->room->name, COL_SYSTEM);
90         return;
91     }
92     if (!strncasecmp(buf, CMD_FAVORITE, CMD_MAXLEN) || !strncasecmp(buf, CMD_FAVORITE1, CMD_MAXLEN)) {
93         snprintf(message, STR_SIZE, CMND_HFAVORITE, time_get(), CMD_FAVORITE, CMD_FAVORITE1);
94         write_str(status->room->name, COL_SYSTEM);
95         return;
96     }
97     if (!strncasecmp(buf, CMD_BAN, CMD_MAXLEN)) {
98         snprintf(message, STR_SIZE, CMND_HBAN, time_get(), CMD_BAN);
99         write_str(status->room->name, COL_SYSTEM);
100         return;
101     }
102     if (!strncasecmp(buf, CMD_BCAST, CMD_MAXLEN)) {
103         snprintf(message, STR_SIZE, CMND_HBCAST, time_get(), CMD_BCAST);
104         write_str(status->room->name, COL_SYSTEM);
105         return;
106     }
107     if (!strncasecmp(buf, CMD_JOIN, CMD_MAXLEN) || !strncasecmp(buf, CMD_JOIN1, CMD_MAXLEN)) {
108         snprintf(message, STR_SIZE, CMND_HJOIN, time_get(), CMD_JOIN, CMD_JOIN1);
109         write_str(status->room->name, COL_SYSTEM);
110         return;
111     }
112     if (!strncasecmp(buf, CMD_LEAVE, CMD_MAXLEN) || !strncasecmp(buf, CMD_LEAVE1, CMD_MAXLEN)) {
113         snprintf(message, STR_SIZE, CMND_HLEAVE, time_get(), CMD_LEAVE, CMD_LEAVE1);
114         write_str(status->room->name, COL_SYSTEM);
115         return;
116     }
117 
118     if (!strncasecmp(buf, CMD_NICK, CMD_MAXLEN) || !strncasecmp(buf, CMD_NICK1, CMD_MAXLEN)) {
119         snprintf(message, STR_SIZE, CMND_HNICK, time_get(), CMD_NICK, CMD_NICK1);
120         write_str(status->room->name, COL_SYSTEM);
121         return;
122     }
123     if (!strncasecmp(buf, CMD_MESG, CMD_MAXLEN) || !strncasecmp(buf, CMD_MESG1, CMD_MAXLEN) || !strncasecmp(buf, CMD_MESG2, CMD_MAXLEN)) {
124         snprintf(message, STR_SIZE, CMND_HMESG, time_get(), CMD_MESG, CMD_MESG1, CMD_MESG2);
125         write_str(status->room->name, COL_SYSTEM);
126         return;
127     }
128     if (!strncasecmp(buf, CMD_MASS, CMD_MAXLEN)) {
129         snprintf(message, STR_SIZE, CMND_HMASS, time_get(), CMD_MASS);
130         write_str(status->room->name, COL_SYSTEM);
131         return;
132     }
133     if (!strncasecmp(buf, CMD_EXEC, CMD_MAXLEN)) {
134         snprintf(message, STR_SIZE, CMND_HEXEC, time_get(), CMD_EXEC);
135         write_str(status->room->name, COL_SYSTEM);
136         return;
137     }
138     if (!strncasecmp(buf, CMD_ME, CMD_MAXLEN)) {
139         snprintf(message, STR_SIZE, CMND_HME, time_get(), CMD_ME);
140         write_str(status->room->name, COL_SYSTEM);
141         return;
142     }
143     if (!strncasecmp(buf, CMD_TOPIC, CMD_MAXLEN) || !strncasecmp(buf, CMD_TOPIC1, CMD_MAXLEN)) {
144         snprintf(message, STR_SIZE, CMND_HTOPIC, time_get(), CMD_TOPIC, CMD_TOPIC1);
145         write_str(status->room->name, COL_SYSTEM);
146         return;
147     }
148     if (!strncasecmp(buf, CMD_ADD, CMD_MAXLEN)) {
149         snprintf(message, STR_SIZE, CMND_HADD, time_get(), CMD_ADD);
150         write_str(status->room->name, COL_SYSTEM);
151         return;
152     }
153     if (!strncasecmp(buf, CMD_MODE, CMD_MAXLEN) || !strncasecmp(buf, CMD_MODE1, CMD_MAXLEN)) {
154         snprintf(message, STR_SIZE, CMND_HMODE, time_get(), CMD_MODE, CMD_MODE1);
155         write_str(status->room->name, COL_SYSTEM);
156         return;
157     }
158     if (!strncasecmp(buf, CMD_NORMAL, CMD_MAXLEN) || !strncasecmp(buf, CMD_NORMAL1, CMD_MAXLEN)) {
159         snprintf(message, STR_SIZE, CMND_HNORMAL, time_get(), CMD_NORMAL, CMD_NORMAL1);
160         write_str(status->room->name, COL_SYSTEM);
161         return;
162     }
163     if (!strncasecmp(buf, CMD_DND, CMD_MAXLEN) || !strncasecmp(buf, CMD_DND1, CMD_MAXLEN)) {
164         snprintf(message, STR_SIZE, CMND_HDND, time_get(), CMD_DND, CMD_DND1);
165         write_str(status->room->name, COL_SYSTEM);
166         return;
167     }
168     if (!strncasecmp(buf, CMD_AWAY, CMD_MAXLEN) || !strncasecmp(buf, CMD_AWAY1, CMD_MAXLEN)) {
169         snprintf(message, STR_SIZE, CMND_HAWAY, time_get(), CMD_AWAY, CMD_AWAY1);
170         write_str(status->room->name, COL_SYSTEM);
171         return;
172     }
173     if (!strncasecmp(buf, CMD_OFF, CMD_MAXLEN) || !strncasecmp(buf, CMD_OFF1, CMD_MAXLEN)) {
174         snprintf(message, STR_SIZE, CMND_HOFF, time_get(), CMD_OFF, CMD_OFF1);
175         write_str(status->room->name, COL_SYSTEM);
176         return;
177     }
178     if (!strncasecmp(buf, CMD_INFO, CMD_MAXLEN) || !strncasecmp(buf, CMD_INFO1, CMD_MAXLEN) || !strncasecmp(buf, CMD_INFO2, CMD_MAXLEN)) {
179         snprintf(message, STR_SIZE, CMND_HINFO, time_get(), CMD_INFO, CMD_INFO1, CMD_INFO2);
180         write_str(status->room->name, COL_SYSTEM);
181         return;
182     }
183     if (!strncasecmp(buf, CMD_BEEP, CMD_MAXLEN) || !strncasecmp(buf, CMD_BEEP1, CMD_MAXLEN)) {
184         snprintf(message, STR_SIZE, CMND_HBEEP, time_get(), CMD_BEEP, CMD_BEEP1);
185         write_str(status->room->name, COL_SYSTEM);
186         return;
187     }
188     if (!strncasecmp(buf, CMD_TALK, CMD_MAXLEN) || !strncasecmp(buf, CMD_TALK1, CMD_MAXLEN) || !strncasecmp(buf, CMD_TALK2, CMD_MAXLEN)) {
189         snprintf(message, STR_SIZE, CMND_HTALK, time_get(), CMD_TALK, CMD_TALK1, CMD_TALK2);
190         write_str(status->room->name, COL_SYSTEM);
191         return;
192     }
193     if (!strncasecmp(buf, CMD_HERE, CMD_MAXLEN)) {
194         snprintf(message, STR_SIZE, CMND_HHERE, time_get(), CMD_HERE);
195         write_str(status->room->name, COL_SYSTEM);
196         return;
197     }
198     if (!strncasecmp(buf, CMD_ACTIVE, CMD_MAXLEN) || !strncasecmp(buf, CMD_ACTIVE1, CMD_MAXLEN)) {
199         snprintf(message, STR_SIZE, CMND_HACTIVE, time_get(), CMD_ACTIVE);
200         write_str(status->room->name, COL_SYSTEM);
201         return;
202     }
203 
204     snprintf(message, STR_SIZE, CMND_HCOMMANDS, time_get());
205     write_str(status->room->name, COL_SYSTEM);
206     *message = '\0';
207     snprintf(buf, STR_SIZE, "%s(%s,%s) %s(%s,%s) %s(%s) %s(%s) %s(%s) %s(%s) %s(%s) %s ",
208         CMD_QUIT, CMD_QUIT1, CMD_QUIT2, CMD_HELP, CMD_HELP1, CMD_HELP2, CMD_VERSION, CMD_VERSION1,
209         CMD_STATUS, CMD_STATUS1, CMD_KEYS, CMD_KEYS1, CMD_VERBOSE, CMD_VERBOSE1, CMD_CLEAR, CMD_CLEAR1, CMD_SHELL);
210     strncat(message, buf, STR_SIZE);
211     snprintf(buf, STR_SIZE, "%s %s %s(%s) %s(%s) %s %s(%s) %s(%s) %s ",
212         CMD_LOAD, CMD_SAVE, CMD_ANSWER, CMD_ANSWER1, CMD_GENDER, CMD_GENDER1, CMD_MY,
213         CMD_FAVORITE, CMD_FAVORITE1, CMD_IGNORE, CMD_IGNORE1, CMD_BAN, CMD_BCAST);
214     strncat(message, buf, STR_SIZE);
215     snprintf(buf, STR_SIZE, "%s(%s) %s(%s) %s(%s) %s(%s,%s) %s %s %s %s(%s) %s ",
216         CMD_JOIN, CMD_JOIN1, CMD_LEAVE, CMD_LEAVE1, CMD_NICK, CMD_NICK1, CMD_MESG, CMD_MESG1, CMD_MESG2, CMD_MASS, CMD_EXEC,
217         CMD_ME, CMD_TOPIC, CMD_TOPIC1, CMD_ADD);
218     strncat(message, buf, STR_SIZE);
219     snprintf(buf, STR_SIZE, "%s(%s) %s(%s) %s(%s) %s(%s) %s(%s) %s(%s,%s) %s(%s) ",
220         CMD_MODE, CMD_MODE1, CMD_NORMAL, CMD_NORMAL1, CMD_DND, CMD_DND1, CMD_AWAY, CMD_AWAY1, CMD_OFF, CMD_OFF1,
221         CMD_INFO, CMD_INFO1, CMD_INFO2, CMD_BEEP, CMD_BEEP1);
222     strncat(message, buf, STR_SIZE);
223     snprintf(buf, STR_SIZE, "%s(%s,%s) %s %s\n",
224         CMD_TALK, CMD_TALK1, CMD_TALK2, CMD_HERE, CMD_ACTIVE);
225     strncat(message, buf, STR_SIZE);
226     write_str(status->room->name, COL_SYSTEM);
227 }
228 
cmnd_keys(void)229 void cmnd_keys(void) {
230     snprintf(message, STR_SIZE, CMND_HKEYWORK, time_get());
231     write_str(status->room->name, COL_SYSTEM);
232     snprintf(message, STR_SIZE, CMND_HKEY1);
233     write_str(status->room->name, COL_SYSTEM);
234     snprintf(message, STR_SIZE, CMND_HKEY2);
235     write_str(status->room->name, COL_SYSTEM);
236     snprintf(message, STR_SIZE, CMND_HKEY3);
237     write_str(status->room->name, COL_SYSTEM);
238     snprintf(message, STR_SIZE, CMND_HKEY4);
239     write_str(status->room->name, COL_SYSTEM);
240     snprintf(message, STR_SIZE, CMND_HKEY5);
241     write_str(status->room->name, COL_SYSTEM);
242     snprintf(message, STR_SIZE, CMND_HKEY6);
243     write_str(status->room->name, COL_SYSTEM);
244     snprintf(message, STR_SIZE, CMND_HKEY7);
245     write_str(status->room->name, COL_SYSTEM);
246     snprintf(message, STR_SIZE, CMND_HKEY8);
247     write_str(status->room->name, COL_SYSTEM);
248     snprintf(message, STR_SIZE, CMND_HKEY9);
249     write_str(status->room->name, COL_SYSTEM);
250     snprintf(message, STR_SIZE, CMND_HKEY0);
251     write_str(status->room->name, COL_SYSTEM);
252     snprintf(message, STR_SIZE, CMND_HKEYA);
253     write_str(status->room->name, COL_SYSTEM);
254 #ifdef  CHARSET
255     snprintf(message, STR_SIZE, CMND_HKEYB);
256     write_str(status->room->name, COL_SYSTEM);
257 #endif  /* CHARSET */
258     snprintf(message, STR_SIZE, CMND_HKEYC);
259     write_str(status->room->name, COL_SYSTEM);
260     snprintf(message, STR_SIZE, CMND_HKEYD);
261     write_str(status->room->name, COL_SYSTEM);
262 }
263 
cmnd_version(void)264 void cmnd_version(void) {
265     snprintf(message, STR_SIZE, CMND_VERSION, time_get(),
266         NAME, VERSION, LANG, SYSTEM);
267     write_str(status->room->name, COL_SYSTEM);
268 }
269 
cmnd_status(void)270 void cmnd_status(void) {
271     snprintf(message, STR_SIZE, CMND_STATUS, time_get());
272     write_str(status->room->name, COL_SYSTEM);
273     if (config->packet_qchat) strncpy(buf, "qChat", STR_SIZE);
274     else if (config->packet_vchat) {
275         if (config->packet_xor) strncpy(buf, "VyChatXOR", STR_SIZE);
276         else strncpy(buf, "VyChat", STR_SIZE);
277     } else if (config->packet_pchat) strncpy(buf, "ProChat", STR_SIZE);
278     else strncpy(buf, "eChat", STR_SIZE);
279     strncat(buf, " (", STR_SIZE);
280     if (config->packet_bcast) strncat(buf, "bcast", STR_SIZE);
281     if (config->packet_mcast) strncat(buf, "mcast", STR_SIZE);
282     if (config->packet_route) strncat(buf, "route", STR_SIZE);
283     strncat(buf, ")", STR_SIZE);
284     snprintf(message, STR_SIZE, CMND_STATUSA, config->address, config->port, buf);
285     write_str(status->room->name, COL_SYSTEM);
286 #ifdef  TCP
287     if (status->clients) {
288         snprintf(message, STR_SIZE, CMND_STATUSL, status->clients);
289         write_str(status->room->name, COL_SYSTEM);
290     }
291 #endif  /* TCP */
292 }
293 
cmnd_verbose(void)294 void cmnd_verbose(void) {
295     config->verbose = !config->verbose;
296     if (config->verbose) snprintf(message, MSG_SIZE, CMND_VERBOSEON, time_get());
297     else snprintf(message, MSG_SIZE, CMND_VERBOSEOFF, time_get());
298     write_str(status->room->name, COL_SYSTEM);
299 }
300 
cmnd_clear(void)301 void cmnd_clear(void) {
302     register int n;
303 
304     for (n = 0; n < HIST_SIZE; n++) {
305         status->history[n][0] = '\0';
306         status->history[n][1] = '\0';
307     }
308     status->hist = status->strn = status->strn_end = status->strn_cur = 0;
309     for (n = 0; n < SCRN_SIZE; n++) {
310         status->room->screen[n][0] = '\0';
311         status->room->screen[n][1] = '\0';
312     }
313     status->room->scrn = status->room->scrn_top = 0;
314     snprintf(message, MSG_SIZE, CMND_CLEAR, time_get());
315     if (config->verbose) write_str(status->room->name, COL_SYSTEM);
316     status_ok(CMND_SCLEAR);
317 }
318 
cmnd_shell(void)319 void cmnd_shell(void) {
320 #ifdef  SHELL
321     int pid;
322 
323     if (*buf != '\0') strncpy(config->shell, buf, PATH_SIZE);
324     if ((pid = fork())) {
325         if (pid > 0) {
326             snprintf(message, MSG_SIZE, CMND_SHELL, time_get());
327             write_str(status->room->name, COL_SYSTEM);
328             snprintf(message, MSG_SIZE, "%s\n", config->shell);
329             write_str(status->room->name, COL_SYSTEM);
330         } else {
331             snprintf(message, MSG_SIZE, CMND_SHELLE, time_get());
332             write_str(status->room->name, COL_ERROR);
333         }
334     } else execlp(config->shell, buf, NULL);
335 #else   /* SHELL */
336     snprintf(message, STR_SIZE, CMND_SHELLD, time_get());
337     write_str(status->room->name, COL_ERROR);
338 #endif  /* SHELL */
339 }
340 
cmnd_load(void)341 void cmnd_load(void) {
342     if (*buf == '\0') snprintf(config->file, STR_SIZE, "~.%s", CNF_ECHATRC);
343     else strncpy(config->file, buf, PATH_SIZE);
344     if (*config->file == '~') {
345         snprintf(buf, PATH_SIZE, "%s/%s", getenv("HOME"), &config->file[1]);
346         strncpy(config->file, buf, PATH_SIZE);
347     }
348     term_kill();
349     sock_kill();
350     if (conf_read()) {
351         term_init();
352         window_init();
353         snprintf(message, MSG_SIZE, CMND_LOAD, time_get());
354         write_str(status->room->name, COL_SYSTEM);
355         snprintf(message, MSG_SIZE, "%s\n", config->file);
356         write_str(status->room->name, COL_SYSTEM);
357         status_ok(CMND_SLOAD);
358     } else {
359         term_init();
360         window_init();
361         snprintf(message, MSG_SIZE, CMND_LOADF, time_get());
362         write_str(status->room->name, COL_ERROR);
363         status_error(CMND_SLOADF);
364     }
365     addr_parse();
366     user_parsfavorite();
367     user_parsignore();
368     user_parsban();
369     sock_init();
370     addr_init();
371     window_refresh();
372     user_rescan();
373 }
374 
cmnd_save(void)375 void cmnd_save(void) {
376     if (*buf == '\0') snprintf(config->file, STR_SIZE, "~.%s", CNF_ECHATRC);
377     else strncpy(config->file, buf, PATH_SIZE);
378     if (*config->file == '~') {
379         snprintf(buf, PATH_SIZE, "%s/%s", getenv("HOME"), &config->file[1]);
380         strncpy(config->file, buf, PATH_SIZE);
381     }
382     if (conf_write()) {
383         snprintf(message, MSG_SIZE, CMND_SAVEF, time_get());
384         write_str(status->room->name, COL_SYSTEM);
385         snprintf(message, MSG_SIZE, "%s\n", config->file);
386         write_str(status->room->name, COL_SYSTEM);
387         status_ok(CMND_SSAVE);
388     } else {
389         snprintf(message, MSG_SIZE, CMND_SAVEF, time_get());
390         write_str(status->room->name, COL_ERROR);
391         status_error(CMND_SSAVEF);
392     }
393 }
394 
cmnd_answer(void)395 void cmnd_answer(void) {
396     if (status->room->name[0] != CHR_CHNL) return;
397     switch (config->mode) {
398         case MOD_DND:
399             if (*buf != '\0') strncpy(config->answer_dnd, buf, STR_SIZE);
400             snprintf(message, MSG_SIZE, CMND_ANSDND, time_get());
401             write_str(status->room->name, COL_SYSTEM);
402             snprintf(message, MSG_SIZE, "%s\n", config->answer_dnd);
403             write_str(status->room->name, COL_SYSTEM); break;
404         case MOD_AWAY:
405             if (*buf != '\0') strncpy(config->answer_away, buf, STR_SIZE);
406             snprintf(message, MSG_SIZE, CMND_ANSAWAY, time_get());
407             write_str(status->room->name, COL_SYSTEM);
408             snprintf(message, MSG_SIZE, "%s\n", config->answer_away);
409             write_str(status->room->name, COL_SYSTEM); break;
410         case MOD_OFF:
411             if (*buf != '\0') strncpy(config->answer_off, buf, STR_SIZE);
412             snprintf(message, MSG_SIZE, CMND_ANSOFF, time_get());
413             write_str(status->room->name, COL_SYSTEM);
414             snprintf(message, MSG_SIZE, "%s\n", config->answer_off);
415             write_str(status->room->name, COL_SYSTEM); break;
416         default: break;
417     }
418 }
419 
cmnd_gender(void)420 void cmnd_gender(void) {
421     if (config->gender) {
422         config->gender = 0;
423         snprintf(message, MSG_SIZE, CMND_GENDERM, time_get());
424         status_ok(CMND_SGENDERM);
425     } else {
426         config->gender = 1;
427         snprintf(message, MSG_SIZE, CMND_GENDERF, time_get());
428         status_ok(CMND_SGENDERF);
429     }
430     if (config->verbose) write_str(status->room->name, COL_SYSTEM);
431 }
432 
cmnd_my(void)433 void cmnd_my(void) {
434     if (config->my_only) {
435         config->my_only = 0;
436         snprintf(message, MSG_SIZE, CMND_BEEPALL, time_get());
437         status_ok(CMND_SBEEPALL);
438     } else {
439         config->my_only = 1;
440         snprintf(message, MSG_SIZE, CMND_BEEPCUR, time_get());
441         status_ok(CMND_SBEEPCUR);
442     }
443     if (config->verbose) write_str(status->room->name, COL_SYSTEM);
444 }
445 
cmnd_favorite(void)446 void cmnd_favorite(void) {
447     register int n;
448 
449     if ((*buf == '\0') || ((buf[0] == ' ') && (buf[1] == '\0'))) {
450         snprintf(message, MSG_SIZE, CMND_FAVORITEN, time_get());
451         write_str(status->room->name, COL_SYSTEM);
452         if (buf[0] == ' ') for (n = 0; n < USERS_MAX; status->favorite[n++][0] = '\0');
453         else {
454             *message = '\0';
455             for (n = 0; n < USERS_MAX; n++) {
456                 if (status->favorite[n][0] == '\0') break;
457                 strncat(message, status->favorite[n], NICK_MAXLEN);
458                 strncat(message, ": ", 2);
459             }
460             strncat(message, "\n", 1);
461             write_str(status->room->name, COL_SYSTEM);
462         }
463     } else while (*buf != '\0') {
464         user_parse();
465         cmnd_next();
466         for (n = 0; n < USERS_MAX; n++)
467             if (!strncmp(status->favorite[n], status->nick, NICK_MAXLEN)) break;
468         if (n == USERS_MAX) {
469             user_addfavorite();
470             snprintf(message, MSG_SIZE, CMND_FAVORITEI, time_get(), status->nick);
471         } else {
472             user_delfavorite();
473             snprintf(message, MSG_SIZE, CMND_FAVORITEU, time_get(), status->nick);
474         }
475         if (config->verbose) write_str(status->room->name, COL_SYSTEM);
476         status->user[user_getnum()].favorite = user_setfavorite();
477         user_refresh();
478     }
479 }
480 
cmnd_ignore(void)481 void cmnd_ignore(void) {
482     register int n;
483 
484     if ((*buf == '\0') || ((buf[0] == ' ') && (buf[1] == '\0'))) {
485         snprintf(message, MSG_SIZE, CMND_IGNOREN, time_get());
486         write_str(status->room->name, COL_SYSTEM);
487         if (buf[0] == ' ') for (n = 0; n < USERS_MAX; status->ignore[n++][0] = '\0');
488         else {
489             *message = '\0';
490             for (n = 0; n < USERS_MAX; n++) {
491                 if (status->ignore[n][0] == '\0') break;
492                 strncat(message, status->ignore[n], NICK_MAXLEN);
493                 strncat(message, ": ", 2);
494             }
495             strncat(message, "\n", 1);
496             write_str(status->room->name, COL_SYSTEM);
497         }
498     } else while (*buf != '\0') {
499         user_parse();
500         cmnd_next();
501         for (n = 0; n < USERS_MAX; n++)
502             if (!strncmp(status->ignore[n], status->nick, NICK_MAXLEN)) break;
503         if (n == USERS_MAX) {
504             user_addignore();
505             snprintf(message, MSG_SIZE, CMND_IGNOREI, time_get(), status->nick);
506         } else {
507             user_delignore();
508             snprintf(message, MSG_SIZE, CMND_IGNOREU, time_get(), status->nick);
509         }
510         if (config->verbose) write_str(status->room->name, COL_SYSTEM);
511         status->user[user_getnum()].ignore = user_setignore();
512         user_refresh();
513     }
514 }
515 
cmnd_ban(void)516 void cmnd_ban(void) {
517     register int n;
518 
519     if ((*buf == '\0') || ((buf[0] == ' ') && (buf[1] == '\0'))) {
520         snprintf(message, MSG_SIZE, CMND_BANA, time_get());
521         write_str(status->room->name, COL_SYSTEM);
522         if (buf[0] == ' ') for (n = 0; n < USERS_MAX; status->ban[n++][0] = '\0');
523         else {
524             *message = '\0';
525             for (n = 0; n < USERS_MAX; n++) {
526                 if (status->ban[n][0] == '\0') break;
527                 strncat(message, status->ban[n], NICK_MAXLEN);
528                 strncat(message, " ", 1);
529             }
530             strncat(message, "\n", 1);
531             write_str(status->room->name, COL_SYSTEM);
532         }
533     } else while (*buf != '\0') {
534         user_parse();
535         cmnd_next();
536         if (user_getnum() < 0) {
537             snprintf(message, MSG_SIZE, CMND_INICK, time_get(), status->nick);
538             write_str(status->room->name, COL_ERROR);
539             continue;
540         }
541         strncpy(status->address, status->user[user_getnum()].addr, ADDR_SIZE);
542         for (n = 0; n < USERS_MAX; n++)
543             if (!strncmp(status->ban[n], status->address, ADDR_SIZE)) break;
544         if (n == USERS_MAX) {
545             user_addban();
546             snprintf(message, MSG_SIZE, CMND_BANB, time_get(), status->address);
547         } else {
548             user_delban();
549             snprintf(message, MSG_SIZE, CMND_BANU, time_get(), status->address);
550         }
551         if (config->verbose) write_str(status->room->name, COL_SYSTEM);
552         status->user[user_getnum()].ignore = user_setignore();
553         refresh_users();
554     }
555 }
556 
cmnd_bcast(void)557 void cmnd_bcast(void) {
558     config->packet_bcast = !config->packet_bcast;
559     if (config->packet_bcast) snprintf(message, MSG_SIZE, CMND_BCASTON, time_get());
560     else snprintf(message, MSG_SIZE, CMND_BCASTOFF, time_get());
561     write_str(status->room->name, COL_SYSTEM);
562 }
563 
cmnd_chat(void)564 void cmnd_chat(void) {
565     if (status->room->name[0] == CHR_CHNL) send_chat();
566     else {
567         strncpy(status->channel, status->room->name, NICK_MAXLEN);
568         strncpy(status->address, status->room->addr, ADDR_SIZE);
569         send_privchat();
570         snprintf(message, MSG_SIZE, "<%s> %s\n", config->nick, buf);
571         write_log(config->log_priv);
572         write_str(status->channel, COL_MY);
573         if (config->mode == MOD_NORMAL) beep_chat();
574     }
575 }
576 
cmnd_join(void)577 void cmnd_join(void) {
578     if (*buf == '\0') return;
579     if ((strchr(buf, CHR_NICK) != NULL) ||
580         (strchr(buf, CHR_CHNL) != NULL) ||
581         (strchr(buf, CHR_RESTR1) != NULL) ||
582         (strchr(buf, CHR_RESTR2) != NULL) ||
583         (strchr(buf, CHR_RESTR3) != NULL) ||
584         (strchr(buf, CHR_RESTR4) != NULL) ||
585         (strchr(buf, CHR_RESTR5) != NULL) ||
586         (strchr(buf, CHR_RESTR6) != NULL) ||
587         (strchr(buf, CHR_RESTR7) != NULL) ||
588         (strchr(buf, CHR_RESTR8) != NULL)) {
589         snprintf(message, MSG_SIZE, CMND_ICHANNEL, time_get(), buf);
590         write_str(status->room->name, COL_ERROR);
591         return;
592     }
593     if (buf[0] != CHR_CHNL) status->channel[0] = CHR_CHNL;
594     else status->channel[0] = '\0';
595     status->channel[1] = '\0';
596     strncat(status->channel, buf, CHANNEL_MAXLEN-1);
597     send_join();
598 }
599 
cmnd_leave(void)600 void cmnd_leave(void) {
601     if (*buf == '\0') strncpy(status->channel, status->room->name, CHANNEL_MAXLEN);
602     else strncpy(status->channel, buf, CHANNEL_MAXLEN);
603     if (!strncmp(status->chnl[0].name, status->channel, CHANNEL_MAXLEN)) {
604         snprintf(message, MSG_SIZE, CMND_LEAVE, time_get(), status->channel);
605         write_str(status->room->name, COL_ERROR);
606         return;
607     }
608     if (status->channel[0] != CHR_CHNL) {
609         strncpy(status->nick, status->channel, NICK_MAXLEN);
610         strncpy(status->address, status->user[user_getnum()].addr, ADDR_SIZE);
611         send_privleave();
612         strncpy(status->nick, config->nick, NICK_MAXLEN);
613         strncpy(status->address, status->user[user_getnum()].addr, ADDR_SIZE);
614         send_privleave();
615     } else send_leave();
616 }
617 
cmnd_nick(void)618 void cmnd_nick(void) {
619     register int n;
620 
621     if (*buf == '\0') return;
622     if ((strchr(buf, CHR_CHNL) != NULL) ||
623         (strchr(buf, CHR_NICK) != NULL) ||
624         (strchr(buf, CHR_RESTR1) != NULL) ||
625         (strchr(buf, CHR_RESTR2) != NULL) ||
626         (strchr(buf, CHR_RESTR3) != NULL) ||
627         (strchr(buf, CHR_RESTR4) != NULL) ||
628         (strchr(buf, CHR_RESTR5) != NULL) ||
629         (strchr(buf, CHR_RESTR5) != NULL) ||
630         (strchr(buf, CHR_RESTR6) != NULL) ||
631         (strchr(buf, CHR_RESTR7) != NULL) ||
632         (strchr(buf, CHR_RESTR8) != NULL)) {
633         snprintf(message, MSG_SIZE, CMND_INICK, time_get(), buf);
634         write_str(status->room->name, COL_ERROR);
635         return;
636     }
637     strncpy(status->nick, buf, NICK_MAXLEN);
638     for (n = 0; n < status->users; n++)
639         if (!strncmp(status->user[n].nick, status->nick, NICK_MAXLEN))
640     if (n != status->users) {
641         snprintf(message, MSG_SIZE, CMND_NICK, time_get(), status->nick);
642         write_str(status->room->name, COL_ERROR);
643         return;
644     }
645     strncpy(status->nick, config->nick, NICK_MAXLEN);
646     strncpy(config->nick, buf, NICK_MAXLEN);
647     send_nick();
648 }
649 
cmnd_mesg(void)650 void cmnd_mesg(void) {
651     if (*buf == '\0') return;
652     user_parse();
653     cmnd_next();
654     strncpy(status->address, status->user[user_getnum()].addr, ADDR_SIZE);
655     send_mesg();
656     snprintf(message, MSG_SIZE, CMND_MESG, time_get(), status->nick);
657     write_log(config->log_mesg);
658     snprintf(message, MSG_SIZE, "%s\n", buf);
659     write_log(config->log_mesg);
660 }
661 
cmnd_mass(void)662 void cmnd_mass(void) {
663     register int n;
664 
665     if (*buf == '\0') return;
666     for (n = 0; n < status->users; n++) {
667         strncpy(status->nick, status->user[n].nick, NICK_MAXLEN);
668         strncpy(status->address, status->user[n].addr, ADDR_SIZE);
669         if (strncmp(config->nick, status->nick, NICK_MAXLEN)) send_mass();
670     }
671     snprintf(message, MSG_SIZE, CMND_MASS, time_get());
672     write_log(config->log_mesg);
673     snprintf(message, MSG_SIZE, "%s\n", buf);
674     write_log(config->log_mesg);
675 }
676 
cmnd_exec(void)677 void cmnd_exec(void) {
678     if (*buf == '\0') return;
679     user_parse();
680     cmnd_next();
681     strncpy(status->address, status->user[user_getnum()].addr, ADDR_SIZE);
682     send_exec();
683 }
684 
cmnd_me(void)685 void cmnd_me(void) {
686     if (*buf == '\0') strncpy(buf, config->me_action, STR_SIZE);
687     if (status->room->name[0] == CHR_CHNL) send_me();
688     else {
689         strncpy(status->channel, status->room->name, CHANNEL_MAXLEN);
690         strncpy(status->address, status->room->addr, ADDR_SIZE);
691         send_privme();
692         snprintf(message, MSG_SIZE, " * %s %s\n", config->nick, buf);
693         write_log(config->log_priv);
694         write_str(status->channel, COL_MY);
695         if (config->mode == MOD_NORMAL) beep_chat();
696     }
697 }
698 
cmnd_topic(void)699 void cmnd_topic(void) {
700     int toplen = STR_SIZE - (strlen(config->nick)+4);
701 
702     if (status->room->name[0] != CHR_CHNL) return;
703     if (config->packet_qchat) {
704         if (*buf == '\0') {
705             snprintf(message, MSG_SIZE, CMND_QTOPIC, time_get());
706             write_str(status->room->name, COL_SYSTEM);
707             snprintf(message, MSG_SIZE, "%s\n", status->chnl[0].topic);
708             write_str(status->room->name, COL_SYSTEM);
709         } else if ((buf[0] == ' ') && (buf[1] == '\0')) {
710             status->chnl[0].topic[0] = '\0';
711             send_topicnew();
712         } else {
713             snprintf(status->chnl[0].topic, toplen, "%s", buf);
714             strncat(status->chnl[0].topic, " (", 2);
715             strncat(status->chnl[0].topic, config->nick, NICK_MAXLEN);
716             strncat(status->chnl[0].topic, ")", 1);
717             send_topicnew();
718         }
719     } else {
720         if (*buf == '\0') {
721             snprintf(message, MSG_SIZE, CMND_TOPIC, time_get(), status->room->name);
722             write_str(status->room->name, COL_SYSTEM);
723             snprintf(message, MSG_SIZE, "%s\n", status->room->topic);
724             write_str(status->room->name, COL_SYSTEM);
725         } else if ((buf[0] == ' ') && (buf[1] == '\0')) {
726             status->room->topic[0] = '\0';
727             send_topicnew();
728         } else {
729             snprintf(status->room->topic, toplen, "%s", buf);
730             strncat(status->room->topic, " (", 2);
731             strncat(status->room->topic, config->nick, NICK_MAXLEN);
732             strncat(status->room->topic, ")", 1);
733             send_topicnew();
734         }
735     }
736 }
737 
cmnd_add(void)738 void cmnd_add(void) {
739     int toplen;
740 
741     if (*status->room->name != CHR_CHNL) return;
742     if (config->packet_qchat) {
743         if ((toplen = STR_SIZE - (strlen(status->chnl[0].topic)+strlen(config->nick)+4)) < 0) return;
744         if (*buf == '\0') {
745             strncat(status->chnl[0].topic, " (", 2);
746             strncat(status->chnl[0].topic, config->nick, NICK_MAXLEN);
747             strncat(status->chnl[0].topic, ")", 1);
748             send_topicnew();
749         } else {
750             strncat(status->chnl[0].topic, " ", 1);
751             strncat(status->chnl[0].topic, buf, toplen);
752             strncat(status->chnl[0].topic, " (", 2);
753             strncat(status->chnl[0].topic, config->nick, NICK_MAXLEN);
754             strncat(status->chnl[0].topic, ")", 1);
755             send_topicnew();
756         }
757     } else {
758         if ((toplen = STR_SIZE - (strlen(status->room->topic)+strlen(config->nick)+4)) < 0) return;
759         if (*buf == '\0') {
760             strncat(status->room->topic, " (", 2);
761             strncat(status->room->topic, config->nick, NICK_MAXLEN);
762             strncat(status->room->topic, ")", 1);
763             send_topicnew();
764         } else {
765             strncat(status->room->topic, " ", 1);
766             strncat(status->room->topic, buf, toplen);
767             strncat(status->room->topic, " (", 2);
768             strncat(status->room->topic, config->nick, NICK_MAXLEN);
769             strncat(status->room->topic, ")", 1);
770             send_topicnew();
771         }
772     }
773 }
774 
cmnd_mode(void)775 void cmnd_mode(void) {
776     if ((*buf == '\0') ||
777         (((config->mode = atoi(buf)) != MOD_DND) &&
778         (config->mode != MOD_AWAY) &&
779         (config->mode != MOD_OFF))) config->mode = 0;
780     send_mode();
781 }
782 
cmnd_normal(void)783 void cmnd_normal(void) {
784     config->mode = MOD_NORMAL;
785     send_mode();
786     config->active = 1;
787     send_active();
788 }
789 
cmnd_dnd(void)790 void cmnd_dnd(void) {
791     if ((buf[0] == ' ') && (buf[1] == '\0')) config->answer_dnd[0] = '\0';
792     else if (*buf != '\0') strncpy(config->answer_dnd, buf, STR_SIZE);
793     config->mode = MOD_DND;
794     send_mode();
795     config->active = 0;
796     send_active();
797 }
798 
cmnd_away(void)799 void cmnd_away(void) {
800     if ((buf[0] == ' ') && (buf[1] == '\0')) config->answer_away[0] = '\0';
801     else if (*buf != '\0') strncpy(config->answer_away, buf, STR_SIZE);
802     config->mode = MOD_AWAY;
803     send_mode();
804     config->active = 0;
805     send_active();
806 }
807 
cmnd_off(void)808 void cmnd_off(void) {
809     if ((buf[0] == ' ') && (buf[1] == '\0')) config->answer_off[0] = '\0';
810     else if (*buf != '\0') strncpy(config->answer_off, buf, STR_SIZE);
811     config->mode = MOD_OFF;
812     send_mode();
813     config->active = 0;
814     send_active();
815 }
816 
cmnd_info(void)817 void cmnd_info(void) {
818     if (*buf == '\0') {
819         strncpy(status->nick, config->nick, NICK_MAXLEN);
820         send_info();
821     } else {
822         while (*buf != '\0') {
823             user_parse();
824             cmnd_next();
825             strncpy(status->address, status->user[user_getnum()].addr, ADDR_SIZE);
826             send_info();
827         }
828     }
829 }
830 
cmnd_beep(void)831 void cmnd_beep(void) {
832     if (*buf == '\0') {
833         strncpy(status->nick, config->nick, NICK_MAXLEN);
834         send_beep();
835     } else {
836         while (*buf != '\0') {
837             user_parse();
838             cmnd_next();
839             strncpy(status->address, status->user[user_getnum()].addr, ADDR_SIZE);
840             send_beep();
841         }
842     }
843 }
844 
cmnd_talk(void)845 void cmnd_talk(void) {
846     if (*buf == '\0') return;
847     user_parse();
848     strncpy(status->channel, status->nick, NICK_MAXLEN);
849     strncpy(status->address, status->user[user_getnum()].addr, ADDR_SIZE);
850     send_privjoin();
851     strncpy(status->nick, config->nick, NICK_MAXLEN);
852     strncpy(status->address, status->user[user_getnum()].addr, ADDR_SIZE);
853     send_privjoin();
854 }
855 
cmnd_here(void)856 void cmnd_here(void) {
857     strncpy(status->channel, status->room->name, CHANNEL_MAXLEN);
858     send_here();
859 }
860 
cmnd_active(void)861 void cmnd_active(void) {
862     config->active = !config->active;
863     send_active();
864 }
865 
cmnd_parse(void)866 void cmnd_parse(void) {
867     register int n;
868 
869     if (*buf != CHR_CMND) { cmnd_chat(); return; }
870     *buf = '\0'; cmnd_next();
871     for (n = 0; n < STR_SIZE; n++) if (buf[n] == ' ') { buf[n] = '\0'; break; }
872     if (!strncasecmp(buf, CMD_QUIT, CMD_MAXLEN) || !strncasecmp(buf, CMD_QUIT1, CMD_MAXLEN) || !strncasecmp(buf, CMD_QUIT2, CMD_MAXLEN)) chat_exit(0);
873     if (!strncasecmp(buf, CMD_HELP, CMD_MAXLEN) || !strncasecmp(buf, CMD_HELP1, CMD_MAXLEN) || !strncasecmp(buf, CMD_HELP2, CMD_MAXLEN)) {
874         cmnd_next(); cmnd_help(); return;
875     }
876     if (!strncasecmp(buf, CMD_VERSION, CMD_MAXLEN) || !strncasecmp(buf, CMD_VERSION1, CMD_MAXLEN)) {
877         cmnd_next(); cmnd_version(); return;
878     }
879     if (!strncasecmp(buf, CMD_STATUS, CMD_MAXLEN) || !strncasecmp(buf, CMD_STATUS1, CMD_MAXLEN)) {
880         cmnd_next(); cmnd_status(); return;
881     }
882     if (!strncasecmp(buf, CMD_KEYS, CMD_MAXLEN) || !strncasecmp(buf, CMD_KEYS1, CMD_MAXLEN)) {
883         cmnd_next(); cmnd_keys(); return;
884     }
885     if (!strncasecmp(buf, CMD_VERBOSE, CMD_MAXLEN) || !strncasecmp(buf, CMD_VERBOSE1, CMD_MAXLEN)) {
886         cmnd_next(); cmnd_verbose(); return;
887     }
888     if (!strncasecmp(buf, CMD_CLEAR, CMD_MAXLEN) || !strncasecmp(buf, CMD_CLEAR1, CMD_MAXLEN)) {
889         cmnd_next(); cmnd_clear(); return;
890     }
891     if (!strncasecmp(buf, CMD_SHELL, CMD_MAXLEN)) {
892         cmnd_next(); cmnd_shell(); return;
893     }
894     if (!strncasecmp(buf, CMD_LOAD, CMD_MAXLEN)) {
895         cmnd_next(); cmnd_load(); return;
896     }
897     if (!strncasecmp(buf, CMD_SAVE, CMD_MAXLEN)) {
898         cmnd_next(); cmnd_save(); return;
899     }
900 
901     if (!strncasecmp(buf, CMD_ANSWER, CMD_MAXLEN) || !strncasecmp(buf, CMD_ANSWER1, CMD_MAXLEN)) {
902         cmnd_next(); cmnd_answer(); return;
903     }
904     if (!strncasecmp(buf, CMD_GENDER, CMD_MAXLEN) || !strncasecmp(buf, CMD_GENDER1, CMD_MAXLEN)) {
905         cmnd_next(); cmnd_gender(); return;
906     }
907     if (!strncasecmp(buf, CMD_MY, CMD_MAXLEN)) {
908         cmnd_next(); cmnd_my(); return;
909     }
910     if (!strncasecmp(buf, CMD_FAVORITE, CMD_MAXLEN) || !strncasecmp(buf, CMD_FAVORITE1, CMD_MAXLEN)) {
911         cmnd_next(); cmnd_favorite(); return;
912     }
913     if (!strncasecmp(buf, CMD_IGNORE, CMD_MAXLEN) || !strncasecmp(buf, CMD_IGNORE1, CMD_MAXLEN)) {
914         cmnd_next(); cmnd_ignore(); return;
915     }
916     if (!strncasecmp(buf, CMD_BAN, CMD_MAXLEN)) {
917         cmnd_next(); cmnd_ban(); return;
918     }
919     if (!strncasecmp(buf, CMD_BCAST, CMD_MAXLEN)) {
920         cmnd_next(); cmnd_bcast(); return;
921     }
922     if (!strncasecmp(buf, CMD_JOIN, CMD_MAXLEN) || !strncasecmp(buf, CMD_JOIN1, CMD_MAXLEN)) {
923         cmnd_next(); cmnd_join(); return;
924     }
925     if (!strncasecmp(buf, CMD_LEAVE, CMD_MAXLEN) || !strncasecmp(buf, CMD_LEAVE1, CMD_MAXLEN)) {
926         cmnd_next(); cmnd_leave(); return;
927     }
928 
929     if (!strncasecmp(buf, CMD_NICK, CMD_MAXLEN) || !strncasecmp(buf, CMD_NICK1, CMD_MAXLEN)) {
930         cmnd_next(); cmnd_nick(); return;
931     }
932     if (!strncasecmp(buf, CMD_MESG, CMD_MAXLEN) || !strncasecmp(buf, CMD_MESG1, CMD_MAXLEN) || !strncasecmp(buf, CMD_MESG2, CMD_MAXLEN)) {
933         cmnd_next(); cmnd_mesg(); return;
934     }
935     if (!strncasecmp(buf, CMD_MASS, CMD_MAXLEN)) {
936         cmnd_next(); cmnd_mass(); return;
937     }
938     if (!strncasecmp(buf, CMD_EXEC, CMD_MAXLEN)) {
939         cmnd_next(); cmnd_exec(); return;
940     }
941     if (!strncasecmp(buf, CMD_ME, CMD_MAXLEN)) {
942         cmnd_next(); cmnd_me(); return;
943     }
944     if (!strncasecmp(buf, CMD_TOPIC, CMD_MAXLEN) || !strncasecmp(buf, CMD_TOPIC1, CMD_MAXLEN)) {
945         cmnd_next(); cmnd_topic(); return;
946     }
947     if (!strncasecmp(buf, CMD_ADD, CMD_MAXLEN)) {
948         cmnd_next(); cmnd_add(); return;
949     }
950     if (!strncasecmp(buf, CMD_MODE, CMD_MAXLEN) || !strncasecmp(buf, CMD_MODE1, CMD_MAXLEN)) {
951         cmnd_next(); cmnd_mode(); return;
952     }
953     if (!strncasecmp(buf, CMD_NORMAL, CMD_MAXLEN) || !strncasecmp(buf, CMD_NORMAL1, CMD_MAXLEN)) {
954         cmnd_next(); cmnd_normal(); return;
955     }
956     if (!strncasecmp(buf, CMD_DND, CMD_MAXLEN) || !strncasecmp(buf, CMD_DND1, CMD_MAXLEN)) {
957         cmnd_next(); cmnd_dnd(); return;
958     }
959     if (!strncasecmp(buf, CMD_AWAY, CMD_MAXLEN) || !strncasecmp(buf, CMD_AWAY1, CMD_MAXLEN)) {
960         cmnd_next(); cmnd_away(); return;
961     }
962     if (!strncasecmp(buf, CMD_OFF, CMD_MAXLEN) || !strncasecmp(buf, CMD_OFF1, CMD_MAXLEN)) {
963         cmnd_next(); cmnd_off(); return;
964     }
965     if (!strncasecmp(buf, CMD_INFO, CMD_MAXLEN) || !strncasecmp(buf, CMD_INFO1, CMD_MAXLEN) || !strncasecmp(buf, CMD_INFO2, CMD_MAXLEN)) {
966         cmnd_next(); cmnd_info(); return;
967     }
968     if (!strncasecmp(buf, CMD_BEEP, CMD_MAXLEN) || !strncasecmp(buf, CMD_BEEP1, CMD_MAXLEN)) {
969         cmnd_next(); cmnd_beep(); return;
970     }
971     if (!strncasecmp(buf, CMD_TALK, CMD_MAXLEN) || !strncasecmp(buf, CMD_TALK1, CMD_MAXLEN) || !strncasecmp(buf, CMD_TALK2, CMD_MAXLEN)) {
972         cmnd_next(); cmnd_talk(); return;
973     }
974     if (!strncasecmp(buf, CMD_HERE, CMD_MAXLEN)) {
975         cmnd_next(); cmnd_here(); return;
976     }
977     if (!strncasecmp(buf, CMD_ACTIVE, CMD_MAXLEN) || !strncasecmp(buf, CMD_ACTIVE1, CMD_MAXLEN)) {
978         cmnd_next(); cmnd_active(); return;
979     }
980 
981     if (config->status_str) status_error(CMND_SUNKNOWN);
982     else {
983         snprintf(message, STR_SIZE, CMND_UNKNOWN, time_get(), buf);
984         write_str(status->room->name, COL_ERROR);
985     }
986 }
987