Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
BitchX
GitHub Repository: BitchX/BitchX1.3
Path: blob/master/source/bot_link.c
1069 views
1
/*
2
* Copyright Colten Edwards. Oct 96
3
*/
4
5
#include "irc.h"
6
static char cvsrevision[] = "$Id: bot_link.c 62 2009-09-02 14:14:21Z keaston $";
7
CVS_REVISION(botlink_c)
8
#include <stdarg.h>
9
10
#include "ircaux.h"
11
#include "struct.h"
12
#include "commands.h"
13
#include "dcc.h"
14
#include "server.h"
15
#include "output.h"
16
#include "list.h"
17
#include "who.h"
18
#include "ctcp.h"
19
#include "tcl_bx.h"
20
#include "status.h"
21
#include "vars.h"
22
#include "misc.h"
23
#include "userlist.h"
24
#include "hash2.h"
25
#define MAIN_SOURCE
26
#include "modval.h"
27
28
#ifndef BITCHX_LITE
29
static int clink_active = 0;
30
static int xlink_commands = 0;
31
32
#ifndef TCL_OK
33
#define TCL_OK 0
34
#endif
35
36
#ifndef TCL_ERROR
37
#define TCL_ERROR 1
38
#endif
39
40
extern int in_add_to_tcl;
41
extern char *FromUserHost;
42
43
int BX_get_max_fd();
44
45
extern cmd_t C_dcc[];
46
47
cmd_t C_tandbot[] =
48
{
49
{ "zapf", tand_zapf, 0, NULL },
50
{ "zapf-broad", tand_zapfbroad, 0, NULL },
51
{ "chan", tand_chan, 0, NULL },
52
{ "part", tand_part, 0, NULL },
53
{ "join", tand_join, 0, NULL },
54
{ "who", tand_who, 0, NULL },
55
{ "whom", tand_whom, 0, NULL },
56
{ "priv", tand_priv, 0, NULL },
57
{ "boot", tand_boot, 0, NULL },
58
{ "privmsg", tand_privmsg, 0, NULL },
59
{ "clink_com", tand_clink, 0, NULL },
60
{ "command", tand_command, 0, NULL },
61
{ NULL, NULL, -1, NULL }
62
};
63
#endif
64
65
int BX_dcc_printf(int idx, char *format, ...)
66
{
67
va_list args;
68
char putbuf[BIG_BUFFER_SIZE+1];
69
int len = 0;
70
va_start(args, format);
71
vsnprintf(putbuf, BIG_BUFFER_SIZE, format, args);
72
va_end(args);
73
if (strlen(putbuf) > 510)
74
putbuf[510] = '\n';
75
putbuf[511] = '\0';
76
if (idx == -1)
77
put_it("%s", chop(putbuf, 1));
78
else
79
{
80
len = strlen(putbuf);
81
send(idx, putbuf, len, 0);
82
}
83
return len;
84
}
85
86
#ifndef BITCHX_LITE
87
void tandout_but(int idx, char *format, ...)
88
{
89
va_list args;
90
char putbuf[BIG_BUFFER_SIZE+1];
91
SocketList *s;
92
int i;
93
va_start(args, format);
94
vsnprintf(putbuf, BIG_BUFFER_SIZE, format, args);
95
va_end(args);
96
97
for (i = 0; i < get_max_fd()+1; i++)
98
{
99
if (!check_dcc_socket(i) || (idx == i))
100
continue;
101
s = get_socket(i);
102
if (((s->flags & DCC_TYPES) == DCC_BOTMODE) && s->flags & DCC_ACTIVE)
103
send(i, putbuf, strlen(putbuf), 0);
104
}
105
}
106
107
void chanout_but(int idx, char *format, ...)
108
{
109
va_list args;
110
char putbuf[BIG_BUFFER_SIZE+1];
111
SocketList *s;
112
int i;
113
va_start(args, format);
114
vsnprintf(putbuf, BIG_BUFFER_SIZE, format, args);
115
va_end(args);
116
117
for (i = 0; i < get_max_fd()+1; i++)
118
{
119
DCC_int *n;
120
if (!check_dcc_socket(i) || (idx == i)) continue;
121
s = get_socket(i);
122
if (!(s->flags & DCC_ACTIVE)) continue;
123
n = get_socketinfo(i);
124
125
if (idx != i && (s->flags & DCC_BOTCHAT))
126
send(i, putbuf, strlen(putbuf), 0);
127
else if (idx == i && (s->flags & DCC_ECHO))
128
send(i, putbuf, strlen(putbuf), 0);
129
}
130
}
131
132
BUILT_IN_COMMAND(csay)
133
{
134
int found = 0;
135
SocketList *s;
136
char *t = NULL;
137
int i;
138
if (!args || !*args)
139
return;
140
for (i = 0; i < get_max_fd()+1; i++)
141
{
142
if (!check_dcc_socket(i)) continue;
143
s = get_socket(i);
144
if (s->flags & DCC_ACTIVE)
145
{
146
DCC_int *n;
147
n = get_socketinfo(i);
148
if ((s->flags & DCC_TYPES) == DCC_BOTMODE)
149
{
150
n->bytes_sent += dcc_printf(i, "chan %s %d %s@%s %s\n", get_server_nickname(from_server), 0, get_server_nickname(from_server), get_server_nickname(from_server), args);
151
found++;
152
}
153
else if (((s->flags & DCC_TYPES) == DCC_CHAT) && (s->flags & DCC_BOTCHAT))
154
{
155
n->bytes_sent += dcc_printf(i, "[%s@%s] %s\n", get_server_nickname(from_server), get_server_nickname(from_server), args);
156
found++;
157
}
158
}
159
}
160
new_free(&t);
161
162
if (!found)
163
bitchsay("No Active bot link");
164
else
165
put_it("%s", convert_output_format("%K(%R$1%K(%rxlink%K))%n $2-", "%s %s %s", update_clock(GET_TIME), get_server_nickname(from_server), args));
166
}
167
168
BUILT_IN_COMMAND(cwho)
169
{
170
int whom = 0;
171
SocketList *s;
172
int i;
173
whom = !my_stricmp(command, "cwhom");
174
whom ? tell_whom(-1, NULL) : tell_who(-1, NULL);
175
for (i = 0; i < get_max_fd()+1; i++)
176
{
177
if (!check_dcc_socket(i)) continue;
178
s = get_socket(i);
179
if (s->flags & DCC_ACTIVE)
180
{
181
if ((s->flags & DCC_TYPES) == DCC_BOTMODE)
182
{
183
if (whom)
184
dcc_printf(i, "whom %d:%s@%s %s %d\n",
185
-1, get_server_nickname(from_server), get_server_nickname(from_server), args?args:empty_string, 0);
186
else
187
send_who(-1, empty_string);
188
}
189
}
190
}
191
}
192
193
BUILT_IN_COMMAND(cboot)
194
{
195
char *nick, *reason;
196
int i;
197
SocketList *s;
198
nick = next_arg(args, &args);
199
reason = args ? args: "We don't like you";
200
if (!nick)
201
return;
202
for (i = 0; i < get_max_fd(); i++)
203
{
204
if (!check_dcc_socket(i)) continue;
205
s = get_socket(i);
206
if (s->flags & DCC_ACTIVE)
207
{
208
if ((s->flags & DCC_TYPES) == DCC_CHAT && (s->flags & DCC_BOTCHAT))
209
dcc_printf(i, ".boot %s %s %s\n", get_server_nickname(from_server), nick, reason);
210
}
211
}
212
}
213
214
BUILT_IN_COMMAND(toggle_xlink)
215
{
216
xlink_commands ^= 1;
217
put_it("X-link commands toggled %s", on_off(xlink_commands));
218
}
219
220
BUILT_IN_COMMAND(cmsg)
221
{
222
char *nick, *reason;
223
SocketList *s;
224
int i;
225
nick = next_arg(args, &args);
226
reason = args;
227
if (!nick)
228
return;
229
for (i = 0; i < get_max_fd()+1; i++)
230
{
231
if (!check_dcc_socket(i)) continue;
232
s = get_socket(i);
233
if ((s->flags & DCC_ACTIVE) && ((s->flags & DCC_TYPES) == DCC_CHAT) && (s->flags & DCC_BOTCHAT))
234
dcc_printf(i, ".cmsg %s %s\n", nick, reason);
235
}
236
}
237
238
void userhost_clink(UserhostItem *stuff, char *nick, char *args)
239
{
240
if (!stuff || !stuff->nick || !nick || !strcmp(stuff->user, "<UNKNOWN>") || my_stricmp(stuff->nick, nick))
241
{
242
bitchsay("No information for %s found", nick);
243
return;
244
}
245
bitchsay("Attempting Clink to %s!%s@%s", nick, stuff->user, stuff->host);
246
send_ctcp(CTCP_PRIVMSG, nick, CTCP_BOTLINK, "%s", args);
247
clink_active++;
248
}
249
250
BUILT_IN_COMMAND(clink)
251
{
252
char *nick;
253
NickList *Nick = NULL;
254
ChannelList *chan;
255
int i = 0;
256
nick = next_arg(args, &args);
257
if (nick)
258
{
259
for (i = 0; i < server_list_size(); i++)
260
for (chan = get_server_channels(i); chan; chan = chan->next)
261
if ((Nick = find_nicklist_in_channellist(nick, chan, 0)))
262
break;
263
if (Nick)
264
{
265
if (Nick->userlist && (Nick->userlist->flags & ADD_BOT))
266
bitchsay("Attempting clink with %s!%s", Nick->nick, Nick->host);
267
send_ctcp(CTCP_PRIVMSG, nick, CTCP_BOTLINK, "%s", args);
268
clink_active++;
269
}
270
else
271
userhostbase(nick, userhost_clink, 1, "%s", args);
272
}
273
}
274
275
int handle_tcl_chan(int idx, char *user, char *host, char *text)
276
{
277
tandout_but(idx, "chan %s %d %s@%s %s\n", get_server_nickname(from_server), 0, user, get_server_nickname(from_server), text);
278
chanout_but(idx, "[%s@%s] %s\n", user, get_server_nickname(from_server), text);
279
put_it("%s", convert_output_format("%K(%R$1%K(%rxlink%K))%n $2-", "%s %s %s", update_clock(GET_TIME), user, text));
280
return 0;
281
}
282
283
int tand_chan(int idx, char *par)
284
{
285
char *bot;
286
char *chan;
287
char *who;
288
char *uhost;
289
/*
290
tand_chan (idx=7, par=0x8140009 "panasync 0 sabina@botnick testing\r")
291
*/
292
bot = next_arg(par, &par);
293
chan = next_arg(par, &par);
294
who = next_arg(par, &par);
295
if (!who || !chan || !bot)
296
return 0;
297
tandout_but(idx, "chan %s %d %s %s\n", get_server_nickname(from_server), 0, who, par);
298
chanout_but(idx, "%s %s\n", who, par);
299
if ((uhost = strchr(who, '@')))
300
*uhost++ = '\0';
301
put_it("%s", convert_output_format("%K[%RxLink%Y$1%K(%r$2%K)] %n$3-", "%s %s %s %s", update_clock(GET_TIME), who, uhost?uhost:"u@h", par));
302
return 0;
303
}
304
305
int tand_zapf(int idx, char *par)
306
{
307
char *from, *to;
308
SocketList *s = NULL, *s1 = NULL;
309
#ifdef WANT_TCL
310
char *opcode;
311
#endif
312
from = next_arg(par, &par);
313
to = next_arg(par, &par);
314
if (!(s = find_dcc(from, "chat", NULL, DCC_BOTMODE, 0, 1, -1)) || s->is_read != idx)
315
return 0;
316
#ifdef WANT_TCL
317
if (!my_stricmp(to, get_server_nickname(from_server)))
318
{
319
opcode = next_arg(par, &par);
320
check_tcl_tand(from, opcode, par);
321
return 0;
322
}
323
#endif
324
s1 = find_dcc(to, "chat", NULL, DCC_BOTMODE, 0, 1, -1);
325
if (!s1)
326
tandout_but(idx, "zapf %s %s %s\n", from, to, par);
327
else
328
dcc_printf(s1->is_read, "zapf %s %s %s\n", from, to, par);
329
return 0;
330
}
331
332
/* used to send a global msg from Tcl on one bot to every other bot */
333
/* zapf-broad <frombot> <code [param]> */
334
int tand_zapfbroad(int idx, char *par)
335
{
336
char *from, *opcode;
337
338
339
from = next_arg(par, &par);
340
opcode = next_arg(par, &par);
341
342
#ifdef WANT_TCL
343
check_tcl_tand(from, opcode, par);
344
#endif
345
tandout_but(idx, "zapf-broad %s %s %s\n", from, opcode, par);
346
return 0;
347
}
348
349
350
int handle_dcc_bot(int idx, char *param)
351
{
352
char *code;
353
int i = 0;
354
int found = 0;
355
code = next_arg(param, &param);
356
if (!code)
357
return 0;
358
while (C_tandbot[i].access != -1)
359
{
360
if (!my_stricmp(code, C_tandbot[i].name))
361
{
362
(C_tandbot[i].func)(idx, param);
363
found = 1;
364
break;
365
}
366
i++;
367
}
368
return found;
369
}
370
371
372
int tand_join (int idx, char *args)
373
{
374
char *bot, *nick;
375
bot = next_arg(args, &args);
376
nick = next_arg(args, &args);
377
tandout_but(idx, "join %s %s %d\n", bot, nick, 0);
378
chanout_but(idx, "[%s@%s] has entered the TwilightZone\n", nick, bot);
379
put_it("%s", convert_output_format("%K[%RxLink%Y$1%K(%r$2%K)] %n$3-", "%s %s %s %s", update_clock(GET_TIME), nick, bot, "entered the TwilightZone"));
380
return 0;
381
}
382
383
int tand_part (int idx, char *args)
384
{
385
char *bot, *nick;
386
bot = next_arg(args, &args);
387
nick = next_arg(args, &args);
388
tandout_but(idx, "part %s %s\n", bot, nick);
389
chanout_but(idx, "[%s@%s] has left the TwilightZone\n", nick, bot);
390
put_it("%s", convert_output_format("%K[%RxLink%Y$1%K(%r$2%K)] %n$3-", "%s %s %s %s", update_clock(GET_TIME), nick, bot, "left the TwilightZone"));
391
return 0;
392
}
393
394
int send_who_to(int idx, char *from, int arg)
395
{
396
/* dcc_printf(idx, "priv %s %s testing\n", get_server_nickname(from_server), from);*/
397
SocketList *s;
398
int found = 0;
399
int i;
400
for (i = 0; i < get_max_fd()+1; i++)
401
{
402
if (!check_dcc_socket(i)) continue;
403
s = get_socket(i);
404
if (((s->flags & DCC_TYPES) == DCC_CHAT) && (s->flags & DCC_BOTCHAT))
405
{
406
DCC_int *n = (DCC_int *)s->info;
407
if (!found++)
408
dcc_printf(idx, "priv %s %s %-10s %-10s %-25s\n", get_server_nickname(from_server), from, "Who", "Bot", "Host");
409
dcc_printf(idx, "priv %s %s %-10s %-10s %-25s\n", get_server_nickname(from_server), from, s->server, get_server_nickname(from_server), n->userhost);
410
}
411
}
412
return 0;
413
}
414
415
int tand_who (int idx, char *args)
416
{
417
char *from, *to, *p;
418
char buffer[IRCD_BUFFER_SIZE+1];
419
from = LOCAL_COPY(next_arg(args, &args));
420
if (!(p = strchr(from, '@')))
421
{
422
strmopencat(buffer, IRCD_BUFFER_SIZE, from, "@", get_server_nickname(from_server), NULL);
423
from = buffer;
424
}
425
if ((to = next_arg(args, &args)))
426
{
427
if (!my_stricmp(to, get_server_nickname(from_server)))
428
send_who_to(idx, from, atoi(args));
429
else
430
tandout_but(idx, "who %s %s %s\n", from, to, args);
431
}
432
return 0;
433
}
434
435
void do_command(int idx, char *from, char *par)
436
{
437
logmsg(LOG_TCL, from, 0, "[command] %s", par);
438
parse_line("BOT", par, NULL, 0, 0, 1);
439
}
440
441
int tand_command (int idx, char *args)
442
{
443
char *from, *to, *p;
444
char buffer[IRCD_BUFFER_SIZE+1];
445
from = LOCAL_COPY(next_arg(args, &args));
446
if (!(p = strchr(from, '@')))
447
{
448
strmopencat(buffer, IRCD_BUFFER_SIZE, from, "@", get_server_nickname(from_server), NULL);
449
from = buffer;
450
}
451
if ((to = next_arg(args, &args)))
452
{
453
if (!args) return 0;
454
if (!my_stricmp(to, get_server_nickname(from_server)))
455
do_command(idx, from, args);
456
else
457
tandout_but(idx, "command %s %s %s\n", from, to, args);
458
}
459
return 0;
460
}
461
462
int tand_whom (int idx, char *args)
463
{
464
char *bot, *nick, *from, *p;
465
char buffer[IRCD_BUFFER_SIZE+1];
466
from = LOCAL_COPY(next_arg(args, &args));
467
if (!(p = strchr(from, '@')))
468
{
469
strmopencat(buffer, IRCD_BUFFER_SIZE, from, "@", get_server_nickname(from_server), NULL);
470
from = buffer;
471
}
472
nick = next_arg(args, &args);
473
bot = next_arg(args, &args);
474
send_who_to(idx, from, 0);
475
tandout_but(idx, "whom %s %s %s %s\n", from, nick, bot, args);
476
return 0;
477
}
478
479
int tell_who(int idx, char *arg)
480
{
481
SocketList *s;
482
DCC_int *n;
483
int i;
484
int found = 0;
485
for (i = 0; i < get_max_fd()+1; i++)
486
{
487
if (!check_dcc_socket(i)) continue;
488
s = get_socket(i);
489
n = get_socketinfo(i);
490
if ((s->flags & DCC_TYPES) == DCC_CHAT && (s->flags & DCC_BOTCHAT))
491
{
492
if (!found++)
493
dcc_printf(idx, "%-10s %-10s\n", "Who", "Bot");
494
dcc_printf(idx, "%-10s %-10s\n", s->server, get_server_nickname(from_server));
495
}
496
}
497
if (!found)
498
dcc_printf(idx, "No Clients connected\n");
499
found = 0;
500
for (i = 0; i < get_max_fd()+1; i++)
501
{
502
if (!check_dcc_socket(i)) continue;
503
s = get_socket(i);
504
n = get_socketinfo(i);
505
if ((s->flags & DCC_TYPES) == DCC_BOTMODE)
506
{
507
if (!found++)
508
dcc_printf(idx, "%-10s %-15s\n", "Bots", "Connected");
509
dcc_printf(idx, "%-10s %10s\n", s->server, get_server_nickname(from_server));
510
}
511
}
512
if (!found)
513
dcc_printf(idx, "No Bots connected\n");
514
return 0;
515
}
516
517
int send_who(int idx, char *arg)
518
{
519
int found = 0;
520
if (arg && *arg)
521
{
522
if (!my_stricmp(arg, get_server_nickname(from_server)))
523
tell_who(idx, NULL);
524
else
525
{
526
int i;
527
SocketList *s, *C = NULL;
528
C = get_socket(idx);
529
for (i = 0; i < get_max_fd()+1; i++)
530
{
531
if (!check_dcc_socket(i)) continue;
532
s = get_socket(i);
533
if (!(s->flags & DCC_ACTIVE) || !((s->flags & DCC_TYPES) == DCC_BOTMODE))
534
continue;
535
if (C->info && !my_stricmp(s->server, arg))
536
{
537
dcc_printf(i, "who %d:%s@%s %s %d\n",
538
idx, C->server, get_server_nickname(from_server), arg, 0);
539
found = 1;
540
}
541
542
}
543
if (!found)
544
dcc_printf(idx, "Not found %s\n", arg);
545
}
546
} else
547
tell_who(idx, NULL);
548
return 0;
549
}
550
551
int tell_whom(int idx, char *arg)
552
{
553
DCC_int *n;
554
int found = 0;
555
int i;
556
SocketList *s;
557
for (i = 0; i < get_max_fd()+1; i++)
558
{
559
if (!check_dcc_socket(i)) continue;
560
s = get_socket(i);
561
n = get_socketinfo(i);
562
if ((s->flags & DCC_TYPES) == DCC_CHAT && (s->flags & DCC_BOTCHAT))
563
{
564
if (!found++)
565
dcc_printf(idx, "%-10s %-10s %-25s\n", "Who", "Bot", "Host");
566
dcc_printf(idx, "%-10s %-10s %-25s\n", s->server, get_server_nickname(from_server), n->userhost?n->userhost:"Unknown");
567
}
568
}
569
return 0;
570
}
571
572
int send_whom(int idx, char *arg)
573
{
574
int found = 0;
575
int i;
576
int j;
577
SocketList *s, *s1 = NULL;
578
tell_whom(idx, NULL);
579
for (i = 0; i < get_max_fd()+1; i++)
580
{
581
if (!check_dcc_socket(i)) continue;
582
if (idx == i) { s1 = get_socketinfo(i); break; }
583
}
584
if (!s1) return 0;
585
for (j = 0; j < get_max_fd()+1; j++)
586
{
587
if (!check_dcc_socket(j)) continue;
588
s = get_socketinfo(j);
589
if ((s->flags & DCC_TYPES) == DCC_BOTMODE)
590
{
591
dcc_printf(s->is_read, "whom %d:%s@%s %s %d\n",
592
idx, s1->server, get_server_nickname(from_server), arg, 0);
593
found = 1;
594
}
595
}
596
return 0;
597
}
598
599
int tand_priv (int idx, char *args)
600
{
601
char *to, *from, *p, *i_dx;
602
from = next_arg(args, &args);
603
to = next_arg(args, &args);
604
p = strchr(to, '@');
605
if (p && !my_stricmp(p+1, get_server_nickname(from_server)))
606
{
607
char *t = strchr(to, ':');
608
i_dx = to;
609
if (t)
610
*t = 0;
611
/* this ones for me */
612
dcc_printf(atoi(i_dx), "%s\n", args);
613
}
614
else
615
{
616
tandout_but(idx, "%s\n", args);
617
}
618
return 0;
619
}
620
621
int tand_boot (int idx, char *args)
622
{
623
char *nick;
624
char *from;
625
char *reason;
626
SocketList *s;
627
from = next_arg(args, &args);
628
nick = next_arg(args, &args);
629
reason = args;
630
if ((s = find_dcc(nick, "chat", NULL, DCC_CHAT, 0, 1, -1)))
631
{
632
chanout_but(s->is_read, "%s has booted %s out of the TwilightZone for (%s)\n", from, s->server, reason);
633
dcc_printf(s->is_read, "You have been booted by %s for %s\n", from, reason);
634
erase_dcc_info(s->is_read, 0, NULL);
635
}
636
else
637
tandout_but(idx, "boot %s %s %s\n", from, nick, args);
638
return 0;
639
}
640
641
int tand_privmsg(int idx, char *par)
642
{
643
char *to, *from;
644
SocketList *s;
645
to = next_arg(par, &par);
646
from = next_arg(par, &par);
647
s = find_dcc(to, "chat", NULL, DCC_CHAT, 0, 1, -1);
648
if (s && s->flags & DCC_BOTCHAT)
649
dcc_printf(s->is_read, "[%s] %s\n", from, par?par:empty_string);
650
else
651
tandout_but(idx, "privmsg %s %s %s\n", to, from, par);
652
return 0;
653
}
654
655
int cmd_cmsg(int idx, char *par)
656
{
657
char *nick, *user;
658
SocketList *s, *s1 = NULL;
659
660
nick = next_arg(par, &par);
661
662
if (nick)
663
{
664
int i;
665
666
if ((user = strchr(nick, '@')))
667
*user++ = '\0';
668
669
for (i = 0; i < get_max_fd()+1; i++)
670
{
671
if (!check_dcc_socket(i)) continue;
672
if (idx == i) { s1 = get_socket(i); break; }
673
}
674
if (!s1) return TCL_OK;
675
s = find_dcc(nick, "chat", NULL, DCC_CHAT, 0, 1, -1);
676
if (s)
677
dcc_printf(s->is_read, "[%s@%s] %s\n", s1->server, user?user:get_server_nickname(from_server), par);
678
else
679
tandout_but(idx, "privmsg %s %s@%s %s\n", nick, s1->server, user?user:get_server_nickname(from_server), par);
680
}
681
return TCL_OK;
682
}
683
684
int cmd_boot(int idx, char *par)
685
{
686
char *nick = next_arg(par, &par);
687
char *reason;
688
SocketList *s, *s1 = NULL;
689
690
s = find_dcc(nick, "chat", NULL, DCC_CHAT, 0, 1, -1);
691
if ((check_dcc_socket(idx)))
692
s1 = get_socketinfo(idx);
693
694
if (my_stricmp(nick, get_server_nickname(from_server)))
695
{
696
if (!par || !*par)
697
reason = "We don't like you";
698
else
699
reason = par;
700
if (!s)
701
tandout_but(idx, "boot %s %s %s\n", get_server_nickname(from_server), nick, reason);
702
else
703
{
704
dcc_printf(s->is_read, "You have been booted by %s for (%s)\n", s1? s1->server:get_server_nickname(from_server), reason);
705
chanout_but(s->is_read, "%s booting %s out of the TwilightZone (%s)\n", s1? s1->server:get_server_nickname(from_server), s->server, reason);
706
erase_dcc_info(s->is_read, 0, NULL);
707
}
708
} else
709
dcc_printf(idx, "Can't boot a bot\n");
710
return TCL_OK;
711
}
712
713
int cmd_act(int idx, char *par)
714
{
715
char *nick;
716
SocketList *s;
717
if (!check_dcc_socket(idx))
718
return TCL_OK;
719
s = get_socket(idx);
720
if (idx > -1)
721
nick = s->server;
722
else
723
nick = empty_string;
724
tandout_but(idx, " * %s %s\n", nick, par);
725
chanout_but(idx, " * %s %s\n", nick, par);
726
return TCL_OK;
727
}
728
729
int cmd_msg(int idx, char *par)
730
{
731
char *nick = next_arg(par, &par);
732
send_to_server("PRIVMSG %s :%s\n",nick, par);
733
return TCL_OK;
734
}
735
736
int cmd_say(int idx, char *par)
737
{
738
char *nick = next_arg(par, &par);
739
send_to_server("PRIVMSG %s :%s\n",nick, par);
740
return TCL_OK;
741
}
742
743
int cmd_tcl(int idx, char *par)
744
{
745
#ifdef WANT_TCL
746
if (!get_int_var(BOT_TCL_VAR))
747
return TCL_ERROR;
748
if ((Tcl_Eval(tcl_interp, par)) == TCL_OK)
749
{
750
dcc_printf(idx, "Tcl: %s\n", tcl_interp->result);
751
} else
752
dcc_printf(idx, "Tcl Error: %s\n", tcl_interp->result);
753
#else
754
dcc_printf(idx, "Not implemented in this client\n");
755
#endif
756
return TCL_OK;
757
}
758
759
int cmd_ircii(int idx, char *par)
760
{
761
762
parse_line("BOT", par, NULL, 0, 0, 1);
763
return TCL_OK;
764
}
765
766
int cmd_ops(int idx, char *par)
767
{
768
DCC_int *n;
769
n = get_socketinfo(idx);
770
if (n && n->ul)
771
{
772
ChannelList *ch;
773
NickList *nl;
774
char *nick, *chan, *loc, *n1;
775
loc = LOCAL_COPY(par);
776
nick = next_arg(loc, &loc);
777
chan = next_arg(loc, &loc);
778
if (chan)
779
ch = lookup_channel(chan, from_server, 0);
780
else
781
ch = lookup_channel(get_current_channel_by_refnum(0), from_server, 0);
782
if (!nick || !ch || !ch->have_op) { dcc_printf(idx, "No Nick specified, not on that channel or not channel op\n"); return TCL_ERROR; }
783
while ((n1 = next_in_comma_list(nick, &nick)))
784
{
785
if (!n1 || !*n1) break;
786
if ((nl = find_nicklist_in_channellist(n1, ch, 0)))
787
{
788
if (nl->userlist && (nl->userlist->flags & ADD_OPS))
789
my_send_to_server(from_server, "MODE %s +o %s", ch->channel, n1);
790
} else
791
dcc_printf(idx, "Nick %s is not on channel %s\n", n1, ch->channel);
792
}
793
return TCL_OK;
794
}
795
return TCL_ERROR;
796
}
797
798
int cmd_chat(int idx, char *par)
799
{
800
SocketList *s;
801
char buffer[IRCD_BUFFER_SIZE+1];
802
char *pass = NULL;
803
s = get_socket(idx);
804
if (check_dcc_socket(idx) && !(s->flags & DCC_BOTCHAT))
805
{
806
DCC_int *n;
807
n = (DCC_int *)s->info;
808
pass = next_arg(par, &par);
809
if (get_int_var(BOT_MODE_VAR))
810
{
811
char *main_pass;
812
int got_it = 0;
813
814
main_pass = get_string_var(BOT_PASSWD_VAR);
815
if (pass && n->ul && n->ul->password && !checkpass(pass, n->ul->password))
816
got_it++;
817
else if (pass && main_pass && !strcmp(pass, main_pass))
818
got_it++;
819
if (!got_it)
820
{
821
dcc_printf(idx, "Wrong Password\n");
822
erase_dcc_info(s->is_read, 1, NULL);
823
close_socketread(s->is_read);
824
return TCL_ERROR;
825
}
826
}
827
s->flags |= DCC_BOTCHAT;
828
snprintf(buffer, IRCD_BUFFER_SIZE, "%s %s %s", get_server_nickname(from_server), s->server, n->userhost);
829
tand_join(idx, buffer);
830
dcc_printf(idx, "Welcome to the TwilightZone\n");
831
}
832
return TCL_OK;
833
}
834
835
int cmd_password(int idx, char *par)
836
{
837
SocketList *s;
838
char buffer[IRCD_BUFFER_SIZE+1];
839
char *pass = NULL;
840
s = get_socket(idx);
841
if (check_dcc_socket(idx))
842
{
843
DCC_int *n;
844
char *main_pass = NULL;
845
char *user_pass = NULL;
846
int got_it = 0;
847
848
n = (DCC_int *)s->info;
849
pass = next_arg(par, &par);
850
if (!pass)
851
return TCL_ERROR;
852
main_pass = get_string_var(BOT_PASSWD_VAR);
853
if (n->ul && n->ul->password)
854
user_pass = n->ul->password;
855
if (pass)
856
{
857
if (main_pass && !strcmp(pass, main_pass))
858
got_it++;
859
if (user_pass && !checkpass(pass, user_pass))
860
got_it++;
861
}
862
if (!got_it)
863
return TCL_ERROR;
864
865
s->flags |= DCC_BOTCHAT;
866
snprintf(buffer, IRCD_BUFFER_SIZE, "%s %s %s", get_server_nickname(from_server), s->server, n->userhost);
867
tand_join(idx, buffer);
868
dcc_printf(idx, "Welcome to the TwilightZone\n");
869
}
870
return TCL_OK;
871
}
872
873
int cmd_quit(int idx, char *par)
874
{
875
SocketList *s;
876
char buffer[IRCD_BUFFER_SIZE+1];
877
s = get_socket(idx);
878
if (check_dcc_socket(idx) && (s->flags & DCC_BOTCHAT))
879
{
880
DCC_int *n = (DCC_int *)s->info;
881
s->flags |= DCC_BOTCHAT;
882
snprintf(buffer, IRCD_BUFFER_SIZE, "%s %s %s", get_server_nickname(from_server), s->server, n->userhost);
883
tand_part(idx, buffer);
884
dcc_printf(idx, "\002GoodBye %s.\002\n", s->server);
885
erase_dcc_info(s->is_read, 1, NULL);
886
close_socketread(s->is_read);
887
}
888
return TCL_OK;
889
}
890
891
void invite_dcc_chat(UserhostItem *stuff, char *nick, char *args)
892
{
893
char *id;
894
int idx = -1;
895
id = next_arg(args, &args);
896
idx = atol(id);
897
if (!stuff || !stuff->nick || !nick || !strcmp(stuff->user, "<UNKNOWN>") || my_stricmp(stuff->nick, nick))
898
{
899
if (check_dcc_socket(idx))
900
dcc_printf(idx, "No such for user %s\n", nick);
901
return;
902
}
903
dcc_chat(NULL, nick);
904
send_to_server("NOTICE %s :You've been invited to a TwilightZone", nick);
905
send_to_server("NOTICE %s :Please type .chat in dcc chat to start", nick);
906
chanout_but(idx, "Inviting %s!%s@%s to TwilightZone\n", nick, stuff->user, stuff->host);
907
return;
908
}
909
910
int cmd_invite(int idx, char *par)
911
{
912
int old_server = from_server;
913
from_server = get_window_server(0);
914
if (par && *par)
915
{
916
char *nick = next_arg(par, &par);
917
userhostbase(nick, invite_dcc_chat, 1, "%d %s", idx, nick);
918
}
919
from_server = old_server;
920
return TCL_OK;
921
}
922
923
int cmd_echo(int idx, char *par)
924
{
925
SocketList *s;
926
if ((idx == -1) || !check_dcc_socket(idx))
927
return TCL_ERROR;
928
929
s = get_socket(idx);
930
if (par && *par)
931
{
932
if (!my_stricmp(par, "off"))
933
s->flags &= ~DCC_ECHO;
934
else
935
s->flags &= DCC_ECHO;
936
}
937
else
938
s->flags &= (s->flags & DCC_ECHO) ? ~DCC_ECHO : DCC_ECHO;
939
dcc_printf(idx, " echo is now %s\n", on_off((s->flags & DCC_ECHO)));
940
return TCL_OK;
941
}
942
943
int send_command (int idx, char *par)
944
{
945
if (par && *par && xlink_commands)
946
{
947
tandout_but(idx, "clink_com %s\n", par);
948
if (xlink_commands)
949
parse_command(par, 0, empty_string);
950
return TCL_OK;
951
}
952
return TCL_ERROR;
953
}
954
955
int tand_clink(int idx, char *par)
956
{
957
chanout_but(idx, ".xlink %s\n", par);
958
tandout_but(idx, "clink_com %s\n", par);
959
if (xlink_commands)
960
parse_command(par, 0, empty_string);
961
return TCL_OK;
962
}
963
964
int cmd_adduser(int idx, char *par)
965
{
966
/* add_user();*/
967
return TCL_OK;
968
}
969
970
int cmd_whoami(int idx, char *par)
971
{
972
char *host;
973
unsigned long atr = 0;
974
UserList *n;
975
host = FromUserHost;
976
#ifdef WANT_USERLIST
977
if ((n = lookup_userlevelc("*", host, "*", NULL)))
978
atr = n->flags;
979
if (n)
980
dcc_printf(idx, "You are %s!%s with %s flags.\n", n->nick, n->host, convert_flags_to_str(atr));
981
else
982
#endif
983
dcc_printf(idx, "Nobody special\n");
984
return TCL_OK;
985
}
986
987
int tand_ircii(int idx, char *par)
988
{
989
char *from, *to, *p = NULL;
990
char buffer[IRCD_BUFFER_SIZE+1];
991
992
from = LOCAL_COPY(next_arg(par, &par));
993
if (!(p = strchr(from, '@')))
994
{
995
strmopencat(buffer, IRCD_BUFFER_SIZE, from, "@", get_server_nickname(from_server), NULL);
996
from = buffer;
997
}
998
to = next_arg(par, &par);
999
if (!my_stricmp(to, get_server_nickname(from_server)))
1000
send_who_to(idx, from, atoi(par));
1001
else
1002
tandout_but(idx, "ircii %s %s %s\n", from, to, par);
1003
return 0;
1004
}
1005
1006
int cmd_help(int idx, char *par)
1007
{
1008
char *command;
1009
int i, j;
1010
1011
command = next_arg(par, &par);
1012
if (!command)
1013
{
1014
DCC_int *n;
1015
n = get_socketinfo(idx);
1016
dcc_printf(idx, "DCC commands :\n");
1017
for (i = 1, j = 1; C_dcc[i-1].name; i++)
1018
{
1019
if (C_dcc[i-1].access != 0)
1020
if (!n->ul || !(n->ul->flags & C_dcc[i-1].access))
1021
continue;
1022
#ifdef WANT_USERLIST
1023
dcc_printf(idx, "%6s %-10s", convert_flags_to_str(C_dcc[i-1].access), C_dcc[i-1].name);
1024
#else
1025
dcc_printf(idx, "%-10s", C_dcc[i-1].name);
1026
#endif
1027
if (!(j % 3))
1028
dcc_printf(idx, "\n");
1029
j++;
1030
}
1031
dcc_printf(idx, "\n");
1032
}
1033
else
1034
{
1035
for (i = 0; C_dcc[i].name; i++)
1036
if (!my_stricmp(C_dcc[i].name, command))
1037
break;
1038
if (C_dcc[i].name)
1039
#ifdef WANT_USERLIST
1040
dcc_printf(idx, "%6s %-10s %s\n", convert_flags_to_str(C_dcc[i].access), C_dcc[i].name, C_dcc[i].help);
1041
#else
1042
dcc_printf(idx, "%-10s %s\n", C_dcc[i].name, C_dcc[i].help);
1043
#endif
1044
else
1045
dcc_printf(idx, "No such command [%s]\n", command);
1046
}
1047
return TCL_OK;
1048
}
1049
1050
1051
#endif
1052
1053
1054