/* tcldcc.c -- handles: Tcl stubs for the dcc commands dprintf'ized, 1aug96 */ #if HAVE_CONFIG_H #include #endif #include #include #include #include #include "../lush.h" #include "eggdrop.h" #include "proto.h" #include "cmdt.h" #include "tclegg.h" extern Tcl_Interp *interp; extern char cx_file[]; extern int cx_line; extern struct dcc_t dcc[]; extern int dcc_total; extern int copy_to_tmp; extern char tempdir[]; extern char origbotname[]; extern int backgrd; extern int noshare; /***********************************************************************/ int tcl_putdcc STDVAR { int i,j; BADARGS(3,3," idx text"); i=atoi(argv[1]); j=findidx(i); if (j<0) { Tcl_AppendResult(irp,"illegal idx",NULL); return TCL_ERROR; } dprintf(j,"%s\n",argv[2]); return TCL_OK; } int tcl_dccsimul STDVAR { int i,idx,atr; char cmd[512]; BADARGS(3,3," idx command"); i=atoi(argv[1]); idx=findidx(i); if (idx<0) { Tcl_AppendResult(irp,"invalid idx",NULL); return TCL_ERROR; } if ((dcc[idx].type!=DCC_CHAT) && (dcc[idx].type!=DCC_FILES) && (dcc[idx].type!=DCC_SCRIPT)) { Tcl_AppendResult(irp,"invalid idx",NULL); return TCL_ERROR; } if (strlen(argv[2])>510) argv[2][510]=0; /* restrict length of cmd */ strcpy(cmd,argv[2]); atr=get_attr_handle(dcc[idx].nick); noshare=1; set_attr_handle(dcc[idx].nick,atr|USER_OWNER); noshare=0; dcc_activity(dcc[idx].sock,cmd,strlen(cmd)); noshare=1; set_attr_handle(dcc[idx].nick,atr); noshare=0; /* if (got_dcc_cmd(idx,cmd)) { dcc_activity(dcc[idx].sock,".quit",5); } */ return TCL_OK; } int tcl_dccsend STDVAR { char s[5],sys[512],*nfn; int i; FILE *f; BADARGS(3,3," filename ircnick"); f=fopen(argv[1],"r"); if (f==NULL) { /* file not found */ Tcl_AppendResult(irp,"3",NULL); return TCL_OK; } fclose(f); nfn=strrchr(argv[1],'/'); if (nfn==NULL) nfn=argv[1]; else nfn++; if (at_limit(argv[2])) { /* queue that mother */ if (nfn==argv[1]) queue_file("*",nfn,"(script)",argv[2]); else { nfn--; *nfn=0; nfn++; sprintf(sys,"*%s",argv[1]); queue_file(sys,nfn,"(script)",argv[2]); } Tcl_AppendResult(irp,"4",NULL); return TCL_OK; } if (copy_to_tmp) { sprintf(sys,"%s%s",tempdir,nfn); /* new filename, in /tmp */ copyfile(argv[1],sys); } else strcpy(sys,argv[1]); i=raw_dcc_send(sys,argv[2],"*",argv[1]); if (i>0) wipe_tmp_filename(sys,-1); sprintf(s,"%d",i); Tcl_AppendResult(irp,s,NULL); return TCL_OK; } int tcl_dccbroadcast STDVAR { char msg[401]; BADARGS(2,2," message"); strncpy(msg,argv[1],400); msg[400]=0; chatout("*** %s\n",msg); tandout("chat %s %s\n",origbotname,msg); return TCL_OK; } int tcl_hand2idx STDVAR { int i; char s[10]; BADARGS(2,2," nickname"); for (i=0; iu.chat->channel); else sprintf(s,"%d",dcc[idx].u.chat->channel); Tcl_AppendResult(irp,s,NULL); return TCL_OK; } int tcl_setchan STDVAR { int idx,i,chan; BADARGS(3,3," idx channel"); i=atoi(argv[1]); idx=findidx(i); if (idx<0) { Tcl_AppendResult(irp,"invalid idx",NULL); return TCL_ERROR; } if ((dcc[idx].type!=DCC_CHAT) && (dcc[idx].type!=DCC_SCRIPT)) { Tcl_AppendResult(irp,"invalid idx",NULL); return TCL_ERROR; } if ((argv[2][0]<'0') || (argv[2][0]>'9')) { if ((strcmp(argv[2],"-1")==0) || (strcasecmp(argv[2],"off")==0)) chan=(-1); else chan=get_assoc(argv[2]); if (chan < -1) { Tcl_AppendResult(irp,"channel name is invalid",NULL); return TCL_ERROR; } } else chan=atoi(argv[2]); if ((chan<-1) || (chan>99999)) { Tcl_AppendResult(irp,"channel out of range; must be -1 thru 99999",NULL); return TCL_ERROR; } if (dcc[idx].type==DCC_SCRIPT) dcc[idx].u.script->u.chat->channel=chan; else dcc[idx].u.chat->channel=chan; return TCL_OK; } int tcl_dccputchan STDVAR { int chan; char msg[401]; BADARGS(3,3," channel message"); chan=atoi(argv[1]); if ((chan<0) || (chan>99999)) { Tcl_AppendResult(irp,"channel out of range; must be 0 thru 99999",NULL); return TCL_ERROR; } strncpy(msg,argv[2],400); msg[400]=0; chanout2(chan,"%s\n",argv[2]); return TCL_OK; } int tcl_console STDVAR { int i,j,pls,arg; BADARGS(2,4," idx ?channel? ?console-modes?"); j=atoi(argv[1]); i=findidx(j); if (i<0) { Tcl_AppendResult(irp,"invalid idx",NULL); return TCL_ERROR; } if (dcc[i].type!=DCC_CHAT) { Tcl_AppendResult(irp,"invalid idx",NULL); return TCL_ERROR; } pls=1; for (arg=2; argcon_chan,argv[arg],80); dcc[i].u.chat->con_chan[80]=0; } else { if ((argv[arg][0]!='+') && (argv[arg][0]!='-')) dcc[i].u.chat->con_flags=0; for (j=0; jcon_flags|=logmodes(s); else dcc[i].u.chat->con_flags&=~logmodes(s); } } } } Tcl_AppendElement(irp,dcc[i].u.chat->con_chan); Tcl_AppendElement(irp,masktype(dcc[i].u.chat->con_flags)); return TCL_OK; } int tcl_echo STDVAR { int i,j; BADARGS(2,3," idx ?status?"); j=atoi(argv[1]); i=findidx(j); if (i<0) { Tcl_AppendResult(irp,"invalid idx",NULL); return TCL_ERROR; } if (dcc[i].type!=DCC_CHAT) { Tcl_AppendResult(irp,"invalid idx",NULL); return TCL_ERROR; } if (argc==3) { if (atoi(argv[2])) dcc[i].u.chat->status|=STAT_ECHO; else dcc[i].u.chat->status&=~STAT_ECHO; } if (dcc[i].u.chat->status&STAT_ECHO) Tcl_AppendResult(irp,"1",NULL); else Tcl_AppendResult(irp,"0",NULL); return TCL_OK; } int tcl_control STDVAR { int idx,i; BADARGS(3,3," idx command"); i=atoi(argv[1]); idx=findidx(i); if (idx<0) { Tcl_AppendResult(irp,"invalid idx",NULL); return TCL_ERROR; } if ((dcc[idx].type==DCC_CHAT) && (dcc[idx].u.chat->channel >= 0)) chanout2_but(idx,dcc[idx].u.chat->channel,"%s has gone.\n",dcc[idx].nick); set_script(idx); strncpy(dcc[idx].u.script->command,argv[2],120); dcc[idx].u.script->command[119]=0; return TCL_OK; } int tcl_killdcc STDVAR { int idx,i; BADARGS(2,2," idx"); i=atoi(argv[1]); idx=findidx(i); if (idx<0) { Tcl_AppendResult(irp,"invalid idx",NULL); return TCL_ERROR; } if ((dcc[idx].type!=DCC_CHAT) && (dcc[idx].type!=DCC_FILES) && (dcc[idx].type!=DCC_SCRIPT)) { Tcl_AppendResult(irp,"invalid idx",NULL); return TCL_ERROR; } /* don't kill terminal socket */ if ((dcc[idx].sock==STDOUT) && !backgrd) return TCL_OK; killsock(dcc[idx].sock); lostdcc(idx); return TCL_OK; } int tcl_putbot STDVAR { int i; char msg[401]; BADARGS(3,3," botnick message"); i=nextbot(argv[1]); if (i<0) { Tcl_AppendResult(irp,"bot is not in the botnet",NULL); return TCL_ERROR; } strncpy(msg,argv[2],400); msg[400]=0; tprintf(dcc[i].sock,"zapf %s %s %s\n",origbotname,argv[1],msg); return TCL_OK; } int tcl_putallbots STDVAR { char msg[401]; BADARGS(2,2," message"); strncpy(msg,argv[1],400); msg[400]=0; tandout("zapf-broad %s %s\n",origbotname,msg); return TCL_OK; } int tcl_idx2hand STDVAR { int i,idx; BADARGS(2,2," idx"); i=atoi(argv[1]); idx=findidx(i); if (idx<0) { Tcl_AppendResult(irp,"invalid idx",NULL); return TCL_ERROR; } Tcl_AppendResult(irp,dcc[idx].nick,NULL); return TCL_OK; } int tcl_bots STDVAR { int i; BADARGS(1,1,""); for (i=0; itimer)); break; case DCC_FILES: x=(now-(dcc[idx].u.file->chat->timer)); break; case DCC_SCRIPT: if (dcc[idx].u.script->type == DCC_CHAT) x=(now-(dcc[idx].u.script->u.chat->timer)); else x=(now-(dcc[idx].u.script->u.file->chat->timer)); break; default: Tcl_AppendResult(irp,"invalid idx",NULL); return TCL_ERROR; } sprintf(s,"%d",x); Tcl_AppendElement(irp,s); return TCL_OK; } int tcl_link STDVAR { int x,i; char bot[10],bot2[10]; BADARGS(2,3," ?via-bot? bot"); strncpy(bot,argv[1],9); bot[9]=0; if (argc==2) x=tandem_link("",-1,bot); else { x=1; strncpy(bot2,argv[2],9); bot2[9]=0; i=nextbot(bot); if (i<0) x=0; else tprintf(dcc[i].sock,"link %s %s %s\n",origbotname,bot,bot2); } sprintf(bot,"%d",x); Tcl_AppendResult(irp,bot,NULL); return TCL_OK; } int tcl_unlink STDVAR { int i,x; char bot[10]; BADARGS(2,2," bot"); strncpy(bot,argv[1],9); bot[9]=0; i=nextbot(bot); if (i<0) x=0; else { x=1; if (strcasecmp(bot,dcc[i].nick)==0) x=tandem_unlink(-2,bot); else tprintf(dcc[i].sock,"unlink %s %s %s\n",origbotname,lastbot(bot),bot); } sprintf(bot,"%d",x); Tcl_AppendResult(irp,bot,NULL); return TCL_OK; } int tcl_filesend STDVAR { int i,idx; char s[10]; BADARGS(3,4," idx filename ?nick?"); i=atoi(argv[1]); idx=findidx(i); if (idx<0) { Tcl_AppendResult(irp,"invalid idx",NULL); return TCL_ERROR; } if (dcc[idx].type!=DCC_FILES) { Tcl_AppendResult(irp,"invalid idx",NULL); return TCL_ERROR; } if (argc==4) i=files_get(idx,argv[2],argv[3]); else i=files_get(idx,argv[2],""); sprintf(s,"%d",i); Tcl_AppendResult(irp,s,NULL); return TCL_OK; } int tcl_assoc STDVAR { int chan; char name[21],*p; BADARGS(2,3," chan name"); chan=atoi(argv[1]); if ((chan<1) || (chan>99999)) { Tcl_AppendResult(irp,"invalid channel #",NULL); return TCL_ERROR; } if (argc==3) { strncpy(name,argv[2],20); name[20]=0; add_assoc(name,chan); } p=get_assoc_name(chan); if (p==NULL) name[0]=0; else strcpy(name,p); Tcl_AppendResult(irp,name,NULL); return TCL_OK; } int tcl_killassoc STDVAR { int chan; BADARGS(2,2," chan"); chan=atoi(argv[1]); if ((chan<1) || (chan>99999)) { Tcl_AppendResult(irp,"invalid channel #",NULL); return TCL_ERROR; } kill_assoc(chan); return TCL_OK; }