]> jfr.im git - irc/thales.git/blob - src/actions.c
Sequana support removed
[irc/thales.git] / src / actions.c
1 /* GNU Thales - IRC to Relational Database Gateway
2 * Copyright (C) 2002 Lucas Nussbaum <lucas@lucas-nussbaum.net>
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; either version 2 of the License, or
7 * (at your option) any later version.
8 *
9 * This program is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 * GNU General Public License for more details.
13 *
14 * You should have received a copy of the GNU General Public License
15 * along with this program; if not, write to the Free Software
16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
17 */
18
19 #include "thales.h"
20 #include "actions.h"
21 #include "db.h"
22 #include "send.h"
23 #include "misc.h"
24 #include "compat.h"
25 #include "memory.h"
26 #include "log.h"
27 #include "sockutil.h"
28
29 extern char *ServerName;
30 extern char *RemoteServer;
31 extern time_t start_time;
32 extern char inbuf[];
33 extern int ServerCacheTime;
34 extern int UserCacheTime;
35 extern int HidePasswords;
36
37 /*************************************************************************/
38 /*
39 * Max values calculation
40 */
41
42 unsigned int nbusers = 0;
43 unsigned int nbusers_max = 0;
44 unsigned int nbchans = 0;
45 unsigned int nbchans_max = 0;
46 unsigned int nbservs = 0;
47 unsigned int nbservs_max = 0;
48 /* keep track of logged umodes et cmodes, init to 0 by default */
49 int log_umode[256];
50 int log_cmode[256];
51
52 /* check if nbchans > nbchans_max */
53 void do_checknbchansmax()
54 {
55 if (nbchans > nbchans_max)
56 {
57 nbchans_max = nbchans;
58 db_query
59 ("UPDATE " TBL_MAXV
60 " SET val=\'%d\', time=NOW() WHERE type='channels'",
61 nbchans_max);
62 }
63 }
64
65 /* check if nbusers > nbusers_max */
66 void do_checknbusersmax()
67 {
68 if (nbusers > nbusers_max)
69 {
70 nbusers_max = nbusers;
71 db_query
72 ("UPDATE " TBL_MAXV
73 " SET val=\'%d\', time=NOW() WHERE type='users'", nbusers_max);
74 }
75 }
76
77 /* check if nbservs > nbservs_max */
78 void do_checknbservsmax()
79 {
80 if (nbservs > nbservs_max)
81 {
82 nbservs_max = nbservs;
83 db_query
84 ("UPDATE " TBL_MAXV
85 " SET val=\'%d\', time=NOW() WHERE type='servers'", nbservs_max);
86 }
87 }
88
89 /*************************************************************************/
90 /*
91 * general purpose functions
92 */
93
94 #if !(defined(IRCD_UNREAL)||defined(IRCD_HYBRID)||defined(IRCD_ULTI28))
95 /* converts an IP numeric to a char * */
96 static char *do_ipdecode(char *ipaddr)
97 {
98 static char buf[16]; /* enough for an IPv4 address. TODO IPv6 ? */
99 unsigned int ip = (unsigned int) strtoul(ipaddr, (char **) NULL, 10);
100 snprintf(buf, 16, "%u.%u.%u.%u", (unsigned int) ip >> 24,
101 (unsigned int) (ip & 0xff0000) >> 16,
102 (unsigned int) (ip & 0xff00) >> 8, (unsigned int) ip & 0xff);
103 return buf;
104 }
105 #endif
106
107 /* adds modes to a given chanid */
108 static void do_chanmodes(int chanid, char **av, int ac)
109 {
110 /* the ircd parses the mode before forwarding it to thales, so there's no buffer overrun
111 * possibility here. - lucas
112 */
113 int atleastone = 0;
114 char db[1000]; /* should be enough for long queries */
115 char tmp[14] = "mode_XX=\"X\", ";
116 char *modes = av[0];
117 int argptr = 1;
118 if (*modes == '0')
119 return;
120 strcpy(db, "UPDATE " TBL_CHAN " SET ");
121 while (*modes)
122 {
123 switch (*modes)
124 {
125 case '+':
126 tmp[9] = 'Y';
127 break;
128 case '-':
129 tmp[9] = 'N';
130 break;
131 default:
132 if (!strchr(CHANMODES, *modes))
133 {
134 if (!log_cmode[(int) *modes])
135 {
136 mylog("unknown mode : chanmode %c (in %s)", *modes, inbuf);
137 log_cmode[(int) *modes] = TRUE;
138 }
139 }
140 #ifdef IRCD_ULTI28
141 else if (*modes == 'b' || *modes == 'e' || *modes == 'f') /* ignore them */
142 argptr++;
143 #else
144 else if (*modes == 'b' || *modes == 'e' || *modes == 'I') /* ignore them */
145 argptr++;
146 #endif
147 #ifdef IRCD_IRCDRU
148 else if (*modes == 'B' || *modes == 'X' || *modes == 'E') /* ignore them too */
149 argptr++;
150 #endif
151
152 #if defined(IRCD_BAHAMUT)||defined(IRCD_IRCDRU)
153 else if (*modes == 'o' || *modes == 'v')
154 #elif defined(IRCD_HYBRID)||defined(IRCD_ULTI28)
155 else if (*modes == 'o' || *modes == 'v' || *modes == 'h')
156 #elif defined(IRCD_ULTIMATE)
157 else if (*modes == 'o' || *modes == 'v'
158 || *modes == 'a' || *modes == 'h')
159 #elif defined(IRCD_UNREAL)
160 else if (*modes == 'o' || *modes == 'v'
161 || *modes == 'a' || *modes == 'h' || *modes == 'q')
162 #endif
163 {
164 char *user;
165 user = db_escape(av[argptr++]);
166 db_query
167 ("UPDATE " TBL_ISON
168 " SET mode_l%c=\"%c\" WHERE chanid=\"%d\" AND nickid=\"%d\"",
169 *modes, tmp[9], chanid, db_getnick(user));
170 free(user);
171 }
172 else
173 {
174 atleastone = 1;
175 tmp[5] = ((*modes >= 'a') ? 'l' : 'u');
176 tmp[6] = tolower(*modes);
177 strcat(db, tmp);
178 if (*modes == 'k')
179 {
180 if (tmp[9] == 'Y')
181 {
182 char *key = db_escape(av[argptr++]);
183 if (HidePasswords)
184 {
185 strcat(db, "mode_lk_data=\"HIDDEN\", ");
186 }
187 else
188 {
189 strcat(db, "mode_lk_data=\"");
190 strcat(db, key);
191 strcat(db, "\", ");
192 }
193 free(key);
194 }
195 else
196 {
197 strcat(db, "mode_lk_data=\"\", ");
198 argptr++; /* mode -k needs a parameter */
199 }
200 }
201 else if (*modes == 'l')
202 {
203 if (tmp[9] == 'Y')
204 {
205 strcat(db, "mode_ll_data=\"");
206 strcat(db, av[argptr++]);
207 strcat(db, "\", ");
208 }
209 else
210 {
211 strcat(db, "mode_ll_data=\"\", ");
212 }
213 }
214 #if defined(IRCD_UNREAL)||defined(IRCD_ULTI28)
215 else if (*modes == 'L')
216 {
217 if (tmp[9] == 'Y')
218 {
219 char *ch = db_escape(av[argptr++]);
220 strcat(db, "mode_ul_data=\"");
221 strcat(db, ch);
222 strcat(db, "\", ");
223 free(ch);
224 }
225 else
226 {
227 strcat(db, "mode_ul_data=\"\", ");
228 }
229 }
230 #endif
231 #ifdef IRCD_UNREAL
232 else if (*modes == 'f')
233 {
234 if (tmp[9] == 'Y')
235 {
236 strcat(db, "mode_lf_data=\"");
237 strcat(db, av[argptr++]);
238 strcat(db, "\", ");
239 }
240 else
241 {
242 strcat(db, "mode_lf_data=\"\", ");
243 }
244 }
245 #endif
246 }
247 break;
248 }
249 modes++;
250 }
251 #ifndef NOMODES
252 if (atleastone)
253 {
254 sprintf(&db[strlen(db) - 2], " WHERE chanid=\'%d\'", chanid);
255 db_query(db);
256 }
257 #endif /* !NOMODES */
258 }
259
260 /* add one or more users to a chanid */
261 static void do_addusers(int chanid, char *users)
262 {
263 int op, voice, halfop, owner, protect;
264 char *nextusers;
265 int nickid;
266 while (users && (*users))
267 {
268 #if defined(IRCD_UNREAL)
269 /* Unreal uses SJOIN to send bans and exempts. Just ignore them. */
270 if ((*users == '&') || (*users == '\"'))
271 {
272 nextusers = strchr(users, ' ');
273 if (nextusers)
274 *nextusers = '\0';
275 users = nextusers;
276 if (users)
277 users++;
278 continue;
279 }
280 #endif
281 op = 0;
282 halfop = 0;
283 voice = 0;
284 owner = 0;
285 protect = 0;
286 #if defined(IRCD_ULTIMATE)||defined(IRCD_ULTI28)
287 #if defined(IRCD_ULTIMATE)
288 if ((*users == '!') || (*users == '¤'))
289 {
290 users++;
291 owner = 1;
292 }
293 #endif
294 if (*users == '*')
295 {
296 users++;
297 owner = 1;
298 }
299 if (*users == '%')
300 {
301 users++;
302 halfop = 1;
303 }
304 #endif
305 if (*users == '@')
306 {
307 users++;
308 op = 1;
309 }
310 if (*users == '+')
311 {
312 users++;
313 voice = 1;
314 }
315 #if defined(IRCD_UNREAL)||defined(IRCD_HYBRID)
316 if (*users == '%')
317 {
318 users++;
319 halfop = 1;
320 }
321 #endif
322 #if defined(IRCD_UNREAL)
323 if (*users == '*')
324 {
325 users++;
326 owner = 1;
327 }
328 if (*users == '~')
329 {
330 users++;
331 protect = 1;
332 }
333 #endif
334 nextusers = strchr(users, ' ');
335 if (nextusers)
336 *nextusers = '\0';
337 users = db_escape(users);
338 nickid = db_checknick(users);
339 if (nickid != -1)
340 {
341 #if defined(IRCD_BAHAMUT)||defined(IRCD_IRCDRU)
342 db_query("INSERT INTO " TBL_ISON
343 " (nickid, chanid, mode_lo, mode_lv) VALUES (\'%d\', \'%d\',\'%s\',\'%s\')",
344 nickid, chanid, (op ? "Y" : "N"), (voice ? "Y" : "N"));
345 #elif defined(IRCD_UNREAL)
346 db_query("INSERT IGNORE INTO " TBL_ISON
347 " (nickid, chanid, mode_lo, mode_lv, mode_lq, mode_lh, mode_la) VALUES (\'%d\', \'%d\',\'%s\',\'%s\',\'%s\',\'%s\',\'%s\')",
348 nickid, chanid, (op ? "Y" : "N"), (voice ? "Y" : "N"),
349 (owner ? "Y" : "N"), (halfop ? "Y" : "N"),
350 (protect ? "Y" : "N"));
351 #elif defined(IRCD_HYBRID)
352 db_query("INSERT INTO " TBL_ISON
353 " (nickid, chanid, mode_lo, mode_lv, mode_lh) VALUES (\'%d\', \'%d\',\'%s\',\'%s\', \'%s\')",
354 nickid, chanid, (op ? "Y" : "N"), (voice ? "Y" : "N"),
355 (halfop ? "Y" : "N"));
356 #elif defined(IRCD_ULTI28)
357 db_query("INSERT INTO " TBL_ISON
358 " (nickid, chanid, mode_lo, mode_lv, mode_lh) VALUES (\'%d\', \'%d\',\'%s\',\'%s\',\'%s\')",
359 nickid, chanid, (op ? "Y" : "N"), (voice ? "Y" : "N"),
360 (halfop ? "Y" : "N"));
361 #elif defined(IRCD_ULTIMATE)
362 db_query("INSERT INTO " TBL_ISON
363 " (nickid, chanid, mode_lo, mode_lv, mode_lh, mode_la) VALUES (\'%d\', \'%d\',\'%s\',\'%s\',\'%s\',\'%s\')",
364 nickid, chanid, (op ? "Y" : "N"), (voice ? "Y" : "N"),
365 (halfop ? "Y" : "N"), (owner ? "Y" : "N"));
366 #endif
367 }
368 else
369 {
370 mylog("received join of non-existing user %s on channel ID %d",
371 users, chanid);
372 }
373 free(users);
374 users = nextusers;
375 if (users)
376 users++;
377 }
378 }
379
380 /* add modes to a nickid */
381 static void do_usermodes(int nickid, char *modes)
382 {
383 #ifndef NOMODES
384 int atleastone = 0;
385 char db[1000]; /*should be enough for long queries */
386 char tmp[14] = "mode_XX=\"X\", ";
387 strcpy(db, "UPDATE " TBL_USER " SET ");
388 while (*modes)
389 {
390 switch (*modes)
391 {
392 case '+':
393 tmp[9] = 'Y';
394 break;
395 case '-':
396 tmp[9] = 'N';
397 break;
398 default:
399 if (!strchr(USERMODES, *modes))
400 {
401 if (!log_umode[(int) *modes])
402 {
403 mylog("unknown mode : usermode %c (in %s)", *modes, inbuf);
404 log_umode[(int) *modes] = TRUE;
405 }
406 }
407 else
408 {
409 atleastone = 1;
410 tmp[5] = ((*modes >= 'a') ? 'l' : 'u');
411 #if defined(IRCD_UNREAL)||defined(IRCD_ULTIMATE)
412 if (tmp[9] == 'N' && *modes == 'x') /* lame Unreal ... */
413 db_query
414 ("UPDATE " TBL_USER
415 " SET hiddenhostname='*' WHERE nickid='%d'", nickid);
416 #endif
417 tmp[6] = tolower(*modes);
418 strcat(db, tmp);
419 }
420 break;
421 }
422 modes++;
423 }
424 if (atleastone)
425 {
426 sprintf(&db[strlen(db) - 2], " WHERE nickid=\'%d\'", nickid);
427 db_query(db);
428 }
429 #endif /* !NOMODES */
430 }
431
432 /*************************************************************************/
433 /*
434 * IRC messages handlers
435 */
436
437 /* SERVER */
438 void do_server(char *server, char *comment, char *linkedto)
439 {
440 int servid;
441 int add = 1;
442 server = db_escape(server);
443 comment = db_escape(comment);
444 linkedto = db_escape(linkedto);
445 if (ServerCacheTime && ((servid = db_checkserver(server)) != -1))
446 {
447 db_query("UPDATE " TBL_SERV
448 " SET server=\"%s\", comment=\"%s\", linkedto=\"%d\", connecttime=NOW(), online=\"Y\" WHERE servid=\"%d\"",
449 server, comment, db_getserver(linkedto), servid);
450 db_addserver(server, servid);
451 add = 0;
452 }
453 if (add)
454 {
455 db_query
456 ("INSERT INTO " TBL_SERV
457 " (server, comment, linkedto, connecttime) VALUES(\'%s\','\%s\',\'%d\', NOW())",
458 server, comment, db_getserver(linkedto));
459 db_addserver(server, db_insertid());
460 }
461 if (ServerCacheTime)
462 db_cleanserver();
463 free(server);
464 free(comment);
465 free(linkedto);
466 nbservs++;
467 do_checknbservsmax();
468 }
469
470 /* SQUIT */
471 void do_squit(char *server)
472 {
473 server = db_escape(server);
474 if (ServerCacheTime)
475 {
476 db_query("UPDATE " TBL_SERV
477 " SET online=\"N\", lastsplit=NOW(),linkedto=NULL WHERE servid=\"%d\"",
478 db_getserver(server));
479 db_cleanserver();
480 }
481 else
482 {
483 db_query("DELETE FROM " TBL_SERV " WHERE server=\'%s\'", server);
484 db_delserver(server);
485 }
486 free(server);
487 nbservs--;
488 }
489
490 /* NICK (new nick) */
491 void do_nick_new(int ac, char **av)
492 {
493 char *nick, *realname, *hostname, *username, *serv;
494 #ifndef IRCD_ULTI28
495 char *hiddenhost;
496 #endif
497 #if !(defined(IRCD_UNREAL)||defined(IRCD_HYBRID)||defined(IRCD_ULTI28))
498 char *ipaddr;
499 #endif
500 unsigned int connecttime;
501 int servid;
502 int add = 1;
503 int nickid;
504
505 nick = db_escape(av[0]);
506 connecttime = atoi(av[2]);
507 #if defined(IRCD_BAHAMUT)||defined(IRCD_ULTIMATE)||defined(IRCD_IRCDRU)||defined(IRCD_HYBRID)
508 username = db_escape(av[4]);
509 hostname = db_escape(av[5]);
510 serv = db_escape(av[6]);
511 #if defined(IRCD_HYBRID)
512 hiddenhost = "";
513 realname = db_escape(av[7]);
514 #else
515 hiddenhost = "";
516 ipaddr = do_ipdecode(av[8]);
517 realname = db_escape(av[9]);
518 #endif
519 #elif defined(IRCD_UNREAL)||defined(IRCD_ULTI28)
520 username = db_escape(av[3]);
521 hostname = db_escape(av[4]);
522 serv = db_escape(av[5]);
523 #ifdef IRCD_UNREAL
524 hiddenhost = db_escape(av[8]);
525 realname = db_escape(av[9]);
526 #else
527 realname = db_escape(av[7]);
528 #endif
529 #endif
530 servid = db_getserver(serv);
531
532 if (UserCacheTime && ((nickid = db_checknick(nick)) != -1))
533 {
534 #if defined(IRCD_BAHAMUT)||defined(IRCD_IRCDRU) /* with nickip */
535 db_query
536 ("UPDATE " TBL_USER
537 " SET nick=\'%s\', realname=\'%s\', hostname=\'%s\', ipaddr=\'%s\', username=\'%s\', connecttime=FROM_UNIXTIME(\'%d\'), servid=\'%d\',lastquit=NULL, online=\'Y\', away=\'N\', awaymsg=\'\' WHERE nickid=\'%d\'",
538 nick, realname, hostname, ipaddr, username, connecttime, servid,
539 nickid);
540 #elif defined(IRCD_ULTIMATE) /* with nickip & hiddenhost */
541 db_query
542 ("UPDATE " TBL_USER
543 " SET nick=\'%s\', realname=\'%s\', hostname=\'%s\', hiddenhostname=\"%s\", ipaddr=\'%s\', username=\'%s\', connecttime=FROM_UNIXTIME(\'%d\'), servid=\'%d\', lastquit=NULL, online=\'Y\', away=\'N\', awaymsg=\'\' WHERE nickid=\'%d\'",
544 nick, realname, hostname, hiddenhost, ipaddr, username,
545 connecttime, servid, nickid);
546 #elif defined(IRCD_UNREAL)||defined(IRCD_HYBRID) /* with hiddenhost */
547 db_query
548 ("UPDATE " TBL_USER
549 " SET nick=\'%s\', realname=\'%s\', hostname=\'%s\', hiddenhostname=\"%s\", username=\'%s\', connecttime=FROM_UNIXTIME(\'%d\'), servid=\'%d\', lastquit=NULL, online=\'Y\', away=\'N\', awaymsg=\'\' WHERE nickid=\'%d\'",
550 nick, realname, hostname, hiddenhost, username, connecttime,
551 servid, nickid);
552 #elif defined(IRCD_ULTI28) /* without nickip */
553 db_query
554 ("UPDATE " TBL_USER
555 " SET nick=\'%s\', realname=\'%s\', hostname=\'%s\', username=\'%s\', connecttime=FROM_UNIXTIME(\'%d\'), servid=\'%d\',lastquit=NULL, online=\'Y\', away=\'N\', awaymsg=\'\' WHERE nickid=\'%d\'",
556 nick, realname, hostname, username, connecttime, servid, nickid);
557 #endif
558 add = 0;
559 }
560 if (add)
561 {
562 #if defined(IRCD_BAHAMUT)||defined(IRCD_IRCDRU) /* with nickip */
563 db_query
564 ("INSERT INTO " TBL_USER
565 " (nick, realname, hostname, ipaddr, username, connecttime, servid) VALUES(\'%s\',\'%s\',\'%s\',\'%s\',\'%s\',FROM_UNIXTIME(\'%d\'),\'%d\')",
566 nick, realname, hostname, ipaddr, username, connecttime, servid);
567 #elif defined(IRCD_ULTIMATE) /* with nickip & hiddenhost */
568 db_query
569 ("INSERT INTO " TBL_USER
570 " (nick, realname, hostname, hiddenhostname, ipaddr, username, connecttime, servid) VALUES(\'%s\',\'%s\',\'%s\',\'%s\',\'%s\',\'%s\',FROM_UNIXTIME(\'%d\'),\'%d\')",
571 nick, realname, hostname, hiddenhost, ipaddr, username,
572 connecttime, servid);
573 #elif defined(IRCD_UNREAL)||defined(IRCD_HYBRID) /* with hiddenhost */
574 db_query
575 ("INSERT INTO " TBL_USER
576 " (nick, realname, hostname, hiddenhostname, username, connecttime, servid) VALUES(\'%s\',\'%s\',\'%s\',\'%s\',\'%s\',FROM_UNIXTIME(\'%d\'),\'%d\')",
577 nick, realname, hostname, hiddenhost, username, connecttime,
578 servid);
579 #elif defined(IRCD_ULTI28) /* without nickip */
580 db_query
581 ("INSERT INTO " TBL_USER
582 " (nick, realname, hostname, username, connecttime, servid) VALUES(\'%s\',\'%s\',\'%s\',\'%s\',FROM_UNIXTIME(\'%d\'),\'%d\')",
583 nick, realname, hostname, username, connecttime, servid);
584 #endif
585 db_addnick(nick, db_insertid());
586 }
587 if (UserCacheTime)
588 db_cleanuser();
589 free(nick);
590 free(username);
591 free(hostname);
592 free(serv);
593 #if defined(IRCD_UNREAL)
594 free(hiddenhost);
595 #endif
596 free(realname);
597 #if defined(IRCD_BAHAMUT)||defined(IRCD_ULTIMATE)||defined(IRCD_IRCDRU)||defined(IRCD_HYBRID)
598 do_usermodes(db_insertid(), av[3]);
599 #elif defined(IRCD_UNREAL)
600 do_usermodes(db_insertid(), av[7]);
601 #endif
602 nbusers++;
603 do_checknbusersmax();
604 }
605
606 /* NICK (nick change) */
607 void do_nick_chg(char *newnick, char *oldnick)
608 {
609 int nickid;
610
611 newnick = db_escape(newnick);
612 oldnick = db_escape(oldnick);
613 /* the target nickname might already exist if caching is enabled */
614 if (UserCacheTime && (strcasecmp(newnick, oldnick))
615 && ((nickid = db_checknick(newnick)) != -1))
616 {
617 /* In this case, we don't keep a record of the old nick. It would be :
618 * - technically difficult, because we'd have to make a copy of the record
619 * - dangerous, because it would provide an easy way to fill up the DB */
620 db_delnick(newnick);
621 db_query("DELETE from " TBL_USER " WHERE nickid=\'%d\'", nickid);
622 }
623 /* we update the nickname */
624 db_query("UPDATE " TBL_USER " SET nick=\'%s\' WHERE nick=\'%s\'",
625 newnick, oldnick);
626 db_chgnick(newnick, oldnick);
627 free(newnick);
628 free(oldnick);
629 }
630
631 /* PART */
632 void do_part(char *chan, char *nick)
633 {
634 chan = db_escape(chan);
635 nick = db_escape(nick);
636 db_query("DELETE FROM " TBL_ISON
637 " WHERE nickid=\'%d\' AND chanid=\'%d\'", db_getnick(nick),
638 db_getchannel(chan));
639 db_checkemptychan(db_getchannel(chan), chan);
640 free(chan);
641 free(nick);
642 }
643
644 /* JOIN - join 0 */
645 void do_partall(char *nick)
646 {
647 nick = db_escape(nick);
648 db_removefromchans(db_getnick(nick));
649 free(nick);
650 }
651
652 /* JOIN */
653 void do_join(char *chan, char *nick)
654 {
655 chan = db_escape(chan);
656 /* we don't escape nick because do_addusers does. */
657 do_addusers(db_getchancreate(chan), nick);
658 free(chan);
659 }
660
661 /* QUIT */
662 void do_quit(char *nick)
663 {
664 nick = db_escape(nick);
665 db_removenick(nick); /* sql */
666 if (UserCacheTime)
667 {
668 db_cleanuser();
669 }
670 else
671 {
672 db_delnick(nick); /* hash */
673 }
674 free(nick);
675 nbusers--;
676 }
677
678 /* SJOIN */
679 void do_sjoin(char *chan, char *users, char **modes, int nbmodes)
680 {
681 chan = db_escape(chan);
682 do_addusers(db_getchancreate(chan), users);
683 if (nbmodes)
684 do_chanmodes(db_getchannel(chan), modes, nbmodes);
685 free(chan);
686 }
687
688 /* [SVS]MODE - user */
689 void do_umode(char *nick, char *modes)
690 {
691 nick = db_escape(nick);
692 do_usermodes(db_getnick(nick), modes);
693 free(nick);
694 }
695
696 /* [SVS]MODE - channel */
697 void do_cmode(char *chan, char **modes, int nbmodes)
698 {
699 chan = db_escape(chan);
700 do_chanmodes(db_getchannel(chan), modes, nbmodes);
701 free(chan);
702 }
703
704 /* TOPIC */
705 /* hybrid7 patches -iwes */
706 #ifdef IRCD_HYBRID
707 void do_topic(char *author, char *chan, char *topic)
708 {
709 chan = db_escape(chan);
710 author = db_escape(author);
711 topic = db_escape(topic);
712 db_query
713 ("UPDATE " TBL_CHAN
714 " SET topic=\'%s\', topicauthor=\'%s\', topictime=NOW() WHERE chanid=\'%d\'",
715 topic ? topic : "", author, db_getchannel(chan));
716 free(chan);
717 free(author);
718 if (topic)
719 free(topic);
720 }
721 #else /* regular topic */
722 void do_topic(char *chan, char *author, char *time, char *topic)
723 {
724 chan = db_escape(chan);
725 author = db_escape(author);
726 topic = db_escape(topic);
727 db_query
728 ("UPDATE " TBL_CHAN
729 " SET topic=\'%s\', topicauthor=\'%s\', topictime=FROM_UNIXTIME(\'%s\') WHERE chanid=\'%d\'",
730 topic ? topic : "", author, time, db_getchannel(chan));
731 free(chan);
732 free(author);
733 if (topic)
734 free(topic);
735 }
736 #endif /* IRCD_HYBRID */
737
738 /* TBURST -iwes */
739 #ifdef IRCD_HYBRID
740 void do_tburst(char *chan, char *time, char *author, char *topic)
741 {
742 chan = db_escape(chan);
743 author = db_escape(author);
744 topic = db_escape(topic);
745 db_query
746 ("UPDATE " TBL_CHAN
747 " SET topic=\'%s\', topicauthor=\'%s\', topictime=FROM_UNIXTIME(\'%s\') WHERE chanid=\'%d\'",
748 topic ? topic : "", author, time, db_getchannel(chan));
749 free(chan);
750 free(author);
751 if (topic)
752 free(topic);
753 }
754 #endif /* IRCD_HYBRID */
755
756
757 /* AWAY set */
758 void do_away_set(char *nick, char *msg)
759 {
760 nick = db_escape(nick);
761 msg = db_escape(msg);
762 db_query("UPDATE " TBL_USER
763 " SET away=\'Y\', awaymsg=\'%s\' WHERE nickid=\'%d\'", msg,
764 db_getnick(nick));
765 free(nick);
766 free(msg);
767 }
768
769 /* AWAY unset */
770 void do_away_unset(char *nick)
771 {
772 nick = db_escape(nick);
773 db_query("UPDATE " TBL_USER
774 " SET away=\'N\', awaymsg=\'\' WHERE nickid=\'%d\'",
775 db_getnick(nick));
776 free(nick);
777 }
778
779 /* LUSERS queries */
780 void do_lusers(char *nick)
781 {
782 send_cmd(ServerName,
783 "251 %s :There are %d users and %d invisible on %d servers",
784 nick, db_getlusers(LUSERS_USERS),
785 db_getlusers(LUSERS_USERSINV), db_getlusers(LUSERS_SERV));
786 send_cmd(ServerName, "252 %s :%d :IRC Operators online", nick,
787 db_getlusers(LUSERS_OPERS));
788 send_cmd(ServerName, "254 %s :%d :channels formed", nick, nbchans,
789 db_getlusers(LUSERS_CHAN));
790 send_cmd(ServerName, "255 %s :I have 0 clients and 1 servers", nick);
791 send_cmd(ServerName, "265 %s :Current local users: 0 Max: 0", nick);
792 send_cmd(ServerName, "266 %s :Current global users: %d Max: %d", nick,
793 db_getlusers(LUSERS_USERSGLOB), db_getlusers(LUSERS_USERSMAX));
794 }
795
796 #if defined(IRCD_UNREAL)||defined(IRCD_ULTIMATE)||defined(IRCD_ULTI28)
797 /* (CHG|SET)HOST */
798 void do_defhost(char *user, char *msg)
799 {
800 user = db_escape(user);
801 msg = db_escape(msg);
802 db_query
803 ("UPDATE " TBL_USER
804 " SET mode_lx=\'Y\', mode_lt=\'Y\', hiddenhostname=\'%s\' WHERE nickid=\'%d\'",
805 msg, db_getnick(user));
806 free(msg);
807 free(user);
808 }
809
810 #endif
811
812 #if defined(IRCD_UNREAL)||defined(IRCD_ULTI28)
813
814 /* (CHG|SET)NAME */
815 void do_defname(char *user, char *msg)
816 {
817 user = db_escape(user);
818 msg = db_escape(msg);
819 db_query
820 ("UPDATE " TBL_USER " SET realname=\'%s\' WHERE nickid=\'%d\'",
821 msg, db_getnick(user));
822 free(msg);
823 free(user);
824 }
825
826 /* (CHG|SET)IDENT */
827 void do_defident(char *user, char *msg)
828 {
829 user = db_escape(user);
830 msg = db_escape(msg);
831 db_query
832 ("UPDATE " TBL_USER " SET username=\'%s\' WHERE nickid=\'%d\'",
833 msg, db_getnick(user));
834 free(msg);
835 free(user);
836 }
837 #endif
838
839 #ifdef IRCD_UNREAL
840
841 /* SDESC */
842 void do_sdesc(char *user, char *msg)
843 {
844 user = db_escape(user);
845 msg = db_escape(msg);
846 db_query("UPDATE " TBL_SERV " SET comment=\'%s\' WHERE servid=\'%d\'",
847 msg, db_getservfromnick(user));
848 free(user);
849 free(msg);
850 }
851
852 void do_swhois(char * user, char * msg)
853 {
854 user = db_escape(user);
855 msg = db_escape(msg);
856 db_query
857 ("UPDATE " TBL_USER " SET swhois=\'%s\' WHERE nickid=\'%d\'",
858 msg, db_getnick(user));
859 free(user);
860 free(msg);
861 }
862
863 #endif
864
865 #ifdef IRCD_HYBRID
866 /* REALHOST */
867 void do_realhost(char *user, char *host)
868 {
869 user = db_escape(user);
870 host = db_escape(host);
871 db_query("UPDATE " TBL_USER
872 " SET hiddenhostname=\'%s\' WHERE nickid=\'%d\'", host,
873 db_getnick(user));
874 free(user);
875 free(host);
876 }
877
878 #endif