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