Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
BitchX
GitHub Repository: BitchX/BitchX1.3
Path: blob/master/dll/nap/nap.c
1072 views
1
2
#define NAP_VERSION "0.07"
3
4
/*
5
*
6
* This is the Napster handler.
7
* based on code donated by Drago.
8
* Written by Colten Edwards. (C) Nov 99
9
*/
10
#include "irc.h"
11
#include "struct.h"
12
#include "dcc.h"
13
#include "ircaux.h"
14
#include "misc.h"
15
#include "output.h"
16
#include "lastlog.h"
17
#include "screen.h"
18
#include "status.h"
19
#include "window.h"
20
#include "vars.h"
21
#include "input.h"
22
#include "module.h"
23
#include "hook.h"
24
#define INIT_MODULE
25
#include "modval.h"
26
#include "./napster.h"
27
28
#include <sys/ioctl.h>
29
#ifdef HAVE_SYS_FILIO_H
30
#include <sys/filio.h>
31
#endif
32
33
SocketList *naphub = NULL;
34
int nap_socket = -1;
35
int nap_data = -1;
36
37
#undef DEBUG
38
39
char napbuf[NAP_BUFFER_SIZE+1];
40
int nap_port = 8875;
41
int connection_speed = 2;
42
int nap_numeric = 0;
43
static int channel_count = 0;
44
45
static int nap_error = 0;
46
47
#define MAX_SPEED 10
48
49
char *_n_speed[] =
50
{"?", "14.4", "28.8", "33.6", "56.7", "64k ISDN", "128k ISDN", "Cable", "DSL", "T1", "T3 >", 0};
51
char *_speed_color[] =
52
{ "%K", "%g", "%y", "%p", "%r", "%n", "%B", "%R", "%P", "%Y", "%G", "" };
53
/* 0 1 2 3 4 5 6 7 8 9 10 11 */
54
55
_N_AUTH auth = { 0 };
56
57
char nap_version[] = NAP_VERSION;
58
59
ChannelStruct *nchannels = NULL;
60
char *nap_current_channel = NULL;
61
62
FileStruct *file_search = NULL;
63
64
FileStruct *file_browse = NULL;
65
66
NickStruct *nap_hotlist = NULL;
67
68
69
_NAP_COMMANDS nap_commands[] =
70
{
71
{CMDS_UNKNOWN , cmd_unknown },/* 1 */
72
{CMDS_LOGIN , cmd_login }, /* 2 */
73
{CMDR_EMAILADDR , cmd_email }, /* 3 */
74
{CMDR_BASTARD , cmd_bastard}, /* 4 */
75
{CMDS_REGISTERINFO , NULL }, /* 6 */
76
{CMDS_CREATEUSER , NULL }, /* 7 */
77
{CMDR_CREATED , cmd_registerinfo }, /* 8 */
78
{CMDR_CREATEERROR , cmd_alreadyregistered }, /* 9 */
79
{CMDR_MSTAT , NULL }, /* 15 */
80
{CMDR_REQUESTUSERSPEED , NULL }, /* 89 */
81
{CMDR_SENDFILE , NULL }, /* 95 */
82
{CMDS_ADDFILE , NULL }, /* 100 is for adding to shared. */
83
{CMDR_GETQUEUE , NULL }, /* 108 */
84
{CMDR_MOTD , NULL }, /* 109 */
85
{CMDR_ANOTHERUSER , NULL }, /* 148 */
86
{CMDS_SEARCH , NULL }, /* 200 */
87
{CMDR_SEARCHRESULTS , cmd_search }, /* 201 */
88
{CMDR_SEARCHRESULTSEND , cmd_endsearch }, /* 202 */
89
{CMDS_REQUESTFILE , NULL }, /* 203 */
90
{CMDR_FILEREADY , cmd_getfile }, /* 204 */
91
{CMDS_SENDMSG , cmd_msg }, /* 205 */
92
{CMDR_GETERROR , NULL }, /* 206 */
93
94
{CMDS_ADDHOTLIST , NULL }, /* 207 */
95
{CMDS_ADDHOTLISTSEQ , NULL }, /* 208 */
96
{CMDR_HOTLISTONLINE , cmd_hotlist }, /* 209 */
97
{CMDR_USEROFFLINE , cmd_offline }, /* 210 */
98
99
{CMDS_BROWSE , NULL },
100
{CMDR_BROWSERESULT , cmd_browse },
101
{CMDR_BROWSEENDRESULT , cmd_endbrowse },
102
{CMDR_STATS , cmd_stats }, /* 214 */
103
104
{CMDR_RESUMESUCCESS , cmd_resumerequest },
105
{CMDR_RESUMEEND , cmd_resumerequestend },
106
107
{CMDR_HOTLISTSUCCESS , cmd_hotlistsuccess }, /* 301 */
108
{CMDR_HOTLISTERROR , cmd_hotlisterror }, /* 302 */
109
110
{CMDS_JOIN , NULL }, /* 400 */
111
{CMDS_PART , NULL }, /* 401 */
112
{CMDS_SEND , NULL }, /* 402 */
113
{CMDR_PUBLIC , cmd_public }, /* 403 */
114
{CMDR_ERRORMSG , NULL }, /* 404 */
115
{CMDR_JOIN , cmd_joined }, /* 405 */
116
{CMDR_JOINNEW , cmd_names }, /* 406 */
117
{CMDR_PARTED , cmd_parted }, /* 407 */
118
{CMDR_NAMES , cmd_names }, /* 408 */
119
{CMDR_ENDNAMES , cmd_endnames }, /* 409 */
120
{CMDS_TOPIC , cmd_topic }, /* 410 */
121
{CMDR_FILEINFOFIRE , cmd_firewall_request }, /* 501 */
122
123
{CMDS_REQUESTINFO , NULL }, /* 600 */
124
{CMDS_FILESIZE , cmd_getfileinfo }, /* 601 */
125
126
{CMDS_WHOIS , cmd_whois }, /* 603 */
127
{CMDR_WHOIS , cmd_whois }, /* 604 */
128
{CMDR_WHOWAS , cmd_whowas }, /* 605 */
129
{CMDR_FILEREQUEST , cmd_filerequest }, /* 607 */
130
{CMDR_ACCEPTERROR , cmd_accepterror }, /* 609 */
131
{CMDR_BANLIST_IP , cmd_banlist }, /* 616 */
132
{CMDS_LISTCHANNELS , NULL }, /* 617 */
133
{CMDR_LISTCHANNELS , cmd_channellist }, /* 618 */
134
{CMDR_SENDLIMIT , cmd_send_limit_msg }, /* 620 */
135
{CMDR_MOTDS , NULL }, /* 621 */
136
{CMDR_DATAPORTERROR , cmd_dataport }, /* 626 */
137
{CMDR_BANLIST_NICK , cmd_banlist }, /* 629 */
138
{CMDR_NICK , cmd_recname }, /* 825 */
139
{CMDS_PING , cmd_ping }, /* 751 */
140
{CMDS_PONG , cmd_ping }, /* 752 */
141
{CMDS_NAME , cmd_endname }, /* 830 */
142
{CMDS_SENDME , cmd_sendme }, /* 824 */
143
{ -1 , NULL }
144
};
145
146
#define NUMBER_OF_COMMANDS (sizeof(nap_commands) / sizeof(_NAP_COMMANDS)) - 1
147
148
149
static char *nap_ansi = NULL;
150
151
char *n_speed(int speed)
152
{
153
if (speed > MAX_SPEED)
154
speed = MAX_SPEED;
155
return _n_speed[speed];
156
}
157
158
char *speed_color(int speed)
159
{
160
if (speed > MAX_SPEED)
161
speed = MAX_SPEED;
162
return _speed_color[speed];
163
}
164
165
#if 0
166
void flush_napster (int snum)
167
{
168
fd_set rd;
169
struct timeval timeout;
170
int flushing = 1;
171
char buffer[NAP_BUFFER_SIZE + 1];
172
173
if (snum == -1)
174
return;
175
timeout.tv_usec = 0;
176
timeout.tv_sec = 1;
177
nap_say("Flushing output/input");
178
while (flushing)
179
{
180
FD_ZERO(&rd);
181
FD_SET(snum, &rd);
182
switch (select(snum + 1, &rd, NULL, NULL, &timeout))
183
{
184
case -1:
185
case 0:
186
flushing = 0;
187
break;
188
default:
189
if (FD_ISSET(snum, &rd))
190
{
191
int count;
192
if (ioctl(snum, FIONREAD, &count) == -1)
193
break;
194
if (read(snum, buffer, count) == -1)
195
flushing = 0;
196
}
197
break;
198
}
199
}
200
}
201
#endif
202
203
void set_napster_socket(int number)
204
{
205
int on = 32000;
206
setsockopt(number, SOL_SOCKET, SO_RCVBUF, (char *)&on, sizeof(on));
207
on = 60000;
208
setsockopt(number, SOL_SOCKET, SO_SNDBUF, (char *)&on, sizeof(on));
209
}
210
211
int connectbynumber(char *hostn, unsigned short *portnum, int service, int protocol, int nonblocking)
212
{
213
int fd = -1;
214
int sock_type,
215
proto_type;
216
217
sock_type = AF_INET;
218
proto_type = (protocol == PROTOCOL_TCP) ? SOCK_STREAM : SOCK_DGRAM;
219
220
if ((fd = socket(sock_type, proto_type, 0)) < 0)
221
return -1;
222
223
set_napster_socket(fd);
224
225
if (service == SERVICE_SERVER)
226
{
227
int length;
228
#ifdef IP_PORTRANGE
229
int ports;
230
#endif
231
int on = 1;
232
struct sockaddr_in name;
233
234
setsockopt(fd, SOL_SOCKET, SO_REUSEADDR, (char *)&on, sizeof(on));
235
on = 1;
236
setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (char *)&on, sizeof(on));
237
238
memset(&name, 0, sizeof(struct sockaddr_in));
239
name.sin_family = AF_INET;
240
name.sin_addr.s_addr = htonl(INADDR_ANY);
241
name.sin_port = htons(*portnum);
242
#ifdef PARANOID
243
name.sin_port += (unsigned short)(rand() & 255);
244
#endif
245
246
#ifdef IP_PORTRANGE
247
if (getenv("EPIC_USE_HIGHPORTS"))
248
{
249
ports = IP_PORTRANGE_HIGH;
250
setsockopt(fd, IPPROTO_IP, IP_PORTRANGE,
251
(char *)&ports, sizeof(ports));
252
}
253
#endif
254
255
if (bind(fd, (struct sockaddr *)&name, sizeof(name)))
256
return close(fd), -2;
257
258
length = sizeof (name);
259
if (getsockname(fd, (struct sockaddr *)&name, &length))
260
return close(fd), -5;
261
262
*portnum = ntohs(name.sin_port);
263
264
if (protocol == PROTOCOL_TCP)
265
if (listen(fd, 4) < 0)
266
return close(fd), -3;
267
#ifdef NON_BLOCKING_CONNECTS
268
if (nonblocking && set_non_blocking(fd) < 0)
269
return close(fd), -4;
270
#endif
271
}
272
273
/* Inet domain client */
274
else if (service == SERVICE_CLIENT)
275
{
276
struct sockaddr_foobar server;
277
struct hostent *hp;
278
279
memset(&server, 0, sizeof(struct sockaddr_in));
280
281
if (isdigit(hostn[strlen(hostn)-1]))
282
inet_aton(hostn, (struct in_addr *)&server.sf_addr);
283
else
284
{
285
if (!(hp = gethostbyname(hostn)))
286
return close(fd), -6;
287
memcpy(&server.sf_addr, hp->h_addr, hp->h_length);
288
}
289
server.sf_family = AF_INET;
290
server.sf_port = htons(*portnum);
291
292
#ifdef NON_BLOCKING_CONNECTS
293
if (nonblocking && set_non_blocking(fd) < 0)
294
return close(fd), -4;
295
#endif
296
297
alarm(get_int_var(CONNECT_TIMEOUT_VAR));
298
if (connect (fd, (struct sockaddr *)&server, sizeof(server)) < 0)
299
{
300
alarm(0);
301
#ifdef NON_BLOCKING_CONNECTS
302
if (!nonblocking)
303
#endif
304
return close(fd), -4;
305
}
306
alarm(0);
307
}
308
309
/* error */
310
else
311
return close(fd), -7;
312
313
return fd;
314
}
315
316
317
318
char *numeric_banner(int curr)
319
{
320
static char thing[4];
321
if (!get_dllint_var("napster_show_numeric"))
322
return (nap_ansi?nap_ansi:empty_string);
323
sprintf(thing, "%3.3u", curr);
324
return (thing);
325
}
326
327
static void set_numeric_string(Window *win, char *value, int unused)
328
{
329
if (value)
330
malloc_strcpy(&nap_ansi, value);
331
else
332
new_free(&nap_ansi);
333
}
334
335
336
char *convert_time (time_t ltime)
337
{
338
unsigned long days = 0,hours = 0,minutes = 0,seconds = 0;
339
static char buffer[40];
340
*buffer = '\0';
341
seconds = ltime % 60;
342
ltime = (ltime - seconds) / 60;
343
minutes = ltime%60;
344
ltime = (ltime - minutes) / 60;
345
hours = ltime % 24;
346
days = (ltime - hours) / 24;
347
sprintf(buffer, "%2lud %2luh %2lum %2lus", days, hours, minutes, seconds);
348
return(*buffer ? buffer : empty_string);
349
}
350
351
352
int send_ncommand(unsigned int ncmd, char *fmt, ...)
353
{
354
char buffer[2*NAP_BUFFER_SIZE+1];
355
_N_DATA n_data = {0};
356
va_list ap;
357
int rc;
358
if (nap_socket == -1)
359
return -1;
360
if (fmt)
361
{
362
va_start(ap, fmt);
363
n_data.len = vsnprintf(buffer, 2*NAP_BUFFER_SIZE, fmt, ap);
364
va_end(ap);
365
}
366
n_data.command = ncmd;
367
#ifdef DEBUG
368
put_it("send: %d %d to %d", n_data.len, n_data.command, nap_socket);
369
put_it("data: %s", buffer);
370
#endif
371
rc = NAP_send(&n_data, sizeof(n_data));
372
if (fmt)
373
return NAP_send(buffer, n_data.len);
374
return (rc != -1) ? 0 : -1;
375
}
376
377
void send_hotlist(void)
378
{
379
NickStruct *new;
380
ChannelStruct *ch;
381
for (new = nap_hotlist; new; new = new->next)
382
send_ncommand(CMDS_ADDHOTLISTSEQ, new->nick);
383
for (ch = nchannels; ch; ch = ch->next)
384
{
385
send_ncommand(CMDS_JOIN, ch->channel);
386
if (!ch->next)
387
malloc_strcpy(&nap_current_channel, ch->channel);
388
}
389
}
390
391
392
int nap_say(char *format, ...)
393
{
394
int lastlog_level;
395
396
lastlog_level = set_lastlog_msg_level(LOG_CRAP);
397
if (get_dllint_var("napster_window") > 0)
398
if (!(target_window = get_window_by_name("NAPSTER")))
399
target_window = current_window;
400
if (window_display && format)
401
{
402
va_list args;
403
va_start (args, format);
404
vsnprintf(&(napbuf[strlen(get_dllstring_var("napster_prompt"))+1]), 2*NAP_BUFFER_SIZE, format, args);
405
va_end(args);
406
strcpy(napbuf, get_dllstring_var("napster_prompt"));
407
napbuf[strlen(get_dllstring_var("napster_prompt"))] = ' ';
408
if (get_dllint_var("napster_show_numeric"))
409
strmopencat(napbuf, sizeof(napbuf)-1, " ", "[", ltoa(nap_numeric), "]", NULL);
410
if (*napbuf)
411
{
412
add_to_log(irclog_fp, 0, napbuf, 0);
413
add_to_screen(napbuf);
414
}
415
}
416
target_window = NULL;
417
set_lastlog_msg_level(lastlog_level);
418
return 0;
419
}
420
421
int nap_put(char *format, ...)
422
{
423
int lastlog_level;
424
425
lastlog_level = set_lastlog_msg_level(LOG_CRAP);
426
if (get_dllint_var("napster_window") > 0)
427
if (!(target_window = get_window_by_name("NAPSTER")))
428
target_window = current_window;
429
if (window_display && format)
430
{
431
va_list args;
432
va_start (args, format);
433
vsnprintf(napbuf, sizeof(napbuf), format, args);
434
va_end(args);
435
if (get_dllint_var("napster_show_numeric"))
436
strmopencat(napbuf, sizeof(napbuf)-1, " ", "[", ltoa(nap_numeric), "]", NULL);
437
if (*napbuf)
438
{
439
add_to_log(irclog_fp, 0, napbuf, 0);
440
add_to_screen(napbuf);
441
}
442
}
443
target_window = NULL;
444
set_lastlog_msg_level(lastlog_level);
445
return 0;
446
}
447
448
int check_naplink(SocketList *Client, char *str, int active)
449
{
450
if ((active && !Client) || (!active && Client))
451
{
452
nap_say(str?str:"Connect to Napster first");
453
return 0;
454
}
455
return 1;
456
}
457
458
void clear_filelist(FileStruct **f)
459
{
460
FileStruct *last_file, *f1 = *f;
461
while (f1)
462
{
463
last_file = f1->next;
464
new_free(&f1->name);
465
new_free(&f1->nick);
466
new_free(&f1->checksum);
467
new_free(&f1);
468
f1 = last_file;
469
}
470
*f = NULL;
471
}
472
473
void free_nicks(ChannelStruct *ch)
474
{
475
NickStruct *n, *last;
476
n = ch->nicks;
477
while(n)
478
{
479
last = n;
480
n = n->next;
481
new_free(&last->nick);
482
new_free(&last);
483
}
484
}
485
486
void clear_nchannels()
487
{
488
ChannelStruct *lastch;
489
while (nchannels)
490
{
491
lastch = nchannels->next;
492
free_nicks(nchannels);
493
new_free(&nchannels->topic);
494
new_free(&nchannels);
495
nchannels = lastch;
496
}
497
nchannels = NULL;
498
}
499
500
void clear_nicks()
501
{
502
ChannelStruct *lastch;
503
for (lastch = nchannels; lastch; lastch = lastch->next)
504
{
505
free_nicks(lastch);
506
lastch->nicks = NULL;
507
lastch->injoin = 1;
508
}
509
}
510
511
BUILT_IN_DLL(nclose)
512
{
513
NickStruct *new;
514
if (nap_data != -1)
515
close_socketread(nap_data);
516
nap_data = -1;
517
if (nap_socket != -1)
518
close_socketread(nap_socket);
519
naphub = NULL;
520
nap_socket = -1;
521
if (do_hook(MODULE_LIST, "NAP close"))
522
nap_say("%s", cparse("Closed Napster connection", NULL));
523
clear_nicks();
524
clear_filelist(&file_search);
525
clear_filelist(&file_browse);
526
new_free(&nap_current_channel);
527
528
statistics.shared_files = 0;
529
statistics.shared_filesize = 0;
530
statistics.libraries = 0;
531
statistics.gigs = 0;
532
statistics.songs = 0;
533
build_napster_status(NULL);
534
for (new = nap_hotlist; new; new = new->next)
535
new->speed = -1;
536
537
}
538
539
BUILT_IN_DLL(nap_link)
540
{
541
char *host = NULL, *passwd = NULL, *port = NULL, *username = NULL, *tmp;
542
int sucks = 0;
543
int create = 0;
544
int got_host = 0;
545
546
if (!check_naplink(naphub, "Already connected to Napster", 0))
547
return;
548
if (args && *args)
549
{
550
if (!my_strnicmp(args, "-create", 3))
551
{
552
next_arg(args, &args);
553
create = 1;
554
}
555
}
556
/*
557
* user pass host port
558
* user pass host
559
* user pass
560
* user
561
*/
562
while ((tmp = next_arg(args, &args)))
563
{
564
if (!got_host && !strchr(tmp, '.'))
565
{
566
if (!username)
567
username = tmp;
568
else
569
passwd = tmp;
570
}
571
else
572
{
573
got_host = 1;
574
if (!host)
575
host = tmp;
576
else
577
port = tmp;
578
}
579
}
580
if (!username)
581
username = get_dllstring_var("napster_user");
582
else
583
set_dllstring_var("napster_user", username);
584
if (!passwd)
585
passwd = get_dllstring_var("napster_pass");
586
else
587
set_dllstring_var("napster_pass", passwd);
588
589
if (!host)
590
host = get_dllstring_var("napster_host");
591
if (!port)
592
sucks = get_dllint_var("napster_port");
593
else
594
sucks = my_atol(port);
595
#if 0
596
if (create)
597
{
598
if (!(username = next_arg(args, &args)))
599
username = get_dllstring_var("napster_user");
600
else
601
set_dllstring_var("napster_user", username);
602
if (!(passwd = next_arg(args, &args)))
603
passwd = get_dllstring_var("napster_pass");
604
else
605
set_dllstring_var("napster_pass", passwd);
606
}
607
else
608
{
609
if (!(username = next_arg(args, &args)))
610
username = get_dllstring_var("napster_user");
611
else
612
set_dllstring_var("napster_user", username);
613
if (!(passwd = next_arg(args, &args)))
614
passwd = get_dllstring_var("napster_pass");
615
else
616
set_dllstring_var("napster_pass", passwd);
617
}
618
if (!(host = next_arg(args, &args)))
619
host = get_dllstring_var("napster_host");
620
if (!(port = next_arg(args, &args)))
621
sucks = get_dllint_var("napster_port");
622
else
623
sucks = my_atol(port);
624
#endif
625
if (!sucks)
626
{
627
nap_say("Invalid port specified %d", sucks);
628
return;
629
}
630
if (host && sucks && username && passwd)
631
{
632
malloc_strcpy(&auth.username, username);
633
malloc_strcpy(&auth.password, passwd);
634
auth.connection_speed = get_dllint_var("napster_speed");
635
naplink_getserver(host, (unsigned short)sucks, create);
636
}
637
else if (do_hook(MODULE_LIST, "NAP error connect"))
638
nap_say("No %s specified", !host?"host":!username?"username":!passwd?"passwd":"arrggh");
639
}
640
641
NAP_COMM(cmd_sendme)
642
{
643
char *chan, *nick;
644
chan = next_arg(args, &args);
645
nick = next_arg(args, &args);
646
put_it("* %s/%s %s", chan, nick, args);
647
return 0;
648
}
649
650
651
NAP_COMM(cmd_bastard)
652
{
653
nap_say("Got bastard command %s", args);
654
return 0;
655
}
656
657
NAP_COMM(cmd_ping)
658
{
659
char *nick;
660
if ((nick = next_arg(args, &args)))
661
{
662
nap_say("%s", cparse("$0 has requested a ping", "%s", nick));
663
send_ncommand(CMDS_PONG, "%s%s%s", nick, args ? " ":empty_string, args ? args : empty_string);
664
}
665
return 0;
666
}
667
668
NAP_COMM(cmd_hotlist)
669
{
670
char *nick;
671
NickStruct *new;
672
nick = next_arg(args, &args);
673
if ((new = (NickStruct *)find_in_list((List **)&nap_hotlist, nick, 0)))
674
{
675
new->speed = my_atol(next_arg(args, &args));
676
if (do_hook(MODULE_LIST, "NAP HOTLIST %s %d", new->nick, new->speed))
677
nap_say("%s", cparse(" %R*%n HotList User $0 $1 has signed on", "%s %s", new->nick, n_speed(new->speed)));
678
}
679
return 0;
680
}
681
682
NAP_COMM(cmd_dataport)
683
{
684
if (do_hook(MODULE_LIST, "NAP DATAPORT"))
685
nap_say("%s", cparse("* Data port misconfigured. Reconfiguring", NULL));
686
make_listen(-1);
687
return 0;
688
}
689
690
NAP_COMM(cmd_banlist)
691
{
692
if (do_hook(MODULE_LIST, "NAP BANLIST %s", args))
693
nap_say("%s", cparse("* $0-", "%s", args));
694
return 0;
695
}
696
697
void update_napster_window(Window *tmp)
698
{
699
char statbuff[NAP_BUFFER_SIZE];
700
char *st;
701
st = napster_status();
702
sprintf(statbuff, " %d/%d/%dgb %%>%s ", statistics.libraries, statistics.songs, statistics.gigs, tmp->double_status ? "" : st);
703
set_wset_string_var(tmp->wset, STATUS_FORMAT1_WSET, statbuff);
704
sprintf(statbuff, " %%>%s ", st);
705
set_wset_string_var(tmp->wset, STATUS_FORMAT2_WSET, statbuff);
706
update_window_status(tmp, 1);
707
new_free(&st);
708
}
709
710
int build_napster_status(Window *tmp)
711
{
712
Window *tmp1;
713
if (!(tmp1 = tmp))
714
tmp1 = get_window_by_name("NAPSTER");
715
if (tmp1)
716
{
717
update_napster_window(tmp1);
718
build_status(tmp1, NULL, 0);
719
#if 0
720
if (nap_socket != -1)
721
set_input_prompt(tmp, "%K[%YNap%K]%n ", 0);
722
else
723
set_input_prompt(tmp, "[0] ", 0);
724
#endif
725
update_all_windows();
726
return 1;
727
}
728
return 0;
729
}
730
731
732
NAP_COMM(cmd_stats)
733
{
734
sscanf(args, "%d %d %d", &statistics.libraries, &statistics.songs, &statistics.gigs);
735
if (!build_napster_status(NULL))
736
if (do_hook(MODULE_LIST, "NAP STATS %d %d %d", statistics.libraries, statistics.songs, statistics.gigs))
737
nap_say("%s", cparse("Libs[$0] Songs[$1] GB[$2]", "%d %d %d", statistics.libraries, statistics.songs, statistics.gigs));
738
return 0;
739
}
740
741
NAP_COMM(cmd_whowas)
742
{
743
if (do_hook(MODULE_LIST, "NAP WHOWAS %s", args))
744
{
745
char *nick, *class, *l_ip, *l_port, *d_port, *email;
746
int t_up, t_down;
747
time_t online;
748
nick = new_next_arg(args, &args);
749
class = new_next_arg(args, &args);
750
online = my_atol(new_next_arg(args, &args));
751
t_down = my_atol(next_arg(args, &args));
752
t_up = my_atol(next_arg(args, &args));
753
l_ip = next_arg(args, &args);
754
l_port = next_arg(args, &args);
755
d_port = next_arg(args, &args);
756
email = next_arg(args, &args);
757
758
nap_put("%s", cparse("������---�--��-������---�--��-���������--- -- -", NULL));
759
if (l_ip)
760
nap_put("%s", cparse("| User : $0($1) $2 l:$3 d:$4", "%s %s %s %s %s", nick, email, l_ip, l_port, d_port));
761
else
762
nap_put("%s", cparse("| User : $0", "%s", nick));
763
nap_put("%s", cparse("� Class : $0", "%s", class));
764
nap_put("%s", cparse(": Last online: $0-", "%s", my_ctime(online)));
765
if (t_down || t_up)
766
nap_put("%s", cparse(": Total Uploads : $0 Downloading : $1", "%d %d", t_up, t_down));
767
}
768
return 0;
769
}
770
771
NAP_COMM(cmd_whois)
772
{
773
if (do_hook(MODULE_LIST, "NAP WHOIS %s", args))
774
{
775
char *nick, *class, *status, *channels, *ver, *l_ip, *l_port, *d_port, *email;
776
int shared, download, upload, speed, t_down, t_up;
777
time_t online;
778
779
nick = new_next_arg(args, &args);
780
class = new_next_arg(args, &args);
781
online = my_atol(new_next_arg(args, &args));
782
channels = new_next_arg(args, &args);
783
status = new_next_arg(args, &args);
784
shared = my_atol(new_next_arg(args, &args));
785
download = my_atol(new_next_arg(args, &args));
786
upload = my_atol(new_next_arg(args, &args));
787
speed = my_atol(new_next_arg(args, &args));
788
ver = new_next_arg(args, &args);
789
790
t_down = my_atol(next_arg(args, &args));
791
t_up = my_atol(next_arg(args, &args));
792
l_ip = next_arg(args, &args);
793
l_port = next_arg(args, &args);
794
d_port = next_arg(args, &args);
795
email = next_arg(args, &args);
796
797
nap_put("%s", cparse("������---�--��-������---�--��-���������--- -- -", NULL));
798
if (l_ip)
799
nap_put("%s", cparse("| User : $0($1) $2 l:$3 d:$4", "%s %s %s %s %s", nick, email, l_ip, l_port, d_port));
800
else
801
nap_put("%s", cparse("| User : $0", "%s", nick));
802
nap_put("%s", cparse("| Class : $0", "%s", class));
803
nap_put("%s", cparse("� Line : $0-", "%s", n_speed(speed)));
804
nap_put("%s", cparse("� Time : $0-", "%s", convert_time(online)));
805
nap_put("%s", cparse("� Channels: $0-", "%s", channels ? channels : empty_string));
806
nap_put("%s", cparse("� Status : $0-", "%s", status));
807
nap_put("%s", cparse("� Shared : $0", "%d", shared));
808
nap_put("%s", cparse(": Client : $0-", "%s", ver));
809
nap_put("%s", cparse(": Uploading : $0 Downloading : $1", "%d %d", upload, download));
810
if (t_down || t_up)
811
nap_put("%s", cparse(": Total Uploads : $0 Downloading : $1", "%d %d", t_up, t_down));
812
}
813
return 0;
814
}
815
816
NAP_COMM(cmd_error)
817
{
818
if (do_hook(MODULE_LIST, "NAP ERROR %s", args))
819
{
820
if (args && !strcmp(args, "Invalid Password!"))
821
{
822
nap_say("%s", cparse("$0-", "%s", args));
823
nap_error = 11;
824
}
825
else
826
nap_say("%s", cparse("Recieved error for [$0] $1-.", "%d %s", cmd, args ? args : empty_string));
827
}
828
if (nap_error > 10)
829
{
830
nclose(NULL, NULL, NULL, NULL, NULL);
831
nap_error = 0;
832
}
833
return 0;
834
}
835
836
NAP_COMM(cmd_unknown)
837
{
838
if (do_hook(MODULE_LIST, "NAP UNKNOWN %s", args))
839
nap_say("%s", cparse("Recieved unknown [$0] $1-.", "%d %s", cmd, args));
840
return 0;
841
}
842
843
NAP_COMM(cmd_login)
844
{
845
send_ncommand(CMDS_LOGIN, "%s %s %d \"BX-nap v%s\" %d",
846
get_dllstring_var("napster_user"),
847
get_dllstring_var("napster_pass"),
848
get_dllint_var("napster_dataport"),
849
nap_version,
850
get_dllint_var("napster_speed"));
851
return 0;
852
}
853
854
NAP_COMM(cmd_email)
855
{
856
nap_say("%s", cparse("EMAIL address is $0-", "%s", args));
857
return 0;
858
}
859
860
NAP_COMM(cmd_joined)
861
{
862
char *chan;
863
if ((chan = next_arg(args, &args)) && !find_in_list((List **)&nchannels, chan, 0))
864
{
865
ChannelStruct *new;
866
new = (ChannelStruct *)new_malloc(sizeof(ChannelStruct));
867
new->channel = m_strdup(chan);
868
add_to_list((List **)&nchannels, (List *)new);
869
new->injoin = 1;
870
if (do_hook(MODULE_LIST, "NAP JOINED %s", chan))
871
nap_say("%s", cparse("Joined channel $0", "%s", chan));
872
malloc_strcpy(&nap_current_channel, chan);
873
build_napster_status(NULL);
874
}
875
return 0;
876
}
877
878
NAP_COMM(cmd_parted)
879
{
880
char *chan;
881
ChannelStruct *new;
882
NickStruct *n;
883
if ((chan = next_arg(args, &args)) && (new = (ChannelStruct *)find_in_list((List **)&nchannels, chan, 0)))
884
{
885
char *nick;
886
if (!(nick = next_arg(args, &args)))
887
return 0;
888
if (!my_stricmp(nick, get_dllstring_var("napster_user")))
889
{
890
if ((new = (ChannelStruct *)remove_from_list((List **)&nchannels, chan)))
891
{
892
free_nicks(new);
893
new_free(&new->topic);
894
new_free(&new);
895
}
896
if (do_hook(MODULE_LIST, "NAP PARTED %s", chan))
897
nap_say("%s", cparse("You have parted $0", "%s", chan));
898
}
899
else if ((n = (NickStruct *)remove_from_list((List **)&nchannels->nicks, nick)))
900
{
901
int shared = 0;
902
int speed = 0;
903
shared = my_atol(next_arg(args, &args));
904
speed = my_atol(args);
905
new_free(&n->nick);
906
new_free(&n);
907
if (do_hook(MODULE_LIST, "NAP PARTED %s %s %d %d", nick, chan, shared, speed))
908
{
909
char part_str[200], *p;
910
strcpy(part_str, "$0 has parted $1 %K[ $2/$3%n%K]");
911
if ((p = strstr(part_str, " ")))
912
memcpy(p, speed_color(speed), 2);
913
nap_say("%s", cparse(part_str, "%s %s %d %s", nick, chan, shared, n_speed(speed)));
914
}
915
}
916
}
917
return 0;
918
}
919
920
NAP_COMM(cmd_topic)
921
{
922
char *chan;
923
ChannelStruct *new;
924
if ((chan = next_arg(args, &args)) && (new = (ChannelStruct *)find_in_list((List **)&nchannels, chan, 0)))
925
{
926
new->topic = m_strdup(args);
927
if (do_hook(MODULE_LIST, "NAP TOPIC %s", args))
928
nap_say("%s", cparse("Topic for $0: $1-", "%s %s", chan, args));
929
}
930
return 0;
931
}
932
933
NAP_COMM(cmd_names)
934
{
935
ChannelStruct *ch;
936
char *chan, *nick;
937
chan = next_arg(args, &args);
938
nick = next_arg(args, &args);
939
if (!nick || !chan)
940
return 0;
941
ch = (ChannelStruct *)find_in_list((List **)&nchannels, chan, 0);
942
if (ch)
943
{
944
NickStruct *n;
945
if (!(n = (NickStruct *)find_in_list((List **)&ch->nicks, nick, 0)))
946
{
947
n = (NickStruct *)new_malloc(sizeof(NickStruct));
948
n->nick = m_strdup(nick);
949
add_to_list((List **)&ch->nicks, (List *)n);
950
}
951
n->shared = my_atol(next_arg(args, &args));
952
n->speed = my_atol(args);
953
if (!ch->injoin)
954
if (do_hook(MODULE_LIST, "NAP NAMES %s %d %d", nick, n->shared, n->speed))
955
{
956
char join_str[200], *p;
957
strcpy(join_str, "$0 has joined $1 %K[ $2/$3-%n%K]");
958
p = strstr(join_str, " ");
959
memcpy(p, speed_color(n->speed), 2);
960
nap_say("%s", cparse(join_str, "%s %s %d %s", nick, chan, n->shared, n_speed(n->speed)));
961
}
962
}
963
return 0;
964
}
965
966
void name_print(NickStruct *n, int hotlist)
967
{
968
char buffer[NAP_BUFFER_SIZE+1];
969
int cols = get_dllint_var("napster_names_columns") ? get_dllint_var("napster_names_columns") : get_int_var(NAMES_COLUMNS_VAR);
970
int count = 0;
971
NickStruct *n1;
972
if (!cols)
973
cols = 1;
974
*buffer = 0;
975
for (n1 = n; n1; n1 = n1->next)
976
{
977
if (hotlist)
978
strcat(buffer, convert_output_format((n1->speed != -1)?get_dllstring_var("napster_hotlist_online") : get_dllstring_var("napster_hotlist_offline"), "%s %d", n1->nick, n1->speed));
979
else
980
{
981
char tmp[200], *p;
982
strcpy(tmp, get_dllstring_var("napster_names_nickcolor"));
983
if ((p = strstr(tmp, " ")))
984
memcpy(p, speed_color(n1->speed), 2);
985
strcat(buffer, convert_output_format(tmp, "%s %d %d", n1->nick, n1->speed, n1->shared));
986
}
987
strcat(buffer, space);
988
if (count++ >= (cols - 1))
989
{
990
nap_put("%s", buffer);
991
*buffer = 0;
992
count = 0;
993
}
994
}
995
if (*buffer)
996
nap_put("%s", buffer);
997
}
998
999
NAP_COMM(cmd_endname) /* 830 */
1000
{
1001
nap_say("%s", cparse("End of names", NULL));
1002
return 0;
1003
}
1004
1005
NAP_COMM(cmd_recname)
1006
{
1007
nap_say("%s", cparse("$[20]0 $[8]1 $2", "%s", args));
1008
return 0;
1009
}
1010
1011
NAP_COMM(cmd_endnames)
1012
{
1013
ChannelStruct *ch;
1014
char *chan;
1015
if (!(chan = next_arg(args, &args)))
1016
return 0;
1017
ch = (ChannelStruct *)find_in_list((List **)&nchannels, chan, 0);
1018
ch->injoin = 0;
1019
if (do_hook(MODULE_LIST, "NAP ENDNAMES %s", chan))
1020
{
1021
if (ch)
1022
name_print(ch->nicks, 0);
1023
}
1024
malloc_strcpy(&nap_current_channel, chan);
1025
return 0;
1026
}
1027
1028
NAP_COMM(cmd_public)
1029
{
1030
char *from, *chan;
1031
chan = next_arg(args, &args);
1032
from = next_arg(args, &args);
1033
if (!chan || !from || check_nignore(from))
1034
return 0;
1035
if (nap_current_channel && !my_stricmp(nap_current_channel, chan))
1036
{
1037
if (do_hook(MODULE_LIST, "NAP PUBLIC %s %s %s", from, chan, args))
1038
nap_put("%s",cparse(fget_string_var(FORMAT_PUBLIC_FSET), "%s %s %s %s", update_clock(GET_TIME), from, chan, args));
1039
}
1040
else
1041
{
1042
if (do_hook(MODULE_LIST, "NAP PUBLIC_OTHER %s %s %s", from, chan, args))
1043
nap_put("%s",cparse(fget_string_var(FORMAT_PUBLIC_OTHER_FSET), "%s %s %s %s", update_clock(GET_TIME), from, chan, args));
1044
}
1045
return 0;
1046
}
1047
1048
NAP_COMM(cmd_msg)
1049
{
1050
char *from;
1051
from = next_arg(args, &args);
1052
if (!from || check_nignore(from))
1053
return 0;
1054
if (do_hook(MODULE_LIST, "NAP MSG %s %s", from, args))
1055
nap_put("%s", convert_output_format(fget_string_var(FORMAT_MSG_FSET), "%s %s %s %s", update_clock(GET_TIME), from, "*@*", args));
1056
addtabkey(from, "nmsg", 0);
1057
return 0;
1058
}
1059
1060
static void naplink_handler (int s)
1061
{
1062
char tmpstr[2*NAP_BUFFER_SIZE+1];
1063
char *tmp = tmpstr;
1064
_N_DATA n_data;
1065
unsigned char blah[5];
1066
int i;
1067
set_display_target("NAPSTER", LOG_CRAP);
1068
memset(tmpstr, 0, sizeof(tmpstr));
1069
1070
/* rain thinks this might work better on big-endian */
1071
i = read(s, blah, 4);
1072
n_data.len = blah[0] + ((blah[1] << 8) & 0xff00);
1073
n_data.command = blah[2] + ((blah[3] << 8) & 0xff00);
1074
1075
if (i <= 0)
1076
{
1077
nap_say("Read error [%s]", strerror(errno));
1078
nclose(NULL, NULL, NULL, NULL, NULL);
1079
return;
1080
}
1081
if (!n_data.command)
1082
nap_error++;
1083
else
1084
nap_error = 0;
1085
if ((i = read(s, tmp, n_data.len)) != n_data.len)
1086
{
1087
int len;
1088
len = n_data.len - i;
1089
if ((i == -1) || (i = read(s, tmp+i, len)) != len)
1090
{
1091
nap_say("Read error [%s]", strerror(errno));
1092
nclose(NULL, NULL, NULL, NULL, NULL);
1093
close_socketread(s);
1094
reset_display_target();
1095
return;
1096
}
1097
}
1098
nap_numeric = n_data.command;
1099
1100
for (i = 0; i < NUMBER_OF_COMMANDS; i++)
1101
{
1102
if (nap_commands[i].cmd == n_data.command)
1103
{
1104
if (nap_commands[i].func)
1105
(nap_commands[i].func)(n_data.command, tmpstr);
1106
else
1107
nap_say("%s %s", numeric_banner(n_data.command), tmpstr);
1108
nap_error = 0;
1109
reset_display_target();
1110
return;
1111
}
1112
}
1113
cmd_error(n_data.command, tmpstr);
1114
reset_display_target();
1115
}
1116
1117
SocketList *naplink_connect(char *host, u_short port)
1118
{
1119
struct in_addr address;
1120
struct hostent *hp;
1121
int lastlog_level;
1122
1123
lastlog_level = set_lastlog_msg_level(LOG_DCC);
1124
if ((address.s_addr = inet_addr(host)) == -1)
1125
{
1126
if (!my_stricmp(host, "255.255.255.0") || !(hp = gethostbyname(host)))
1127
{
1128
nap_say("%s", cparse("%RDCC%n Unknown host: $0-", "%s", host));
1129
set_lastlog_msg_level(lastlog_level);
1130
return NULL;
1131
}
1132
bcopy(hp->h_addr, (char *)&address, sizeof(address));
1133
}
1134
nap_socket = connectbynumber(host, &port, SERVICE_CLIENT, PROTOCOL_TCP, 0);
1135
if (nap_socket < 0)
1136
{
1137
nap_socket = -1;
1138
naphub = NULL;
1139
return NULL;
1140
}
1141
add_socketread(nap_socket, port, 0, host, naplink_handler, NULL);
1142
(void) set_lastlog_msg_level(lastlog_level);
1143
naphub = get_socket(nap_socket);
1144
return naphub;
1145
}
1146
1147
NAP_COMM(cmd_registerinfo)
1148
{
1149
if (do_hook(MODULE_LIST, "NAP REGISTER %s", get_dllstring_var("napster_user")))
1150
nap_say("%s", cparse("Registered Username $0", "%s", get_dllstring_var("napster_user")));
1151
send_ncommand(CMDS_REGISTERINFO," %s %s %d \"BX-nap v%s\" %d %s",
1152
get_dllstring_var("napster_user"),
1153
get_dllstring_var("napster_pass"),
1154
get_dllint_var("napster_dataport"), nap_version,
1155
get_dllint_var("napster_speed"),
1156
get_dllstring_var("napster_email"));
1157
return 0;
1158
}
1159
1160
NAP_COMM(cmd_alreadyregistered)
1161
{
1162
if (do_hook(MODULE_LIST, "NAP REGISTER_ERROR"))
1163
nap_say("%s", cparse("Already Registered", NULL));
1164
nclose(NULL, NULL, NULL, NULL, NULL);
1165
return 0;
1166
}
1167
1168
NAP_COMM(cmd_offline)
1169
{
1170
if (do_hook(MODULE_LIST, "NAP OFFLINE %s", args))
1171
nap_say("%s", cparse("User $0 offline", "%s", args));
1172
return 0;
1173
}
1174
1175
void _naplink_connectserver(char *tmp, int create)
1176
{
1177
char *s_port;
1178
unsigned short port;
1179
if (do_hook(MODULE_LIST, "NAP CONNECT %s", tmp))
1180
nap_say("%s", cparse("Got server. Attempting connect to $0.", "%s", tmp));
1181
naphub = NULL;
1182
nap_socket = -1;
1183
if (!(s_port = strchr(tmp, ':')))
1184
{
1185
next_arg(tmp, &s_port);
1186
if (!s_port)
1187
{
1188
nap_say("%s", cparse("error in naplink_connectserver()", NULL));
1189
return;
1190
}
1191
} else
1192
*s_port++ = 0;
1193
port = atoi(s_port);
1194
if ((naplink_connect(tmp, port)))
1195
{
1196
set_napster_socket(nap_socket);
1197
nap_say("%s", cparse("Connected. Attempting Login to $0:$1.", "%s %s", tmp, s_port));
1198
if (create)
1199
send_ncommand(CMDS_CREATEUSER, "%s", get_dllstring_var("napster_user"));
1200
else
1201
cmd_login(CMDS_LOGIN, empty_string);
1202
make_listen(get_dllint_var("napster_dataport"));
1203
send_hotlist();
1204
}
1205
}
1206
1207
static void naplink_connectserver (int s)
1208
{
1209
char tmpstr[NAP_BUFFER_SIZE+1];
1210
char *tmp = tmpstr;
1211
SocketList *s1;
1212
s1 = get_socket(s);
1213
memset(tmpstr, 0, sizeof(tmpstr));
1214
read(s, tmp, sizeof(tmpstr)-1);
1215
close_socketread(s);
1216
if (*tmp)
1217
_naplink_connectserver(tmp, s1->flags);
1218
else
1219
nap_say("Error connecting to server");
1220
}
1221
1222
void naplink_getserver(char *host, u_short port, int create)
1223
{
1224
struct in_addr address;
1225
struct hostent *hp;
1226
int lastlog_level;
1227
lastlog_level = set_lastlog_msg_level(LOG_DCC);
1228
if ((address.s_addr = inet_addr(host)) == -1)
1229
{
1230
if (!my_stricmp(host, "255.255.255.0") || !(hp = gethostbyname(host)))
1231
{
1232
nap_say("%s", cparse("%RDCC%n Unknown host: $0-", "%s", host));
1233
set_lastlog_msg_level(lastlog_level);
1234
return;
1235
}
1236
bcopy(hp->h_addr, (char *)&address, sizeof(address));
1237
}
1238
nap_socket = connectbynumber(host, &port, SERVICE_CLIENT, PROTOCOL_TCP, 1);
1239
if (nap_socket < 0)
1240
{
1241
nap_socket = -1;
1242
naphub = NULL;
1243
return;
1244
}
1245
add_socketread(nap_socket, port, create, host, naplink_connectserver, NULL);
1246
nap_say("%s", cparse("Attempting to get host from $0:$1.","%s %d", host, port));
1247
(void) set_lastlog_msg_level(lastlog_level);
1248
}
1249
1250
static void toggle_napwin_hide (Window *win, char *unused, int onoff)
1251
{
1252
Window *tmp;
1253
if ((tmp = get_window_by_name("NAPSTER")))
1254
{
1255
if (onoff)
1256
{
1257
if (tmp->screen)
1258
hide_window(tmp);
1259
build_napster_status(tmp);
1260
update_all_windows();
1261
cursor_to_input();
1262
}
1263
else
1264
{
1265
show_window(tmp);
1266
resize_window(2, tmp, 6);
1267
build_napster_status(tmp);
1268
update_all_windows();
1269
cursor_to_input();
1270
}
1271
}
1272
}
1273
1274
static void toggle_napwin (Window *win, char *unused, int onoff)
1275
{
1276
Window *tmp;
1277
if (onoff)
1278
{
1279
if ((tmp = get_window_by_name("NAPSTER")))
1280
return;
1281
if ((tmp = new_window(win->screen)))
1282
{
1283
resize_window(2, tmp, 6);
1284
tmp->name = m_strdup("NAPSTER");
1285
#undef query_cmd
1286
tmp->query_cmd = m_strdup("nsay");
1287
tmp->double_status = 0;
1288
tmp->absolute_size = 1;
1289
tmp->update_status = update_napster_window;
1290
tmp->server = -2;
1291
set_wset_string_var(tmp->wset, STATUS_FORMAT1_WSET, NULL);
1292
set_wset_string_var(tmp->wset, STATUS_FORMAT2_WSET, NULL);
1293
set_wset_string_var(tmp->wset, STATUS_FORMAT3_WSET, NULL);
1294
set_wset_string_var(tmp->wset, STATUS_FORMAT_WSET, NULL);
1295
1296
if (get_dllint_var("napster_window_hidden"))
1297
hide_window(tmp);
1298
else
1299
set_screens_current_window(tmp->screen, tmp);
1300
build_napster_status(tmp);
1301
update_all_windows();
1302
cursor_to_input();
1303
}
1304
}
1305
else
1306
{
1307
if ((tmp = get_window_by_name("NAPSTER")))
1308
{
1309
if (tmp == target_window)
1310
target_window = NULL;
1311
delete_window(tmp);
1312
update_all_windows();
1313
cursor_to_input();
1314
1315
}
1316
}
1317
}
1318
1319
1320
BUILT_IN_DLL(naphelp)
1321
{
1322
if (do_hook(MODULE_LIST, "NAP HELP"))
1323
{
1324
nap_say("%s", cparse("First Set your napster_user and napster_pass variables", NULL));
1325
nap_say("%s", cparse("then we can use /napster to find a server and connect", NULL));
1326
nap_say("%s", cparse("typing /n<tab> will display a list of various napster commands", NULL));
1327
nap_say("%s", cparse("also /set napster will display a list of variables", NULL));
1328
}
1329
return;
1330
}
1331
1332
BUILT_IN_DLL(napsave)
1333
{
1334
IrcVariableDll *newv = NULL;
1335
FILE *outf = NULL;
1336
char *expanded = NULL;
1337
char buffer[NAP_BUFFER_SIZE+1];
1338
NickStruct *new;
1339
char *p = NULL;
1340
if (get_string_var(CTOOLZ_DIR_VAR))
1341
snprintf(buffer, NAP_BUFFER_SIZE, "%s/Napster.sav", get_string_var(CTOOLZ_DIR_VAR));
1342
else
1343
sprintf(buffer, "~/Napster.sav");
1344
expanded = expand_twiddle(buffer);
1345
if (!expanded || !(outf = fopen(expanded, "w")))
1346
{
1347
nap_say("error opening %s", expanded ? expanded : buffer);
1348
new_free(&expanded);
1349
return;
1350
}
1351
for (newv = dll_variable; newv; newv = newv->next)
1352
{
1353
if (!my_strnicmp(newv->name, "napster", 7))
1354
{
1355
if (newv->type == STR_TYPE_VAR)
1356
{
1357
if (newv->string)
1358
fprintf(outf, "SET %s %s\n", newv->name, newv->string);
1359
}
1360
else if (newv->type == BOOL_TYPE_VAR)
1361
fprintf(outf, "SET %s %s\n", newv->name, on_off(newv->integer));
1362
else
1363
fprintf(outf, "SET %s %d\n", newv->name, newv->integer);
1364
}
1365
}
1366
for (new = nap_hotlist; new; new = new->next)
1367
m_s3cat(&p, " ", new->nick);
1368
if (p)
1369
{
1370
fprintf(outf, "NHOTLIST %s\n", p);
1371
new_free(&p);
1372
}
1373
if (do_hook(MODULE_LIST, "NAP SAVE %s", buffer))
1374
nap_say("Finished saving Napster variables to %s", buffer);
1375
fclose(outf);
1376
new_free(&expanded);
1377
return;
1378
}
1379
1380
1381
NAP_COMM(cmd_channellist)
1382
{
1383
if (do_hook(MODULE_LIST, "NAP CHANNEL %s", args))
1384
{
1385
if (channel_count == 0)
1386
nap_put("%s", cparse("Num Channel Topic", NULL));
1387
nap_put("%s", cparse("$[-3]1 $[20]0 $5-", "%s", args));
1388
}
1389
channel_count++;
1390
return 0;
1391
}
1392
1393
1394
BUILT_IN_DLL(nap_channel)
1395
{
1396
if (command)
1397
{
1398
ChannelStruct *ch = NULL;
1399
char *cmd = next_arg(args, &args);
1400
if (!my_stricmp(command, "njoin"))
1401
{
1402
if (cmd)
1403
{
1404
if (!(ch = (ChannelStruct *)find_in_list((List **)&nchannels, cmd, 0)))
1405
{
1406
send_ncommand(CMDS_JOIN, cmd);
1407
do_hook(MODULE_LIST, "NAP JOIN %s", cmd);
1408
}
1409
else
1410
{
1411
malloc_strcpy(&nap_current_channel, ch->channel);
1412
do_hook(MODULE_LIST, "NAP SWITCH_CHANNEL %s", ch->channel);
1413
}
1414
}
1415
else if (nap_current_channel)
1416
{
1417
ch = (ChannelStruct *)find_in_list((List **)&nchannels, nap_current_channel, 0);
1418
if (ch && ch->next)
1419
malloc_strcpy(&nap_current_channel, ch->next->channel);
1420
else if (nchannels)
1421
malloc_strcpy(&nap_current_channel, nchannels->channel);
1422
}
1423
build_napster_status(NULL);
1424
}
1425
else if (!my_stricmp(command, "npart"))
1426
{
1427
if (cmd)
1428
{
1429
if ((ch = (ChannelStruct *)remove_from_list((List **)&nchannels, cmd)))
1430
send_ncommand(CMDS_PART, cmd);
1431
}
1432
else if (nap_current_channel)
1433
{
1434
if ((ch = (ChannelStruct *)remove_from_list((List **)&nchannels, nap_current_channel)))
1435
send_ncommand(CMDS_PART, nap_current_channel);
1436
}
1437
if (ch)
1438
{
1439
if (do_hook(MODULE_LIST, "NAP PART %s", ch->channel))
1440
nap_say("%s", cparse("Parted $0", "%s", ch->channel));
1441
free_nicks(ch);
1442
if (!my_stricmp(ch->channel, nap_current_channel))
1443
{
1444
if (ch->next)
1445
malloc_strcpy(&nap_current_channel, ch->next->channel);
1446
else if (nchannels)
1447
malloc_strcpy(&nap_current_channel, nchannels->channel);
1448
}
1449
new_free(&ch->channel);
1450
new_free(&ch->topic);
1451
new_free(&ch);
1452
}
1453
1454
if (!nap_current_channel && nchannels)
1455
malloc_strcpy(&nap_current_channel, nchannels->channel);
1456
else if (nap_current_channel && !nchannels)
1457
new_free(&nap_current_channel);
1458
build_napster_status(NULL);
1459
}
1460
else if (!my_stricmp(command, "ntopic"))
1461
{
1462
ChannelStruct *ch;
1463
ch = (ChannelStruct *)find_in_list((List **)&nchannels, cmd ? cmd : nap_current_channel ? nap_current_channel : empty_string, 0);
1464
if (ch)
1465
{
1466
if (args && *args)
1467
{
1468
send_ncommand(CMDS_TOPIC, "%s %s", ch->channel, args);
1469
if (do_hook(MODULE_LIST, "NAP TOPIC %s %s", ch->channel, args))
1470
nap_say("%s", cparse("Topic for $0: $1-", "%s %s", ch->channel, args));
1471
}
1472
else
1473
{
1474
if (do_hook(MODULE_LIST, "NAP TOPIC %s %s", ch->channel, ch->topic))
1475
nap_say("%s", cparse("Topic for $0: $1-", "%s %s", ch->channel, ch->topic));
1476
}
1477
}
1478
else if (do_hook(MODULE_LIST, "NAP TOPIC No Channel"))
1479
nap_say("%s", cparse("No Channel found $0", "%s", cmd ? cmd : empty_string));
1480
}
1481
else if (!my_stricmp(command, "nlist"))
1482
{
1483
send_ncommand(CMDS_LISTCHANNELS, NULL);
1484
channel_count = 0;
1485
}
1486
else if(!my_stricmp(command, "ninfo"))
1487
send_ncommand(CMDS_WHOIS, !cmd ? get_dllstring_var("napster_user") : cmd);
1488
}
1489
}
1490
1491
NAP_COMM(cmd_search)
1492
{
1493
FileStruct *new;
1494
if (!args || !*args)
1495
return 0;
1496
new = (FileStruct *)new_malloc(sizeof(FileStruct));
1497
new->name = m_strdup(new_next_arg(args, &args));
1498
new->checksum = m_strdup(next_arg(args, &args));
1499
new->filesize = my_atol(next_arg(args, &args));
1500
new->bitrate = my_atol(next_arg(args, &args));
1501
new->freq = my_atol(next_arg(args, &args));
1502
new->seconds = my_atol(next_arg(args, &args));
1503
new->nick = m_strdup(next_arg(args, &args));
1504
new->ip = my_atol(next_arg(args, &args));
1505
new->speed = my_atol(next_arg(args, &args));
1506
if (!new->name || !new->checksum || !new->nick || !new->filesize)
1507
{
1508
new_free(&new->name);
1509
new_free(&new->checksum);
1510
new_free(&new->nick);
1511
new_free(&new);
1512
return 1;
1513
}
1514
add_to_list((List **)&file_search, (List *)new);
1515
return 0;
1516
}
1517
1518
NAP_COMM(cmd_browse)
1519
{
1520
/* nick filename checksum filesize bitrate freq seconds */
1521
FileStruct *new;
1522
new = (FileStruct *)new_malloc(sizeof(FileStruct));
1523
new->nick = m_strdup(next_arg(args, &args));
1524
new->name = m_strdup(new_next_arg(args, &args));
1525
new->checksum = m_strdup(next_arg(args, &args));
1526
new->filesize = my_atol(next_arg(args, &args));
1527
new->bitrate = my_atol(next_arg(args, &args));
1528
new->freq = my_atol(next_arg(args, &args));
1529
new->seconds = my_atol(next_arg(args, &args));
1530
new->speed = my_atol(args);
1531
if (!new->name || !new->checksum || !new->nick || !new->filesize)
1532
{
1533
new_free(&new->name);
1534
new_free(&new->checksum);
1535
new_free(&new->nick);
1536
new_free(&new);
1537
return 1;
1538
}
1539
add_to_list((List **)&file_browse, (List *)new);
1540
return 0;
1541
}
1542
1543
char *base_name(char *str)
1544
{
1545
char *p;
1546
if ((p = strrchr(str, '\\')))
1547
p++;
1548
else if ((p = strrchr(str, '/')))
1549
p++;
1550
else
1551
p = str;
1552
return p;
1553
}
1554
1555
char *mp3_time(unsigned long t)
1556
{
1557
static char str[40];
1558
int seconds;
1559
int minutes;
1560
minutes = t / 60;
1561
seconds = t % 60;
1562
sprintf(str, "%02d:%02d", minutes, seconds);
1563
return str;
1564
}
1565
1566
void print_file(FileStruct *f, int count)
1567
{
1568
if (!f || !f->name)
1569
return;
1570
if (count == 1)
1571
{
1572
if (do_hook(MODULE_LIST, "NAP PRINTFILE_HEADER"))
1573
{
1574
nap_put("Number � Song � Bitrate � Frequency � Length � Size � Computer � Speed");
1575
nap_put("������������������������������������������������������������������������������");
1576
}
1577
}
1578
if (do_hook(MODULE_LIST, "NAP PRINTFILE %d %s %u %u %lu %lu %s %d",
1579
count, f->name, f->bitrate, f->freq, f->seconds, f->filesize, f->nick, f->speed))
1580
{
1581
if (((f->ip & 0xff) == 0xc0) && ((f->ip & 0xff00) == 0xa800))
1582
nap_put("%.3d %s %u %u %s %4.2f%s %s %s XXX",
1583
count, base_name(f->name), f->bitrate, f->freq,
1584
mp3_time(f->seconds), (float)_GMKv(f->filesize), _GMKs(f->filesize),
1585
f->nick, n_speed(f->speed));
1586
else
1587
nap_put("%.3d %s %u %u %s %4.2f%s %s %s",
1588
count, base_name(f->name), f->bitrate, f->freq,
1589
mp3_time(f->seconds), (float)_GMKv(f->filesize), _GMKs(f->filesize),
1590
f->nick, n_speed(f->speed));
1591
}
1592
}
1593
1594
NAP_COMM(cmd_fileinfo)
1595
{
1596
char *nick;
1597
char *ip;
1598
int port;
1599
char *file;
1600
char *checksum;
1601
int speed;
1602
nick = next_arg(args, &args);
1603
ip = next_arg(args, &args);
1604
port = my_atol(next_arg(args, &args));
1605
file = new_next_arg(args, &args);
1606
checksum = next_arg(args, &args);
1607
speed = my_atol(next_arg(args, &args));
1608
nap_put("Number � Song � Speed");
1609
nap_put("������������������������������������������������������������������������������");
1610
nap_put("%.3d %s %d %d", 1, base_name(file), port, n_speed(speed));
1611
return 0;
1612
}
1613
1614
NAP_COMM(cmd_endbrowse)
1615
{
1616
int count = 1;
1617
FileStruct *f;
1618
1619
if (do_hook(MODULE_LIST, "NAP ENDBROWSE"))
1620
{
1621
for (f = file_browse; f; f = f->next, count++)
1622
print_file(f, count);
1623
if (!file_browse)
1624
nap_say("%s", cparse("Browse finished. No results", NULL));
1625
}
1626
return 0;
1627
}
1628
1629
NAP_COMM(cmd_endsearch)
1630
{
1631
int count = 1;
1632
FileStruct *f;
1633
if (do_hook(MODULE_LIST, "NAP ENDSEARCH"))
1634
{
1635
for (f = file_search; f; f = f->next, count++)
1636
print_file(f, count);
1637
if (!file_search)
1638
nap_say("%s", cparse("search finished. No results", NULL));
1639
}
1640
return 0;
1641
}
1642
1643
BUILT_IN_DLL(nap_search)
1644
{
1645
char buff[NAP_BUFFER_SIZE+1];
1646
char s_buff[NAP_BUFFER_SIZE+1];
1647
int n = 0;
1648
1649
int bitrate = 0;
1650
unsigned int freq = 0;
1651
int linespeed = 0;
1652
int bit_int = -1;
1653
int freq_int = -1;
1654
int line_int = -1;
1655
int do_type = 0;
1656
int buf_len = 0;
1657
char *search_param[] = { "EQUAL TO", "AT BEST", "AT LEAST", ""};
1658
int soundex = 0;
1659
char *sound_ex[] = { "FILENAME", "SOUNDEX", "" };
1660
char any[] = "ANY";
1661
char *type = NULL;
1662
1663
if (!args || !*args)
1664
{
1665
FileStruct *f;
1666
int count = 1;
1667
for (f = file_search; f; f = f->next, count++)
1668
print_file(f, count);
1669
return;
1670
}
1671
if (command && !my_stricmp(command, "soundex"))
1672
soundex++;
1673
while (args && *args == '-')
1674
{
1675
char *cmd, *val;
1676
unsigned int value = 0;
1677
cmd = next_arg(args, &args);
1678
val = next_arg(args, &args);
1679
value = my_atol(type);
1680
if (!my_strnicmp(cmd, "-type", 4))
1681
{
1682
type = val;
1683
do_type = 1;
1684
continue;
1685
}
1686
else if (!my_strnicmp(cmd, "-any", 4))
1687
{
1688
type = any;
1689
do_type = 1;
1690
continue;
1691
}
1692
if (!my_strnicmp(cmd, "-maxresults", 4))
1693
{
1694
if (!args)
1695
{
1696
nap_say("%s", cparse("Default Max Results $0", "%d", get_dllint_var("napster_max_results")));
1697
return;
1698
}
1699
set_dllint_var("napster_max_results", value);
1700
continue;
1701
}
1702
if (strstr(cmd, "bitrate"))
1703
{
1704
int br[] = {20, 24, 32, 48, 56, 64, 98, 112, 128, 160, 192, 256, 320, -1 };
1705
int o;
1706
for (o = 0; br[o] != -1; o++)
1707
if (br[o] == value)
1708
break;
1709
if (br[o] == -1)
1710
{
1711
nap_say("%s", cparse("Allowed Bitrates 20, 24, 32, 48, 56, 64, 98, 112, 128, 160, 192, 256, 320", NULL));
1712
return;
1713
}
1714
if (!my_strnicmp(cmd, "-bitrate", 4))
1715
bitrate = value, bit_int = 0;
1716
else if (!my_strnicmp(cmd, "-minbitrate", 4))
1717
bitrate = value, bit_int = 2;
1718
else if (!my_strnicmp(cmd, "-maxbitrate", 4))
1719
bitrate = value, bit_int = 1;
1720
}
1721
else if (strstr(cmd, "freq"))
1722
{
1723
long fr[] = {8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000, -1};
1724
int o;
1725
for (o = 0; fr[o] != -1; o++)
1726
if (fr[o] == value)
1727
break;
1728
if (fr[o] == -1)
1729
{
1730
nap_say("%s", cparse("Allowed Freq 8000, 11025, 12000, 16000, 22050, 24000, 32000, 44100, 48000", NULL));
1731
return;
1732
}
1733
if (!my_strnicmp(cmd, "-maxfreq", 4))
1734
freq = value, freq_int = 1;
1735
else if (!my_strnicmp(cmd, "-minfreq", 4))
1736
freq = value, freq_int = 2;
1737
else if (!my_strnicmp(cmd, "-freq", 4))
1738
freq = value, freq_int = 0;
1739
}
1740
else if (strstr(cmd, "line"))
1741
{
1742
if (value < 0 || value > 10)
1743
{
1744
nap_say("%s", cparse("Allowed linespeed 0-10", NULL));
1745
return;
1746
}
1747
if (!my_strnicmp(cmd, "-maxlinespeed", 4))
1748
linespeed = value, line_int = 1;
1749
else if (!my_strnicmp(cmd, "-minlinespeed", 4))
1750
linespeed = value, line_int = 2;
1751
else if (!my_strnicmp(cmd, "-linespeed", 4))
1752
linespeed = value, line_int = 0;
1753
}
1754
}
1755
1756
1757
if (!args || !*args)
1758
return;
1759
1760
clear_filelist(&file_search);
1761
if (soundex)
1762
compute_soundex(s_buff, sizeof(s_buff), args);
1763
1764
if (do_type && type)
1765
{
1766
sprintf(buff, "TYPE %s ", type);
1767
buf_len = strlen(buff);
1768
}
1769
1770
if ((n = get_dllint_var("napster_max_results")))
1771
sprintf(buff + buf_len, "%s CONTAINS \"%s\" MAX_RESULTS %d", sound_ex[soundex], soundex ? s_buff : args, n);
1772
else
1773
sprintf(buff + buf_len, "%s CONTAINS \"%s\"", sound_ex[soundex], soundex ? s_buff : args);
1774
1775
if (!do_type && !type)
1776
{
1777
if (bitrate && (bit_int != -1))
1778
strmopencat(buff, NAP_BUFFER_SIZE, " BITRATE \"", search_param[bit_int], "\" \"", ltoa(bitrate), "\"", NULL);
1779
if (freq && (freq_int != -1))
1780
strmopencat(buff, NAP_BUFFER_SIZE, " FREQ \"", search_param[freq_int], "\" \"", ltoa(freq), "\"", NULL);
1781
if (linespeed && (line_int != -1))
1782
strmopencat(buff, NAP_BUFFER_SIZE, " LINESPEED \"", search_param[line_int], "\" ", ltoa(linespeed), NULL);
1783
}
1784
1785
if (do_hook(MODULE_LIST, "NAP SEARCH %s %s", args, soundex ? s_buff : ""))
1786
nap_say("%s", cparse("* Searching for $0-", "%s %s", args, soundex ? s_buff: ""));
1787
send_ncommand(CMDS_SEARCH, buff);
1788
}
1789
1790
BUILT_IN_DLL(nap_scan)
1791
{
1792
ChannelStruct *ch;
1793
char *chan;
1794
if (!args || !*args)
1795
chan = nap_current_channel;
1796
else
1797
chan = next_arg(args, &args);
1798
if (!chan || !*chan)
1799
return;
1800
if (command && !my_stricmp(command, "nnames"))
1801
send_ncommand(CMDS_NAME, chan);
1802
else if ((ch = (ChannelStruct *)find_in_list((List **)&nchannels, chan, 0)))
1803
name_print(ch->nicks, 0);
1804
}
1805
1806
BUILT_IN_DLL(nap_command)
1807
{
1808
char *cmd, *data;
1809
cmd = next_arg(args, &args);
1810
if (cmd)
1811
{
1812
if (!my_stricmp(cmd, "whois"))
1813
{
1814
data = next_arg(args, &args);
1815
if (!data)
1816
data = get_dllstring_var("napster_user");
1817
send_ncommand(CMDS_WHOIS, data);
1818
}
1819
else if (!my_stricmp(cmd, "raw"))
1820
{
1821
if ((data = next_arg(args, &args)))
1822
send_ncommand(my_atol(data), (args && *args) ? args : NULL);
1823
}
1824
else if (command && !my_stricmp(command, "nbrowse"))
1825
{
1826
if (!my_stricmp(cmd, get_dllstring_var("napster_user")))
1827
{
1828
nap_say("Browsing yourself is not a very smart thing");
1829
return;
1830
}
1831
send_ncommand(CMDS_BROWSE, cmd);
1832
clear_filelist(&file_browse);
1833
}
1834
else if (command && !my_stricmp(command, "nping"))
1835
{
1836
if (cmd)
1837
send_ncommand(CMDS_PING, "%s %s", cmd, args ? args : empty_string);
1838
}
1839
}
1840
}
1841
1842
BUILT_IN_DLL(nap_connect)
1843
{
1844
char *str = NULL;
1845
char buff[BIG_BUFFER_SIZE];
1846
if (!my_stricmp(command, "nreconnect"))
1847
{
1848
SocketList *s;
1849
s = get_socket(nap_socket);
1850
if (s)
1851
{
1852
sprintf(buff, "%s:%d", s->server, s->port);
1853
str = buff;
1854
}
1855
}
1856
else
1857
str = args;
1858
if (nap_socket != -1)
1859
nclose(NULL, NULL, NULL, NULL, NULL);
1860
if (str && *str)
1861
_naplink_connectserver(str, 0);
1862
}
1863
1864
int make_listen(int port)
1865
{
1866
int fd;
1867
unsigned short pt;
1868
if (nap_data > 0)
1869
close_socketread(nap_data);
1870
if (port == -1)
1871
pt = get_dllint_var("napster_dataport");
1872
else
1873
pt = port;
1874
if (!pt)
1875
return 0;
1876
fd = connectbynumber(NULL, &pt, SERVICE_SERVER, PROTOCOL_TCP, 1);
1877
if (fd < 0)
1878
{
1879
nap_say("%s", cparse("Cannot setup listen port [$0] $1-", "%d %s", pt, strerror(errno)));
1880
return -1;
1881
}
1882
add_socketread(fd, pt, 0, NULL, naplink_handlelink, NULL);
1883
nap_data = fd;
1884
return nap_data;
1885
}
1886
1887
NAP_COMM(cmd_hotlistsuccess)
1888
{
1889
if (do_hook(MODULE_LIST, "NAP HOTLISTADD %s", args))
1890
nap_say("%s", cparse("Adding $0 to your HotList", "%s", args));
1891
return 0;
1892
}
1893
1894
NAP_COMM(cmd_hotlisterror)
1895
{
1896
NickStruct *new;
1897
if (args && (new = (NickStruct *)remove_from_list((List **)&nap_hotlist, args)))
1898
{
1899
if (do_hook(MODULE_LIST, "NAP HOTLISTERROR %s", args))
1900
nap_say("%s", cparse("No such nick $0", "%s", args));
1901
new_free(&new->nick);
1902
new_free(&new);
1903
}
1904
return 0;
1905
}
1906
1907
BUILT_IN_DLL(naphotlist)
1908
{
1909
NickStruct *new;
1910
char *nick;
1911
if (!args || !*args)
1912
{
1913
nap_say("%s", cparse("Your Hotlist:", NULL));
1914
name_print(nap_hotlist, 1);
1915
return;
1916
}
1917
while ((nick = next_arg(args, &args)))
1918
{
1919
if (!(*nick == '-'))
1920
{
1921
if (nap_socket != -1)
1922
send_ncommand(CMDS_ADDHOTLIST, nick);
1923
if (!(new = (NickStruct *)find_in_list((List **)&nap_hotlist, nick, 0)))
1924
{
1925
new = new_malloc(sizeof(NickStruct));
1926
new->nick = m_strdup(nick);
1927
new->speed = -1;
1928
add_to_list((List **)&nap_hotlist, (List *)new);
1929
} else if (do_hook(MODULE_LIST, "NAP HOTLISTERROR Already on your hotlist %s", nick))
1930
nap_say("%s", cparse("$0 is already on your Hotlist", "%s", nick));
1931
}
1932
else
1933
{
1934
nick++;
1935
if (*nick && (new = (NickStruct *)remove_from_list((List **)&nap_hotlist, nick)))
1936
{
1937
send_ncommand(CMDS_HOTLISTREMOVE, nick);
1938
if (do_hook(MODULE_LIST, "NAP HOTLISTREMOVE %s", nick))
1939
nap_say("%s", cparse("Removing $0 from your HotList", "%s", nick));
1940
new_free(&new->nick);
1941
new_free(&new);
1942
}
1943
}
1944
}
1945
}
1946
1947
BUILT_IN_DLL(nap_admin)
1948
{
1949
int i;
1950
char *comm,
1951
*user;
1952
1953
typedef struct _Nadmin {
1954
char *command;
1955
int cmd;
1956
int arg_count;
1957
int len;
1958
} Nadmin;
1959
1960
Nadmin admin_comm[] = {
1961
{ "killserver", CMDS_SERVERKILL, -1, 5 },
1962
{ "banuser", CMDS_BANUSER, 1, 4 },
1963
{ "setdataport",CMDS_SETDATAPORT, 2, 4 },
1964
{ "setlinespeed",CMDS_SETLINESPEED, 2, 4 },
1965
{ "setuserlevel",CMDS_SETUSERLEVEL, 2, 4 },
1966
{ "connect", CMDS_SERVERLINK, -1, 4 },
1967
{ "disconnect", CMDS_SERVERUNLINK, -1, 4 },
1968
{ "config", CMDS_SETCONFIG, -1, 4 },
1969
{ "unnukeuser", CMDS_UNNUKEUSER, 1, 3 },
1970
{ "unbanuser", CMDS_UNBANUSER, 1, 3 },
1971
{ "unmuzzle", CMDS_UNMUZZLE, 2, 3 },
1972
{ "removeserver",CMDS_SERVERREMOVE, -1, 3 },
1973
{ "opsay", CMDS_OPSAY, -1, 1 },
1974
{ "announce", CMDS_ANNOUNCE, -1, 1 },
1975
{ "version", CMDS_SERVERVERSION, 0, 1 },
1976
{ "reload", CMDS_RELOADCONFIG, -1, 1 },
1977
{ "kill", CMDS_KILLUSER, 2, 1 },
1978
{ "nukeuser", CMDS_NUKEUSER, 1, 1 },
1979
{ "banlist", CMDS_BANLIST, 0, 1 },
1980
{ "muzzle", CMDS_MUZZLE, 2, 1 },
1981
{ NULL, 0, -1}
1982
};
1983
1984
if (!(comm = next_arg(args, &args)))
1985
{
1986
nap_say("Please specify a command for /nadmin <command> [args]");
1987
nap_say(" kill nukeuser unnukeuser banuser unbanuser banlist muzzle unmuzzle");
1988
nap_say(" setdataport setlinespeed opsay announce setuserlevel version");
1989
nap_say("Following are open-nap specific");
1990
nap_say(" connect disconnect killserver removeserver config reload");
1991
return;
1992
}
1993
for (i = 0; admin_comm[i].command; i++)
1994
{
1995
if (!my_strnicmp(admin_comm[i].command, comm, admin_comm[i].len))
1996
{
1997
switch(admin_comm[i].arg_count)
1998
{
1999
case 0:
2000
{
2001
send_ncommand(admin_comm[i].cmd, NULL);
2002
break;
2003
}
2004
case 1:
2005
{
2006
if ((user = next_arg(args, &args)))
2007
send_ncommand(admin_comm[i].cmd, user);
2008
else
2009
nap_say("Nothing to send for %s", admin_comm[i].command);
2010
break;
2011
}
2012
case 2:
2013
{
2014
user = next_arg(args, &args);
2015
if (args && *args)
2016
send_ncommand(admin_comm[i].cmd, "%s %s", user, args);
2017
else
2018
send_ncommand(admin_comm[i].cmd, "%s", user);
2019
break;
2020
}
2021
case -1:
2022
{
2023
if (args && *args)
2024
send_ncommand(admin_comm[i].cmd, "%s", args);
2025
else
2026
nap_say("Nothing to send for %s", admin_comm[i].command);
2027
}
2028
}
2029
return;
2030
}
2031
}
2032
userage(command, helparg);
2033
2034
#if 0
2035
if (!my_stricmp(comm, "config"))
2036
{
2037
cmd = CMDS_SETCONFIG;
2038
count = -1;
2039
}
2040
else if (!my_stricmp(comm, "reload"))
2041
{
2042
cmd = CMDS_RELOADCONFIG;
2043
count = -1;
2044
}
2045
else if (!my_stricmp(comm, "version"))
2046
{
2047
cmd = CMDS_SERVERVERSION;
2048
count = 0;
2049
}
2050
else if (!my_stricmp(comm, "connect"))
2051
{
2052
cmd = CMDS_SERVERLINK;
2053
count = -1;
2054
}
2055
else if (!my_stricmp(comm, "disconnect"))
2056
{
2057
cmd = CMDS_SERVERUNLINK;
2058
count = -1;
2059
}
2060
else if (!my_stricmp(comm, "killserver"))
2061
{
2062
cmd = CMDS_SERVERKILL;
2063
count = -1;
2064
}
2065
else if (!my_stricmp(comm, "removeserver"))
2066
{
2067
cmd = CMDS_SERVERREMOVE;
2068
count = -1;
2069
}
2070
else if (!my_stricmp(comm, "setuserlevel"))
2071
{
2072
cmd = CMDS_SETUSERLEVEL;
2073
count = 2;
2074
}
2075
else if (!my_stricmp(comm, "kill"))
2076
{
2077
cmd = CMDS_KILLUSER;
2078
count = 2;
2079
}
2080
else if (!my_stricmp(comm, "nukeuser"))
2081
cmd = CMDS_NUKEUSER;
2082
else if (!my_stricmp(comm, "banuser"))
2083
cmd = CMDS_BANUSER;
2084
else if (!my_stricmp(comm, "setdataport"))
2085
{
2086
cmd = CMDS_SETDATAPORT;
2087
count = 2;
2088
}
2089
else if (!my_stricmp(comm, "unbanuser"))
2090
cmd = CMDS_UNBANUSER;
2091
else if (!my_stricmp(comm, "banlist"))
2092
{
2093
cmd = CMDS_BANLIST;
2094
count = 0;
2095
}
2096
else if (!my_stricmp(comm, "muzzle"))
2097
{
2098
cmd = CMDS_MUZZLE;
2099
count = 2;
2100
}
2101
else if (!my_stricmp(comm, "unmuzzle"))
2102
{
2103
cmd = CMDS_UNMUZZLE;
2104
count = 2;
2105
}
2106
else if (!my_stricmp(comm, "unnukeuser"))
2107
cmd = CMDS_UNNUKEUSER;
2108
else if (!my_stricmp(comm, "setlinespeed"))
2109
{
2110
cmd = CMDS_SETLINESPEED;
2111
count = 2;
2112
}
2113
else if (!my_stricmp(comm, "opsay"))
2114
{
2115
cmd = CMDS_OPSAY;
2116
count = -1;
2117
}
2118
else if (!my_stricmp(comm, "announce"))
2119
{
2120
cmd = CMDS_ANNOUNCE;
2121
count = -1;
2122
}
2123
else
2124
{
2125
userage(command, helparg);
2126
return;
2127
}
2128
switch (count)
2129
{
2130
case 0:
2131
send_ncommand(cmd, NULL);
2132
break;
2133
case 1:
2134
{
2135
char *user;
2136
if ((user = next_arg(args, &args)))
2137
send_ncommand(cmd, user);
2138
break;
2139
}
2140
case 2:
2141
{
2142
char *user;
2143
user = next_arg(args, &args);
2144
if (args && *args)
2145
send_ncommand(cmd, "%s %s", user, args);
2146
else
2147
send_ncommand(cmd, "%s", user);
2148
break;
2149
}
2150
case -1:
2151
{
2152
if (args && *args)
2153
send_ncommand(cmd, "%s", args);
2154
}
2155
}
2156
#endif
2157
}
2158
2159
BUILT_IN_DLL(nap_msg)
2160
{
2161
char *loc, *nick;
2162
if (!args || !*args)
2163
return;
2164
loc = LOCAL_COPY(args);
2165
if (!my_stricmp(command, "nmsg"))
2166
{
2167
nick = next_arg(loc, &loc);
2168
send_ncommand(CMDS_SENDMSG, "%s", args);
2169
if (do_hook(MODULE_LIST, "NAP SENDMSG %s %s", nick, loc))
2170
nap_put("%s", cparse(fget_string_var(FORMAT_SEND_MSG_FSET),
2171
"%s %s %s %s",update_clock(GET_TIME),
2172
nick, get_dllstring_var("napster_user"), loc));
2173
}
2174
else if (!my_stricmp(command, "nsay") && nap_current_channel)
2175
send_ncommand(CMDS_SEND, "%s %s", nap_current_channel, args);
2176
}
2177
2178
BUILT_IN_DLL(stats_napster)
2179
{
2180
nap_say("There are %d libraries with %d songs in %dgb", statistics.libraries, statistics.songs, statistics.gigs);
2181
nap_say("We are sharing %d for %4.2f%s", statistics.shared_files, _GMKv(statistics.shared_filesize), _GMKs(statistics.shared_filesize));
2182
nap_say("There are %d files loaded with %4.2f%s", statistics.total_files, _GMKv(statistics.total_filesize), _GMKs(statistics.total_filesize));
2183
nap_say("We have served %lu files and %4.2f%s", statistics.files_served, _GMKv(statistics.filesize_served), _GMKs(statistics.filesize_served));
2184
nap_say("We have downloaded %lu files for %4.2f%s", statistics.files_received, _GMKv(statistics.filesize_received), _GMKs(statistics.filesize_received));
2185
nap_say("The Highest download speed has been %4.2fK/s", _GMKv(statistics.max_downloadspeed));
2186
nap_say("The Highest upload speed has been %4.2fK/s", _GMKv(statistics.max_uploadspeed));
2187
}
2188
2189
2190
static void set_passwd (Window *win, char *unused, int onoff)
2191
{
2192
if (unused && nap_socket != -1)
2193
send_ncommand(CMDS_CHANGEPASS, "%s", unused);
2194
}
2195
2196
static void set_email (Window *win, char *unused, int onoff)
2197
{
2198
if (unused && nap_socket != -1)
2199
{
2200
if (strchr(unused, '@') && strchr(unused, '.'))
2201
send_ncommand(CMDS_CHANGEEMAIL, "%s", unused);
2202
else
2203
{
2204
nap_say("Malformed email address");
2205
new_free(&unused);
2206
}
2207
}
2208
}
2209
2210
static void set_linespeed (Window *win, char *unused, int onoff)
2211
{
2212
if (nap_socket != -1)
2213
{
2214
if (onoff >= 0 && onoff < 11)
2215
send_ncommand(CMDS_CHANGESPEED, "%d", onoff);
2216
else
2217
nap_say("Bad Speed Value. 0 to 10");
2218
}
2219
}
2220
static void set_dataport (Window *win, char *unused, int onoff)
2221
{
2222
int yes,
2223
old_data = nap_data;
2224
nap_data = -1;
2225
if (nap_socket != -1)
2226
{
2227
if ((yes = make_listen(onoff)) != -1)
2228
{
2229
close_socketread(old_data);
2230
send_ncommand(CMDS_CHANGEDATA, "%d", onoff);
2231
}
2232
else
2233
nap_data = old_data;
2234
}
2235
}
2236
2237
char *Nap_Version(IrcCommandDll **intp)
2238
{
2239
return nap_version;
2240
}
2241
2242
int Nap_Lock(IrcCommandDll **intp)
2243
{
2244
return 1;
2245
}
2246
2247
2248
int Nap_Init(IrcCommandDll **intp, Function_ptr *global_table)
2249
{
2250
char buffer[BIG_BUFFER_SIZE+1];
2251
char *p;
2252
char nap_name[] = "napster";
2253
2254
initialize_module(nap_name);
2255
add_module_proc(COMMAND_PROC, nap_name, "napster", NULL, 0, 0, nap_link, "[-create] command to login to napster");
2256
add_module_proc(COMMAND_PROC, nap_name, "n", NULL, 0, 0, nap_command, "[whois] [raw] various raw commands");
2257
add_module_proc(COMMAND_PROC, nap_name, "nping", "nping", 0, 0, nap_command, "<nick> attempt to ping nick");
2258
add_module_proc(COMMAND_PROC, nap_name, "ninfo", "ninfo", 0, 0, nap_channel, "<nick> attempts to whois nick");
2259
add_module_proc(COMMAND_PROC, nap_name, "njoin", "njoin", 0, 0, nap_channel, "<channel> join a channel");
2260
add_module_proc(COMMAND_PROC, nap_name, "npart", "npart", 0, 0, nap_channel, "[channel] part a channel or current if none given");
2261
#if 0
2262
add_module_proc(COMMAND_PROC, nap_name, "npass", "npass", 0, 0, nap_user, "<nick passwd> to change your passwd");
2263
add_module_proc(COMMAND_PROC, nap_name, "nemail", "nemail", 0, 0, nap_user, "<email> change your email address");
2264
add_module_proc(COMMAND_PROC, nap_name, "ndataport", "ndataport", 0, 0, nap_user, "<dataport> to change your dataport");
2265
add_module_proc(COMMAND_PROC, nap_name, "nlinespeed", "nlinespeed", 0, 0, nap_user, "<# from 0 to 11> to change your linespeed");
2266
#endif
2267
add_module_proc(COMMAND_PROC, nap_name, "nlist", "nlist", 0, 0, nap_channel, "list all channels");
2268
2269
add_module_proc(COMMAND_PROC, nap_name, "nsearch", NULL, 0, 0, nap_search, "<search string> search napster database");
2270
add_module_proc(COMMAND_PROC, nap_name, "nsound", "soundex", 0, 0, nap_search, "<search string> search napster database");
2271
add_module_proc(COMMAND_PROC, nap_name, "nmsg", "nmsg", 0, 0, nap_msg, "<nick msg> send a privmsg to nick");
2272
add_module_proc(COMMAND_PROC, nap_name, "nsay", "nsay", 0, 0, nap_msg, "<msg> say something in the current channel");
2273
add_module_proc(COMMAND_PROC, nap_name, "nscan", "nscan", 0, 0, nap_scan, "show list of current nicks in channel");
2274
add_module_proc(COMMAND_PROC, nap_name, "nnames", "nnames", 0, 0, nap_scan, "show list of current nicks in channel");
2275
add_module_proc(COMMAND_PROC, nap_name, "nconnect", "nconnect", 0, 0, nap_connect, "[server:port] connect to a specific server/port");
2276
add_module_proc(COMMAND_PROC, nap_name, "nreconnect", "nreconnect", 0, 0, nap_connect, "reconnect to the current server");
2277
add_module_proc(COMMAND_PROC, nap_name, "nbrowse", "nbrowse", 0, 0, nap_command, "<nick> browse nick's list of files");
2278
add_module_proc(COMMAND_PROC, nap_name, "ntopic", "ntopic", 0, 0, nap_channel, "[channel] display topic of channel or current channel");
2279
add_module_proc(COMMAND_PROC, nap_name, "nrequest", "nrequest", 0, 0, nap_request, "<nick file> request a specific file from nick");
2280
add_module_proc(COMMAND_PROC, nap_name, "nget", "nget", 0, 0, nap_request, "<# -search -browse> request the file # from the search list of the browse list default is the search list");
2281
add_module_proc(COMMAND_PROC, nap_name, "nglist", "nglist", 0, 0, nap_glist, "list current downloads");
2282
add_module_proc(COMMAND_PROC, nap_name, "ndel", "ndel", 0, 0, nap_del, "<#> delete numbered file requests");
2283
add_module_proc(COMMAND_PROC, nap_name, "nhotlist", "nhotlist", 0, 0, naphotlist, "<nick> Adds <nick> to your hotlist");
2284
add_module_proc(COMMAND_PROC, nap_name, "nignore", "nignore", 0, 0, ignore_user, "<nick(s)> ignore these nicks in public/msgs/files");
2285
#if 0
2286
add_module_proc(COMMAND_PROC, nap_name, "nkill", "nkill", 0, 0, nap_admin, "<user> kills the user");
2287
add_module_proc(COMMAND_PROC, nap_name, "nnuke", "nnuke", 0, 0, nap_admin, "<user> nukes the user record");
2288
add_module_proc(COMMAND_PROC, nap_name, "nunnuke", "nunnuke", 0, 0, nap_admin, "<user> un-nukes the user record");
2289
add_module_proc(COMMAND_PROC, nap_name, "nban", "nban", 0, 0, nap_admin, "<user> ban the user");
2290
add_module_proc(COMMAND_PROC, nap_name, "nunban", "nunban", 0, 0, nap_admin, "<user> unban the user");
2291
add_module_proc(COMMAND_PROC, nap_name, "nsetdataport", "nsetdataport", 0, 0, nap_admin, "<user port> set the users dataport");
2292
add_module_proc(COMMAND_PROC, nap_name, "nsetuserlevel", "nsetuserlevel", 0, 0, nap_admin, "<user level> set the users level");
2293
add_module_proc(COMMAND_PROC, nap_name, "nopsay", "nopsay", 0, 0, nap_admin, "<msg> to all moderators/administrators/elite");
2294
add_module_proc(COMMAND_PROC, nap_name, "nannouce", "nannouce", 0, 0, nap_admin, "<msg> to all");
2295
add_module_proc(COMMAND_PROC, nap_name, "nbanlist", "nbanlist", 0, 0, nap_admin, "list current bans on server");
2296
add_module_proc(COMMAND_PROC, nap_name, "nsetlinespeed", "nsetlinespeed", 0, 0, nap_admin, "<user speed> set users line speed");
2297
add_module_proc(COMMAND_PROC, nap_name, "nmuzzle", "nunmuzzle", 0, 0, nap_admin, "<user> un-muzzle the user");
2298
add_module_proc(COMMAND_PROC, nap_name, "nmuzzle", "nunmuzzle", 0, 0, nap_admin, "<user> muzzle the user");
2299
#endif
2300
add_module_proc(COMMAND_PROC, nap_name, "nadmin", "nadmin", 0, 0, nap_admin, "Various ADMIN commands");
2301
add_module_proc(COMMAND_PROC, nap_name, "necho", "necho", 0, 0, nap_echo, "[-x] Echo output");
2302
2303
2304
add_module_proc(COMMAND_PROC, nap_name, "nsave", NULL, 0, 0, napsave, "saves a Napster.sav");
2305
add_module_proc(COMMAND_PROC, nap_name, "nclose", NULL, 0, 0, nclose, "close the current napster connect");
2306
2307
/* napsend.c */
2308
add_module_proc(COMMAND_PROC, nap_name, "nload", NULL, 0, 0, load_napserv, "[<dir dir | -recurse dir> scan dirs recursively -recurse to toggle");
2309
add_module_proc(COMMAND_PROC, nap_name, "nreload", NULL, 0, 0, load_napserv, "<dir dir | -recurse dir> scan dirs recursively -recurse to toggle");
2310
add_module_proc(COMMAND_PROC, nap_name, "nprint", NULL, 0, 0, print_napster, "display list of shared files");
2311
add_module_proc(COMMAND_PROC, nap_name, "nshare", NULL, 0, 0, share_napster, "Send list of shared files to napster server");
2312
add_module_proc(COMMAND_PROC, nap_name, "nstats", NULL, 0, 0, stats_napster, "Send list of shared files to napster server");
2313
2314
2315
add_module_proc(VAR_PROC, nap_name, "napster_prompt", (char *)convert_output_format("%K[%YNap%K]%n ", NULL, NULL), STR_TYPE_VAR, 0, NULL, NULL);
2316
add_module_proc(VAR_PROC, nap_name, "napster_window", NULL, BOOL_TYPE_VAR, 0, toggle_napwin, NULL);
2317
2318
add_module_proc(VAR_PROC, nap_name, "napster_host", "server.napster.com", STR_TYPE_VAR, 0, NULL, NULL);
2319
#ifdef ME
2320
add_module_proc(VAR_PROC, nap_name, "napster_user", "qr", STR_TYPE_VAR, 0, NULL, NULL);
2321
add_module_proc(VAR_PROC, nap_name, "napster_pass", "qr", STR_TYPE_VAR, 0, NULL, NULL);
2322
#else
2323
add_module_proc(VAR_PROC, nap_name, "napster_user", NULL, STR_TYPE_VAR, 0, NULL, NULL);
2324
add_module_proc(VAR_PROC, nap_name, "napster_pass", NULL, STR_TYPE_VAR, 0, set_passwd, NULL);
2325
#endif
2326
add_module_proc(VAR_PROC, nap_name, "napster_email", "[email protected]", STR_TYPE_VAR, 0, set_email, NULL);
2327
add_module_proc(VAR_PROC, nap_name, "napster_port", NULL, INT_TYPE_VAR, 8875, NULL, NULL);
2328
add_module_proc(VAR_PROC, nap_name, "napster_dataport", NULL, INT_TYPE_VAR, 6699, set_dataport, NULL);
2329
add_module_proc(VAR_PROC, nap_name, "napster_speed", NULL, INT_TYPE_VAR, 3, set_linespeed, NULL);
2330
add_module_proc(VAR_PROC, nap_name, "napster_max_results", NULL, INT_TYPE_VAR, 100, NULL, NULL);
2331
add_module_proc(VAR_PROC, nap_name, "napster_numeric", NULL, STR_TYPE_VAR, 0, NULL, NULL);
2332
add_module_proc(VAR_PROC, nap_name, "napster_download_dir", get_string_var(DCC_DLDIR_VAR), STR_TYPE_VAR, 0, NULL, NULL);
2333
add_module_proc(VAR_PROC, nap_name, "napster_names_nickcolor", "%K[%w $[12]0%K]", STR_TYPE_VAR, 0, NULL, NULL);
2334
add_module_proc(VAR_PROC, nap_name, "napster_hotlist_online", "%K[%w$[12]0%K]", STR_TYPE_VAR, 0, NULL, NULL);
2335
add_module_proc(VAR_PROC, nap_name, "napster_hotlist_offline", "%K[%R$[12]0%K]", STR_TYPE_VAR, 0, NULL, NULL);
2336
add_module_proc(VAR_PROC, nap_name, "napster_show_numeric", NULL, BOOL_TYPE_VAR, 0, set_numeric_string, NULL);
2337
add_module_proc(VAR_PROC, nap_name, "napster_window_hidden", NULL, BOOL_TYPE_VAR, 0, toggle_napwin_hide, NULL);
2338
add_module_proc(VAR_PROC, nap_name, "napster_resume_download", NULL, BOOL_TYPE_VAR, 1, NULL, NULL);
2339
add_module_proc(VAR_PROC, nap_name, "napster_send_limit", NULL, INT_TYPE_VAR, 5, NULL, NULL);
2340
add_module_proc(VAR_PROC, nap_name, "napster_names_columns", NULL, INT_TYPE_VAR, get_int_var(NAMES_COLUMNS_VAR), NULL, NULL);
2341
add_module_proc(VAR_PROC, nap_name, "napster_share", NULL, INT_TYPE_VAR, 1, NULL, NULL);
2342
add_module_proc(VAR_PROC, nap_name, "napster_max_send_nick", NULL, INT_TYPE_VAR, 4, NULL, NULL);
2343
2344
add_module_proc(ALIAS_PROC, nap_name, "mp3time", NULL, 0, 0, func_mp3_time, NULL);
2345
add_module_proc(ALIAS_PROC, nap_name, "ntopic", NULL, 0, 0, func_topic, NULL);
2346
add_module_proc(ALIAS_PROC, nap_name, "nonchan", NULL, 0, 0, func_onchan, NULL);
2347
add_module_proc(ALIAS_PROC, nap_name, "nonchannel", NULL, 0, 0, func_onchannel, NULL);
2348
add_module_proc(ALIAS_PROC, nap_name, "napconnected", NULL, 0, 0, func_connected, NULL);
2349
add_module_proc(ALIAS_PROC, nap_name, "nhotlist", NULL, 0, 0, func_hotlist, NULL);
2350
add_module_proc(ALIAS_PROC, nap_name, "ncurrent", NULL, 0, 0, func_napchannel, NULL);
2351
add_module_proc(ALIAS_PROC, nap_name, "nraw", NULL, 0, 0, func_raw, NULL);
2352
add_module_proc(ALIAS_PROC, nap_name, "md5", NULL, 0, 0, func_md5, NULL);
2353
2354
add_module_proc(VAR_PROC, nap_name, "napster_format", NULL, STR_TYPE_VAR, 0, set_numeric_string, NULL);
2355
add_module_proc(VAR_PROC, nap_name, "napster_dir", NULL, STR_TYPE_VAR, 0, NULL, NULL);
2356
2357
add_completion_type("nload", 4, FILE_COMPLETION);
2358
add_completion_type("nreload", 4, FILE_COMPLETION);
2359
2360
naphelp(NULL, NULL, NULL, NULL, NULL);
2361
sprintf(buffer, "$0+Napster %s by panasync - $2 $3", nap_version);
2362
fset_string_var(FORMAT_VERSION_FSET, buffer);
2363
loading_global = 1;
2364
snprintf(buffer, BIG_BUFFER_SIZE, "%s/Napster.sav", get_string_var(CTOOLZ_DIR_VAR));
2365
p = expand_twiddle(buffer);
2366
load("LOAD", p, empty_string, NULL);
2367
new_free(&p);
2368
loading_global = 0;
2369
2370
return 0;
2371
}
2372
2373