29
29
#include "tandem.h"
31
extern Tcl_Interp *interp;
32
extern struct userrec *userlist;
33
extern int default_flags, dcc_total, ignore_time;
34
extern struct dcc_t *dcc;
35
extern char origbotname[], botnetnick[];
32
extern Tcl_Interp *interp;
33
extern struct userrec *userlist;
34
extern int default_flags, dcc_total, ignore_time;
35
extern struct dcc_t *dcc;
36
extern char origbotname[], botnetnick[];
39
40
static int tcl_countusers STDVAR
42
44
Tcl_AppendResult(irp, int_to_base10(count_users(userlist)), NULL);
225
235
BADARGS(3, 4, " handle flags ?channel?");
226
237
if ((u = get_user_by_handle(userlist, argv[1]))) {
227
238
user.match = FR_GLOBAL | (argc == 4 ? FR_CHAN : 0) | FR_BOT;
228
239
get_user_flagrec(u, &user, argv[3]);
229
240
plus.match = user.match;
230
241
break_down_flags(argv[2], &plus, &minus);
231
f = (minus.global || minus.udef_global || minus.chan ||
232
minus.udef_chan || minus.bot);
242
f = (minus.global ||minus.udef_global || minus.chan || minus.udef_chan ||
233
244
if (flagrec_eq(&plus, &user)) {
237
minus.match = plus.match ^ (FR_AND | FR_OR);
238
if (!flagrec_eq(&minus, &user))
248
minus.match = plus.match ^ (FR_AND | FR_OR);
249
if (!flagrec_eq(&minus, &user))
266
278
BADARGS(3, 3, " handle address");
267
280
if (strlen(argv[1]) > HANDLEN)
268
argv[1][HANDLEN] = 0;
281
argv[1][HANDLEN] = 0;
269
282
if (get_user_by_handle(userlist, argv[1]))
270
Tcl_AppendResult(irp, "0", NULL);
283
Tcl_AppendResult(irp, "0", NULL);
271
284
else if (argv[1][0] == '*')
272
Tcl_AppendResult(irp, "0", NULL);
285
Tcl_AppendResult(irp, "0", NULL);
274
287
userlist = adduser(userlist, argv[1], "none", "-", USER_BOT);
275
288
bi = user_malloc(sizeof(struct bot_addr));
300
313
static int tcl_deluser STDVAR
302
315
BADARGS(2, 2, " handle");
303
317
Tcl_AppendResult(irp, (argv[1][0] == '*') ? "0" :
304
int_to_base10(deluser(argv[1])), NULL);
318
int_to_base10(deluser(argv[1])), NULL);
308
322
static int tcl_delhost STDVAR
310
324
BADARGS(3, 3, " handle hostmask");
311
326
if ((!get_user_by_handle(userlist, argv[1])) || (argv[1][0] == '*')) {
312
327
Tcl_AppendResult(irp, "non-existent user", NULL);
313
328
return TCL_ERROR;
315
Tcl_AppendResult(irp, delhost_by_handle(argv[1], argv[2]) ? "1" : "0",
330
Tcl_AppendResult(irp, delhost_by_handle(argv[1], argv[2]) ? "1" : "0", NULL);
332
347
plus.match = FR_GLOBAL | FR_CHAN | FR_BOT;
333
348
break_down_flags(argv[1], &plus, &minus);
334
f = (minus.global || minus.udef_global || minus.chan ||
335
minus.udef_chan || minus.bot);
349
f = (minus.global ||minus.udef_global || minus.chan || minus.udef_chan ||
337
352
minus.match = plus.match ^ (FR_AND | FR_OR);
338
353
for (u = userlist; u; u = u->next) {
340
355
user.match = FR_GLOBAL | FR_CHAN | FR_BOT | (argc == 3 ? 0 : FR_ANYWH);
342
get_user_flagrec(u, &user, argv[2]);
357
get_user_flagrec(u, &user, argv[2]);
344
get_user_flagrec(u, &user, NULL);
359
get_user_flagrec(u, &user, NULL);
346
360
if (flagrec_eq(&plus, &user) && !(f && flagrec_eq(&minus, &user)))
352
366
Tcl_AppendElement(interp, u->handle);
375
389
BADARGS(3, 3, " oldnick newnick");
376
391
u = get_user_by_handle(userlist, argv[1]);
380
395
strncpyz(newhand, argv[2], sizeof newhand);
381
396
for (i = 0; i < strlen(newhand); i++)
382
397
if ((newhand[i] <= 32) || (newhand[i] >= 127) || (newhand[i] == '@'))
384
399
if (strchr(BADHANDCHARS, newhand[0]) != NULL)
386
401
else if (strlen(newhand) < 1)
388
403
else if (get_user_by_handle(userlist, newhand))
390
else if (!egg_strcasecmp(botnetnick, newhand) &&
391
(!(u->flags & USER_BOT) || nextbot (argv [1]) != -1))
405
else if (!egg_strcasecmp(botnetnick, newhand) && (!(u->flags & USER_BOT) ||
406
nextbot(argv[1]) != -1))
393
408
else if (newhand[0] == '*')
397
x = change_handle(u, newhand);
412
x = change_handle(u, newhand);
398
414
Tcl_AppendResult(irp, x ? "1" : "0", NULL);
488
510
Tcl_AppendResult(irp, "No such user.", NULL);
489
511
return TCL_ERROR;
491
return TCL_OK; /* silently ignore user * */
513
return TCL_OK; /* silently ignore user */
493
if (!egg_strcasecmp(argv[2], "HANDLE")) {
494
Tcl_AppendResult(irp,u->handle, NULL);
496
e = find_user_entry(et, u);
498
return et->tcl_get(irp, u, e, argc, argv);
515
if (!egg_strcasecmp(argv[2], "HANDLE"))
516
Tcl_AppendResult(irp, u->handle, NULL);
518
e = find_user_entry(et, u);
520
return et->tcl_get(irp, u, e, argc, argv);
529
559
r = et->tcl_set(irp, u, e, argc, argv);
530
560
/* Yeah... e is freed, and we read it... (tcl: setuser hand HOSTS none) */
532
if (list_delete((struct list_type **) &(u->entries),
533
(struct list_type *) e))
561
if ((!e->u.list) && (list_delete((struct list_type **) &(u->entries),
562
(struct list_type *) e)))
535
564
/* else maybe already freed... (entry_type==HOSTS) <drummer> */
565
if (me && !strcmp(argv[2], "hosts") && argc == 4) {
566
Function *func = me->funcs;
568
(func[IRC_CHECK_THIS_USER]) (argv[1], 0, NULL);
540
tcl_cmds tcluser_cmds[] =
542
{"countusers", tcl_countusers},
543
{"validuser", tcl_validuser},
544
{"finduser", tcl_finduser},
545
{"passwdok", tcl_passwdOk},
546
{"chattr", tcl_chattr},
547
{"botattr", tcl_botattr},
548
{"matchattr", tcl_matchattr},
549
{"matchchanattr", tcl_matchattr},
550
{"adduser", tcl_adduser},
551
{"addbot", tcl_addbot},
552
{"deluser", tcl_deluser},
553
{"delhost", tcl_delhost},
554
{"userlist", tcl_userlist},
556
{"reload", tcl_reload},
557
{"chhandle", tcl_chhandle},
558
{"chnick", tcl_chhandle},
559
{"getting-users", tcl_getting_users},
560
{"isignore", tcl_isignore},
561
{"newignore", tcl_newignore},
562
{"killignore", tcl_killignore},
563
{"ignorelist", tcl_ignorelist},
564
{"getuser", tcl_getuser},
565
{"setuser", tcl_setuser},
573
tcl_cmds tcluser_cmds[] = {
574
{"countusers", tcl_countusers},
575
{"validuser", tcl_validuser},
576
{"finduser", tcl_finduser},
577
{"passwdok", tcl_passwdOk},
578
{"chattr", tcl_chattr},
579
{"botattr", tcl_botattr},
580
{"matchattr", tcl_matchattr},
581
{"matchchanattr", tcl_matchattr},
582
{"adduser", tcl_adduser},
583
{"addbot", tcl_addbot},
584
{"deluser", tcl_deluser},
585
{"delhost", tcl_delhost},
586
{"userlist", tcl_userlist},
588
{"reload", tcl_reload},
589
{"chhandle", tcl_chhandle},
590
{"chnick", tcl_chhandle},
591
{"getting-users", tcl_getting_users},
592
{"isignore", tcl_isignore},
593
{"newignore", tcl_newignore},
594
{"killignore", tcl_killignore},
595
{"ignorelist", tcl_ignorelist},
596
{"getuser", tcl_getuser},
597
{"setuser", tcl_setuser},