/****************************************************************************** Functions coded by Flier (THANX to Sheik!!) FindMatch Returns pointer to friends list with matching entry HandleNickCollision Handles nick collisions TimeReply Handles reply number 333 from server TagNick Tags nick for nick watcher WhereIs Try to dig out users new nick WhereList This will list all users on nick watcher list UnFlash Unflashes your terminal vt100Decode Checks if character is printable FixColorAnsi Checks if ansi string only sets colors/attributes and if not it changes escape character (0x1B) to space CountAnsi How many ansi chars are there in string ColorName Returns the name of the color GetColors Decodes colors and returns string for save SaveColors Saves color settings to ScrollZ.save BuildColor Parses color string and puts color codes in target string SetColors Sets colors loaded from ScrollZ.save PrintSetting Prints setting StripAnsi Strips out ANSI codes for logging StripCrap Strips out non printable codes for logging SplitPrint Prints netsplit stuff ModePrint Prints mode stuff KickPrint Prints kick stuff Password Sets password for log file encryption PrintWho Prints who reply PrintWhoIsUser Prints whois user reply PrintWhoIsChannels Prints whois channel reply PrintWhoIsServers Prints whois server reply PrintPublic Prints public messages OpenCreateFile Opens file in path and creates one if necessary PrintLinks Prints coloured links PlayBack Shows messages from ScrollZ.away w/o setting you back AwaySaveToggle Defines what to save to ScrollZ.away StatsKFilter Does /STATS k with filter HandleStatsK Handles STATS k reply from server CurrentChaneMode Sets mode for your current channel Nslookup Looks up DNS entry DoNslookup This does the real DNS look-up InsertAutoReply Inserts nickname of person that triggered auto reply Dump Dumps variables, aliases, ons or all of them AddNick2AutoReply Adds nick to auto reply nick RemoveLog Deletes ScrollZ.away file AutoChangeNick Automatically changes nick PrintChatMsg Colored chat PrintMyChatMsg Prints my chat messages MSay Outputs line to all channels CreateBan Creates ban according to ban type Terminate Quits with 152 errorlevel PrintSynch Checks whether join is synched DirLSM Redirects last message/notice you've sent ShowUser Like internal WHO SetColor Sets colors interactively NotifyModeToggle Toggles notify mode brief/verbose PingMe Pings yourself NotePad Lets you write down into a file URLCatchToggle Toggles URL catcher on/off PrintLinksHead Prints head of /LINKS CountAnsiInput How many ansi chars are there in input line SortedCmp Used to insert into sorted linked list LastJoinerKick BanKicks the last person to join URLSave Saves URLs to notepad (coded by Zakath) AcceptLastChat Establishes dcc chat with user that last requested chat GrabURL This bolds out URLs and copies them to buffer LogOnToggle Toggles whether to save to ScrollZ.away if not away PrintNames Prints names on channel join InitKeysColors Initializes keys and default color scheme MultiKick Kicks nick from multiple channel WhoKill Kills users matching filter with WHO DoKill Does the actual killing HandleEndOfKill Reports statistics ******************************************************************************/ /* * $Id: edit5.c,v 1.113 2006/04/30 14:15:43 f Exp $ */ #include "irc.h" #include "crypt.h" #include "vars.h" #include "ircaux.h" #include "window.h" #include "whois.h" #include "hook.h" #include "input.h" #include "ignore.h" #include "keys.h" #include "list.h" #include "names.h" #include "alias.h" #include "history.h" #include "funny.h" #include "ctcp.h" #include "dcc.h" #include "translat.h" #include "output.h" #include "notify.h" #include "numbers.h" #include "status.h" #include "screen.h" #include "server.h" #include "edit.h" #include "ircterm.h" #include "struct.h" #include "parse.h" #include "myvars.h" #include "whowas.h" #include /* for umask() */ void PlayBack2 _((char *, char *)); void AddNick2AutoReply _((char *)); void DoNslookup _((char *)); void NotePad _((char *, char *, char *)); char *OpenCreateFile _((char *, int)); void PrintLinksHead _((void)); void URLSave _((char *, char *, char *)); /* /URL coded by Zakath */ void URLSave2 _((char *, char *)); void URLSave3 _((char *, char *)); int GrabURL _((char *, char *, char *, char *)); void MasterPassword _((char *, char *)); void MasterPasswordOld _((char *, char *)); extern int CheckChannel _((char *, char *)); extern void AwaySave _((char *, int)); extern void NextArg _((char *, char **, char *)); extern void PrintError _((char *, char *, int)); extern void DumpAliases _((int)); extern void DumpOn _((void)); extern NickList *CheckJoiners _((char *, char *, int , ChannelList *)); extern int readln _((FILE *, char *)); extern void UserDomainList _((char *)); #ifdef MGS extern void MyQuit _((char *)); #endif extern void HandleGotOps _((char *, ChannelList *)); extern void AddNick2List _((char *, int)); extern struct friends *CheckUsers _((char *, char *)); extern void BanKick _((char *, char *, char *)); extern void BuildPrivs _((struct friends *, char *)); extern void SetBackDelete _((char *, char *)); extern void Check4WordKick _((char *, NickList *, int, ChannelList *)); extern void NotChanOp _((char *)); extern void NoWindowChannel _((void)); extern void PrintUsage _((char *)); extern void ColorUserHost _((char *, char *, char *, int)); extern NickList *find_in_hash _((ChannelList *, char *)); extern int AddLast _((List *, List *)); /* needed for GrabURL, by Zakath */ extern int CheckServer _((int)); extern char *TimeStamp _((int)); extern void ChannelLogSave _((char *, ChannelList *)); extern int EncryptString _((char *, char *, char *, int, int)); extern int DecryptString _((char *, char *, char *, int, int)); extern int RateLimitJoin _((int)); #ifdef CELE /*extern void Cstatusupd _((int, int)); extern int Cstatusnum;*/ #endif /* CELE */ #ifdef CELECOSM struct friends *whoisfriend; #endif #ifdef COUNTRY extern char *function_country _((char *)); #endif extern void dcc_chat _((char *)); extern void reset_nickname _((char *, char **)); extern void nickname_sendline _((char *, char *)); extern char *function_match _((char *)); /* Needed for URL, by Zakath */ int URLnum=0; static char *urlbuf=(char *) 0; #ifdef OPER int StatskNumber; static int WhoKillNum; static char *wkillpattern=(char *) 0; static char *wkillreason=(char *) 0; #endif static char *playpattern=(char *) 0; static int filesize; static int DontHold; static int PlayReverse; static FILE *awayfile=NULL; #ifdef ACID static int listcount=0; #endif /* Returns pointer to friends list with matching entry */ struct friends *FindMatch(userhost,channel) char *userhost; char *channel; { struct friends *tmpfriend; for (tmpfriend=frlist;tmpfriend;tmpfriend=tmpfriend->next) if ((wild_match(tmpfriend->userhost,userhost) || wild_match(userhost,tmpfriend->userhost)) && CheckChannel(channel,tmpfriend->channels)) return(tmpfriend); return(NULL); } /* Handles nick collision */ void HandleNickCollision() { if (away_set || LogOn) AwaySave("Nick collision",SAVECOLL); } /* Handles reply number 333 from server */ void TimeReply(from,ArgList) char *from; char **ArgList; { char *channel; ChannelList *chan; if (ArgList[1] && is_channel(ArgList[0]) && ArgList[2]) { channel = ArgList[0]; if ((chan = lookup_channel(channel, parsing_server_index, 0))) { chan->topicwhen = atoi(ArgList[2]); malloc_strcpy(&(chan->topicwho), ArgList[1]); save_message_from(); message_from(channel, LOG_CRAP); put_it("%sSet by %s on %.19s", numeric_banner(), chan->topicwho, ctime(&(chan->topicwhen))); restore_message_from(); if (chan->ChanLog) { char tmpbuf[mybufsize]; snprintf(tmpbuf, sizeof(tmpbuf), "Set by %s on %.19s", chan->topicwho, ctime(&(chan->topicwhen))); ChannelLogSave(tmpbuf, chan); } } } } #ifdef ACID /* Just a declaration , needed to shut up the compiler */ void TagNickNew(); /* Tags nick for nick watcher */ void TagNick(command,args,subargs) char *command; char *args; char *subargs; { char *tmpnick; void (*func)(); if (*args) { tmpnick=new_next_arg(args,&args); func=(void(*)())TagNickNew; server_list[from_server].SZWI++; add_to_whois_queue(tmpnick,func,"%s",tmpnick); } else PrintUsage("TAG nick"); } /* This stores user to nick watch list */ void TagNickNew(wistuff,tmpnick,text) WhoisStuff *wistuff; char *tmpnick; char *text; { char tmpbuf1[mybufsize/4]; struct list *tmp; if (server_list[from_server].SZWI) server_list[from_server].SZWI--; if (wistuff->not_on || !wistuff->nick || my_stricmp(wistuff->nick,tmpnick)) { say("Can't find %s on IRC",tmpnick); return; } snprintf(tmpbuf1,sizeof(tmpbuf1),"%s@%s",wistuff->user,wistuff->server); tmp=nickwatchlist; while (tmp && tmp->next) tmp=tmp->next; tmpnickwatch=(struct list *) new_malloc(sizeof(struct list)); tmpnickwatch->nick=NULL; tmpnickwatch->userhost=NULL; malloc_strcpy(&(tmpnickwatch->nick),wistuff->nick); malloc_strcpy(&(tmpnickwatch->userhost),tmpbuf1); tmpnickwatch->next=NULL; if (nickwatchlist) tmp->next=tmpnickwatch; else nickwatchlist=tmpnickwatch; say("%s added to nick watcher",tmpnickwatch->nick); } /* This will dig out users new nickname */ void WhereIs(command,args,subargs) char *command; char *args; char *subargs; { char *tmpnick; int found=0; if (*args) { tmpnick=new_next_arg(args,&args); tmpnickwatch=nickwatchlist; while (tmpnickwatch && !found) { if (!my_stricmp(tmpnick,tmpnickwatch->nick)) found=1; else tmpnickwatch=tmpnickwatch->next; } if (found) { say("You will get VERSION reply from person under their new nick"); say("if they didn't change their server or username. This will fail"); say("if two users share the same username on target server."); send_to_server("PRIVMSG %s :%cVERSION%c",tmpnickwatch->userhost,CTCP_DELIM_CHAR,CTCP_DELIM_CHAR); } else say("%s is not on nick watcher list, use /TAG to add user",tmpnick); } else PrintUsage("WHEREIS nick"); } /* Just a declaration , needed to shut up the compiler */ void WhereListPage(); /* This will list all users on nick watcher list */ void WhereList(command,args,subargs) char *command; char *args; char *subargs; { listcount=0; tmpnickwatch=nickwatchlist; say("The following people are on nick watch list :"); WhereListPage(command); } /* Just a declaration , needed to shut up the compiler */ void WhereListKey(); /* Lists one page of nick watch list */ void WhereListPage(line) char *line; { int count=3; while (countdisplay_size && tmpnickwatch!=NULL) { count++; listcount++; say("#%-2d %-12s %s",listcount,tmpnickwatch->nick,tmpnickwatch->userhost); tmpnickwatch=tmpnickwatch->next; } if (!tmpnickwatch) WhereListKey(line,"E"); else if (count>=curr_scr_win->display_size) add_wait_prompt("Press any key to continue, 'q' to quit",WhereListKey,line,WAIT_PROMPT_KEY); } /* This waits for key press */ void WhereListKey(stuff,line) char *stuff; char *line; { if (line && (*line=='q' || *line=='Q' || *line=='E')) { if (*line=='E') say("Total of %d people on nick watch list",listcount); return; } else WhereListPage(stuff); } #endif /* Unflashes your terminal */ void UnFlash(command,args,subargs) char *command; char *args; char *subargs; { fwrite("\033c",2,1,stdout); refresh_screen(0,(char *) 0); } #ifdef WANTANSI /* Checks if character is printable */ int vt100Decode(chr) register char chr; { static enum { Normal,Escape,SCS,CSI,DCS,DCSData,DCSEscape } vtstate=Normal; if (chr==0x1B) if (vtstate==DCSData || vtstate==DCSEscape) vtstate=DCSEscape; else { vtstate=Escape; return(1); } else if (chr==0x18 || chr==0x1A) vtstate=Normal; else if (chr==0xE || chr==0xF) ; else if (chr<0x20) return(0); switch (vtstate) { case Normal: return 0; break; case Escape: switch (chr) { case '[': vtstate = CSI; break; case 'P': vtstate = DCS; break; case '(': case ')': vtstate = SCS; break; default: vtstate = Normal; } return(1); break; case SCS: vtstate = Normal; break; case CSI: if (isalpha(chr)) vtstate=Normal; break; case DCS: if (chr>=0x40 && chr<=0x7E) vtstate=DCSData; break; case DCSData: break; case DCSEscape: vtstate=Normal; break; } return(1); } /* Checks if ansi string only sets colors/attributes */ void FixColorAnsi(str) char *str; { register int val=0; register int what=0; register int numbers=0; register char *tmpstr; register char *tmpstr1=NULL; for (tmpstr=str;*tmpstr;tmpstr++) { if ((*tmpstr>='0' && *tmpstr<='9')) { numbers=1; val=val*10+(*tmpstr-'0'); } else if (*tmpstr==';') { numbers=1; val=0; } /*else if (!(*tmpstr=='m' || *tmpstr=='C')) numbers=val=0;*/ else if (!(*tmpstr=='m')) numbers=val=0; if (*tmpstr==0x1B) { if (what && tmpstr1) *tmpstr1+=64; what=1; tmpstr1=tmpstr; numbers=val=0; } /*if (what && (*tmpstr=='m' || *tmpstr=='C')) {*/ if (what && *tmpstr=='m') { if (!numbers || val==12) { *tmpstr1+=64; tmpstr1=tmpstr; } what=0; numbers=val=0; } else if (what==1 && *tmpstr=='(') what=2; else if (what==2 && *tmpstr=='U') what=0; else if (what && isalpha(*tmpstr)) { *tmpstr1+=64; what=0; } } if (what && tmpstr1) *tmpstr1+=64; } /* Counts ansi chars in string */ int CountAnsi(str,len) char *str; int len; { register int count=0; register int x=0; register char *ptr; if (!str) return(0); FixColorAnsi(str); if (len==-1) { for (ptr=str;*ptr;ptr++) if (vt100Decode(*ptr)) count++; } else { for (ptr=str;*ptr && x=128 (national characters) 3 ... same as 2, but also strip BOLD, REVERSE and UNDERLINE 4 ... same as 1 but convert non-printable characters to reverse */ void StripAnsi(line, destline, printonly) char *line; char *destline; int printonly; { int what = 0; int isattr; unsigned char *tmpstr; unsigned char *newstr = destline; for (tmpstr = line; *tmpstr; tmpstr++) { if (*tmpstr == 0x1B) what = 1; else if (what && isalpha(*tmpstr)) what = 0; else if (!what) { if (printonly && (*tmpstr < ' ' || *tmpstr > '~')) { if (printonly == 4 && *tmpstr < ' ') { *newstr ++= REV_TOG; *newstr ++= (*tmpstr & 127) | 64; *newstr ++= REV_TOG; continue; } if (printonly == 1) continue; if (*tmpstr == 0x9B || *tmpstr == 0x84) continue; isattr = (*tmpstr == BOLD_TOG || *tmpstr == REV_TOG || *tmpstr == UND_TOG || *tmpstr == ALL_OFF); if (printonly == 3 && isattr) continue; if (!(*tmpstr > '~' || isattr)) continue; } *newstr ++= *tmpstr; } } *newstr = '\0'; } /* Prints netsplit stuff */ void SplitPrint(reason,nick,channel,netsplit) char *reason; char *nick; char *channel; int netsplit; { char *tmpstr; char *server; char tmpbuf1[mybufsize]; #ifdef WANTANSI char tmpbuf2[mybufsize]; #endif if (NHDisp && netsplit==2) { strmcpy(tmpbuf1, reason, sizeof(tmpbuf1)); tmpstr = tmpbuf1; server = new_next_arg(tmpstr,&tmpstr); #ifdef WANTANSI #ifdef CELECOSM if (Stamp < 2) snprintf(tmpbuf2,sizeof(tmpbuf2), "%snetsplit%s %s[%s%s%s%s%s]%s - ", CmdsColors[COLNETSPLIT].color1, Colors[COLOFF], CmdsColors[COLNETSPLIT].color3, Colors[COLOFF], CmdsColors[COLNETSPLIT].color2, update_clock(0, 0, GET_TIME), Colors[COLOFF], CmdsColors[COLNETSPLIT].color3, Colors[COLOFF]); else snprintf(tmpbuf2,sizeof(tmpbuf2), "%snetsplit%s - ", CmdsColors[COLNETSPLIT].color1, Colors[COLOFF]); #else /* CELECOSM */ snprintf(tmpbuf2,sizeof(tmpbuf2), "%sNetsplit detected%s%s%s%s%s : ", CmdsColors[COLNETSPLIT].color1, Colors[COLOFF], Stamp < 2 ? " at " : empty_string, CmdsColors[COLNETSPLIT].color2, Stamp < 2 ? update_clock(0, 0, GET_TIME) : empty_string, Colors[COLOFF]); #endif /* CELECOSM */ say("%s[%s%s%s %s<-%s %s%s%s]", tmpbuf2, CmdsColors[COLNETSPLIT].color3, tmpstr, Colors[COLOFF], CmdsColors[COLNETSPLIT].color6, Colors[COLOFF], CmdsColors[COLNETSPLIT].color3, server, Colors[COLOFF]); #else /* WANTANSI */ say("Netsplit detected%s%s : [%s <- %s]", Stamp < 2 ? " at " : empty_string, Stamp < 2 ? update_clock(0, 0, GET_TIME) : empty_string, tmpstr, server); #endif /* WANTANSI */ } } /* Prints mode stuff */ void ModePrint(line,channel,nick,userhost,nethacks,servmode) char *line; char *channel; char *nick; char *userhost; char *nethacks; char *servmode; { int isitserver; #ifdef WANTANSI char tmpbuf1[mybufsize/2]; #endif char tmpbuf2[mybufsize]; ChannelList *chan = NULL; if (ChanLog) chan = lookup_channel(channel, parsing_server_index, 0); isitserver=index(nick,'.')?1:0; if (isitserver) { if (NHDisp==2 && nethacks[0]) { #ifdef WANTANSI #ifdef CELECOSM snprintf(tmpbuf1,sizeof(tmpbuf1),"/%s%s%s - %s%s%s/", #else snprintf(tmpbuf1,sizeof(tmpbuf1),"[%s%s%s] on %s%s%s", #endif /* CELECOSM */ CmdsColors[COLNETSPLIT].color3,nick,Colors[COLOFF], CmdsColors[COLNETSPLIT].color4,channel,Colors[COLOFF]); #ifdef CELECOSM snprintf(tmpbuf2,sizeof(tmpbuf2),"%snethack%s %s %s%s%s", #else snprintf(tmpbuf2,sizeof(tmpbuf2),"%sNetsplit hack%s %s by : %s%s%s", #endif /* CELECOSM */ CmdsColors[COLNETSPLIT].color1,Colors[COLOFF],tmpbuf1, CmdsColors[COLNETSPLIT].color5,nethacks,Colors[COLOFF]); #else /* WANTANSI */ snprintf(tmpbuf2,sizeof(tmpbuf2),"%cNetsplit hack%c [%s] detected on %s by : %s", bold,bold,nick,channel,nethacks); #endif /* WANTANSI */ say("%s",tmpbuf2); if (away_set || LogOn) AwaySave(tmpbuf2,SAVEHACK); if (chan && chan->ChanLog) ChannelLogSave(tmpbuf2, chan); } if (servmode[0]) { #ifdef WANTANSI #ifdef CELECOSM snprintf(tmpbuf1,sizeof(tmpbuf1),"%sserver modes%s in %s%s%s: \"%s%s%s\" by ", CmdsColors[COLMODE].color5,Colors[COLOFF], CmdsColors[COLMODE].color3,channel,Colors[COLOFF], CmdsColors[COLMODE].color4,servmode,Colors[COLOFF]); #else /* CELECOSM */ snprintf(tmpbuf1,sizeof(tmpbuf1),"%sServer modes%s \"%s%s%s\" detected on %s%s%s by : ", CmdsColors[COLMODE].color5,Colors[COLOFF], CmdsColors[COLMODE].color4,servmode,Colors[COLOFF], CmdsColors[COLMODE].color3,channel,Colors[COLOFF]); #endif /* CELECOSM */ snprintf(tmpbuf2,sizeof(tmpbuf2),"%s%s%s%s", tmpbuf1,CmdsColors[COLMODE].color1,nick,Colors[COLOFF]); #else /* WANTANSI */ snprintf(tmpbuf2,sizeof(tmpbuf2),"%cServer modes%c \"%s\" detected on %s by : %s", bold,bold,servmode,channel,nick); #endif /* WANTANSI */ say("%s",tmpbuf2); if (away_set || LogOn) AwaySave(tmpbuf2,SAVESRVM); if (chan && chan->ChanLog) ChannelLogSave(tmpbuf2, chan); } } else { #ifdef WANTANSI #ifdef CELECOSM snprintf(tmpbuf1,sizeof(tmpbuf1),"%smode%s in %s%s%s: \"%s%s%s\" by ", CmdsColors[COLMODE].color5,Colors[COLOFF], CmdsColors[COLMODE].color3,channel,Colors[COLOFF], CmdsColors[COLMODE].color4,line,Colors[COLOFF]); #else /* CELECOSM */ snprintf(tmpbuf1,sizeof(tmpbuf1),"%sMode change%s \"%s%s%s\" on channel %s%s%s by ", CmdsColors[COLMODE].color5,Colors[COLOFF], CmdsColors[COLMODE].color4,line,Colors[COLOFF], CmdsColors[COLMODE].color3,channel,Colors[COLOFF]); #endif /* CELECOSM */ say("%s%s%s%s",tmpbuf1,CmdsColors[COLMODE].color1,nick,Colors[COLOFF]); #else /* WANTANSI */ say("Mode change \"%s\" on channel %s by %s",line, channel, nick); #endif /* WANTANSI */ if (chan && chan->ChanLog) { snprintf(tmpbuf2, sizeof(tmpbuf2), "Mode change \"%s\" on channel %s by %s",line, channel, nick); ChannelLogSave(tmpbuf2, chan); } } } /* Prints kick stuff */ void KickPrint(who,word,from,channel,comment,rejoin,frkick) char *who; char *word; char *from; char *channel; char *comment; int rejoin; int frkick; { #ifdef WANTANSI char *colnick; char tmpbuf[mybufsize/2]; if (frkick) colnick=CmdsColors[COLKICK].color6; else colnick=CmdsColors[COLKICK].color1; #ifdef CELECOSM snprintf(tmpbuf,sizeof(tmpbuf),"%s%s%s %s %skicked%s from %s%s%s by", colnick,who,Colors[COLOFF],word, CmdsColors[COLKICK].color5,Colors[COLOFF], CmdsColors[COLKICK].color3,channel,Colors[COLOFF]); #else /* CELECOSM */ snprintf(tmpbuf,sizeof(tmpbuf),"%s%s%s %s been %skicked%s from channel %s%s%s by", colnick,who,Colors[COLOFF],word, CmdsColors[COLKICK].color5,Colors[COLOFF], CmdsColors[COLKICK].color3,channel,Colors[COLOFF]); #endif /* CELECOSM */ if (comment && *comment) say("%s %s%s%s (%s%s%s)",tmpbuf, CmdsColors[COLKICK].color2,from,Colors[COLOFF], CmdsColors[COLKICK].color4,comment,Colors[COLOFF]); else say("%s %s%s%s",tmpbuf, CmdsColors[COLKICK].color2,from,Colors[COLOFF]); if (rejoin) { save_message_from(); message_from(channel,LOG_CRAP); say("Auto rejoining %s%s%s",CmdsColors[COLJOIN].color3,channel,Colors[COLOFF]); restore_message_from(); } #else if (comment && *comment) say("%s %s been kicked from channel %s by %s (%s)", who,word,channel,from,comment); else say("%s %s been kicked from channel %s by %s (%s)", who,word,channel,from); if (rejoin) { save_message_from(); message_from(channel,LOG_CRAP); say("Auto rejoining %s",channel); restore_message_from(); } #endif } /* Sets master password for ENCRMSG and log file encryption */ void Password(command, args, subargs) char *command; char *args; char *subargs; { char *oldpwd; char *newpwd; newpwd = new_next_arg(args, &args); if (newpwd) { int pwlen = 2 * strlen(newpwd) + 16; char *newpass = (char *) new_malloc(pwlen + 1); /* a-la master password in Mozilla - store encrypted password */ EncryptString(newpass, newpwd, newpwd, pwlen, 0); if (!(args && *args)) { if (EncryptPassword) { if (!strcmp(newpass, EncryptPassword)) { if (encrlist) { say("Encryption list not empty - master password NOT deleted!"); return; } say("Master password deleted, encryption is now disabled!"); new_free(&EncryptPassword); } else say("Incorrect master password, not deleted!"); } else { malloc_strcpy(&EncryptPassword, newpass); say("Remember your master password!"); } } else { int oldpwlen; char *oldpass = NULL; oldpwd = new_next_arg(args, &args); if (!oldpwd) return; if (oldpwd) { oldpwlen = 2 * strlen(oldpwd) + 16; oldpass = (char *) new_malloc(oldpwlen + 1); EncryptString(oldpass, oldpwd, oldpwd, oldpwlen, 0); bzero(oldpwd, strlen(oldpwd)); } if (!EncryptPassword) PrintUsage("PASSWD [password [old password]]"); else { if (strcmp(EncryptPassword, newpass)) say("Incorrect master password!"); else { malloc_strcpy(&EncryptPassword, newpass); say("Remember your master password!"); } } new_free(&oldpass); } new_free(&newpass); bzero(newpwd, strlen(newpwd)); } else { /* no master password - ask for one */ if (!EncryptPassword) add_wait_prompt("Master Password:", MasterPassword, NULL, WAIT_PROMPT_LINE); else add_wait_prompt("Old Master Password:", MasterPasswordOld, NULL, WAIT_PROMPT_LINE); } } /* Handle old master password */ void MasterPasswordOld(char *x, char *pass) { int pwlen; char *mastpass; pwlen = 2 * strlen(pass) + 16; mastpass = (char *) new_malloc(pwlen + 1); EncryptString(mastpass, pass, pass, pwlen, 0); if (strcmp(EncryptPassword, mastpass)) { say("Incorrect master password!"); new_free(&mastpass); return; } new_free(&mastpass); add_wait_prompt("Master Password:", MasterPassword, pass, WAIT_PROMPT_LINE); } /* Handle master password */ void MasterPassword(char *x, char *pass) { char tmpbuf[mybufsize / 2 + 1]; *tmpbuf = '\0'; if (x) { strmcpy(tmpbuf, x, mybufsize / 2); strmcat(tmpbuf, " ", mybufsize / 2); } strmcat(tmpbuf, pass, mybufsize / 2); Password(NULL, tmpbuf, NULL); } /* Prints who reply */ void PrintWho(channel,nick,stat,user,host,name,server,show_server) char *channel; char *nick; char *stat; char *user; char *host; char *name; char *server; int show_server; { int width=-1; char format[40]; char *stampbuf=TimeStamp(2); #ifdef WANTANSI char tmpbuf1[mybufsize/2]; char tmpbuf2[mybufsize/2]; if ((width=get_int_var(CHANNEL_NAME_WIDTH_VAR))!=0) snprintf(format,sizeof(format),"%%s%%-%u.%us%%s %%s%%-9s%%s", (unsigned char) width,(unsigned char) width); else strcpy(format,"%s%s%s\t%s%-9s%s"); snprintf(tmpbuf1,sizeof(tmpbuf1),format, CmdsColors[COLWHO].color3,channel,Colors[COLOFF], CmdsColors[COLWHO].color1,nick,Colors[COLOFF]); snprintf(tmpbuf2,sizeof(tmpbuf2),"%s %s%-3s%s %s%s%s%s@%s%s%s%s",tmpbuf1, CmdsColors[COLWHO].color4,stat,Colors[COLOFF], CmdsColors[COLWHO].color2,user,Colors[COLOFF], CmdsColors[COLMISC].color1,Colors[COLOFF], CmdsColors[COLWHO].color2,host,Colors[COLOFF]); put_it("%s%s %c%s%s%s%c",stampbuf,tmpbuf2, show_server?'[':'(', CmdsColors[COLWHO].color5,show_server?server:name,Colors[COLOFF], show_server?']':')'); #else if ((width=get_int_var(CHANNEL_NAME_WIDTH_VAR))!=0) snprintf(format,sizeof(format),"%s%%-%u.%us %%-9s %%-3s %%s@%%s (%%s)", (unsigned char) width,(unsigned char) width); else strcpy(format,"%s%s\t%-9s %-3s %s@%s (%s)"); put_it(format,stampbuf,channel,nick,stat,user,host,show_server?server:name); #endif } /* Prints whois user reply */ void PrintWhoIsUser(banner,word,nick,user,host,name,channel) char *banner; char *word; char *nick; char *user; char *host; char *name; char *channel; { char tmpbuf1[mybufsize/2]; char *country; struct friends *tmpfriend; #ifdef GENX char tmpbuf2[mybufsize/2]; #endif /* GENX */ country=empty_string; #ifdef COUNTRY if ((country=rindex(host,'.'))) country++; country=function_country(country); snprintf(tmpbuf1,sizeof(tmpbuf1)," [%s]",country); new_free(&country); malloc_strcpy(&country,tmpbuf1); #endif /* COUNTRY */ snprintf(tmpbuf1,sizeof(tmpbuf1),"%s!%s@%s",nick,user,host); tmpfriend=CheckUsers(tmpbuf1,get_channel_by_refnum(0)); #ifdef WANTANSI #ifdef GENX if (!my_stricmp(word,"is")) word="address"; else word="was"; put_it("%sÚÄÄÄÄÄÄÄÄÄÄÂÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ",banner); snprintf(tmpbuf2,sizeof(tmpbuf2), "%s³ %s%8s%s ³ %s%s%s%s!%s%s%s%s%s@%s%s%s%s",banner, CmdsColors[COLWHOIS].color5,word,Colors[COLOFF], CmdsColors[COLWHOIS].color1,nick,Colors[COLOFF], CmdsColors[COLMISC].color1,Colors[COLOFF], CmdsColors[COLWHOIS].color2,user,Colors[COLOFF], CmdsColors[COLMISC].color1,Colors[COLOFF], CmdsColors[COLWHOIS].color2,host,Colors[COLOFF]); put_it("%s", tmpbuf2); put_it("%s³ %sirc name%s ³ %s%s",banner, CmdsColors[COLWHOIS].color5,Colors[COLOFF],name,Colors[COLOFF]); if (tmpfriend && tmpfriend->privs) { snprintf(tmpbuf1,sizeof(tmpbuf1),"%s³ %sfriend%s ³ filt: %s%s%s",banner, CmdsColors[COLWHOIS].color5,Colors[COLOFF], CmdsColors[COLWHOIS].color4,tmpfriend->userhost,Colors[COLOFF]); snprintf(tmpbuf2,sizeof(tmpbuf2)," acs: %s",CmdsColors[COLWHOIS].color4); BuildPrivs(tmpfriend,tmpbuf2); put_it("%s%s%s chnl: %s%s%s",tmpbuf1,tmpbuf2,Colors[COLOFF], CmdsColors[COLWHOIS].color5,tmpfriend->channels,Colors[COLOFF]); } #elif defined(CELECOSM) snprintf(tmpbuf1,sizeof(tmpbuf1),"%s%s%s%s@%s%s%s%s", CmdsColors[COLWHOIS].color2,user,Colors[COLOFF], CmdsColors[COLMISC].color1,Colors[COLOFF], CmdsColors[COLWHOIS].color2,host,Colors[COLOFF]); put_it("%s%s%s%s is %s",banner, CmdsColors[COLWHOIS].color1,nick,Colors[COLOFF],tmpbuf1); put_it("%s%sircname%s: %s%s%s",banner, CmdsColors[COLWHOIS].color5,Colors[COLOFF], CmdsColors[COLWHOIS].color3,name,Colors[COLOFF]); whoisfriend=tmpfriend; if (channel && *channel) put_it("%s%schannels%s: %s%s%s",banner, CmdsColors[COLWHOIS].color5,Colors[COLOFF], CmdsColors[COLWHOIS].color3,channel,Colors[COLOFF]); #else /* GENX & CELE */ snprintf(tmpbuf1,sizeof(tmpbuf1),"%s%s%s%s@%s%s%s%s", CmdsColors[COLWHOIS].color2,user,Colors[COLOFF], CmdsColors[COLMISC].color1,Colors[COLOFF], CmdsColors[COLWHOIS].color2,host,Colors[COLOFF]); put_it("%s%s%-9s%s : %s (%s%s)%s",banner, CmdsColors[COLWHOIS].color1,nick,Colors[COLOFF],tmpbuf1,name, Colors[COLOFF],country); #ifdef COUNTRY new_free(&country); #endif /* COUNTRY */ if (tmpfriend && tmpfriend->privs) { snprintf(tmpbuf1,sizeof(tmpbuf1),"%s%sFriend%s : [Filt] #%d %s%s%s [Acs] %s", banner,CmdsColors[COLWHOIS].color5,Colors[COLOFF], tmpfriend->number, CmdsColors[COLWHOIS].color4,tmpfriend->userhost,Colors[COLOFF], CmdsColors[COLWHOIS].color4); BuildPrivs(tmpfriend,tmpbuf1); put_it("%s%s [Chnl] %s%s%s",tmpbuf1,Colors[COLOFF], CmdsColors[COLWHOIS].color6,tmpfriend->channels,Colors[COLOFF]); } if (channel && *channel) put_it("%s%sChannels%s : %s%s%s",banner, CmdsColors[COLWHOIS].color5,Colors[COLOFF], CmdsColors[COLWHOIS].color3,channel,Colors[COLOFF]); #endif /* GENX */ #else /* WANTANSI */ put_it("%s%-9s : %s@%s (%s)%s",banner,nick,user,host,name,country); #ifdef COUNTRY new_free(&country); #endif /* COUNTRY */ if (tmpfriend && tmpfriend->privs) { snprintf(tmpbuf1,sizeof(tmpbuf1),"%sFriend : [Filt] #%d %s [Acs] ", banner,tmpfriend->number,tmpfriend->userhost); BuildPrivs(tmpfriend,tmpbuf1); put_it("%s [Chnl] %s",tmpbuf1,tmpfriend->channels); } if (channel && *channel) put_it("%sChannels : %s",banner,channel); #endif /* WANTANSI */ } /* Prints whois channels reply */ void PrintWhoIsChannels(banner, channels) char *banner; char *channels; { char tmpbuf1[2 * mybufsize]; char tmpbuf2[2 * mybufsize]; snprintf(tmpbuf1, sizeof(tmpbuf1), "%s", channels); StripAnsi(tmpbuf1, tmpbuf2, 4); #ifdef WANTANSI #ifdef GENX put_it("%s³ %schannels%s ³ %s%s%s", banner, CmdsColors[COLWHOIS].color5, Colors[COLOFF], CmdsColors[COLWHOIS].color3, tmpbuf2, Colors[COLOFF]); #elif defined(CELECOSM) put_it("%s%schannels%s: %s%s%s", banner, CmdsColors[COLWHOIS].color5, Colors[COLOFF], CmdsColors[COLWHOIS].color3, tmpbuf2, Colors[COLOFF]); #else put_it("%s%sChannels%s : %s%s%s", banner, CmdsColors[COLWHOIS].color5, Colors[COLOFF], CmdsColors[COLWHOIS].color3, tmpbuf2, Colors[COLOFF]); #endif /* GENX */ #else /* WANTANSI */ put_it("%sChannels : %s", banner, tmpbuf2); #endif /* WANTANSI */ } /* Prints whois servers reply */ void PrintWhoIsServer(banner,server,line) char *banner; char *server; char *line; { #ifdef WANTANSI #ifdef GENX char *uplink=NULL; char *tmpstr; char tmpbuf[mybufsize/2]; if (line && *line && wild_match("*.*",line)) { uplink=line; if (*uplink=='[') uplink++; tmpstr=index(uplink,']'); if (tmpstr) *tmpstr='\0'; snprintf(tmpbuf,sizeof(tmpbuf),"%c:%c%s%s%s",bold,bold, CmdsColors[COLWHOIS].color4,uplink,Colors[COLOFF]); } if (uplink) put_it("%s³ %sserver%s ³ %s%s%s UpLink%s",banner, CmdsColors[COLWHOIS].color5,Colors[COLOFF], CmdsColors[COLWHOIS].color3,server,Colors[COLOFF],tmpbuf); else put_it("%s³ %sserver%s ³ %s%s%s",banner, CmdsColors[COLWHOIS].color5,Colors[COLOFF], CmdsColors[COLWHOIS].color3,server,Colors[COLOFF]); #elif defined(CELECOSM) put_it("%s%sserver%s: %s%s%s (%s)",banner, CmdsColors[COLWHOIS].color5,Colors[COLOFF], CmdsColors[COLWHOIS].color3,server,Colors[COLOFF],line); #else put_it("%s%sServer%s : %s%s%s (%s)",banner, CmdsColors[COLWHOIS].color5,Colors[COLOFF], CmdsColors[COLWHOIS].color3,server,Colors[COLOFF],line); #endif /* GENX */ #else /* WANTANSI */ put_it("%sServer : %s (%s)",banner,server,line); #endif /* WANTANSI */ } /* Returns true if line matches auto reply buffer */ int AutoReplyMatch(line) char *line; { int foundar = 0; int invmatch; char *newar; char *currentar; char tmpbuf1[mybufsize / 2]; char tmpbuf2[2 * mybufsize]; strmcpy(tmpbuf1, AutoReplyBuffer, sizeof(tmpbuf1)); currentar = tmpbuf1; do { invmatch = 0; if ((newar = strchr(currentar, ','))) *newar++ = '\0'; if (*currentar == '-') { currentar++; invmatch = 1; } snprintf(tmpbuf2, sizeof(tmpbuf2), "%s %s", currentar, line); currentar = function_match(tmpbuf2); if (atoi(currentar) > 0) { if (!invmatch) foundar = 1; else foundar = 0; } new_free(¤tar); currentar = newar; } while (currentar); return(foundar); } /* Prints public message */ void PrintPublic(nick,col,channel,line,print,iscrypted) char *nick; char *col; char *channel; char *line; int print; int iscrypted; { int foundar=0; int isfriend=0; int isshit=0; int isitme; int numurl=0; int isopped=0; int ishalfopped=0; int isvoiced=0; #ifdef WANTANSI char *coln=CmdsColors[COLCSCAN].color2; #endif char *mynick; char *newcol; char *newchan; char *filepath=NULL; char tmpbuf1[mybufsize/8]; char tmpbuf2[mybufsize/2]; char tmpbuf3[2*mybufsize]; char tmpbuf4[2*mybufsize]; #ifdef WANTANSI char tmpbuf5[mybufsize/16]; #endif char *stampbuf=TimeStamp(1); #ifdef WANTANSI Window *oldwin; #endif NickList *joiner; ChannelList *chan=NULL; #ifdef CELE int truncate=get_int_var(TRUNCATE_PUBLIC_CHANNEL_VAR); char channel1[mybufsize/16]; #endif #ifdef ALTERNATIVE_PUBLICS char pubschar='('; char pubechar=')'; #else char pubschar='<'; char pubechar='>'; #endif chan=lookup_channel(channel,from_server,0); if (chan) { chan->pub++; } joiner=CheckJoiners(nick,channel,from_server,chan); if (joiner) { joiner->publics++; joiner->lastmsg=time((time_t *) 0); isshit=joiner->shitlist?joiner->shitlist->shit:0; isfriend=(!isshit && joiner->frlist)?joiner->frlist->privs:0; isopped=joiner->chanop; ishalfopped=joiner->halfop; isvoiced=joiner->hasvoice; } if (!col) { newcol=empty_string; newchan=empty_string; } else { newcol=col; newchan=channel; } mynick=get_server_nickname(from_server); isitme=!my_stricmp(mynick,nick); if (!isitme && URLCatch) { filepath=OpenCreateFile("ScrollZ.notepad",1); numurl=GrabURL(line,tmpbuf4,filepath,channel); } else strmcpy(tmpbuf4,line,sizeof(tmpbuf4)); #ifdef WANTANSI if (!isitme || ShowNick) { #ifdef CELECOSM if (isfriend && !isshit && isitme) coln=CmdsColors[COLMISC].color4; else #endif /* CELECOSM */ if (isitme) coln=CmdsColors[COLMISC].color5; else if (isshit && !isfriend) coln=CmdsColors[COLCSCAN].color6; else if (isfriend) coln=CmdsColors[COLMISC].color4; else coln=CmdsColors[COLPUBLIC].color2; snprintf(tmpbuf1,sizeof(tmpbuf1),"%s%c%s",coln,pubschar,Colors[COLOFF]); snprintf(tmpbuf5,sizeof(tmpbuf5),"%s%c%s",coln,pubechar,Colors[COLOFF]); *tmpbuf3='\0'; if (ExtPub) { strmcpy(tmpbuf3,CmdsColors[COLPUBLIC].color6,sizeof(tmpbuf3)); if (isopped) strmcat(tmpbuf3,"@",sizeof(tmpbuf3)); else if (ishalfopped) strmcat(tmpbuf3,"%",sizeof(tmpbuf3)); else if (isvoiced) strmcat(tmpbuf3,"+",sizeof(tmpbuf3)); strmcat(tmpbuf3,Colors[COLOFF],sizeof(tmpbuf3)); strmcat(tmpbuf1,tmpbuf3,sizeof(tmpbuf1)); } if (!isitme && AutoReplyBuffer) foundar=AutoReplyMatch(tmpbuf4); if (!foundar || isitme) { if (Ego && isitme) strmcat(tmpbuf1,CmdsColors[COLPUBLIC].color6,sizeof(tmpbuf1)); else strmcat(tmpbuf1,CmdsColors[COLPUBLIC].color1,sizeof(tmpbuf1)); } else if (foundar) { strmcat(tmpbuf1,CmdsColors[COLPUBLIC].color4,sizeof(tmpbuf1)); /* Display AR in current screen window too if it's different from orig channel window -Pier */ if (ARinWindow==3 || (ARinWindow && chan->window!=curr_scr_win)) { oldwin=to_window; if (ARinWindow==1) /* ON */ to_window=curr_scr_win; else { /* USER/BOTH */ to_window=get_window_by_level(LOG_USER4); if (to_window==NULL) to_window=curr_scr_win; } #ifdef CELE if (truncate && strlen(newchan)>5) strmcpy(channel1,channel,5); else strmcpy(channel1,channel,sizeof(channel1)); #endif *tmpbuf3='\0'; if (ExtPub) { strmcpy(tmpbuf3,CmdsColors[COLPUBLIC].color6,sizeof(tmpbuf3)); if (isopped) strmcat(tmpbuf3,"@",sizeof(tmpbuf3)); else if (isvoiced) strmcat(tmpbuf3,"+",sizeof(tmpbuf3)); strmcat(tmpbuf3,Colors[COLOFF],sizeof(tmpbuf3)); } snprintf(tmpbuf2,sizeof(tmpbuf2),"%s%c%s%s%s%s%s:%s%s%s%s%c%s ", CmdsColors[COLPUBLIC].color2,pubschar,Colors[COLOFF], tmpbuf3, CmdsColors[COLPUBLIC].color4,nick,Colors[COLOFF], #ifdef CELE CmdsColors[COLPUBLIC].color3,channel1,Colors[COLOFF], #else CmdsColors[COLPUBLIC].color3,channel,Colors[COLOFF], #endif CmdsColors[COLPUBLIC].color2,pubechar,Colors[COLOFF]); put_it("%s%s%s%s%s%s",iscrypted?"[!]":"",stampbuf,tmpbuf2, CmdsColors[COLPUBLIC].color5,tmpbuf4,Colors[COLOFF]); to_window=oldwin; } } if (print) { #ifdef CELE if (truncate && strlen(newchan)>5) strmcpy(channel1,newchan,5); else strmcpy(channel1,newchan,sizeof(channel1)); #endif snprintf(tmpbuf2,sizeof(tmpbuf2),"%s%s%s%s%s%s%s",tmpbuf1, nick,Colors[COLOFF],newcol, #ifdef CELE CmdsColors[COLPUBLIC].color3,channel1,Colors[COLOFF] #else CmdsColors[COLPUBLIC].color3,newchan,Colors[COLOFF] #endif ); put_it("%s%s%s%s %s%s%s",iscrypted?"[!]":"",stampbuf,tmpbuf2,tmpbuf5, CmdsColors[COLPUBLIC].color5,tmpbuf4,Colors[COLOFF]); } /* AwaySave needs to go after the put_it(). Two if's doesn't hurt */ if (foundar && (away_set || LogOn)) { snprintf(tmpbuf3,sizeof(tmpbuf3),"<%s:%s> %s",nick,channel,tmpbuf4); AwaySave(tmpbuf3,SAVEAREPLY); } } else { if (isitme) coln=CmdsColors[COLMISC].color5; else if (isshit && !isfriend) coln=CmdsColors[COLCSCAN].color6; else if (isfriend) coln=CmdsColors[COLMISC].color4; else coln=CmdsColors[COLPUBLIC].color2; if (!col && print) put_it("%s%s%s%c%s %s%s%s",iscrypted?"[!]":"",stampbuf, coln,pubechar,Colors[COLOFF], CmdsColors[COLPUBLIC].color5,tmpbuf4,Colors[COLOFF]); else if (print) { snprintf(tmpbuf1,sizeof(tmpbuf1),"%s%c%s%s%s%s%s>%s ", coln,pubechar,Colors[COLOFF], CmdsColors[COLPUBLIC].color3,newchan,Colors[COLOFF], CmdsColors[COLPUBLIC].color2,Colors[COLOFF]); put_it("%s%s%s%s%s%s",iscrypted?"[!]":"",stampbuf,tmpbuf1, CmdsColors[COLPUBLIC].color5,tmpbuf4,Colors[COLOFF]); } } #else /* WANTANSI */ if (!isitme || ShowNick) { if (!isitme && AutoReplyBuffer) foundar=AutoReplyMatch(tmpbuf4); *tmpbuf2='\0'; if (ExtPub) { strmcpy(tmpbuf2,"",sizeof(tmpbuf2)); if (isopped) strmcat(tmpbuf2,"@",sizeof(tmpbuf2)); else if (ishalfopped) strmcat(tmpbuf2,"%",sizeof(tmpbuf2)); else if (isvoiced) strmcat(tmpbuf2,"+",sizeof(tmpbuf2)); strmcat(tmpbuf2,"",sizeof(tmpbuf2)); } if (print && (!foundar || isitme)) { snprintf(tmpbuf3,sizeof(tmpbuf3),"%s%s%c%s",iscrypted?"[!]":"",stampbuf,pubschar,tmpbuf2); put_it("%s%s%s%s%s%s%c %s",tmpbuf3, (isitme && Ego)?"":"",nick,(isitme && Ego)?"":"",newcol,newchan,pubechar,tmpbuf4); } else { if (print) put_it("%s%s%c%s%s%s%s%c %s",iscrypted?"[!]":"", stampbuf,pubschar,tmpbuf2,nick,newcol,newchan,pubechar,tmpbuf4); if (away_set || LogOn) { snprintf(tmpbuf2,sizeof(tmpbuf2),"<%s:%s> %s",nick,channel,tmpbuf4); AwaySave(tmpbuf2,SAVEAREPLY); } } } else { if (!col && print) put_it("%s%s%c %s",iscrypted?"[!]":"",stampbuf,pubechar,tmpbuf4); else if (print) put_it("%s%s%c%s> %s",iscrypted?"[!]":"",stampbuf,pubechar,newchan,tmpbuf4); } #endif /* WANTANSI */ if (URLCatch && URLCatch<3 && numurl) say("Added %d URL%s to NotePad (%c%s%c)",numurl,numurl==1?"":"s",bold,filepath, bold); if (foundar) AddNick2AutoReply(nick); if (!isitme) Check4WordKick(line,joiner,isfriend,chan); if (chan && chan->ChanLog) { snprintf(tmpbuf3,sizeof(tmpbuf3),"<%s> %s", nick, line); ChannelLogSave(tmpbuf3, chan); } } /* Returns path to filename */ char *OpenCreateFile(filename,create) char *filename; int create; { char *path; char *filepath; char tmpbuf[mybufsize/4]; static char newfilepath[mybufsize/8]; if (!filename) return(NULL); if (!(path=get_string_var(LOAD_PATH_VAR))) path="."; if ((filepath=path_search(filename,path))) return(filepath); if (!create) return(NULL); strmcpy(tmpbuf,path,sizeof(tmpbuf)); if ((filepath=index(tmpbuf,':'))) *filepath='\0'; if (*tmpbuf && tmpbuf[strlen(tmpbuf)-1]!='/') strmcat(tmpbuf,"/",sizeof(tmpbuf)); strmcat(tmpbuf,filename,sizeof(tmpbuf)); filepath=expand_twiddle(tmpbuf); strmcpy(newfilepath,filepath,sizeof(newfilepath)); new_free(&filepath); return(newfilepath); } /* Prints links info */ void PrintLinks(server,uplink,distance) char *server; char *uplink; char *distance; { int dist; #ifdef WANTANSI char tmpbuf1[mybufsize/4]; char tmpbuf2[mybufsize/4]; char tmpbuf3[mybufsize/4]; #endif dist=atoi(distance); #ifdef WANTANSI if (!LinksNumber) PrintLinksHead(); #ifdef HAVE_ICONV_H snprintf(tmpbuf1,sizeof(tmpbuf1),"%s%s%s",CmdsColors[COLLINKS].color5, get_int_var(HIGH_ASCII_VAR)?"\342\224\202":"|",Colors[COLOFF]); #else snprintf(tmpbuf1,sizeof(tmpbuf1),"%s%c%s",CmdsColors[COLLINKS].color5, get_int_var(HIGH_ASCII_VAR)?'³':'|',Colors[COLOFF]); #endif /* HAVE_ICONV_H */ LinksNumber++; snprintf(tmpbuf2,sizeof(tmpbuf2),"%s%s%3d%s %s %s%s%26s%s%s", tmpbuf1,CmdsColors[COLLINKS].color1,LinksNumber,Colors[COLOFF],tmpbuf1, tmpbuf1,CmdsColors[COLLINKS].color1,server,Colors[COLOFF],tmpbuf1); snprintf(tmpbuf3,sizeof(tmpbuf3),"%s%s%3d%s %s %s>%s %s%s%25s%s%s", tmpbuf1,CmdsColors[COLLINKS].color3,dist,Colors[COLOFF],tmpbuf1, CmdsColors[COLLINKS].color4,Colors[COLOFF],tmpbuf1, CmdsColors[COLLINKS].color2,uplink,Colors[COLOFF],tmpbuf1); say("%s %s",tmpbuf2,tmpbuf3); /* snprintf(tmpbuf1,sizeof(tmpbuf1),"%s[%s",CmdsColors[COLLINKS].color4,Colors[COLOFF]); snprintf(tmpbuf2,sizeof(tmpbuf2),"%s]%s",CmdsColors[COLLINKS].color4,Colors[COLOFF]); if (!LinksNumber) { snprintf(tmpbuf3,sizeof(tmpbuf3),"%s%sNo.%s%s %s %sServer%s %s", tmpbuf1,CmdsColors[COLLINKS].color1,Colors[COLOFF],tmpbuf2, tmpbuf1,CmdsColors[COLLINKS].color1,Colors[COLOFF],tmpbuf2); snprintf(tmpbuf4,sizeof(tmpbuf4),"%s%sDis%s%s %s %sUplink%s %s", tmpbuf1,CmdsColors[COLLINKS].color2,Colors[COLOFF],tmpbuf2, tmpbuf1,CmdsColors[COLLINKS].color2,Colors[COLOFF],tmpbuf2); say("%s %s",tmpbuf3,tmpbuf4); } LinksNumber++; snprintf(tmpbuf3,sizeof(tmpbuf3),"%s%s%3d%s%s %s%s%25s%s%s", tmpbuf1,CmdsColors[COLLINKS].color1,LinksNumber,Colors[COLOFF],tmpbuf2, tmpbuf1,CmdsColors[COLLINKS].color1,server,Colors[COLOFF],tmpbuf2); snprintf(tmpbuf4,sizeof(tmpbuf4),"%s%s%3d%s%s %s->%s %s%s%25s%s%s", tmpbuf1,CmdsColors[COLLINKS].color3,dist,Colors[COLOFF],tmpbuf2, CmdsColors[COLLINKS].color3,Colors[COLOFF], tmpbuf1,CmdsColors[COLLINKS].color2,uplink,Colors[COLOFF],tmpbuf2); say("%s %s",tmpbuf3,tmpbuf4); */ #else if (!LinksNumber) say("[No.] [Dis] %-27s %-27s","Server","Uplink"); LinksNumber++; say("[%3d] [%3d] %-27s %-27s",LinksNumber,dist,server,uplink); #endif } /* This checks given password against master password */ void EncryptMasterPlayBack(stuff, line) char *stuff; char *line; { int pwlen; char *mastpass; pwlen = 2 * strlen(line) + 16; mastpass = (char *) new_malloc(pwlen + 1); EncryptString(mastpass, line, line, pwlen, 0); if (strcmp(EncryptPassword, mastpass)) { say("Incorrect master password!"); new_free(&mastpass); return; } new_free(&mastpass); PlayBack2(stuff, empty_string); } /* Shows stored messages from ScrollZ.away w/o setting you back */ void PlayBack(command, args, subargs) char *command; char *args; char *subargs; { char *pattern; char *filepath; char *filename; char tmpbuf[mybufsize / 4]; new_free(&playpattern); filename = get_string_var(AWAY_FILE_VAR); filepath = OpenCreateFile(filename, 1); if (filepath && (awayfile = fopen(filepath, "r"))) { if (!my_strnicmp(args, "-R", 2)) { pattern = new_next_arg(args, &args); pattern = new_next_arg(args, &args); PlayReverse = 1; } else { PlayReverse = 0; pattern = args; } fseek(awayfile, 0, 2); filesize = ftell(awayfile); if (!PlayReverse) fseek(awayfile, 0, 0); if (!filesize) filesize = 1; DontHold = 0; if (command) subargs = NULL; if (pattern && *pattern) { if (*pattern != '*') snprintf(tmpbuf, sizeof(tmpbuf), "*%s*", pattern); else strmcpy(tmpbuf, pattern, sizeof(tmpbuf)); malloc_strcpy(&playpattern, tmpbuf); } if (AwayEncrypt && EncryptPassword) add_wait_prompt("Master Password:", EncryptMasterPlayBack, subargs, WAIT_PROMPT_LINE); else PlayBack2(subargs, empty_string); } else { say("Can't open file %s", filename); PlayBack2(subargs, "q"); } } /* Shows one page from ScrollZ.away file */ void PlayBack2(stuff,line) char *stuff; char *line; { int count = 2; int readline = 1; char tmpbuf[2 * mybufsize + 1]; char tmpbuf2[2 * mybufsize + 1]; if (line && (*line == 'q' || *line == 'Q')) { if (awayfile) fclose(awayfile); add_wait_prompt("Delete message file (y/n) ? ", SetBackDelete, stuff, WAIT_PROMPT_KEY); return; } else if (line && (*line == 'c' || *line == 'C')) DontHold = 1; while (count < curr_scr_win->display_size && readline) { if (PlayReverse) { readline = rfgets(tmpbuf,mybufsize,awayfile) ? 1 : 0; if (readline && tmpbuf[strlen(tmpbuf) - 1] == '\n') tmpbuf[strlen(tmpbuf) - 1] = '\0'; } else readline = readln(awayfile, tmpbuf); if (readline) { if (playpattern && !wild_match(playpattern, tmpbuf)) continue; #ifdef WANTANSI count += (strlen(tmpbuf) - CountAnsi(tmpbuf, -1) + 6) / current_screen->co + 1; #else count += (strlen(tmpbuf) + 6) / current_screen->co + 1; #endif if (AwayEncrypt && EncryptPassword) DecryptString(tmpbuf2, tmpbuf, EncryptPassword, 2 * mybufsize, 0); else strcpy(tmpbuf2, tmpbuf); say("%s", tmpbuf2); } } if (!readline) { if (awayfile) fclose(awayfile); add_wait_prompt("Delete message file (y/n) ? ", SetBackDelete, stuff, WAIT_PROMPT_KEY); return; } if (DontHold) PlayBack2(stuff, line); else if (count >= curr_scr_win->display_size) { readline = ((float) (100 * ftell(awayfile)) / (float) filesize); if (PlayReverse) readline = 100 - readline; snprintf(tmpbuf, sizeof(tmpbuf), "[%2d%%] Press any key to continue, 'c' for continuous, 'q' to quit", readline); add_wait_prompt(tmpbuf, PlayBack2, stuff, WAIT_PROMPT_KEY); } } /* Defines what to save to ScrollZ.away */ void AwaySaveToggle(command,args,subargs) char *command; char *args; char *subargs; { int newtype=AwaySaveSet; int curval; int minus=0; char *tmpstr=(char *) 0; if (args && *args) { while ((tmpstr=new_next_arg(args,&args))!=NULL) { minus=0; curval=0; if (*tmpstr=='-') { minus=1; tmpstr++; } if (!my_stricmp(tmpstr,"MSG")) curval=SAVEMSG; else if (!my_stricmp(tmpstr,"NOTICE")) curval=SAVENOTICE; else if (!my_stricmp(tmpstr,"MASS")) curval=SAVEMASS; else if (!my_stricmp(tmpstr,"COLL")) curval=SAVECOLL; else if (!my_stricmp(tmpstr,"CDCC")) curval=SAVECDCC; else if (!my_stricmp(tmpstr,"DCC")) curval=SAVEDCC; else if (!my_stricmp(tmpstr,"PROT")) curval=SAVEPROT; else if (!my_stricmp(tmpstr,"HACK")) curval=SAVEHACK; else if (!my_stricmp(tmpstr,"SRVMODE")) curval=SAVESRVM; else if (!my_stricmp(tmpstr,"CTCP")) curval=SAVECTCP; else if (!my_stricmp(tmpstr,"FLOOD")) curval=SAVEFLOOD; else if (!my_stricmp(tmpstr,"INVITE")) curval=SAVEINVITE; else if (!my_stricmp(tmpstr,"KILL")) curval=SAVEKILL; else if (!my_stricmp(tmpstr,"KICK")) curval=SAVEKICK; else if (!my_stricmp(tmpstr,"SERVER")) curval=SAVESERVER; else if (!my_stricmp(tmpstr,"FAKE")) curval=SAVEFAKE; else if (!my_stricmp(tmpstr,"AREPLY")) curval=SAVEAREPLY; else if (!my_stricmp(tmpstr,"CHAT")) curval=SAVECHAT; else if (!my_stricmp(tmpstr,"NOTIFY")) curval=SAVENOTIFY; else if (!my_stricmp(tmpstr,"SENTMSG")) curval=SAVESENTMSG; else if (!my_stricmp(tmpstr,"AWAY")) curval=SAVEAWAY; else if (!my_stricmp(tmpstr,"ALL")) newtype=SAVEALL; else if (!my_stricmp(tmpstr,"NONE")) newtype=0; else say("Unknown type %s",tmpstr); if (curval) { if (minus) newtype&=(~curval); else newtype|=curval; } } AwaySaveSet=newtype; } tmpstr=NULL; if ((AwaySaveSet&SAVEALL)==SAVEALL) malloc_strcpy(&tmpstr,"ALL"); else { if (AwaySaveSet&SAVEMSG) malloc_strcat(&tmpstr,"MSG "); if (AwaySaveSet&SAVENOTICE) malloc_strcat(&tmpstr,"NOTICE "); if (AwaySaveSet&SAVEMASS) malloc_strcat(&tmpstr,"MASS "); if (AwaySaveSet&SAVECOLL) malloc_strcat(&tmpstr,"COLL "); if (AwaySaveSet&SAVECDCC) malloc_strcat(&tmpstr,"CDCC "); if (AwaySaveSet&SAVEDCC) malloc_strcat(&tmpstr,"DCC "); if (AwaySaveSet&SAVEPROT) malloc_strcat(&tmpstr,"PROT "); if (AwaySaveSet&SAVEHACK) malloc_strcat(&tmpstr,"HACK "); if (AwaySaveSet&SAVESRVM) malloc_strcat(&tmpstr,"SRVMODE "); if (AwaySaveSet&SAVECTCP) malloc_strcat(&tmpstr,"CTCP "); if (AwaySaveSet&SAVEFLOOD) malloc_strcat(&tmpstr,"FLOOD "); if (AwaySaveSet&SAVEINVITE) malloc_strcat(&tmpstr,"INVITE "); if (AwaySaveSet&SAVEKILL) malloc_strcat(&tmpstr,"KILL "); if (AwaySaveSet&SAVEKICK) malloc_strcat(&tmpstr,"KICK "); if (AwaySaveSet&SAVESERVER) malloc_strcat(&tmpstr,"SERVER "); if (AwaySaveSet&SAVEFAKE) malloc_strcat(&tmpstr,"FAKE "); if (AwaySaveSet&SAVEAREPLY) malloc_strcat(&tmpstr,"AREPLY "); if (AwaySaveSet&SAVECHAT) malloc_strcat(&tmpstr,"CHAT "); if (AwaySaveSet&SAVENOTIFY) malloc_strcat(&tmpstr,"NOTIFY "); if (AwaySaveSet&SAVESENTMSG) malloc_strcat(&tmpstr,"SENTMSG "); if (AwaySaveSet&SAVEAWAY) malloc_strcat(&tmpstr,"AWAY"); } if (tmpstr) PrintSetting("Away saving",tmpstr,empty_string,empty_string); else PrintSetting("Away saving","NONE",empty_string,empty_string); new_free(&tmpstr); } /* Does /STATS k with filter */ #ifdef OPER void StatsKFilter(command,args,subargs) char *command; char *args; char *subargs; { int doall=1; char *tmpstr; char *server=NULL; tmpstr=new_next_arg(args,&args); if (tmpstr && *tmpstr) { if (!my_strnicmp(tmpstr,"-TEMP",5)) { doall=0; tmpstr=new_next_arg(args,&args); } if (tmpstr && *tmpstr) { malloc_strcpy(&StatskFilter,tmpstr); StatskNumber=0; server=new_next_arg(args,&args); send_to_server("STATS %c %s",doall?'K':'k',server?server:""); return; } } PrintUsage("FKLINE [-TEMP] filter [server]"); } /* Parses STATS k reply from server */ void HandleStatsK(kline,rest) char *kline; char *rest; { char *blah; char *tmpstr; char *format="%s@%s"; char *comment=NULL; char *username=NULL; char tmpbuf1[mybufsize/4]; char tmpbuf2[mybufsize/4]; char tmpbuf3[mybufsize/4]; struct nicks *tmp; struct nicks *args=NULL; struct nicks *tmpnew; if (rest && *rest=='*') { /* it's ircd 2.8/th.v5.3a */ blah=new_next_arg(rest,&rest); username=new_next_arg(rest,&rest); comment=rest; } else if (rest) { /* plain ircd 2.8 or 2.9 */ username=tmpbuf2; comment=tmpbuf3; strmcpy(tmpbuf1,rest,sizeof(tmpbuf1)); blah=tmpbuf1; /* let's dig out username and comment */ while ((tmpstr=new_next_arg(blah,&blah))) { tmpnew=(struct nicks *) new_malloc(sizeof(struct nicks)); tmpnew->nick=NULL; tmpnew->next=NULL; malloc_strcpy(&(tmpnew->nick),tmpstr); /* let's add new element at the end of the list */ if (args) { for (tmp=args;tmp->next;) tmp=tmp->next; tmp->next=tmpnew; } else args=tmpnew; } /* element that is previous to previous to last now holds username */ tmp=NULL; for (tmpnew=args;tmpnew;tmpnew=tmpnew->next) if (tmpnew->next && tmpnew->next->next) tmp=tmpnew; if (tmp) { strmcpy(username,tmp->nick,sizeof(tmpbuf2)); /* elements before it are comment */ strmcpy(tmpbuf1,rest,sizeof(tmpbuf1)); tmpstr=tmpbuf1; while ((blah=strstr(tmpstr,username))) tmpstr=blah+1; /* blah now pointes to username, let's copy string before username */ tmpstr--; tmpstr--; while (isspace(*tmpstr) && tmpstr>tmpbuf1) tmpstr--; if (!isspace(*tmpstr)) tmpstr++; *tmpstr='\0'; strmcpy(comment,tmpbuf1,sizeof(tmpbuf3)); } else say("Something went wrong while parsing K-line"); /* let's free the list */ for (tmp=args;args;tmp=args) { args=args->next; new_free(&(tmp->nick)); new_free(&tmp); } } if (!username) username="*"; if (!(comment && *comment)) comment="Empty"; if (!StatskNumber) say("%-30s Comment","K-Line"); if (kline && strchr(kline,'@')) { format="%s%s"; username=empty_string; } snprintf(tmpbuf1,sizeof(tmpbuf1),format,username,kline); if ((StatskFilter && wild_match(StatskFilter,tmpbuf1)) || !StatskFilter) put_it("%s%-30s %s",numeric_banner(),tmpbuf1,comment); StatskNumber++; } #endif /* OPER */ /* Sets mode for your current channel */ void CurrentChanMode(command,args,subargs) char *command; char *args; char *subargs; { char *channel=(char *) 0; ChannelList *chan; channel=get_channel_by_refnum(0); if (channel) { if (*args) { if ((chan=lookup_channel(channel,from_server,0)) && HAS_OPS(chan->status)) send_to_server("MODE %s %s",chan->channel,args); else NotChanOp(channel); } else PrintUsage("C chanmode"); } else NoWindowChannel(); } /* Just a declaration , needed to shut up the compiler */ void NslookupNew(); /* Looks up DNS entry */ #ifndef LITE void Nslookup(command,args,subargs) char *command; char *args; char *subargs; { char *tmpstr; void (*func)(); NickList *joiner; if (args && *args) { if (strchr(args,'.')) { DoNslookup(args); return; } else if ((joiner=CheckJoiners(args,NULL,from_server,NULL)) && joiner->userhost) { tmpstr=strchr(joiner->userhost,'@'); if (tmpstr) { tmpstr++; DoNslookup(tmpstr); return; } } func=(void(*)())NslookupNew; server_list[from_server].SZWI++; add_userhost_to_whois(args,func); } else PrintUsage("NSLOOKUP entry"); } /* Just calls DoNslookup with correct parameters */ void NslookupNew(wistuff,tmpnick,text) WhoisStuff *wistuff; char *tmpnick; char *text; { if (server_list[from_server].SZWI) server_list[from_server].SZWI--; if (wistuff->not_on || !wistuff->nick || my_stricmp(wistuff->nick,tmpnick)) { say("Can't find %s on IRC",tmpnick); return; } DoNslookup(wistuff->host); } /* This really does nslookup */ void DoNslookup(host) char *host; { int isip=1; char *tmpstr; struct hostent *hostaddr; unsigned long ipnum; for (tmpstr=host;tmpstr && *tmpstr;tmpstr++) isip&=(*tmpstr=='.' || isdigit(*tmpstr)); say("Checking tables..."); if (!isip) hostaddr=gethostbyname(host); else { ipnum=inet_addr(host); hostaddr=gethostbyaddr((char *) &ipnum,sizeof(ipnum),AF_INET); } if (!hostaddr) say("No entry found for %s",host); else say("%s is %s (%s)",host,hostaddr->h_name, inet_ntoa(*(struct in_addr *) hostaddr->h_addr)); } #endif /* LITE */ /* Inserts nickname of the person that triggered auto reply */ void InsertAutoReply() { int curserv=from_server; char *tmpstr; if (CheckServer(curserv) && server_list[curserv].arcur) { input_clear_line(0,(char *) 0); tmpstr=(server_list[curserv].arcur)->nick; while (*tmpstr) { input_add_character(*tmpstr,NULL); tmpstr++; } tmpstr=AutoReplyString; while (tmpstr && *tmpstr) { input_add_character(*tmpstr,NULL); tmpstr++; } if (server_list[curserv].arcur) server_list[curserv].arcur=(server_list[curserv].arcur)->next; if (!(server_list[curserv].arcur)) server_list[curserv].arcur=server_list[curserv].arlist; } } /* Dumps variables, aliases, ons or all of them */ void Dump(command,args,subargs) char *command; char *args; char *subargs; { if (args && *args) { if (!my_stricmp(args,"ALIAS")) DumpAliases(COMMAND_ALIAS); else if (!my_stricmp(args,"VAR")) DumpAliases(VAR_ALIAS); else if (!my_stricmp(args,"ON")) DumpOn(); else if (!my_stricmp(args,"ALL")) { DumpAliases(COMMAND_ALIAS); DumpAliases(VAR_ALIAS); DumpOn(); } } else PrintUsage("DUMP ALIAS | ON | VAR | ALL"); } /* Adds nick that triggered auto reply to list */ void AddNick2AutoReply(nick) char *nick; { int found=0; int numentr=0; int curserv=from_server; struct nicks *artmp; struct nicks *arstr; struct nicks *arcnt; if (CheckServer(curserv)) { artmp=server_list[curserv].arlist; for (arcnt=artmp;arcnt;arcnt=arcnt->next) { if (!found) { if (!my_stricmp(nick,arcnt->nick)) { found=1; arstr=arcnt; } else artmp=arcnt; } numentr++; } if (found) { if (arstr==server_list[curserv].arlist) server_list[curserv].arlist=arstr->next; else artmp->next=arstr->next; new_free(&(arstr->nick)); new_free(&arstr); if (numentr) numentr--; } else if (numentr==AUTOREPLYSIZE) { artmp=server_list[curserv].arlist; while (artmp && artmp->next && artmp->next->next) artmp=artmp->next; if (artmp && artmp->next) { new_free(&(artmp->next->nick)); new_free(&(artmp->next)); artmp->next=NULL; } } if ((arstr=(struct nicks *) new_malloc(sizeof(struct nicks)))) { arstr->nick=(char *) 0; malloc_strcpy(&(arstr->nick),nick); arstr->next=server_list[curserv].arlist; server_list[curserv].arlist=arstr; } server_list[curserv].arcur=server_list[curserv].arlist; } } /* Deletes ScrollZ.away file */ void RemoveLog(command,args,subargs) char *command; char *args; char *subargs; { int done; char *filepath; char *filename; filename=get_string_var(AWAY_FILE_VAR); if ((filepath=OpenCreateFile(filename,0))) { done=remove(filepath); if (args && *args && !my_stricmp(args,"OFF")) goto out; if (done==0) say("File %s has been deleted",filename); else say("Can't delete file %s",filename); } out: AwayMsgNum=0; update_all_status(); } /* Automatically changes nick */ void AutoChangeNick(nick) char *nick; { int nicklen; char *tmpstr; char *newnick; char tmpbuf[mybufsize / 8 + 1]; char nickbuf[mybufsize / 8 + 1]; static int fudge_index = 0; static char oldnick[mybufsize / 8 + 1] = {0}; strmcpy(tmpbuf, nick, sizeof(tmpbuf)); tmpstr = tmpbuf; newnick = new_next_arg(tmpstr, &tmpstr); strmcpy(nickbuf, newnick, sizeof(nickbuf)); if (!(*oldnick)) { strmcpy(oldnick, nickbuf, sizeof(oldnick)); fudge_index = strlen(nickbuf); } else { /* Same nick as the last one we convoluted? */ if (!my_stricmp(oldnick, nickbuf)) { fudge_index++; if (fudge_index == 17) { char *arglist = NULL; reset_nickname(NULL, &arglist); fudge_index = 0; return; } } else { strmcpy(oldnick, nickbuf, sizeof(oldnick)); fudge_index = strlen(nickbuf); } } if ((nicklen = strlen(nickbuf)) < 9) strmcat(nickbuf, "_", sizeof(nickbuf)); else { char tmp; strmcpy(tmpbuf, nickbuf, sizeof(tmpbuf)); tmp = tmpbuf[8]; tmpbuf[8] = tmpbuf[7]; tmpbuf[7] = tmpbuf[6]; tmpbuf[6] = tmpbuf[5]; tmpbuf[5] = tmpbuf[4]; tmpbuf[4] = tmpbuf[3]; tmpbuf[3] = tmpbuf[2]; tmpbuf[2] = tmpbuf[1]; tmpbuf[1] = tmpbuf[0]; tmpbuf[0] = tmp; /* be smart about this -> don't create illegal nick */ if (check_nickname(tmpbuf)) strmcpy(nickbuf, tmpbuf, sizeof(nickbuf)); else { srand(time(NULL)); nickbuf[rand() % nicklen] = '_'; } } snprintf(tmpbuf, sizeof(tmpbuf), "%d", parsing_server_index); strmcpy(oldnick, nickbuf, sizeof(nickbuf)); nickname_sendline(tmpbuf, nickbuf); } /* Colored chat */ void PrintChatMsg(client,line,bytes,iscrypted) DCC_list *client; char *line; int bytes; int iscrypted; { char *thing; char tmpbuf[mybufsize/4]; #ifdef WANTANSI #ifdef TDF char tmpbuf2[mybufsize/4]; #endif #endif char thingleft[mybufsize/128]; char thingright[mybufsize/128]; void (*func)()=(void(*)())put_it; if (Stamp==2) func=(void(*)())say; #ifdef HAVE_ICONV_H if (get_int_var(HIGH_ASCII_VAR)) thing="\342\211\241"; #else if (get_int_var(HIGH_ASCII_VAR)) thing="ð"; #endif else thing="="; snprintf(thingleft,sizeof(thingleft),"%s%s",iscrypted?"*":"",thing); snprintf(thingright,sizeof(thingright),"%s%s",thing,iscrypted?"*":""); #ifdef WANTANSI snprintf(tmpbuf,sizeof(tmpbuf),"%s%s%s%s%s%s%s%s%s", CmdsColors[COLDCCCHAT].color2,thingleft,Colors[COLOFF], CmdsColors[COLDCCCHAT].color1,client->user,Colors[COLOFF], CmdsColors[COLDCCCHAT].color2,thingright,Colors[COLOFF]); #ifdef TDF snprintf(tmpbuf2,sizeof(tmpbuf2),"<[%s%s%s]%s%s,%s%s>", CmdsColors[COLMSG].color4,update_clock(0,0,GET_TIME),Colors[COLOFF], CmdsColors[COLDCC].color4,client->addr,client->port,Colors[COLOFF]); func("%s %s%s%s %s",tmpbuf,CmdsColors[COLDCCCHAT].color3,line,Colors[COLOFF], tmpbuf2); #else /* TDF */ func("%s %s%s%s",tmpbuf,CmdsColors[COLDCCCHAT].color3,line,Colors[COLOFF]); #endif /* TDF */ #else /* WANTANSI */ func("%s%s%s %s",thingleft,client->user,thingright,line); #endif /* WANTANSI */ if (bytes>512 && (away_set || LogOn)) { snprintf(tmpbuf,sizeof(tmpbuf),"DCC CHAT from %s is %d bytes long",client->user,bytes); AwaySave(tmpbuf,SAVEDCC); } } /* Prints my chat messages */ void PrintMyChatMsg(nick,line,iscrypted) char *nick; char *line; int iscrypted; { char *thing; #ifdef WANTANSI char tmpbuf[mybufsize/4]; #endif char thingleft[mybufsize/128]; char thingright[mybufsize/128]; void (*func)()=(void(*)())put_it; if (Stamp==2) func=(void(*)())say; #ifdef HAVE_ICONV_H if (get_int_var(HIGH_ASCII_VAR)) thing="\342\211\241"; #else if (get_int_var(HIGH_ASCII_VAR)) thing="ð"; #endif /* HAVE_ICONV_H */ else thing="="; snprintf(thingleft,sizeof(thingleft),"%s%s",iscrypted?"*":"",thing); snprintf(thingright,sizeof(thingright),"%s%s",thing,iscrypted?"*":""); #ifdef WANTANSI snprintf(tmpbuf,sizeof(tmpbuf),"%s[%s%s%s%s%s%s%s%s%s%s%s]%s", CmdsColors[COLDCCCHAT].color4,Colors[COLOFF], CmdsColors[COLDCCCHAT].color2,thingleft,Colors[COLOFF], CmdsColors[COLDCCCHAT].color5,nick,Colors[COLOFF], CmdsColors[COLDCCCHAT].color2,thingright,Colors[COLOFF], CmdsColors[COLDCCCHAT].color4,Colors[COLOFF]); func("%s %s%s%s",tmpbuf,CmdsColors[COLDCCCHAT].color3,line,Colors[COLOFF]); #else func("[%s%s%s] %s",thingleft,nick,thingright,line); #endif } #ifdef EXTRAS /* Outputs line to all channels */ void MSay(command,args,subargs) char *command; char *args; char *subargs; { int server; char *channels=(char *) 0; ChannelList *chan; if (args && *args) { if (is_channel(args)) channels=new_next_arg(args,&args); else channels="*"; for (chan=server_list[from_server].chan_list;chan;chan=chan->next) { server=from_server; from_server=chan->server; if (CheckChannel(chan->channel,channels)) send_text(chan->channel,args,NULL); from_server=server; } } else PrintUsage("MSAY [#channels] line"); } #endif /* Creates ban according to ban type */ void CreateBan(nick, userhost, banstr) char *nick; char *userhost; char *banstr; { int found = 0; int rate1; int rate2; char *tmpstr; char *tmpstr2; char tmpbuf[mybufsize / 4 + 1]; char tmpbuf2[mybufsize / 4 + 1]; if (!userhost) snprintf(tmpbuf2, sizeof(tmpbuf2), "*%s*!*@*", nick); else if (defban=='N') snprintf(tmpbuf2, sizeof(tmpbuf2), "%s!%s", nick, userhost); else { userhost++; if (*userhost == '@') userhost--; if (defban == 'B') { strmcpy(tmpbuf, userhost, sizeof(tmpbuf)); UserDomainList(tmpbuf); snprintf(tmpbuf2, sizeof(tmpbuf2), "*!%s", tmpbuf); } else if (defban == 'E') { srand(time((time_t *) 0)); strmcpy(tmpbuf, userhost, sizeof(tmpbuf)); UserDomainList(tmpbuf); snprintf(tmpbuf2, sizeof(tmpbuf2), "*!%s", tmpbuf); rate1 = 350; rate2 = 1; for (tmpstr = tmpbuf2; *tmpstr; tmpstr++) { if (*tmpstr == '@') { found = 1; rate1 = 500; rate2 = 2; } if (*tmpstr != '.' && *tmpstr != '@' && *tmpstr != '*' && *tmpstr != '!' && *tmpstr != ':' && ((rand() % 1000) < 650)) { if (((rand() % 1000) < rate1) || (*(tmpstr - (1 + rand() % rate2)) != '?')) *tmpstr = '?'; } } } else if (defban == 'H') snprintf(tmpbuf2, sizeof(tmpbuf2), "*!*%s", index(userhost,'@')); else if (defban == 'S') { tmpstr2 = userhost; while ((tmpstr = index(tmpstr2, '.'))) { tmpstr2 = tmpstr + 1; found++; } if (found > 1) { tmpstr2 = userhost; while (found-- > 1) { tmpstr = index(tmpstr2, '.'); tmpstr2 = tmpstr + 1; } } else tmpstr = index(userhost, '@') + 1; snprintf(tmpbuf2, sizeof(tmpbuf2), "*!*@*%s", tmpstr); } } strcpy(banstr, tmpbuf2); } #ifdef MGS_ /* Quits IRC with error level 152 */ void Terminate(command,args,subargs) char *command; char *args; char *subargs; { char *tmpstr=NULL; IRCQuit=152; if (args && *args) tmpstr=args; MyQuit(tmpstr); } #endif /* Checks whether join is synched */ void PrintSynch(chan) ChannelList *chan; { char tmpbuf1[mybufsize / 16]; char tmpbuf2[mybufsize / 32]; struct timeval timenow; if (!chan->gotbans || !chan->gotwho) return; gettimeofday(&timenow, NULL); timenow.tv_sec -= chan->time.tv_sec; if (timenow.tv_usec >= chan->time.tv_usec) timenow.tv_usec -= chan->time.tv_usec; else { timenow.tv_usec = timenow.tv_usec-chan->time.tv_usec + 1000000; timenow.tv_sec--; } snprintf(tmpbuf2,sizeof(tmpbuf2), "%06ld", timenow.tv_usec); tmpbuf2[3] = '\0'; snprintf(tmpbuf1,sizeof(tmpbuf1), "%ld.%s", timenow.tv_sec, tmpbuf2); #ifndef CELEHOOK if (do_hook(CHANNEL_SYNCH_LIST, "%s %s", chan->channel, tmpbuf1)) #endif /* CELEHOOK */ #ifdef WANTANSI say("Join to %s%s%s is now %ssynched%s (%s seconds)", CmdsColors[COLJOIN].color3, chan->channel, Colors[COLOFF], CmdsColors[COLJOIN].color4, Colors[COLOFF], tmpbuf1); #else /* WANTANSI */ say("Join to %s is now %csynched%c (%s seconds)", chan->channel, bold, bold, tmpbuf1); #endif /* WANTANSI */ if (HAS_OPS(chan->status) && (chan->FriendList || chan->BKList)) HandleGotOps(get_server_nickname(from_server), chan); if (chan && chan->ChanLog) { char tmpbuf3[mybufsize]; snprintf(tmpbuf3,sizeof(tmpbuf3), "Join to %s is now synched (%s seconds)", chan->channel, tmpbuf1); ChannelLogSave(tmpbuf3, chan); } /* join next channel in the list */ if (RateLimitJoin(from_server)) { ChannelList *tmpchan = server_list[from_server].ChanPendingList; if (tmpchan) { server_list[from_server].ChanPendingList = tmpchan->next; send_to_server("%s %s %s %s", tmpchan->topicstr, tmpchan->channel, tmpchan->s_mode, tmpchan->key); new_free(&tmpchan->channel); new_free(&tmpchan->key); new_free(&tmpchan->s_mode); new_free(&tmpchan->topicstr); new_free(&tmpchan); } } } /* Redirects last message/notice you have sent to current or specified channel */ void DirLSM(command,args,subargs) char *command; char *args; char *subargs; { int message=!my_stricmp(command,"DIRLSM"); char *target; char *msgsent=server_list[from_server].LastMessageSent; char *ntcsent=server_list[from_server].LastNoticeSent; if ((message && msgsent) || (!message && ntcsent)) { if (!(target=new_next_arg(args,&args))) { target=get_channel_by_refnum(0); if (!target) { NoWindowChannel(); return; } } if (message) send_text(target,msgsent,"PRIVMSG"); else send_text(target,ntcsent,"PRIVMSG"); AddNick2List(target,from_server); } else say("You haven't sent any %s so far",message?"message":"notice"); } /* Colorize joiner for /SHOWUSER */ #ifdef WANTANSI void ColorizeJoiner(joiner,buffer) NickList *joiner; char *buffer; { int count=2; char *colnick=CmdsColors[COLCSCAN].color5; char thing[mybufsize/16]; if (joiner->shitlist && joiner->shitlist->shit) colnick=CmdsColors[COLCSCAN].color6; else if (joiner->frlist && joiner->frlist->privs) colnick=CmdsColors[COLCSCAN].color2; else if (joiner->chanop || joiner->halfop) colnick=CmdsColors[COLCSCAN].color3; else if (joiner->hasvoice) colnick=CmdsColors[COLCSCAN].color4; *thing='\0'; if (joiner->hasvoice) { snprintf(thing,sizeof(thing),"%s+%s",CmdsColors[COLNICK].color5,Colors[COLOFF]); count--; } if (joiner->chanop || joiner->halfop) { snprintf(&thing[strlen(thing)],sizeof(thing),"%s%c%s",CmdsColors[COLNICK].color4,joiner->chanop?'@':'%',Colors[COLOFF]); count--; } while (count) { sprintf(buffer," %s",thing); snprintf(thing,sizeof(thing),buffer); count--; } sprintf(buffer,"%s%s%-9s%s",thing,colnick,joiner->nick,Colors[COLOFF]); } #endif #define SLSTALL 1 #define SLSTFRND 2 #define SLSTNFRND 3 #define SLSTSHIT 8 #define SLSTNSHIT 16 #define SLSTOP 32 #define SLSTNOP 64 #define SLSTVOIC 128 #define SLSTNVOIC 256 #define SLSTHLFO 512 #define SLSTNHLFO 1024 /* Like internal WHO */ void ShowUser(command,args,subargs) char *command; char *args; char *subargs; { #ifdef WANTANSI int len; #else int count; #endif int listfl=SLSTALL; char *channels=NULL; char *tmpstr=NULL; char tmpbuf1[mybufsize/4]; char tmpbuf2[mybufsize/4]; NickList *joiner; ChannelList *chan; struct nicks *filtlist=NULL,*tmpfilt; while ((tmpstr=new_next_arg(args,&args))) { if (*tmpstr=='-') { tmpstr++; if (!(*tmpstr)) continue; upper(tmpstr); if (*tmpstr=='O') { listfl&=(~SLSTALL); listfl|=SLSTOP; } if (*tmpstr=='H') { listfl&=(~SLSTALL); listfl|=SLSTHLFO; } if (*tmpstr=='F') { listfl&=(~SLSTALL); listfl|=SLSTFRND; } if (*tmpstr=='S') { listfl&=(~SLSTALL); listfl|=SLSTSHIT; } if (*tmpstr=='V') { listfl&=(~SLSTALL); listfl|=SLSTVOIC; } if (*tmpstr=='N') { tmpstr++; if (!(*tmpstr)) continue; if (*tmpstr=='O') { listfl&=(~SLSTALL); listfl|=SLSTNOP; } if (*tmpstr=='H') { listfl&=(~SLSTALL); listfl|=SLSTNHLFO; } if (*tmpstr=='F') { listfl&=(~SLSTALL); listfl|=SLSTNFRND; } if (*tmpstr=='S') { listfl&=(~SLSTALL); listfl|=SLSTNSHIT; } if (*tmpstr=='V') { listfl&=(~SLSTALL); listfl|=SLSTNVOIC; } } } else if (*tmpstr=='#') channels=tmpstr; else { if ((tmpfilt=(struct nicks *) new_malloc(sizeof(struct nicks)))) { tmpfilt->nick=(char *) 0; tmpfilt->next=filtlist; malloc_strcpy(&(tmpfilt->nick),tmpstr); filtlist=tmpfilt; } else say("Malloc failed"); } } if (!filtlist) { if ((filtlist=(struct nicks *) new_malloc(sizeof(struct nicks)))) { filtlist->nick=(char *) 0; filtlist->next=(struct nicks *) 0; malloc_strcpy(&(filtlist->nick),"*"); } else say("Malloc failed"); } if (!channels) channels=get_channel_by_refnum(0); say("%-3s %-15s %-10s %-34s Friend","UL","Channel"," Nick","Userhost"); for (chan=server_list[curr_scr_win->server].chan_list;chan;chan=chan->next) if (chan->channel && CheckChannel(chan->channel,channels)) { for (joiner=chan->nicks;joiner;joiner=joiner->next) { if (joiner->userhost) snprintf(tmpbuf1,sizeof(tmpbuf1),"%s!%s",joiner->nick,joiner->userhost); else strmcpy(tmpbuf1,joiner->nick,sizeof(tmpbuf1)); /* Check for u@h match */ for (tmpfilt=filtlist;tmpfilt;tmpfilt=tmpfilt->next) if (wild_match(tmpfilt->nick,tmpbuf1)) break; if (!tmpfilt) continue; /* Check if flags match */ if (((listfl&SLSTOP) && joiner->chanop) || ((listfl&SLSTNOP) && !(joiner->chanop)) || ((listfl&SLSTHLFO) && joiner->halfop) || ((listfl&SLSTNHLFO) && !(joiner->halfop)) || ((listfl&SLSTFRND) && joiner->frlist && joiner->frlist->privs) || ((listfl&SLSTNFRND) && (!(joiner->frlist) || !(joiner->frlist->privs))) || ((listfl&SLSTVOIC) && joiner->hasvoice) || ((listfl&SLSTNVOIC) && !(joiner->hasvoice) && !(joiner->chanop)) || ((listfl&SLSTSHIT) && joiner->shitlist && joiner->shitlist->shit) || ((listfl&SLSTNSHIT) && (!(joiner->shitlist) || !(joiner->shitlist->shit))) || ((listfl&SLSTALL))) { #ifdef WANTANSI ColorizeJoiner(joiner,tmpbuf1); if (joiner->userhost) { ColorUserHost(joiner->userhost,CmdsColors[COLWHO].color2,tmpbuf2,0); len=strlen(joiner->userhost); } else { len=0; *tmpbuf2='\0'; } for (;len<35;len++) strmcat(tmpbuf2," ",sizeof(tmpbuf2)); strmcat(tmpbuf2,CmdsColors[COLCSCAN].color2,sizeof(tmpbuf2)); BuildPrivs(joiner->frlist,tmpbuf2); strmcat(tmpbuf2,Colors[COLOFF],sizeof(tmpbuf2)); say("%-3d %s%-14s%s %s %s", joiner->frlist?joiner->frlist->number:0, CmdsColors[COLWHO].color3,chan->channel,Colors[COLOFF], tmpbuf1,tmpbuf2); #else count=0; strmcpy(tmpbuf2," ",sizeof(tmpbuf2)); if (joiner->hasvoice) { tmpbuf2[1]='+'; count++; } if (joiner->chanop || joiner->halfop) { if (count) { tmpbuf2[0]='+'; count=0; } tmpbuf2[1-count]=joiner->chanop?'@':'%'; } snprintf(tmpbuf1,sizeof(tmpbuf1),"%s%-9s",tmpbuf2,joiner->nick); *tmpbuf2='\0'; BuildPrivs(joiner->frlist,tmpbuf2); say("%-3d %-14s %s %-34s %s", joiner->frlist?joiner->frlist->number:0,chan->channel, tmpbuf1,joiner->userhost,tmpbuf2); #endif } } } for (;filtlist;) { tmpfilt=filtlist; filtlist=filtlist->next; new_free(&(tmpfilt->nick)); new_free(&tmpfilt); } } #ifdef WANTANSI /* Sets color interactively */ void SetColor(command,args,subargs) char *command; char *args; char *subargs; { int error=0; int colsetting=0; char *tmpstr; char tmpbuf1[mybufsize/4]; char tmpbuf2[mybufsize/4]; char tmpbuf3[mybufsize/32]; if (args && *args) { tmpstr=new_next_arg(args,&args); if (!my_stricmp(tmpstr,"WARNING")) colsetting=COLWARNING; else if (!my_stricmp(tmpstr,"JOIN")) colsetting=COLJOIN; else if (!my_stricmp(tmpstr,"MSG")) colsetting=COLMSG; else if (!my_stricmp(tmpstr,"NOTICE")) colsetting=COLNOTICE; else if (!my_stricmp(tmpstr,"NETSPLIT")) colsetting=COLNETSPLIT; else if (!my_stricmp(tmpstr,"INVITE")) colsetting=COLINVITE; else if (!my_stricmp(tmpstr,"MODE")) colsetting=COLMODE; else if (!my_stricmp(tmpstr,"SETTING")) colsetting=COLSETTING; else if (!my_stricmp(tmpstr,"LEAVE")) colsetting=COLLEAVE; else if (!my_stricmp(tmpstr,"NOTIFY")) colsetting=COLNOTIFY; else if (!my_stricmp(tmpstr,"CTCP")) colsetting=COLCTCP; else if (!my_stricmp(tmpstr,"KICK")) colsetting=COLKICK; else if (!my_stricmp(tmpstr,"DCC")) colsetting=COLDCC; else if (!my_stricmp(tmpstr,"WHO")) colsetting=COLWHO; else if (!my_stricmp(tmpstr,"WHOIS")) colsetting=COLWHOIS; else if (!my_stricmp(tmpstr,"PUBLIC")) colsetting=COLPUBLIC; else if (!my_stricmp(tmpstr,"CDCC")) colsetting=COLCDCC; else if (!my_stricmp(tmpstr,"LINKS")) colsetting=COLLINKS; else if (!my_stricmp(tmpstr,"DCCCHAT")) colsetting=COLDCCCHAT; else if (!my_stricmp(tmpstr,"CSCAN")) colsetting=COLCSCAN; else if (!my_stricmp(tmpstr,"NICK")) colsetting=COLNICK; else if (!my_stricmp(tmpstr,"ME")) colsetting=COLME; else if (!my_stricmp(tmpstr,"MISC")) colsetting=COLMISC; else if (!my_stricmp(tmpstr,"SBAR")) colsetting=COLSBAR1; else if (!my_stricmp(tmpstr,"SBAR2")) colsetting=COLSBAR2; #ifdef CELECOSM else if (!my_stricmp(tmpstr,"CELE")) colsetting=COLCELE; #endif #ifdef OPERVISION else if (!my_stricmp(tmpstr,"OV")) colsetting=COLOV; #endif else error=1; if (error) PrintUsage("COLOR SETTING COLOR1 COLOR2 COLOR3 COLOR4 COLOR5"); else { if (args && *args) SetColors(colsetting,&args,&error,0); snprintf(tmpbuf1,sizeof(tmpbuf1),"Color for %s",tmpstr); GetColors(colsetting,tmpbuf2); snprintf(tmpbuf3,sizeof(tmpbuf3)," [%d]",colsetting+1); PrintSetting(tmpbuf1,tmpbuf2,tmpbuf3,empty_string); if (colsetting==COLSBAR1 || colsetting==COLSBAR2) build_status((char *) 0); } } else PrintUsage("COLOR SETTING COLOR1 COLOR2 COLOR3 COLOR4 COLOR5"); } #endif /* void GroupServers(command,args,subargs) char *command; char *args; char *subargs; { char *tmpstr; int isnumber; int low; int high; if (args && *args) { while (*args && isspace(*args)) args++; if (*args) { tmpstr=args; while (*tmpstr) { isnumber=1; low=0; while (*tmpstr && *tmpstr!='-') { isnumber=isnumber?isdigit(*tmpstr):0; low=low*10+(*tmpstr-'0'); tmpstr++; } if (!isnumber) { say("First part of the group should be number"); return; } if (*tmpstr=='-') tmpstr++; else { say("- should follow first number"); return; } isnumber=1; high=0; while (*tmpstr && !isspace(*tmpstr)) { isnumber=isnumber?isdigit(*tmpstr):0; high=high*10+(*tmpstr-'0'); tmpstr++; } if (!isnumber) { say("Second part of the group should be number"); return; } if (low>high) { say("Second part of the group should be larger than first part"); return; } if (high>=number_of_servers) { say("Second part should be smaller than number of servers"); return; } while (*tmpstr && isspace(*tmpstr)) tmpstr++; } say("Servers are now grouped as %s",args); malloc_strcpy(&ServerGroups,args); } } else PrintSetting("Server group",ServerGroups,empty_string,empty_string); } void CheckGroup(servernum) int servernum; { char *tmpstr; char *tmpbuf; int low; int high; int start; int count; int visible; Window *tmp; Window *old; Window *tmp2; Screen *screen; if (*ServerGroups=='*') { FServer(NULL,"+",NULL); return; } strcpy(tmpbuf1,ServerGroups); tmpbuf=tmpbuf1; while ((tmpstr=new_next_arg(tmpbuf,&tmpbuf))) { low=atoi(tmpstr); while (*tmpstr && *tmpstr!='-') tmpstr++; if (*tmpstr=='-') { tmpstr++; high=atoi(tmpstr); if (low<=servernum && servernum<=high) { start=servernum+1; if (start>high) start=low; count=high-low+1; old=current_screen->current_window; if ((tmp=find_window(servernum))) { visible=tmp->visible; if (!visible) { snprintf(tmpbuf2,sizeof(tmpbuf2),"SHOW %d",tmp->refnum); window(NULL,tmpbuf2,NULL); } set_current_window(tmp); while (count) { if (!connect_to_server(get_server_name(start), server_list[start].port,-1)) { for (screen=screen_list;screen;screen=screen->next) { for (tmp2=screen->window_list;tmp2;tmp2=tmp2->next) if (tmp2->oldserver==servernum) tmp2->server=start; } for (tmp2=invisible_list;tmp2;tmp2=tmp2->next) if (tmp2->oldserver==servernum) tmp2->server=start; new_free(&tmp->current_channel); update_all_status(); if (!visible) { snprintf(tmpbuf2,sizeof(tmpbuf2),"HIDE"); window(NULL,tmpbuf2,NULL); } set_current_window(old); return; } start++; if (start>high) start=low; count--; } set_current_window(old); } return; } } } } */ /* Toggles notify mode brief/verbose */ void NotifyModeToggle(command,args,subargs) char *command; char *args; char *subargs; { char *tmpstr=(char *) 0; tmpstr=new_next_arg(args,&args); if (tmpstr) { if (!my_strnicmp("B",tmpstr,1)) NotifyMode=1; else if (!my_strnicmp("V",tmpstr,1)) NotifyMode=2; else { PrintUsage("NTFYMODE B[rief]/V[erbose]"); return; } } if (NotifyMode==1) PrintSetting("Notify mode","Brief",empty_string,empty_string); else PrintSetting("Notify mode","Verbose",empty_string,empty_string); } /* Pings yourself */ void PingMe(command,args,subargs) char *command; char *args; char *subargs; { struct timeval timenow; gettimeofday(&timenow,NULL); send_ctcp(ctcp_type[CTCP_PRIVMSG],get_server_nickname(from_server),"PING","\%ld \%ld", timenow.tv_sec,timenow.tv_usec); } /* Notepad - in case you don't have pen & paper handy... */ #ifndef LITE void NotePad(command,args,subargs) char *command; char *args; char *subargs; { int oldumask=umask(0177); char *filepath; FILE *notefile; time_t now; if (args && *args) { filepath=OpenCreateFile("ScrollZ.notepad",1); if (!filepath || (notefile=fopen(filepath,"a"))==NULL) say("Can't open file ScrollZ.notepad"); else { now=time((time_t *) 0); fprintf(notefile,"# %s [%.24s]\n",args,ctime(&now)); fclose(notefile); say("Successful addition to NotePad (%c%s%c)",bold,filepath,bold); } } else PrintUsage("NOTEPAD "); umask(oldumask); } #endif /* Toggles URL catcher on/off */ void URLCatchToggle(command,args,subargs) char *command; char *args; char *subargs; { char *tmpstr=(char *) 0; tmpstr=new_next_arg(args,&args); if (tmpstr) { if (!my_stricmp("QUIET",tmpstr)) URLCatch=3; else if (!my_stricmp("AUTO",tmpstr)) URLCatch=2; else if (!my_stricmp("ON",tmpstr)) URLCatch=1; else if (!my_stricmp("OFF",tmpstr)) URLCatch=0; else { PrintUsage("URLCATCH on/auto/quiet/off"); return; } } if (URLCatch==3) PrintSetting("URL catcher","QUIET",empty_string,empty_string); else if (URLCatch==2) PrintSetting("URL catcher","AUTO",empty_string,empty_string); else if (URLCatch) PrintSetting("URL catcher","ON",empty_string,empty_string); else PrintSetting("URL catcher","OFF",empty_string,empty_string); } /* Prints head of /LINKS */ #ifdef WANTANSI void PrintLinksHead() { char tmpbuf1[mybufsize/4]; char tmpbuf2[mybufsize/4]; if (get_int_var(HIGH_ASCII_VAR)) { #ifdef HAVE_ICONV_H snprintf(tmpbuf1,sizeof(tmpbuf1),"%s\342\224\214%s\302\267%sNo%s\302\267%s\342\224\220 \342\224\214\342\224\200\342\224\200\342\224\200\342\224\200\342\224\200\342\224\200\342\224\200\342\224\200%s\302\267%sServer%s\302\267%s\342\224\200\342\224\200\342\224\200\342\224\200\342\224\200\342\224\200\342\224\200\342\224\200\342\224\200\342\224\200\342\224\220%s", CmdsColors[COLLINKS].color5,Colors[COLOFF], CmdsColors[COLLINKS].color1,Colors[COLOFF], CmdsColors[COLLINKS].color5,Colors[COLOFF], CmdsColors[COLLINKS].color1,Colors[COLOFF], CmdsColors[COLLINKS].color5,Colors[COLOFF]); snprintf(tmpbuf2,sizeof(tmpbuf2),"%s\342\224\214%s\302\267%sDs%s\302\267%s\342\224\220 \342\224\214\342\224\200\342\224\200\342\224\200\342\224\200\342\224\200\342\224\200\342\224\200\342\224\200%s\302\267%sUplink%s\302\267%s\342\224\200\342\224\200\342\224\200\342\224\200\342\224\200\342\224\200\342\224\200\342\224\200\342\224\200\342\224\220%s", CmdsColors[COLLINKS].color5,Colors[COLOFF], CmdsColors[COLLINKS].color3,Colors[COLOFF], CmdsColors[COLLINKS].color5,Colors[COLOFF], CmdsColors[COLLINKS].color2,Colors[COLOFF], CmdsColors[COLLINKS].color5,Colors[COLOFF]); #else snprintf(tmpbuf1,sizeof(tmpbuf1),"%sÚ%sú%sNo%sú%s¿ ÚÄÄÄÄÄÄÄÄÄ%sú%sServer%sú%sÄÄÄÄÄÄÄÄÄ¿%s", CmdsColors[COLLINKS].color5,Colors[COLOFF], CmdsColors[COLLINKS].color1,Colors[COLOFF], CmdsColors[COLLINKS].color5,Colors[COLOFF], CmdsColors[COLLINKS].color1,Colors[COLOFF], CmdsColors[COLLINKS].color5,Colors[COLOFF]); snprintf(tmpbuf2,sizeof(tmpbuf2),"%sÚ%sú%sDs%sú%s¿ ÚÄÄÄÄÄÄÄÄ%sú%sUplink%sú%sÄÄÄÄÄÄÄÄÄ¿%s", CmdsColors[COLLINKS].color5,Colors[COLOFF], CmdsColors[COLLINKS].color3,Colors[COLOFF], CmdsColors[COLLINKS].color5,Colors[COLOFF], CmdsColors[COLLINKS].color2,Colors[COLOFF], CmdsColors[COLLINKS].color5,Colors[COLOFF]); #endif /* HAVE_ICONV_H */ } else { snprintf(tmpbuf1,sizeof(tmpbuf1),"%s.%s-%sNo%s-%s. .---------%s-%sServer%s-%s---------.%s", CmdsColors[COLLINKS].color5,Colors[COLOFF], CmdsColors[COLLINKS].color1,Colors[COLOFF], CmdsColors[COLLINKS].color5,Colors[COLOFF], CmdsColors[COLLINKS].color1,Colors[COLOFF], CmdsColors[COLLINKS].color5,Colors[COLOFF]); snprintf(tmpbuf2,sizeof(tmpbuf2),"%s.%s-%sDs%s-%s. .--------%s-%sUplink%s-%s---------.%s", CmdsColors[COLLINKS].color5,Colors[COLOFF], CmdsColors[COLLINKS].color3,Colors[COLOFF], CmdsColors[COLLINKS].color5,Colors[COLOFF], CmdsColors[COLLINKS].color2,Colors[COLOFF], CmdsColors[COLLINKS].color5,Colors[COLOFF]); } say("%s %s",tmpbuf1,tmpbuf2); } #endif /* URL command coded by Zakath */ void URLSave(command,args,subargs) char *command; char *args; char *subargs; { int count=0; struct urlstr *tmpurl; if (args && *args) { if (!my_stricmp(args,"-CLEAR")) { for (;urllist;) { tmpurl=urllist; urllist=urllist->next; new_free(&(tmpurl->urls)); new_free(&(tmpurl->source)); new_free(&tmpurl); } return; } malloc_strcpy(&urlbuf,args); add_wait_prompt("Description of URL: ",URLSave3,args,WAIT_PROMPT_LINE); } else { if (!urllist) say("There are currently no URLs stored in memory."); else { say("List of all URLs currently stored in memory:"); for (tmpurl=urllist;tmpurl;tmpurl=tmpurl->next,count++) { say("%-2d %c%s%c %s", count,bold,tmpurl->urls,bold, tmpurl->source?tmpurl->source:empty_string); } say("A total of %d URL%s stored in memory.",count,count==1?"":"s"); add_wait_prompt("Type the # of the URL to save, any other key to abort -> ",URLSave2,args,WAIT_PROMPT_KEY); } } } /* Prompts for URL description */ void URLSave2(stuff,line) char *stuff; char *line; { int count=1; int found=0; int urlnum=0; struct urlstr *tmpurl; if (line && *line && isdigit(*line)) { urlnum=*line-'0'+1; for (tmpurl=urllist;tmpurl;tmpurl=tmpurl->next,count++) if (count==urlnum) { malloc_strcpy(&urlbuf,tmpurl->urls); if (tmpurl->source) { malloc_strcat(&urlbuf," "); malloc_strcat(&urlbuf,tmpurl->source); } found=1; break; } if (found) add_wait_prompt("Description of URL: ",URLSave3,stuff,WAIT_PROMPT_LINE); else say("Could not find the URL with that number"); } } /* Final part, actually does saving */ void URLSave3(blah,args) char *blah; char *args; { int oldumask=umask(0177); char *filepath; char tmpbuf[mybufsize/4]; FILE *notefile; time_t now; if (!(args && *args)) strcpy(tmpbuf,"None given."); else strmcpy(tmpbuf,args,sizeof(tmpbuf)); filepath=OpenCreateFile("ScrollZ.notepad",1); if (!filepath || (notefile=fopen(filepath,"a"))==NULL) say("Can't open file ScrollZ.notepad"); else { now=time((time_t *) 0); fprintf(notefile,"## %s [%.24s]\n",urlbuf,ctime(&now)); fprintf(notefile,"# Desc: %s\n",tmpbuf); fclose(notefile); say("Added URL (%c%s%c) to ScrollZ NotePad.",bold,urlbuf,bold); } new_free(&urlbuf); umask(oldumask); } #ifdef WANTANSI /* Counts ansi chars in string */ int CountAnsiInput(str,len) char *str; int len; { register int count=0; register int x=0; register char *ptr; if (!str) return(0); FixColorAnsi(str); for (ptr=str;*ptr && xname; nick2=elmt2->name; while (*nick1 && *nick2) { xor=(*nick1)^(*nick2); if (xor && xor!=32) { char1=toupper(*nick1); char2=toupper(*nick2); value=(char1-char2)>0?1:0; break; } nick1++; nick2++; } if (*nick1 && !(*nick2)) value=1; return(value); } #endif /* BanKicks the last joined person */ void LastJoinerKick() { char *channel; char *lastjoin; char tmpbuf[mybufsize/4+1]; if (!CheckServer(from_server)) { say("You are not connected to a server. Use /SERVER to connect."); return; } lastjoin=server_list[from_server].LastJoin; if (lastjoin && strcmp(lastjoin,"none yet")) { strmcpy(tmpbuf,lastjoin,mybufsize/4); channel=index(tmpbuf,'/'); if (channel) { *channel=0; if (!my_stricmp(tmpbuf,get_server_nickname(from_server))) return; *channel=' '; BanKick("BK",tmpbuf,NULL); } } else say("No join so far"); } /* Accepts chat from last user that has requested it */ void AcceptLastChat() { if (LastChat) dcc_chat(LastChat); else say("No chat request so far"); } /* This bolds out URLs and copies them to buffer */ int GrabURL(line, buffer, filepath, source) char *line; char *buffer; char *filepath; char *source; { int urlnum = 0; int saveit; char store; char tmpbuf1[mybufsize]; char tmpbuf2[mybufsize / 2]; char *tmpstr1 = tmpbuf1; char *tmpstr2 = buffer; char *tmpstr3; FILE *notefile; time_t now; struct urlstr *urlnew, *tmpurl, *prevurl = NULL; strmcpy(tmpbuf1, line, sizeof(tmpbuf1)); *tmpstr2 = '\0'; while (*tmpstr1) { while (isspace(*tmpstr1)) *tmpstr2 ++= *tmpstr1++; *tmpstr2 = '\0'; if (*tmpstr1) { for (tmpstr3 = tmpstr1; *tmpstr3 && !isspace(*tmpstr3); tmpstr3++); store = *tmpstr3; *tmpstr3 = '\0'; if ((!my_strnicmp(tmpstr1, "http://", 7) || !my_strnicmp(tmpstr1, "ftp://", 6) || !my_strnicmp(tmpstr1, "https://", 8) || !my_strnicmp(tmpstr1, "www.", 4) || !my_strnicmp(tmpstr1, "ftp.", 4))) { saveit = 1; prevurl = NULL; for (tmpurl = urllist; tmpurl; tmpurl = tmpurl->next) { if (!my_stricmp(tmpurl->urls, tmpstr1)) break; prevurl = tmpurl; } if (tmpurl) { if (prevurl) prevurl->next = tmpurl->next; else urllist = tmpurl->next; for (urlnew = urllist; urlnew && urlnew->next;) urlnew = urlnew->next; if (urlnew) urlnew->next = tmpurl; else urllist = tmpurl; tmpurl->next = NULL; saveit = 0; } snprintf(tmpbuf2, sizeof(tmpbuf2), "%c%s%c", bold, tmpstr1, bold); strmcat(tmpstr2, tmpbuf2, sizeof(tmpbuf2)); tmpstr2 += strlen(tmpbuf2); /* Add URL to list */ if (saveit) { tmpurl = urllist; urlnew = (struct urlstr *) new_malloc(sizeof(struct urlstr)); urlnew->urls = NULL; urlnew->source = NULL; urlnew->next = NULL; malloc_strcpy(&(urlnew->urls), tmpstr1); if (source) malloc_strcpy(&(urlnew->source), source); URLnum++; if (URLnum > 10) { urllist = tmpurl->next; new_free(&(tmpurl->urls)); new_free(&(tmpurl->source)); new_free(&tmpurl); URLnum--; } add_to_list_ext((List **) &urllist,(List *) urlnew, (int (*) _((List *, List *))) AddLast); /* if URL Catcher is set to auto... */ if (URLCatch >= 2 && filepath) { int oldumask = umask(0177); if ((notefile = fopen(filepath, "a")) != NULL) { now = time(NULL); fprintf(notefile,"## %s %s [%.24s]\n", urlnew->urls, urlnew->source, ctime(&now)); fclose(notefile); urlnum++; } umask(oldumask); } } } else { strcat(tmpstr2, tmpstr1); tmpstr2 += strlen(tmpstr1); } tmpstr1 = tmpstr3; if (store) *tmpstr1 = store; } } return(urlnum); } /* Prints names on channel join */ void PrintNames(channel,nicks,chan) char *channel; char *nicks; ChannelList *chan; { #ifdef WANTANSI int addspace = 0; char *nick = NULL; char *tmpstr = NULL; char tmpbuf[mybufsize]; char buffer[BIG_BUFFER_SIZE + 1]; strmcpy(tmpbuf, nicks, sizeof(tmpbuf)); tmpstr = tmpbuf; *buffer = '\0'; while ((nick = new_next_arg(tmpstr, &tmpstr))) { if (addspace) strmcat(buffer, " ", sizeof(buffer)); else addspace = 1; if (*nick == '@') { strmcat(buffer, CmdsColors[COLNICK].color4, sizeof(buffer)); strmcat(buffer, "@", sizeof(buffer)); strmcat(buffer, Colors[COLOFF], sizeof(buffer)); strmcat(buffer, CmdsColors[COLCSCAN].color3, sizeof(buffer)); nick++; } else if (*nick == '%') { strmcat(buffer, CmdsColors[COLNICK].color4, sizeof(buffer)); strmcat(buffer, "%", sizeof(buffer)); strmcat(buffer, Colors[COLOFF], sizeof(buffer)); strmcat(buffer, CmdsColors[COLCSCAN].color3, sizeof(buffer)); nick++; } else if (*nick == '+') { strmcat(buffer, CmdsColors[COLNICK].color5, sizeof(buffer)); strmcat(buffer, "+", sizeof(buffer)); strmcat(buffer, Colors[COLOFF], sizeof(buffer)); strmcat(buffer, CmdsColors[COLCSCAN].color4, sizeof(buffer)); nick++; } else strmcat(buffer, CmdsColors[COLCSCAN].color5, sizeof(buffer)); strmcat(buffer, nick, sizeof(buffer)); strmcat(buffer, Colors[COLOFF], sizeof(buffer)); if (strlen(buffer) >= BIG_BUFFER_SIZE - 100) { say("Users on %s%s%s: %s", CmdsColors[COLCSCAN].color1, channel, Colors[COLOFF], buffer); *buffer = '\0'; } } if (*buffer) say("Users on %s%s%s: %s", CmdsColors[COLCSCAN].color1, channel, Colors[COLOFF], buffer); #else say("Users on %s: %s", channel, nicks); #endif if (chan && chan->ChanLog) { char tmpbuf[4 * mybufsize]; snprintf(tmpbuf,sizeof(tmpbuf), "Users on %s: %s", channel, nicks); ChannelLogSave(tmpbuf, chan); } } /* Initializes keys and default color scheme */ void InitKeysColors() { #ifdef WANTANSI int i; #endif char tmpbuf[mybufsize/4]; strcpy(tmpbuf,"^F parse_command wholeft"); bindcmd(NULL,tmpbuf,NULL); strcpy(tmpbuf,"F1 parse_command help keys"); bindcmd(NULL,tmpbuf,NULL); strcpy(tmpbuf,"F2 parse_command join -invite"); bindcmd(NULL,tmpbuf,NULL); strcpy(tmpbuf,"^W? parse_command help net"); bindcmd(NULL,tmpbuf,NULL); strcpy(tmpbuf,"^Wh parse_command window hide"); bindcmd(NULL,tmpbuf,NULL); strcpy(tmpbuf,"^Wn parse_command window next"); bindcmd(NULL,tmpbuf,NULL); strcpy(tmpbuf,"^Wp parse_command window previous"); bindcmd(NULL,tmpbuf,NULL); strcpy(tmpbuf,"^Wk parse_command window kill"); bindcmd(NULL,tmpbuf,NULL); strcpy(tmpbuf,"^Wl parse_command window list"); bindcmd(NULL,tmpbuf,NULL); strcpy(tmpbuf,"^Wc parse_command clear"); bindcmd(NULL,tmpbuf,NULL); strcpy(tmpbuf,"^W1 parse_command window goto 1"); bindcmd(NULL,tmpbuf,NULL); strcpy(tmpbuf,"^W2 parse_command window goto 2"); bindcmd(NULL,tmpbuf,NULL); strcpy(tmpbuf,"^W3 parse_command window goto 3"); bindcmd(NULL,tmpbuf,NULL); strcpy(tmpbuf,"^W4 parse_command window goto 4"); bindcmd(NULL,tmpbuf,NULL); strcpy(tmpbuf,"^W5 parse_command window goto 5"); bindcmd(NULL,tmpbuf,NULL); strcpy(tmpbuf,"meta1-1 parse_command ^window swap 1"); bindcmd(NULL,tmpbuf,NULL); strcpy(tmpbuf,"meta1-2 parse_command ^window swap 2"); bindcmd(NULL,tmpbuf,NULL); strcpy(tmpbuf,"meta1-3 parse_command ^window swap 3"); bindcmd(NULL,tmpbuf,NULL); strcpy(tmpbuf,"meta1-4 parse_command ^window swap 4"); bindcmd(NULL,tmpbuf,NULL); strcpy(tmpbuf,"meta1-5 parse_command ^window swap 5"); bindcmd(NULL,tmpbuf,NULL); strcpy(tmpbuf,"meta1-6 parse_command ^window swap 6"); bindcmd(NULL,tmpbuf,NULL); strcpy(tmpbuf,"meta1-7 parse_command ^window swap 7"); bindcmd(NULL,tmpbuf,NULL); strcpy(tmpbuf,"meta1-8 parse_command ^window swap 8"); bindcmd(NULL,tmpbuf,NULL); strcpy(tmpbuf,"meta1-9 parse_command ^window swap 9"); bindcmd(NULL,tmpbuf,NULL); strcpy(tmpbuf,"^Wg parse_command window grow 1"); bindcmd(NULL,tmpbuf,NULL); strcpy(tmpbuf,"^Wr parse_command window shrink 1"); bindcmd(NULL,tmpbuf,NULL); strcpy(tmpbuf,"meta1-i insert_tabkey_prev"); bindcmd(NULL,tmpbuf,NULL); #ifdef CELE /* Celerity Binds */ strcpy(tmpbuf,"^K erase_to_end_of_line"); bindcmd(NULL,tmpbuf,NULL); strcpy(tmpbuf,"^O parse_command dirlm"); bindcmd(NULL,tmpbuf,NULL); strcpy(tmpbuf,"^D delete_character"); bindcmd(NULL,tmpbuf,NULL); /* strcpy(tmpbuf,"^J enter_digraph"); bindcmd(NULL,tmpbuf,NULL);*/ strcpy(tmpbuf,"^T switch_channels"); bindcmd(NULL,tmpbuf,NULL); strcpy(tmpbuf,"F2 parse_command cscan"); bindcmd(NULL,tmpbuf,NULL); strcpy(tmpbuf,"F3 parse_command clear"); bindcmd(NULL,tmpbuf,NULL); strcpy(tmpbuf,"F4 parse_command cdcc"); bindcmd(NULL,tmpbuf,NULL); strcpy(tmpbuf,"F5 parse_command digraph"); bindcmd(NULL,tmpbuf,NULL); strcpy(tmpbuf,"F6 parse_command quickstat"); bindcmd(NULL,tmpbuf,NULL); #endif /* CELE */ #ifdef WANTANSI for (i=0;i */ malloc_strcpy(&CmdsColors[COLNOTICE].color4,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLNOTICE].color4,Colors[COLGREEN]); /* - in received notice */ malloc_strcpy(&CmdsColors[COLNOTICE].color5,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLNOTICE].color5,Colors[COLWHITE]); /* Userhost in Celerity */ malloc_strcpy(&CmdsColors[COLNOTICE].color6,Colors[COLCYAN]); /* Netsplits, netjoins */ /* Message */ malloc_strcpy(&CmdsColors[COLNETSPLIT].color1,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLNETSPLIT].color1,Colors[COLWHITE]); /* Time */ malloc_strcpy(&CmdsColors[COLNETSPLIT].color2,Colors[COLWHITE]); /* Servers */ malloc_strcpy(&CmdsColors[COLNETSPLIT].color3,Colors[COLWHITE]); /* Channel */ malloc_strcpy(&CmdsColors[COLNETSPLIT].color4,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLNETSPLIT].color4,Colors[COLCYAN]); /* Nicks */ malloc_strcpy(&CmdsColors[COLNETSPLIT].color5,Colors[COLCYAN]); /* <- */ malloc_strcpy(&CmdsColors[COLNETSPLIT].color6,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLNETSPLIT].color6,Colors[COLYELLOW]); /* Invites */ /* Nick */ malloc_strcpy(&CmdsColors[COLINVITE].color1,Colors[COLCYAN]); /* Userhost */ malloc_strcpy(&CmdsColors[COLINVITE].color2,Colors[COLPURPLE]); /* Channel */ malloc_strcpy(&CmdsColors[COLINVITE].color3,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLINVITE].color3,Colors[COLCYAN]); /* fake word */ malloc_strcpy(&CmdsColors[COLINVITE].color4,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLINVITE].color4,Colors[COLRED]); /* Mode changes */ /* Nick */ malloc_strcpy(&CmdsColors[COLMODE].color1,Colors[COLCYAN]); /* Userhost */ malloc_strcpy(&CmdsColors[COLMODE].color2,Colors[COLWHITE]); /* Channel */ malloc_strcpy(&CmdsColors[COLMODE].color3,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLMODE].color3,Colors[COLCYAN]); /* Mode */ malloc_strcpy(&CmdsColors[COLMODE].color4,Colors[COLWHITE]); /* Message */ malloc_strcpy(&CmdsColors[COLMODE].color5,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLMODE].color5,Colors[COLWHITE]); /* Fake word */ malloc_strcpy(&CmdsColors[COLMODE].color6,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLMODE].color6,Colors[COLRED]); /* Settings */ /* Header */ malloc_strcpy(&CmdsColors[COLSETTING].color1,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLSETTING].color1,Colors[COLWHITE]); /* Setting - ON,OFF,5,#te,... */ malloc_strcpy(&CmdsColors[COLSETTING].color2,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLSETTING].color2,Colors[COLPURPLE]); /* Comment for shit list */ malloc_strcpy(&CmdsColors[COLSETTING].color3,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLSETTING].color3,Colors[COLYELLOW]); /* Userhost */ malloc_strcpy(&CmdsColors[COLSETTING].color4,Colors[COLPURPLE]); /* Channels */ malloc_strcpy(&CmdsColors[COLSETTING].color5,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLSETTING].color5,Colors[COLCYAN]); /* Leaves */ /* Nick */ malloc_strcpy(&CmdsColors[COLLEAVE].color1,Colors[COLCYAN]); /* Channel */ malloc_strcpy(&CmdsColors[COLLEAVE].color2,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLLEAVE].color2,Colors[COLCYAN]); /* Reason */ malloc_strcpy(&CmdsColors[COLLEAVE].color3,Colors[COLWHITE]); /* Friends */ malloc_strcpy(&CmdsColors[COLLEAVE].color4,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLLEAVE].color4,Colors[COLCYAN]); /* Shitted */ malloc_strcpy(&CmdsColors[COLLEAVE].color5,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLLEAVE].color5,Colors[COLRED]); /* Notify */ /* Nick */ malloc_strcpy(&CmdsColors[COLNOTIFY].color1,Colors[COLCYAN]); /* Userhost */ malloc_strcpy(&CmdsColors[COLNOTIFY].color2,Colors[COLPURPLE]); /* Time */ malloc_strcpy(&CmdsColors[COLNOTIFY].color3,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLNOTIFY].color3,Colors[COLBLACK]); /* Message */ malloc_strcpy(&CmdsColors[COLNOTIFY].color4,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLNOTIFY].color4,Colors[COLWHITE]); /* Signon-ed nicks */ malloc_strcpy(&CmdsColors[COLNOTIFY].color5,Colors[COLCYAN]); /* Signon-ed friends */ malloc_strcpy(&CmdsColors[COLNOTIFY].color6,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLNOTIFY].color6,Colors[COLCYAN]); /* CTCPs */ /* Nick */ malloc_strcpy(&CmdsColors[COLCTCP].color1,Colors[COLCYAN]); /* Userhost */ malloc_strcpy(&CmdsColors[COLCTCP].color2,Colors[COLPURPLE]); /* Channel */ malloc_strcpy(&CmdsColors[COLCTCP].color3,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLCTCP].color3,Colors[COLCYAN]); /* Command */ malloc_strcpy(&CmdsColors[COLCTCP].color4,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLCTCP].color4,Colors[COLCYAN]); /* Kicks */ /* Nick */ malloc_strcpy(&CmdsColors[COLKICK].color1,Colors[COLCYAN]); /* Who */ malloc_strcpy(&CmdsColors[COLKICK].color2,Colors[COLCYAN]); /* Channel */ malloc_strcpy(&CmdsColors[COLKICK].color3,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLKICK].color3,Colors[COLCYAN]); /* Comment */ malloc_strcpy(&CmdsColors[COLKICK].color4,Colors[COLWHITE]); /* Kick */ malloc_strcpy(&CmdsColors[COLKICK].color5,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLKICK].color5,Colors[COLWHITE]); /* Friends */ malloc_strcpy(&CmdsColors[COLKICK].color6,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLKICK].color6,Colors[COLCYAN]); /* DCCs */ /* Nick */ malloc_strcpy(&CmdsColors[COLDCC].color1,Colors[COLCYAN]); /* Userhost */ malloc_strcpy(&CmdsColors[COLDCC].color2,Colors[COLPURPLE]); /* Command */ malloc_strcpy(&CmdsColors[COLDCC].color3,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLDCC].color3,Colors[COLWHITE]); /* What */ malloc_strcpy(&CmdsColors[COLDCC].color4,Colors[COLCYAN]); /* Dcc */ malloc_strcpy(&CmdsColors[COLDCC].color5,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLDCC].color5,Colors[COLYELLOW]); /* Warning */ malloc_strcpy(&CmdsColors[COLDCC].color6,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLDCC].color6,Colors[COLRED]); /* WHO */ /* Nick */ malloc_strcpy(&CmdsColors[COLWHO].color1,Colors[COLCYAN]); /* Userhost */ malloc_strcpy(&CmdsColors[COLWHO].color2,Colors[COLPURPLE]); /* Channel */ malloc_strcpy(&CmdsColors[COLWHO].color3,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLWHO].color3,Colors[COLCYAN]); /* Mode */ malloc_strcpy(&CmdsColors[COLWHO].color4,Colors[COLWHITE]); /* Name */ malloc_strcpy(&CmdsColors[COLWHO].color5,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLWHO].color5,Colors[COLWHITE]); /* WHOIS */ /* Nick */ malloc_strcpy(&CmdsColors[COLWHOIS].color1,Colors[COLCYAN]); /* Userhost */ malloc_strcpy(&CmdsColors[COLWHOIS].color2,Colors[COLPURPLE]); /* Channels */ malloc_strcpy(&CmdsColors[COLWHOIS].color3,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLWHOIS].color3,Colors[COLCYAN]); /* Server */ malloc_strcpy(&CmdsColors[COLWHOIS].color4,Colors[COLWHITE]); /* Channels,Server,SignOn,Idle,IrcOp */ malloc_strcpy(&CmdsColors[COLWHOIS].color5,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLWHOIS].color5,Colors[COLBLUE]); /* Channels in friend */ malloc_strcpy(&CmdsColors[COLWHOIS].color6,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLWHOIS].color6,Colors[COLRED]); /* Public MSGs */ /* Nick */ malloc_strcpy(&CmdsColors[COLPUBLIC].color1,Colors[COLWHITE]); /* < and > */ malloc_strcpy(&CmdsColors[COLPUBLIC].color2,Colors[COLBOLD]); malloc_strcpy(&CmdsColors[COLPUBLIC].color2,Colors[COLCYAN]); /* Channel */ malloc_strcpy(&CmdsColors[COLPUBLIC].color3,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLPUBLIC].color3,Colors[COLCYAN]); /* Auto reply */ malloc_strcpy(&CmdsColors[COLPUBLIC].color4,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLPUBLIC].color4,Colors[COLCYAN]); /* Line */ malloc_strcpy(&CmdsColors[COLPUBLIC].color5,Colors[COLWHITE]); /* Your nick if Ego is on */ malloc_strcpy(&CmdsColors[COLPUBLIC].color6,Colors[COLCYAN]); /* Cdcc */ /* Nick */ malloc_strcpy(&CmdsColors[COLCDCC].color1,Colors[COLCYAN]); /* Userhost */ malloc_strcpy(&CmdsColors[COLCDCC].color2,Colors[COLPURPLE]); /* What */ malloc_strcpy(&CmdsColors[COLCDCC].color3,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLCDCC].color3,Colors[COLWHITE]); /* Line */ malloc_strcpy(&CmdsColors[COLCDCC].color4,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLCDCC].color4,Colors[COLYELLOW]); /* Files/bytes */ malloc_strcpy(&CmdsColors[COLCDCC].color5,Colors[COLCYAN]); /* Channel */ malloc_strcpy(&CmdsColors[COLCDCC].color6,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLCDCC].color6,Colors[COLCYAN]); /* Links */ /* Server */ malloc_strcpy(&CmdsColors[COLLINKS].color1,Colors[COLCYAN]); /* Uplink */ malloc_strcpy(&CmdsColors[COLLINKS].color2,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLLINKS].color2,Colors[COLCYAN]); /* Distance */ malloc_strcpy(&CmdsColors[COLLINKS].color3,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLLINKS].color3,Colors[COLYELLOW]); /* > */ malloc_strcpy(&CmdsColors[COLLINKS].color4,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLLINKS].color4,Colors[COLWHITE]); /* Border */ malloc_strcpy(&CmdsColors[COLLINKS].color5,Colors[COLPURPLE]); /* DCC CHAT */ /* Nick */ malloc_strcpy(&CmdsColors[COLDCCCHAT].color1,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLDCCCHAT].color1,Colors[COLRED]); /* = */ malloc_strcpy(&CmdsColors[COLDCCCHAT].color2,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLDCCCHAT].color2,Colors[COLWHITE]); /* Line */ malloc_strcpy(&CmdsColors[COLDCCCHAT].color3,Colors[COLWHITE]); /* [ */ malloc_strcpy(&CmdsColors[COLDCCCHAT].color4,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLDCCCHAT].color4,Colors[COLRED]); /* Nick you sent chat message to */ malloc_strcpy(&CmdsColors[COLDCCCHAT].color5,Colors[COLRED]); /* CSCAN */ /* Channel */ malloc_strcpy(&CmdsColors[COLCSCAN].color1,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLCSCAN].color1,Colors[COLCYAN]); /* Friends */ malloc_strcpy(&CmdsColors[COLCSCAN].color2,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLCSCAN].color2,Colors[COLCYAN]); /* Ops */ malloc_strcpy(&CmdsColors[COLCSCAN].color3,Colors[COLCYAN]); /* Voiced */ malloc_strcpy(&CmdsColors[COLCSCAN].color4,Colors[COLPURPLE]); /* Normal */ malloc_strcpy(&CmdsColors[COLCSCAN].color5,Colors[COLWHITE]); /* Shitted */ malloc_strcpy(&CmdsColors[COLCSCAN].color6,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLCSCAN].color6,Colors[COLRED]); /* Nick change */ /* Old nick */ malloc_strcpy(&CmdsColors[COLNICK].color1,Colors[COLCYAN]); /* known */ malloc_strcpy(&CmdsColors[COLNICK].color2,Colors[COLWHITE]); /* New nick */ malloc_strcpy(&CmdsColors[COLNICK].color3,Colors[COLCYAN]); /* @ in Cscan */ malloc_strcpy(&CmdsColors[COLNICK].color4,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLNICK].color4,Colors[COLGREEN]); /* + in Cscan */ malloc_strcpy(&CmdsColors[COLNICK].color5,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLNICK].color5,Colors[COLPURPLE]); /* /ME */ /* * or ì */ malloc_strcpy(&CmdsColors[COLME].color1,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLME].color1,Colors[COLWHITE]); /* Your nick */ malloc_strcpy(&CmdsColors[COLME].color2,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLME].color2,Colors[COLCYAN]); /* Nick */ malloc_strcpy(&CmdsColors[COLME].color3,Colors[COLCYAN]); /* Target */ malloc_strcpy(&CmdsColors[COLME].color4,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLME].color4,Colors[COLCYAN]); /* Line */ malloc_strcpy(&CmdsColors[COLME].color5,Colors[COLWHITE]); /* Auto reply */ malloc_strcpy(&CmdsColors[COLME].color6,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLME].color6,Colors[COLCYAN]); /* Misc Colors */ /* Color of @ in user@host */ malloc_strcpy(&CmdsColors[COLMISC].color1,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLMISC].color1,Colors[COLWHITE]); /* Color of ()s arround user@host */ malloc_strcpy(&CmdsColors[COLMISC].color2,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLMISC].color2,Colors[COLWHITE]); /* Colors of (msg) etc in CELECOSM */ #ifdef CELECOSM malloc_strcat(&CmdsColors[COLMISC].color3,Colors[COLBLUE]); #endif /* Color of <>s for friends in publics */ malloc_strcpy(&CmdsColors[COLMISC].color4,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLMISC].color4,Colors[COLCYAN]); /* Color of <>s for you in publics */ malloc_strcpy(&CmdsColors[COLMISC].color5,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLMISC].color5,Colors[COLBLUE]); /* Color1 of the statusbar */ #ifndef CELE /* BAR */ malloc_strcpy(&CmdsColors[COLSBAR1].color1,Colors[COLBLUEBG]); /* Window refnum, ircop (*), away and server in OV */ malloc_strcpy(&CmdsColors[COLSBAR1].color2,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLSBAR1].color2,Colors[COLGREEN]); #ifdef SZ32 malloc_strcat(&CmdsColors[COLSBAR1].color2,Colors[COLBLUEBG]); #endif /* ChanOp (@) and via server */ malloc_strcpy(&CmdsColors[COLSBAR1].color3,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLSBAR1].color3,Colors[COLPURPLE]); #ifdef SZ32 malloc_strcat(&CmdsColors[COLSBAR1].color3,Colors[COLBLUEBG]); #endif /* Usermode and query */ malloc_strcpy(&CmdsColors[COLSBAR1].color4,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLSBAR1].color4,Colors[COLRED]); #ifdef SZ32 malloc_strcat(&CmdsColors[COLSBAR1].color4,Colors[COLBLUEBG]); #endif /* Channel and lastjoin */ malloc_strcpy(&CmdsColors[COLSBAR1].color5,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLSBAR1].color5,Colors[COLYELLOW]); #ifdef SZ32 malloc_strcat(&CmdsColors[COLSBAR1].color5,Colors[COLBLUEBG]); #endif /* Turn all attributes (bold) off */ #ifndef SZ32 malloc_strcpy(&CmdsColors[COLSBAR1].color6,Colors[COLNOBOLD]); malloc_strcat(&CmdsColors[COLSBAR1].color6,Colors[COLWHITE]); #else malloc_strcpy(&CmdsColors[COLSBAR1].color6,Colors[COLWHITE]); malloc_strcat(&CmdsColors[COLSBAR1].color6,Colors[COLBLUEBG]); #endif #else /* CELE */ /* BAR */ malloc_strcpy(&CmdsColors[COLSBAR1].color1,Colors[COLBLUEBG]); /* Secondary Bar */ malloc_strcpy(&CmdsColors[COLSBAR1].color2,Colors[COLBLUEBG]); /* Level 1 stuff (nick) */ malloc_strcpy(&CmdsColors[COLSBAR1].color3,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLSBAR1].color3,Colors[COLCYAN]); #ifdef SZ32 malloc_strcat(&CmdsColors[COLSBAR1].color3,Colors[COLBLUEBG]); #endif /* Level 2 stuff (modes, names) */ malloc_strcpy(&CmdsColors[COLSBAR1].color4,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLSBAR1].color4,Colors[COLRED]); #ifdef SZ32 malloc_strcat(&CmdsColors[COLSBAR1].color4,Colors[COLBLUEBG]); #endif /* Level 3 stuff (info) */ #ifndef SZ32 malloc_strcpy(&CmdsColors[COLSBAR1].color5,Colors[COLNOBOLD]); malloc_strcat(&CmdsColors[COLSBAR1].color5,Colors[COLGREEN]); #else malloc_strcpy(&CmdsColors[COLSBAR1].color5,Colors[COLGREEN]); malloc_strcat(&CmdsColors[COLSBAR1].color5,Colors[COLBLUEBG]); #endif /* level 4 stuff (brackets) */ malloc_strcpy(&CmdsColors[COLSBAR1].color6,Colors[COLNOBOLD]); malloc_strcat(&CmdsColors[COLSBAR1].color6,Colors[COLWHITE]); #ifdef SZ32 malloc_strcat(&CmdsColors[COLSBAR1].color6,Colors[COLBLUEBG]); #endif #endif /* CELE */ /* Color2 of the statusbar */ /* Nickname and time */ malloc_strcpy(&CmdsColors[COLSBAR2].color1,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLSBAR2].color1,Colors[COLCYAN]); #ifdef SZ32 malloc_strcat(&CmdsColors[COLSBAR2].color1,Colors[COLBLUEBG]); #endif /* Various stuff (uptime, lag, status flags) */ malloc_strcpy(&CmdsColors[COLSBAR2].color2,Colors[COLCYAN]); #ifdef SZ32 malloc_strcat(&CmdsColors[COLSBAR2].color2,Colors[COLBLUEBG]); #endif /* Hold */ malloc_strcpy(&CmdsColors[COLSBAR2].color3,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLSBAR2].color3,Colors[COLWHITE]); #ifdef SZ32 malloc_strcat(&CmdsColors[COLSBAR2].color3,Colors[COLBLUEBG]); #endif /* Window activity */ malloc_strcpy(&CmdsColors[COLSBAR2].color4,Colors[COLYELLOW]); malloc_strcat(&CmdsColors[COLSBAR2].color4,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLSBAR2].color4,Colors[COLREDBG]); #ifdef CELECOSM /* Celerity Colors - Used in cosmetics */ /* Color of (msg) */ malloc_strcpy(&CmdsColors[COLCELE].color1,Colors[COLRED]); /* Color of (notice) */ malloc_strcpy(&CmdsColors[COLCELE].color2,Colors[COLRED]); /* Color of Mail Notice */ malloc_strcpy(&CmdsColors[COLCELE].color3,Colors[COLPURPLE]); #endif #ifdef OPERVISION /* OperVision */ /* Nick / Single Server */ malloc_strcpy(&CmdsColors[COLOV].color1,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLOV].color1,Colors[COLBLUE]); /* Main Server */ malloc_strcpy(&CmdsColors[COLOV].color2,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLOV].color2,Colors[COLWHITE]); /* Server */ malloc_strcpy(&CmdsColors[COLOV].color3,Colors[COLGREEN]); /* Command */ malloc_strcpy(&CmdsColors[COLOV].color4,Colors[COLBOLD]); malloc_strcpy(&CmdsColors[COLOV].color4,Colors[COLWHITE]); /* Secondary Info */ malloc_strcpy(&CmdsColors[COLOV].color5,Colors[COLWHITE]); /* OV String */ malloc_strcpy(&CmdsColors[COLOV].color6,Colors[COLBOLD]); malloc_strcat(&CmdsColors[COLOV].color6,Colors[COLYELLOW]); #endif #endif } /* Kicks nick from multiple channel */ #ifndef LITE void MultiKick(command,args,subargs) char *command; char *args; char *subargs; { char *nick=(char *) 0; char *channels=(char *) 0; char *comment=(char *) 0; NickList *tmpnick; ChannelList *tmpchan; channels=new_next_arg(args,&args); if (channels) { if (!(*channels=='#')) { nick=channels; channels="*"; } else nick=new_next_arg(args,&args); if (!(nick && *nick)) { PrintUsage("MULTK [#channels] nick [comment]"); return; } if (args && *args) comment=args; else comment=DefaultK; for (tmpchan=server_list[curr_scr_win->server].chan_list;tmpchan; tmpchan=tmpchan->next) if (HAS_OPS(tmpchan->status) && CheckChannel(tmpchan->channel,channels)) { tmpnick=find_in_hash(tmpchan,nick); if (tmpnick) send_to_server("KICK %s %s :%s", tmpchan->channel,nick,comment); } } else PrintUsage("MULTK [#channels] nick [comment]"); } #endif /* Kills users matching filter with WHO */ #ifdef OPER void WhoKill(command,args,subargs) char *command; char *args; char *subargs; { char *filter=(char *) 0; char *pattern=(char *) 0; if (inSZFKill) { say("Already doing filter kill or trace kill"); return; } filter=new_next_arg(args,&args); pattern=new_next_arg(args,&args); if (filter && pattern) { malloc_strcpy(&wkillpattern,pattern); if (args && *args) malloc_strcpy(&wkillreason,args); else new_free(&wkillreason); WhoKillNum=0; server_list[from_server].SZWho++; inSZFKill=1; send_to_server("WHO %s",filter); } else PrintUsage("WKILL who_filter kill_pattern [reason]"); } /* Does the actual killing */ void DoKill(nick,user,host) char *nick; char *user; char *host; { char tmpbuf[mybufsize/4]; if (!my_stricmp(nick,get_server_nickname(from_server))) return; snprintf(tmpbuf,sizeof(tmpbuf),"%s!%s@%s",nick,user,host); if (!wild_match(wkillpattern,tmpbuf)) return; WhoKillNum++; if (wkillreason) strmcpy(tmpbuf,wkillreason,sizeof(tmpbuf)); else strmcpy(tmpbuf,nick,sizeof(tmpbuf)); send_to_server("KILL %s :%s (%d)",nick,tmpbuf,WhoKillNum); } /* Reports statistics for filter kill */ void HandleEndOfKill() { say("Total of %d users were killed",WhoKillNum); inSZFKill=0; new_free(&wkillpattern); new_free(&wkillreason); } #endif /* OPER */