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