1 
2 /* C-OperVision, for ScrollZ. Coded by Zakath. */
3 /* Thanks to Sheik and Flier for assistance.   */
4 /*
5  * Comments by Flier:
6  * Implemented caching for OVgetword, fixed for various ircd versions.
7  * There seems to be a problem when you have OperVision turned ON and
8  * either server closes connection or you reconnect yourself.  Client
9  * resets window levels and by doing that, messes things up (not just
10  * OperVision, messages go to wrong window too). I have fixed that by
11  * patching calling OperVisionReinit() which reinstates window levels.
12  * I also had to patch my functions that take care of joining channels
13  * to deal with OperVision correctly. Channels were going to wrong wi-
14  * ndow when OperVision was active. I just changed the way I send JOIN
15  * command to server (I'm using ircII function now) and it seems to be
16  * working as expected.
17  * When user chooses to kill OperVision window with ^WK or WINDOW KILL
18  * command, we disable OperVision since they probably wanted that.
19  *
20  * $Id: operv.c,v 1.71 2004-10-19 18:55:50 f Exp $
21  */
22 
23 #include "irc.h"
24 #include "ircaux.h"
25 #include "window.h"
26 #include "edit.h"
27 #include "output.h"
28 #include "server.h"
29 #include "screen.h"
30 #include "status.h"
31 #include "myvars.h"
32 
33 #if defined(OPERVISION) && defined(WANTANSI)
34 
35 extern void PrintUsage _((char *));
36 extern char *TimeStamp _((int));
37 
38 /* Variables needed for caching */
39 static  int  NewNotice; /* 1 if we are parsing new notice, 0 otherwise */
40 static  int  OldWord;   /* holds number  for previous word, if NewNotice is 0 */
41 static  int  OVTS=1;    /* 1 if time stamping is enabled */
42 static  char *OldPtr;   /* holds pointer for previous word, if NewNotice is 0 */
43 
CreateMode(tmpbuf,sizeofbuf)44 void CreateMode(tmpbuf,sizeofbuf)
45 char *tmpbuf;
46 int  sizeofbuf;
47 {
48     /* we need to send aditional usermodes (+swfuckrn), for ircd 2.9/2.10 only send +w */
49     if (get_server_version(from_server)==Server2_11)
50         strmcpy(tmpbuf,"w",sizeofbuf);
51     else strmcpy(tmpbuf,"swfuckrn",sizeofbuf);
52 }
53 
OperVision(command,args,subargs)54 void OperVision(command,args,subargs)
55 char *command;
56 char *args;
57 char *subargs;
58 {
59     int incurwin=0;
60     int sendmodes=1;
61     char *tmp=(char *) 0;
62     char *ovts=(char *) 0;
63     char *nomodes=(char *) 0;
64     char tmpbuf[mybufsize/4+1];
65     unsigned int display;
66 
67     tmp=new_next_arg(args,&args);
68     ovts=new_next_arg(args,&args);
69     if (tmp) {
70 	if (!my_stricmp("ON",tmp) || !my_stricmp("HERE",tmp)) {
71             if (!my_stricmp("HERE",tmp)) incurwin=1;
72             if (ovts && !my_stricmp("TS",ovts)) OVTS=1;
73             else OVTS=0;
74             if (ovts && !my_stricmp("NOMODES",ovts)) nomodes=ovts;
75             else nomodes=new_next_arg(args,&args);
76             if (nomodes && !my_stricmp("NOMODES",nomodes)) sendmodes=0;
77 	    if (OperV && !incurwin)
78                 say("OperVision is already turned on");
79             else {
80 		OperV=1;
81                 ServerNotice=1;
82                 /* turn on additional user modes */
83                 if (sendmodes) {
84                     CreateMode(tmpbuf,mybufsize/4);
85                     send_to_server("MODE %s :+%s",get_server_nickname(from_server),tmpbuf);
86                 }
87                 /* made one window command, made it jump back to current window when
88                    it's done, all output from /WINDOW command is supressed   -Flier */
89                 if (incurwin) strcpy(tmpbuf,"NAME OV LEVEL +OPNOTE,SNOTE,WALLOP");
90                 else snprintf(tmpbuf,sizeof(tmpbuf),"NEW NAME OV DOUBLE OFF LEVEL OPNOTE,SNOTE,WALLOP REFNUM %d GROW 6",curr_scr_win->refnum);
91                 display=window_display;
92                 window_display=0;
93                 windowcmd(NULL,tmpbuf,NULL);
94                 window_display=display;
95 	    }
96             say("OperVision is now enabled%s, time stamping is %sabled",
97                 incurwin?" in current window":"",
98                 OVTS?"en":"dis");
99 	}
100 	else if (!my_stricmp("OFF",tmp)) {
101 	    if (!OperV) say("OperVision is not currently active");
102 	    else {
103 		OperV=0;
104                 nomodes=ovts;
105                 if (nomodes && !my_stricmp("NOMODES",nomodes)) sendmodes=0;
106                 /* we need to undo aditional usermodes (-swfuckrn) */
107                 if (sendmodes) {
108                     CreateMode(tmpbuf,mybufsize/4);
109                     send_to_server("MODE %s :-%s",get_server_nickname(from_server),tmpbuf);
110                 }
111                 /* made one window command, all output from /WINDOW command is
112                    supressed   -Flier */
113 		strcpy(tmpbuf,"REFNUM OV KILL");
114                 display=window_display;
115                 window_display=0;
116 		windowcmd(NULL,tmpbuf,NULL);
117                 window_display=display;
118 		say("OperVision is now disabled");
119 	    }
120 	}
121 	else PrintUsage("OV on [nots] [nomodes]/here [ts] [nomodes]/off [nomodes]");
122     }
123     else PrintUsage("OV on [nots] [nomodes]/here [ts] [nomodes]/off [nomodes]");
124 }
125 
126 /* Takes (u@h), removes (), colorizes, returns u@h */
127 /* Also works with [u@h]   -Flier */
128 /* Also works with n!u@h   -Pier  */
OVuh(word)129 char *OVuh(word)
130 char *word;
131 {
132     int i;
133     int sht = 1;
134     char *tmpstr;
135     char *tmphost;
136     char tmpbuf1[mybufsize / 4];
137     static char tmpbuf2[mybufsize / 4];
138 
139     /* I added sht (number-of-chars-to-short the line) -Pier */
140     /* Remove the ()'s from *word (pointer +1, cat length -1) */
141     tmphost = index(word,'(');
142     /* We need to check for []'s if there are no ()'s since ircd that I run on
143        my box reports client connecting/exiting with [] ?????   -Flier */
144     if (!tmphost) tmphost = index(word,'[');
145     /* Hybrid 5.1b26 seems to use n!u@h in /quote HTM notices -Pier */
146     if (!tmphost) {
147         tmphost = index(word, '!');
148         sht = 0;
149     }
150     if (tmphost) tmphost++;
151     else return(word);
152     i = strlen(tmphost);
153     strmcpy(tmpbuf1, tmphost, i - sht + 1);
154     /* tmpbuf1 is the u@h, now colorize it */
155     if ((tmpstr = index(tmpbuf1, '@'))) {
156 	*tmpstr = '\0';
157 	tmpstr++;
158 	snprintf(tmpbuf2, sizeof(tmpbuf2), "%s(%s%s%s%s%s@%s%s%s%s%s)%s",
159 	        CmdsColors[COLMISC].color2, Colors[COLOFF],
160 	        CmdsColors[COLSETTING].color4, tmpbuf1, Colors[COLOFF],
161 	        CmdsColors[COLMISC].color1, Colors[COLOFF],
162 	        CmdsColors[COLSETTING].color4, tmpstr, Colors[COLOFF],
163 	        CmdsColors[COLMISC].color2, Colors[COLOFF]);
164     }
165     return(tmpbuf2);
166 }
167 
168 /* Returns domain, minus host and top */
169 /* fixed by Flier to work on hostname.domain (like irc.net) */
OVsvdmn(string)170 char *OVsvdmn(string)
171 char *string;
172 {
173     int  i, l;
174     char *c;
175     char *d;
176     char tmpstr[mybufsize / 8];
177     static char tmpbuf[mybufsize / 4];
178 
179     c = rindex(string, '.');
180     if (!c) return(string);
181     i = strlen(string);
182     l = strlen(c);
183     i -= l;  /* Length of top */
184     strmcpy(tmpstr, string, i+1);
185     if (!(d = rindex(tmpstr, '.'))) d = c; /* Extract domain */
186     d++;
187     snprintf(tmpbuf, sizeof(tmpbuf), "%s", d);
188     return(tmpbuf);
189 }
190 
191 /* Gets word(s) from string. Similar to $word() in IrcII */
192 /* Added caching   -Flier */
OVgetword(a,b,string)193 char *OVgetword(a,b,string)
194 int a;
195 int b;
196 char *string;
197 {
198     int  i=1;
199     static char tmpbuf1[mybufsize/2];
200     static char tmpbuf2[mybufsize/2];
201     char *tmpstr=tmpbuf1;
202     char *tmpbuf=tmpbuf1;
203 
204     /* Caching works like this:
205        You have to call this function with incrementing a or b, i.e.:
206        OVgetword(0,2,blah); OVgetword(0,4,blah); OVgetword(5,0,blah);
207        This should speed things up and reduce CPU usage.
208        First check if this is new notice, and if it is copy entire string to buffer.
209        Else, copy old pointer and work from there on, using new indexes   -Flier */
210     if (NewNotice) strmcpy(tmpbuf1,string,sizeof(tmpbuf1));
211     else {
212         strmcpy(tmpbuf1,OldPtr,sizeof(tmpbuf1));
213         i=OldWord+1;
214     }
215     /* If a=0, find and return word #b */
216     if ((a==0) && (b>0)) {
217 	for(;i<=b;i++) tmpstr=next_arg(tmpbuf,&tmpbuf);
218         /* Made it crash proof since my ircd formats some messages differently */
219         if (tmpstr) strmcpy(tmpbuf2,tmpstr,sizeof(tmpbuf2));
220         /* so if there is no word #b we copy empty string   -Flier */
221         else *tmpbuf2='\0';
222         /* Store current word number */
223         OldWord=b;
224         /* Store current word pointer */
225         OldPtr=tmpbuf;
226     }
227     /* If a>0 and b=0, return from word #a to end */
228     else if ((a>0) && (b==0)) {
229         for(;i<a;i++) {
230             tmpstr=index(tmpstr,' ');
231             if (tmpstr) tmpstr++;
232         }
233         /* Made it crash proof since my ircd formats some messages differently */
234 	if (tmpstr) strmcpy(tmpbuf2,tmpstr,sizeof(tmpbuf2));
235         /* so if there is no word #a we copy empty string   -Flier */
236         else *tmpbuf2='\0';
237         /* Store current word number */
238         OldWord=a;
239         /* Store current word pointer */
240         OldPtr=tmpstr;
241     }
242     /* Update caching variables
243        If there was no word #a or #b start from scratch since we're at the end of
244        the string   -Flier */
245     if (!OldPtr) NewNotice=1;
246     else NewNotice=0;
247     return(tmpbuf2);
248 }
249 
250 /* Gets nick form nick!user@host */
OVgetnick(nuh)251 char *OVgetnick(nuh)
252 char *nuh;
253 {
254     char *tmpstr;
255     static char tmpbuf[mybufsize/4];
256 
257     strmcpy(tmpbuf,nuh,sizeof(tmpbuf));
258     if ((tmpstr=index(tmpbuf,'!'))) *tmpstr='\0';
259     return(tmpbuf);
260 }
261 
262 /* Remove [] from the string */
OVnobrackets(char * inbuf,char * outbuf,int outsize)263 void OVnobrackets(char *inbuf, char *outbuf, int outsize)
264 {
265     char *start = inbuf;
266 
267     if (*start == '[') start++;
268     strmcpy(outbuf, start, outsize);
269     if ((strlen(outbuf) > 0) && (outbuf[strlen(outbuf) - 1] == ']'))
270         outbuf[strlen(outbuf) - 1] = '\0';
271 }
272 
OVformat(line,from)273 void OVformat(line,from)
274 char *line;
275 char *from;
276 {
277     char *tmp;
278     char *tmpline;
279     char *curtime;
280     char *origfrom;
281     char *servername;
282     char word1[mybufsize];
283     char word2[mybufsize];
284     char word3[mybufsize];
285     char word4[mybufsize];
286     char word5[mybufsize];
287     char tmpbuf[mybufsize];
288 #ifdef MULTI_SERVER_OV
289     Window *oldwin;
290 
291     oldwin=to_window;
292     to_window=get_window_by_name("OV");
293     if (!to_window) to_window=oldwin;
294 #endif
295     /* Set up tmpline to be just the message to parse */
296     if (!strncmp(line,"*** Notice -- ",14)) tmpline=line+14;
297     /* SZNet support */
298     else if (!strncmp(line,"*** Global -- ",14)) tmpline=line+14;
299     else if (!strncmp(line,"***",4)) tmpline=line+4;
300     else {
301         tmpline=index(line,' ');
302         if (!tmpline) tmpline=line;
303         else {
304             tmpline++;
305             if (!strncmp(tmpline,"*** Notice -- ",14)) tmpline+=14;
306             else tmpline=line;
307         }
308     }
309     strmcpy(tmpbuf,tmpline,sizeof(tmpbuf)); /* Default if no match is found */
310     tmpline=tmpbuf;
311     /* If from has '.' in it is is server */
312     origfrom=from;
313     if (from && index(from,'.')) from=(char *) 0;
314     /* We got new notice, needed for caching */
315     NewNotice=1;
316     /* Now we got the message, use strstr() to match it up */
317     /* OVgetword() and OVgetnick() return max mybufsize/2 so we are safe */
318     if (from) goto havefrom;
319     if (!strncmp(tmpline,"Connecting to",12)) {
320         strcpy(word1,OVgetword(0,3,tmpline));  /* Server */
321 #ifdef OGRE
322         snprintf(tmpbuf,sizeof(tmpbuf),"[      %slink%s] connecting to %s%s%s",
323                 CmdsColors[COLOV].color5,Colors[COLOFF],
324                 CmdsColors[COLOV].color1,word1,Colors[COLOFF]);
325 #else
326         snprintf(tmpbuf,sizeof(tmpbuf),"Connecting to %s%s%s",CmdsColors[COLOV].color2,word1,Colors[COLOFF]);
327 #endif
328     }
329     else if (!strncmp(tmpline,"Entering high-traffic mode: Forced by",36)) {
330         strcpy(word2,OVgetword(0,6,tmpline));  /* Nick!User@Host */
331         strcpy(word1,OVgetnick(word2));        /* Nick */
332 #ifdef OGRE
333 	snprintf(tmpbuf,sizeof(tmpbuf),"[      %slink%s] high traffic mode: forced by %s%s%s %s",
334                 CmdsColors[COLOV].color5,Colors[COLOFF],
335                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
336 #else
337 	snprintf(tmpbuf,sizeof(tmpbuf),"Entering high traffic mode: forced by %s%s%s %s",
338                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
339 #endif
340     }
341     else if (!strncmp(tmpline,"Entering high-traffic mode",25)) {
342         strcpy(word1,OVgetword(0,5,tmpline));  /* High speed */
343         strcpy(word2,OVgetword(0,7,tmpline));  /* Low speed */
344 #ifdef CELECOSM
345         snprintf(tmpbuf,sizeof(tmpbuf),"high-traffic mode: %s%s%s � %s%s%s",
346                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],
347                 CmdsColors[COLOV].color2,word2,Colors[COLOFF]);
348 #elif defined(OGRE)
349         snprintf(tmpbuf,sizeof(tmpbuf),"[      %slink%s] high traffic mode %s%s%s > %s%s%s",
350                 CmdsColors[COLOV].color5,Colors[COLOFF],
351                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],
352                 CmdsColors[COLOV].color1,word2,Colors[COLOFF]);
353 #else
354         snprintf(tmpbuf,sizeof(tmpbuf),"Entering high traffic mode: %s%s%s > %s%s%s",
355                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],
356                 CmdsColors[COLOV].color2,word2,Colors[COLOFF]);
357 #endif
358     }
359     else if (!strncmp(tmpline,"Resuming standard operation: Forced by",37)) {
360         strcpy(word2,OVgetword(0,6,tmpline));  /* Nick!User@Host */
361         strcpy(word1,OVgetnick(word2));        /* Nick */
362 #ifdef OGRE
363         snprintf(tmpbuf,sizeof(tmpbuf),"[      %slink%s] standard operation: forced by %s%s%s %s",
364                 CmdsColors[COLOV].color5,Colors[COLOFF],
365                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
366 #else
367 	snprintf(tmpbuf,sizeof(tmpbuf),"Resuming standard operation: forced by %s%s%s %s",
368                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
369 #endif
370     }
371     else if (!strncmp(tmpline,"Resuming standard operation",26)) {
372         strcpy(word1,OVgetword(0,4,tmpline));  /* Low speed */
373         strcpy(word2,OVgetword(0,6,tmpline));  /* High speed */
374 #ifdef CELECOSM
375         snprintf(tmpbuf,sizeof(tmpbuf),"standard-traffic mode: %s%s%s %s%s%s",
376 		CmdsColors[COLOV].color2,word1,Colors[COLOFF],
377 		CmdsColors[COLOV].color1,word2,Colors[COLOFF]);
378 #elif defined(OGRE)
379         snprintf(tmpbuf,sizeof(tmpbuf),"[      %slink%s] standard traffic mode: %s%s%s %s%s%s",
380                 CmdsColors[COLOV].color5,Colors[COLOFF],
381                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],
382                 CmdsColors[COLOV].color1,word2,Colors[COLOFF]);
383 #else
384         snprintf(tmpbuf,sizeof(tmpbuf),"Entering standard traffic mode: %s%s%s  %s%s%s",
385 		CmdsColors[COLOV].color2,word1,Colors[COLOFF],
386 		CmdsColors[COLOV].color1,word2,Colors[COLOFF]);
387 #endif
388     }
389     else if (!strncmp(tmpline,"Client exiting",14)) {
390 	strcpy(word1,OVgetword(0,3,tmpline));  /* Nick */
391         if (strstr(tmpline+14," from ")) {
392             /* ircd 2.9/2.10 */
393             strcpy(word3,OVgetword(0,5,tmpline));  /* user */
394 	    snprintf(word2,sizeof(word2),"(%s@%s)",word3,
395                     OVgetword(0,7,tmpline));       /* host */
396             strcpy(word3,OVgetword(9,0));
397         }
398         else {
399 	    strcpy(word2,OVgetword(0,4,tmpline));  /* user@host */
400 	    strcpy(word3,OVgetword(5,0,tmpline));  /* Reason */
401         }
402 #ifdef CELECOSM
403         snprintf(tmpbuf,sizeof(tmpbuf),"clnt/%sexit%s  %s%s%s %s",
404                 CmdsColors[COLOV].color4,Colors[COLOFF],
405                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
406 #elif defined(OGRE)
407         snprintf(tmpbuf,sizeof(tmpbuf),"[      %sexit%s] %s%s%s %s",
408                 CmdsColors[COLOV].color3,Colors[COLOFF],
409                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
410 #else
411 	snprintf(tmpbuf,sizeof(tmpbuf),"Client %sexiting%s: %s%s%s %s %s",
412 		CmdsColors[COLOV].color4,Colors[COLOFF],
413                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2),word3);
414 #endif
415     }
416     else if (!strncmp(tmpline,"Client connecting on port",25)) {
417         strcpy(word1,OVgetword(0,5,tmpline));  /* port */
418         if ((tmp=index(word1,':'))) *tmp='\0';
419 	strcpy(word2,OVgetword(0,6,tmpline));  /* Nick */
420 	strcpy(word3,OVgetword(0,7,tmpline));  /* user@host */
421 #ifdef CELECOSM
422         snprintf(tmpbuf,sizeof(tmpbuf),"clnt/%sconnect%s [p%s%s%s]  %s%s%s %s",
423                 CmdsColors[COLOV].color4,Colors[COLOFF],
424                 CmdsColors[COLOV].color5,word1,Colors[COLOFF],
425                 CmdsColors[COLOV].color1,word2,Colors[COLOFF],OVuh(word3));
426 #elif defined(OGRE)
427         snprintf(tmpbuf,sizeof(tmpbuf),"[   %sconnect%s] [p%s%s%s]  %s%s%s %s",
428                 CmdsColors[COLOV].color3,Colors[COLOFF],
429                 CmdsColors[COLOV].color2,word1,Colors[COLOFF],
430                 CmdsColors[COLOV].color1,word2,Colors[COLOFF],OVuh(word3));
431 #else
432         snprintf(tmpbuf,sizeof(tmpbuf),"Client %sconnecting%s on port %s%s%s: %s%s%s %s",
433                 CmdsColors[COLOV].color4,Colors[COLOFF],
434                 CmdsColors[COLOV].color5,word1,Colors[COLOFF],
435                 CmdsColors[COLOV].color1,word2,Colors[COLOFF],OVuh(word3));
436 #endif
437     }
438     else if (!strncmp(tmpline,"Client connecting",17)) {
439         strcpy(word1,OVgetword(0,3,tmpline));  /* Nick */
440         if (strstr(tmpline+17," from ")) {
441             /* ircd 2.9/2.10 */
442             strcpy(word3,OVgetword(0,5,tmpline));  /* user */
443 	    snprintf(word2,sizeof(word2),"(%s@%s)",word3,
444                     OVgetword(0,7,tmpline));       /* host */
445             *word3='\0';
446             *word4='\0';
447         }
448         else {
449             strcpy(word2,OVgetword(0,4,tmpline));  /* user@host */
450             strcpy(word3,OVgetword(0,6,tmpline));  /* conn. class */
451             strcpy(word4,OVgetword(7,0,tmpline));  /* GECOS */
452         }
453 #ifdef CELECOSM
454         snprintf(tmpbuf,sizeof(tmpbuf),"clnt/%sconnect%s  %s%s%s %s %s%s%s %s",
455                 CmdsColors[COLOV].color4,Colors[COLOFF],
456                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2),
457                 CmdsColors[COLOV].color5,word3,Colors[COLOFF],word4);
458 #elif defined(OGRE)
459         snprintf(tmpbuf,sizeof(tmpbuf),"[   %sconnect%s] %s%s%s %s %s%s%s %s",
460                 CmdsColors[COLOV].color3,Colors[COLOFF],
461                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2),
462                 CmdsColors[COLOV].color5,word3,Colors[COLOFF],word4);
463 #else
464         snprintf(tmpbuf,sizeof(tmpbuf),"Client %sconnecting%s: %s%s%s %s %s%s%s %s",
465                 CmdsColors[COLOV].color4,Colors[COLOFF],
466                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2),
467                 CmdsColors[COLOV].color5,word3,Colors[COLOFF],word4);
468 #endif
469     }
470     else if (!strncmp(tmpline,"LINKS requested by",18) ||
471              !strncmp(tmpline,"LINKS '",7)) {
472         if (*(tmpline+6)=='\'') {
473 	    snprintf(word3,sizeof(word3)," %s",OVgetword(0,2,tmpline));  /* filter */
474             strcpy(word1,OVgetword(0,5,tmpline));  /* Nick */
475 	    strcpy(word2,OVgetword(0,6,tmpline));  /* user@host */
476         }
477         else {
478             strcpy(word1,OVgetword(0,4,tmpline));  /* Nick */
479 	    strcpy(word2,OVgetword(0,5,tmpline));  /* user@host */
480             *word3='\0';
481         }
482 #ifdef CELECOSM
483         snprintf(tmpbuf,sizeof(tmpbuf),"%slinks%s%s from %s%s%s %s",
484                 CmdsColors[COLOV].color4,Colors[COLOFF],word3,
485                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
486 #elif defined(OGRE)
487         snprintf(tmpbuf,sizeof(tmpbuf),"[     %slinks%s]%s from %s%s%s %s",
488                 CmdsColors[COLOV].color5,Colors[COLOFF],word3,
489                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
490 #else
491         snprintf(tmpbuf,sizeof(tmpbuf),"%sLinks%s%s request from %s%s%s %s",
492                 CmdsColors[COLOV].color4,Colors[COLOFF],word3,
493                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
494 #endif
495     }
496     else if (!strncmp(tmpline,"TRACE requested by",18) ||
497              !strncmp(tmpline,"trace requested by",18)) {
498         strcpy(word1,OVgetword(0,4,tmpline));  /* Nick */
499 	strcpy(word2,OVgetword(0,5,tmpline));  /* user@host */
500 #ifdef CELECOSM
501         snprintf(tmpbuf,sizeof(tmpbuf),"%strace%s from %s%s%s %s",
502                 CmdsColors[COLOV].color4,Colors[COLOFF],
503                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
504 #elif defined(OGRE)
505         snprintf(tmpbuf,sizeof(tmpbuf),"[     %strace%s] from %s%s%s %s",
506                 CmdsColors[COLOV].color5,Colors[COLOFF],
507                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
508 #else
509         snprintf(tmpbuf,sizeof(tmpbuf),"%sTrace%s request from %s%s%s %s",
510                 CmdsColors[COLOV].color4,Colors[COLOFF],
511                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
512 #endif
513     }
514     else if (!strncmp(tmpline,"info requested by",17)) {
515         strcpy(word1,OVgetword(0,4,tmpline));  /* Nick */
516 	strcpy(word2,OVgetword(0,5,tmpline));  /* user@host */
517 #ifdef CELECOSM
518         snprintf(tmpbuf,sizeof(tmpbuf),"%sinfo%s from %s%s%s %s",
519                 CmdsColors[COLOV].color4,Colors[COLOFF],
520                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
521 #elif defined(OGRE)
522         snprintf(tmpbuf,sizeof(tmpbuf),"[      %sinfo%s] from %s%s%s %s",
523                 CmdsColors[COLOV].color5,Colors[COLOFF],
524                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
525 #else
526         snprintf(tmpbuf,sizeof(tmpbuf),"%sInfo%s request from %s%s%s %s",
527                 CmdsColors[COLOV].color4,Colors[COLOFF],
528                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
529 #endif
530     }
531     else if (!strncmp(tmpline,"Rejecting vlad",14)) {
532 	strcpy(word1,OVgetword(0,4,tmpline));  /* Bot nick */
533 	strcpy(word2,OVgetword(0,5,tmpline));  /* user@host */
534 #ifdef OGRE
535         snprintf(tmpbuf,sizeof(tmpbuf),"[    %sreject%s] vlad/joh/com bot: %s%s%s %s",
536                 CmdsColors[COLOV].color2,Colors[COLOFF],
537                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
538 #else
539 	snprintf(tmpbuf,sizeof(tmpbuf),"Rejecting vlad/joh/com bot: %s%s%s %s",
540                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
541 #endif
542     }
543     else if (!strncmp(tmpline,"Rejecting clonebot",17)) {
544 	strcpy(word1,OVgetword(0,3,tmpline));  /* Bot nick */
545 	strcpy(word2,OVgetword(0,4,tmpline));  /* user@host */
546 #ifdef OGRE
547 	snprintf(tmpbuf,sizeof(tmpbuf),"[    %sreject%s] clonebot: %s%s%s %s",
548 		CmdsColors[COLOV].color2,Colors[COLOFF],
549 		CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
550 #else
551 	snprintf(tmpbuf,sizeof(tmpbuf),"Rejecting clonebot: %s%s%s %s",
552                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
553 #endif
554     }
555     else if (!strncmp(tmpline,"Identd response differs",22)) {
556 	strcpy(word1,OVgetword(0,4,tmpline));  /* Nick */
557 	strcpy(word2,OVgetword(0,5,tmpline));  /* Attemtped IRCUSER */
558 #ifdef OGRE
559         snprintf(tmpbuf,sizeof(tmpbuf),"[     %sfault%s] fake identd: %s%s%s %c%s%c",
560                 CmdsColors[COLOV].color2,Colors[COLOFF],
561                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],
562                 bold,word2,bold);
563 #else
564         snprintf(tmpbuf,sizeof(tmpbuf),"Fault identd response for %s%s%s %c%s%c",
565                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],
566                 bold,word2,bold);
567 #endif
568     }
569     else if (!strncmp(tmpline,"Kill line active for",19)) {
570 	strcpy(word1,OVgetword(0,5,tmpline));  /* Banned client */
571 #ifdef CELECOSM
572         snprintf(tmpbuf,sizeof(tmpbuf),"k-line active: %s%s%s",
573                 CmdsColors[COLOV].color1,word1,Colors[COLOFF]);
574 #elif defined(OGRE)
575         snprintf(tmpbuf,sizeof(tmpbuf),"[     %skline%s] active: %s%s%s",
576                 CmdsColors[COLOV].color2,Colors[COLOFF],
577                 CmdsColors[COLOV].color1,word1,Colors[COLOFF]);
578 #else
579         snprintf(tmpbuf,sizeof(tmpbuf),"Active K-Line for %s%s%s",
580                 CmdsColors[COLOV].color1,word1,Colors[COLOFF]);
581 #endif
582     }
583     else if (!strncmp(tmpline,"K-lined ",8)) {
584 	strcpy(word1,OVgetword(0,2,tmpline));  /* Banned client */
585         if (*word1) {
586             tmp=word1+strlen(word1)-1;
587             if (*tmp=='.') *tmp='\0';
588         }
589 	strcpy(word2,OVgetword(4,0,tmpline));  /* Banned client */
590         if (*word2) snprintf(word3,sizeof(word3)," (%s)",word2);
591         else *word3='\0';
592 #ifdef CELECOSM
593         snprintf(tmpbuf,sizeof(tmpbuf),"k-line active: %s%s%s%s",
594                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],word3);
595 #elif defined(OGRE)
596         snprintf(tmpbuf,sizeof(tmpbuf),"[     %skline%s] active: %s%s%s",
597                 CmdsColors[COLOV].color2,Colors[COLOFF],
598                 CmdsColors[COLOV].color1,word1,Colors[COLOFF]);
599 #else
600         snprintf(tmpbuf,sizeof(tmpbuf),"Active K-line for %s%s%s%s",
601                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],word3);
602 #endif
603     }
604     else if (!strncmp(tmpline,"KLINE active for",16)) {
605 	strcpy(word1,OVgetword(0,4,tmpline));  /* Banned client */
606 	strcpy(word2,word1);
607         if ((tmp=index(word1,'['))) *tmp='\0';
608 #ifdef CELECOSM
609         snprintf(tmpbuf,sizeof(tmpbuf),"k-line active: %s%s%s %s",
610                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
611 #elif defined(OGRE)
612         snprintf(tmpbuf,sizeof(tmpbuf),"[     %skline%s] active: %s%s%s %s",
613                 CmdsColors[COLOV].color2,Colors[COLOFF],
614                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
615 #else
616         snprintf(tmpbuf,sizeof(tmpbuf),"Active K-Line for %s%s%s %s",
617                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
618 #endif
619     }
620     else if (!strncmp(tmpline,"I-line is full for",18)) {
621 	strcpy(word1,OVgetword(0,5,tmpline));  /* nick[user@host] */
622 	strcpy(word2,word1);
623         /* strip [ from nick */
624         if ((tmp=index(word1,'['))) *tmp='\0';
625 #ifdef CELECOSM
626         snprintf(tmpbuf,sizeof(tmpbuf),"i-line full: %s%s%s %s",
627                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
628 #elif defined(OGRE)
629         snprintf(tmpbuf,sizeof(tmpbuf),"[     %siline%s] full: %s%s%s %s",
630                 CmdsColors[COLOV].color2,Colors[COLOFF],
631                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
632 #else
633         snprintf(tmpbuf,sizeof(tmpbuf),"I-Line full for %s%s%s %s",
634                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
635 #endif
636     }
637     else if (!strncmp(tmpline,"Quarantined nick",16)) {
638 	strcpy(word1,OVgetword(0,3,tmpline));  /* nick */
639 	strcpy(word2,OVgetword(0,6,tmpline));  /* user@host */
640         tmp=word1;
641         /* strip [ from nick */
642         if (*tmp=='[') {
643             if ((tmp=rindex(word1,']'))) *tmp='\0';
644             tmp=word1+1;
645         }
646 #ifdef CELECOSM
647         snprintf(tmpbuf,sizeof(tmpbuf),"quarantined nick: %s%s%s %s",
648                 CmdsColors[COLOV].color1,tmp,Colors[COLOFF],OVuh(word2));
649 #elif defined(OGRE)
650         snprintf(tmpbuf,sizeof(tmpbuf),"[      %snick%s] quarantined: %s%s%s %s",
651                 CmdsColors[COLOV].color2,Colors[COLOFF],
652                 CmdsColors[COLOV].color1,tmp,Colors[COLOFF],OVuh(word2));
653 #else
654         snprintf(tmpbuf,sizeof(tmpbuf),"Quarantined nick %s%s%s %s",
655                 CmdsColors[COLOV].color1,tmp,Colors[COLOFF],OVuh(word2));
656 #endif
657     }
658     else if (!my_strnicmp(tmpline,"stats ",6)) {
659         strcpy(word1,OVgetword(0,2,tmpline));  /* Stat type */
660         if (strstr(tmpline+6," from ")) {
661             /* ircd 2.9/2.10 */
662 	    strcpy(word2,OVgetword(0,4,tmpline));  /* Nick */
663             strcpy(word4,OVgetword(0,6,tmpline));  /* user */
664 	    snprintf(word3,sizeof(word3),"(%s@%s)",word4,
665                     OVgetword(0,8,tmpline));       /* host */
666             *word4='\0';
667         }
668         else {
669 	    strcpy(word2,OVgetword(0,5,tmpline));  /* Nick */
670 	    strcpy(word3,OVgetword(0,6,tmpline));  /* user@host */
671 	    strcpy(word4,OVgetword(0,7,tmpline));  /* Server */
672         }
673 #ifdef CELECOSM
674         snprintf(tmpbuf,sizeof(tmpbuf),"stats %s%s%s from %s%s%s %s %s%s%s",
675 		CmdsColors[COLOV].color4,word1,Colors[COLOFF],
676 		CmdsColors[COLOV].color1,word2,Colors[COLOFF],OVuh(word3),
677                 CmdsColors[COLOV].color3,word4,Colors[COLOFF]);
678 #elif defined(OGRE)
679         snprintf(tmpbuf,sizeof(tmpbuf),"[     %sstats%s] %s%s%s from %s%s%s %s %s%s%s",
680                 CmdsColors[COLOV].color5,Colors[COLOFF],
681                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],
682                 CmdsColors[COLOV].color1,word2,Colors[COLOFF],OVuh(word3),
683                 CmdsColors[COLOV].color1,word4,Colors[COLOFF]);
684 #else
685         snprintf(tmpbuf,sizeof(tmpbuf),"Stats %s%s%s request from %s%s%s %s %s%s%s",
686 		CmdsColors[COLOV].color4,word1,Colors[COLOFF],
687 		CmdsColors[COLOV].color1,word2,Colors[COLOFF],OVuh(word3),
688                 CmdsColors[COLOV].color3,word4,Colors[COLOFF]);
689 #endif
690     }
691     else if (!strncmp(tmpline,"Nick change collision",21)) {
692 	strcpy(word1,OVgetword(0,5,tmpline));
693 	strcpy(word2,OVgetword(0,7,tmpline));
694 	strcpy(word3,OVgetword(8,0,tmpline));
695 #ifdef CELECOSM
696         snprintf(tmpbuf,sizeof(tmpbuf),"nick collide: %s%s%s [%s] %s",
697 		CmdsColors[COLOV].color2,word1,Colors[COLOFF],word2,word3);
698 #elif defined(OGRE)
699         snprintf(tmpbuf,sizeof(tmpbuf),"[ %scollision%s] %s%s%s [%s] %s",
700                 CmdsColors[COLOV].color2,Colors[COLOFF],
701                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],word2,word3);
702 #else
703         snprintf(tmpbuf,sizeof(tmpbuf),"Nick change collision: [%s%s%s] [%s] %s",
704 		CmdsColors[COLOV].color2,word1,Colors[COLOFF],word2,word3);
705 #endif
706     }
707     else if (!strncmp(tmpline,"Nick collision on",17)) {
708 	strcpy(word1,OVgetword(4,0,tmpline));
709 #ifdef CELECOSM
710         snprintf(tmpbuf,sizeof(tmpbuf),"nick collide: %s%s%s",
711 		CmdsColors[COLOV].color2,word1,Colors[COLOFF]);
712 #elif defined(OGRE)
713         snprintf(tmpbuf,sizeof(tmpbuf),"[ %scollision%s] %s%s%s",
714                 CmdsColors[COLOV].color2,Colors[COLOFF],
715                 CmdsColors[COLOV].color1,word1,Colors[COLOFF]);
716 #else
717         snprintf(tmpbuf,sizeof(tmpbuf),"Nick collision: %s%s%s",
718 		CmdsColors[COLOV].color2,word1,Colors[COLOFF]);
719 #endif
720     }
721     else if (!strncmp(tmpline,"Fake ",5)) {
722 	strcpy(word1,OVgetword(0,2,tmpline));  /* Nick/Server */
723 	strcpy(word2,OVgetword(0,4,tmpline));  /* channel */
724 	strcpy(word3,OVgetword(5,0,tmpline));  /* fake modes */
725 #ifdef CELECOSM
726         snprintf(tmpbuf,sizeof(tmpbuf),"fake mode in %s%s%s: \"%s%s%s\" by %s",
727                 CmdsColors[COLOV].color1,word2,Colors[COLOFF],
728                 CmdsColors[COLOV].color4,word3,Colors[COLOFF],word1);
729 #elif defined(OGRE)
730         snprintf(tmpbuf,sizeof(tmpbuf),"[      %sfake%s] mode in %s%s%s: \"%s%s%s\" by %s",
731                 CmdsColors[COLOV].color5,Colors[COLOFF],
732                 CmdsColors[COLOV].color1,word2,Colors[COLOFF],
733                 CmdsColors[COLOV].color1,word3,Colors[COLOFF],word1);
734 #else
735         snprintf(tmpbuf,sizeof(tmpbuf),"Fake mode: \"%s%s%s\" in %s%s%s by %s",
736                 CmdsColors[COLOV].color4,word3,Colors[COLOFF],
737                 CmdsColors[COLOV].color1,word2,Colors[COLOFF],word1);
738 #endif
739     }
740     else if (!strncmp(tmpline,"Too many connect",16)) strcpy(tmpbuf,line);
741     else if (!strncmp(tmpline,"Possible bot",12)) {
742 	strcpy(word1,OVgetword(0,3,tmpline));  /* Botnick */
743 	strcpy(word2,OVgetword(0,4,tmpline));  /* user@host */
744 #ifdef OGRE
745         snprintf(tmpbuf,sizeof(tmpbuf),"[    %sclient%s] possible bot: %s%s%s %s",
746                 CmdsColors[COLOV].color2,Colors[COLOFF],
747                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
748 #else
749 	snprintf(tmpbuf,sizeof(tmpbuf),"Possible Bot: %s%s%s %s",
750                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
751 #endif
752     }
753     else if (!strncmp(tmpline,"Link with",9)) {
754 	strcpy(word1,OVgetword(0,3,tmpline));  /* Server */
755 	strcpy(word2,OVgetword(4,0,tmpline));  /* Connect info */
756         if ((tmp=index(word2,'('))) {
757             *word2='\0';
758         }
759 #ifdef CELECOSM
760         snprintf(tmpbuf,sizeof(tmpbuf),"link/%sconnect%s  %s%s%s%s%s%s",
761                 CmdsColors[COLOV].color3,Colors[COLOFF],
762                 CmdsColors[COLOV].color2,word1,Colors[COLOFF],
763                 *word2?" (":"",*word2?word2:"",*word2?")":"");
764 #elif defined(OGRE)
765         snprintf(tmpbuf,sizeof(tmpbuf),"[      %slink%s] %sconnect%s %s%s%s%s%s%s",
766                 CmdsColors[COLOV].color5,Colors[COLOFF],
767                 CmdsColors[COLOV].color6,Colors[COLOFF],
768                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],
769                 *word2?"(":"",*word2?word2:"",*word2?")":"");
770 #else
771         snprintf(tmpbuf,sizeof(tmpbuf),"Link: connected to %s%s%s%s%s%s",
772                 CmdsColors[COLOV].color2,word1,Colors[COLOFF],
773                 *word2?" (":"",*word2?word2:"",*word2?")":"");
774 #endif
775     }
776     else if (!strncmp(tmpline,"Write error to",14)) {
777 	strcpy(word1,OVgetword(0,4,tmpline));  /* Server */
778 #ifdef CELECOSM
779         snprintf(tmpbuf,sizeof(tmpbuf),"link/%sw.error%s  %s%s%s (closing)",
780                 CmdsColors[COLOV].color3,Colors[COLOFF],
781                 CmdsColors[COLOV].color2,word1,Colors[COLOFF]);
782 #elif defined(OGRE)
783         snprintf(tmpbuf,sizeof(tmpbuf),"[      %slink%s] %sw.error%s %s%s%s (closing)",
784                 CmdsColors[COLOV].color5,Colors[COLOFF],
785                 CmdsColors[COLOV].color6,Colors[COLOFF],
786                 CmdsColors[COLOV].color1,word1,Colors[COLOFF]);
787 #else
788         snprintf(tmpbuf,sizeof(tmpbuf),"Link: Write error to %s%s%s - closing.",
789                 CmdsColors[COLOV].color2,word1,Colors[COLOFF]);
790 #endif
791     }
792     else if (!strncmp(line,"Message",7)) strcpy(tmpbuf,line);
793     else if (!strncmp(tmpline,"Received SQUIT",14)) {
794 	strcpy(word1,OVgetword(0,3,tmpline));  /* Server */
795 	strcpy(word2,OVgetword(0,5,tmpline));  /* SQUITer */
796         strcpy(word3,OVgetword(6,0,tmpline));  /* Reason */
797 #ifdef CELECOSM
798         snprintf(tmpbuf,sizeof(tmpbuf),"link/%ssquit%s  %s%s%s from %s %s",
799                 CmdsColors[COLOV].color3,Colors[COLOFF],
800                 CmdsColors[COLOV].color2,word1,Colors[COLOFF],word2,word3);
801 #elif defined(OGRE)
802         snprintf(tmpbuf,sizeof(tmpbuf),"[      %slink%s] %ssquit%s %s%s%s from %s %s",
803                 CmdsColors[COLOV].color5,Colors[COLOFF],
804                 CmdsColors[COLOV].color6,Colors[COLOFF],
805                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],word2,word3);
806 #else
807 	snprintf(tmpbuf,sizeof(tmpbuf),"Link: %s%s%s recieved %sSQUIT%s from %s %s",
808 		CmdsColors[COLOV].color2,word1,Colors[COLOFF],
809                 CmdsColors[COLOV].color4,Colors[COLOFF],word2,word3);
810 #endif
811     }
812     else if (!strncmp(tmpline,"Received KILL message for",25)) {
813         strcpy(word1,OVgetword(0,5,tmpline));  /* nick */
814         if (strlen(word1) && word1[strlen(word1)-1]=='.')
815             word1[strlen(word1)-1]='\0';
816         strcpy(word2,OVgetword(0,7,tmpline));  /* killer  */
817         /* check for server kill first */
818         if (index(word2,'.')) {
819             strcpy(word3,OVgetword(9,0,tmpline));  /* path  */
820 #ifdef OGRE
821             snprintf(tmpbuf,sizeof(tmpbuf),"[      %skill%s] %sserver%s: %s%s%s from %s%s%s (%s)",
822                     CmdsColors[COLOV].color2,Colors[COLOFF],
823                     CmdsColors[COLOV].color6,Colors[COLOFF],
824                     CmdsColors[COLOV].color1,word1,Colors[COLOFF],
825                     CmdsColors[COLOV].color5,word2,Colors[COLOFF],word3);
826 #else
827             snprintf(tmpbuf,sizeof(tmpbuf),"Server kill received for %s%s%s from %s%s%s (%s)",
828                     CmdsColors[COLOV].color1,word1,Colors[COLOFF],
829                     CmdsColors[COLOV].color2,word2,Colors[COLOFF],word3);
830 #endif
831         }
832         else {
833             int foreign=0;
834             char *tmp=word3;
835             char *tmpuh=NULL;
836             char *userhost=word3;
837 
838             strcpy(word3,OVgetword(0,9,tmpline));  /* path  */
839             strcpy(word4,OVgetword(10,0,tmpline)); /* reason  */
840             /* check for foreing kill (more than one !) */
841             while (*tmp && (tmp=index(tmp,'!'))) {
842                 foreign++;
843                 *tmp++='\0';
844                 userhost=tmpuh;
845                 tmpuh=tmp;
846             }
847             if (foreign>1) {
848 #ifdef OGRE
849                 snprintf(tmpbuf,sizeof(tmpbuf),"[      %skill%s] %sforeign%s: %s%s%s from %s%s%s %s",
850                         CmdsColors[COLOV].color2,Colors[COLOFF],
851                         CmdsColors[COLOV].color6,Colors[COLOFF],
852                         CmdsColors[COLOV].color1,word1,Colors[COLOFF],
853                         CmdsColors[COLOV].color1,word2,Colors[COLOFF],word4);
854 #else
855                 snprintf(tmpbuf,sizeof(tmpbuf),"Foreign kill received for %s%s%s from %s%s%s %s",
856                         CmdsColors[COLOV].color1,word1,Colors[COLOFF],
857                         CmdsColors[COLOV].color1,word2,Colors[COLOFF],word4);
858 #endif
859             }
860             else {
861                 int locop=strstr(tmpuh?tmpuh:"","(L")?1:0;
862 
863 #ifdef OGRE
864                 snprintf(tmpbuf,sizeof(tmpbuf),"[      %skill%s] %slocal%s: %s%s%s from %s%s%s%s %s",
865                         CmdsColors[COLOV].color2,Colors[COLOFF],
866                         CmdsColors[COLOV].color6,Colors[COLOFF],
867                         CmdsColors[COLOV].color1,word1,Colors[COLOFF],
868                         locop?"local operator ":"",
869                         CmdsColors[COLOV].color1,word2,Colors[COLOFF],word4);
870 #else
871                 snprintf(tmpbuf,sizeof(tmpbuf),"Local kill received for %s%s%s from %s%s%s%s %s",
872                         CmdsColors[COLOV].color1,word1,Colors[COLOFF],
873                         locop?"local operator ":"",
874                         CmdsColors[COLOV].color1,word2,Colors[COLOFF],word4);
875 #endif
876             }
877         }
878     }
879     else if (!strncmp(tmpline,"Received SERVER",15)) {
880 	strcpy(word1,OVgetword(0,3,tmpline));  /* server */
881 	strcpy(word2,OVgetword(0,5,tmpline));  /* remote */
882 	strcpy(word4,OVgetword(7,0,tmpline));  /* IP & server name */
883         if (*word4) snprintf(word3,sizeof(word3),"(%s",word4);
884         else *word3='\0';
885 #ifdef CELECOSM
886         snprintf(tmpbuf,sizeof(tmpbuf),"link/%sserver%s  %s%s%s from %s %s %s",
887                 CmdsColors[COLOV].color3,Colors[COLOFF],
888                 CmdsColors[COLOV].color2,word1,Colors[COLOFF],word2,word3);
889 #elif defined(OGRE)
890         snprintf(tmpbuf,sizeof(tmpbuf),"[      %slink%s] %sserver%s %s%s%s from %s %s",
891                 CmdsColors[COLOV].color5,Colors[COLOFF],
892                 CmdsColors[COLOV].color6,Colors[COLOFF],
893                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],word2,word3);
894 #else
895 	snprintf(tmpbuf,sizeof(tmpbuf),"Link: %s%s%s recieved %sSERVER%s from %s %s",
896 		CmdsColors[COLOV].color2,word1,Colors[COLOFF],
897                 CmdsColors[COLOV].color4,Colors[COLOFF],word2,word3);
898 #endif
899     }
900     else if (!strncmp(tmpline,"Possible Eggdrop:",17)) {
901 	strcpy(word1,OVgetword(0,3,tmpline));  /* BotNick */
902 	strcpy(word2,OVgetword(0,4,tmpline));  /* user@host */
903 	strcpy(word3,OVgetword(0,5,tmpline));  /* b-line notice */
904 #ifdef OGRE
905         snprintf(tmpbuf,sizeof(tmpbuf),"[   %sclient%s] possible eggdrop: %s%s%s %s %s",
906                 CmdsColors[COLOV].color2,Colors[COLOFF],
907                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2),word3);
908 #else
909 	snprintf(tmpbuf,sizeof(tmpbuf),"Possible eggdrop: %s%s%s %s %s",
910                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2),word3);
911 #endif
912     }
913     else if (!strncmp(tmpline,"Nick change",11)) {
914         if (strstr(tmpline+6," from ")) {
915             /* ircd 2.9/2.10 */
916 	    strcpy(word1,OVgetword(0,3,tmpline));  /* oldnick */
917             strcpy(word2,OVgetword(0,5,tmpline));  /* newnick */
918             strcpy(word4,OVgetword(0,7,tmpline));  /* user */
919 	    snprintf(word3,sizeof(word3),"(%s@%s)",word4,
920                     OVgetword(0,9,tmpline));       /* host */
921         }
922         else {
923             strcpy(word1,OVgetword(0,4,tmpline));  /* oldnick */
924 	    strcpy(word2,OVgetword(0,6,tmpline));  /* newnick */
925             strcpy(word3,OVgetword(0,7,tmpline));  /* user@host */
926         }
927 #ifdef OGRE
928         snprintf(tmpbuf,sizeof(tmpbuf),"[      %snick%s] %s%s%s to %s%s%s %s",
929                 CmdsColors[COLOV].color1,Colors[COLOFF],
930                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],
931                 CmdsColors[COLOV].color1,word2,Colors[COLOFF],OVuh(word3));
932 #else
933 	snprintf(tmpbuf,sizeof(tmpbuf),"Nick change: %s%s%s to %s%s%s %s",
934 		CmdsColors[COLOV].color2,word1,Colors[COLOFF],
935                 CmdsColors[COLOV].color1,word2,Colors[COLOFF],OVuh(word3));
936 #endif
937     }
938     else if (!strncmp(tmpline,"added K-Line",12)) {
939 	strcpy(word1,OVgetword(0,1,tmpline));  /* Nick */
940         strcpy(word2,OVgetword(5,0,tmpline));  /* K-line */
941 #ifdef OGRE
942         snprintf(tmpbuf,sizeof(tmpbuf),"[     %skline%s] added by %s%s%s for %s%s%s",
943                 CmdsColors[COLOV].color2,Colors[COLOFF],
944                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],
945                 CmdsColors[COLOV].color1,word2,Colors[COLOFF]);
946 #else
947         snprintf(tmpbuf,sizeof(tmpbuf),"K-Line added by %s%s%s - %s",
948                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],word2);
949 #endif
950     }
951     else if (!strncmp(tmpline,"Added K-Line [",14)) {
952     }
953     else if (!strncmp(tmpline,"Added temporary ",16) && strstr(tmpline," min. K-Line ")) {
954 	strcpy(word1,OVgetword(0,3,tmpline));  /* time */
955         strcpy(word3,OVgetword(6,0,tmpline));  /* K-line */
956         OVnobrackets(word3,word2,sizeof(word2));
957 #ifdef OGRE
958         snprintf(tmpbuf,sizeof(tmpbuf),"[     %skline%s] added %s%s%s for %s%s%sm",
959                 CmdsColors[COLOV].color2,Colors[COLOFF],
960                 CmdsColors[COLOV].color1,word2,Colors[COLOFF],
961                 CmdsColors[COLOV].color5,word1,Colors[COLOFF]);
962 #else
963         snprintf(tmpbuf,sizeof(tmpbuf),"%s%s%sm K-Line added for %s%s%s",
964                 CmdsColors[COLOV].color5,word1,Colors[COLOFF],
965                 CmdsColors[COLOV].color1,word2,Colors[COLOFF]);
966 #endif
967     }
968     else if (!strncmp(tmpline,"Added temporary ",16) && strstr(tmpline," min. D-Line for ")) {
969 	strcpy(word1,OVgetword(0,3,tmpline));  /* time */
970         strcpy(word3,OVgetword(7,0,tmpline));  /* D-line */
971         OVnobrackets(word3,word2,sizeof(word2));
972 #ifdef OGRE
973         snprintf(tmpbuf,sizeof(tmpbuf),"[     %sdline%s] added %s%s%s for %s%s%sm",
974                 CmdsColors[COLOV].color2,Colors[COLOFF],
975                 CmdsColors[COLOV].color1,word2,Colors[COLOFF],
976                 CmdsColors[COLOV].color5,word1,Colors[COLOFF]);
977 #else
978         snprintf(tmpbuf,sizeof(tmpbuf),"%s%s%sm D-Line added for %s%s%s",
979                 CmdsColors[COLOV].color5,word1,Colors[COLOFF],
980                 CmdsColors[COLOV].color1,word2,Colors[COLOFF]);
981 #endif
982     }
983     else if (!strncmp(tmpline,"Bogus server name",17)) {
984 	strcpy(word1,OVgetword(0,4,tmpline));  /* Bogus name */
985 	strcpy(word2,OVgetword(0,6,tmpline));  /* Nick */
986 #ifdef OGRE
987         snprintf(tmpbuf,sizeof(tmpbuf),"[      %slink%s] %sbogus%s:  %s%s%s from %s%s%s",
988                 CmdsColors[COLOV].color5,Colors[COLOFF],
989                 CmdsColors[COLOV].color6,Colors[COLOFF],
990                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],
991                 CmdsColors[COLOV].color1,word2,Colors[COLOFF]);
992 #else
993 	snprintf(tmpbuf,sizeof(tmpbuf),"Bogus server name %s%s%s from %s%s%s",
994 		CmdsColors[COLOV].color2,word1,Colors[COLOFF],
995                 CmdsColors[COLOV].color1,word2,Colors[COLOFF]);
996 #endif
997     }
998     else if (!strncmp(tmpline,"No response from",16)) {
999 	strcpy(word1,OVgetword(0,4,tmpline));  /* Server */
1000 #ifdef OGRE
1001         snprintf(tmpbuf,sizeof(tmpbuf),"[      %slink%s]  %serror%s: %s%s%s is not responding",
1002                 CmdsColors[COLOV].color5,Colors[COLOFF],
1003                 CmdsColors[COLOV].color6,Colors[COLOFF],
1004                 CmdsColors[COLOV].color1,word1,Colors[COLOFF]);
1005 #else
1006 	snprintf(tmpbuf,sizeof(tmpbuf),"Link error: %s%s%s is not responding",
1007                 CmdsColors[COLOV].color2,word1,Colors[COLOFF]);
1008 #endif
1009     }
1010     else if (!strncmp(tmpline,"IP# Mismatch",12)) {
1011 	strcpy(word1,OVgetword(0,3,tmpline));  /* Real IP */
1012 	strcpy(word2,OVgetword(0,5,tmpline));  /* Mismatched IP */
1013 #ifdef OGRE
1014         snprintf(tmpbuf,sizeof(tmpbuf),"[  %smismatch%s] %s%s%s != %s%s%s",
1015                 CmdsColors[COLOV].color4,Colors[COLOFF],
1016                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],
1017                 CmdsColors[COLOV].color1,word2,Colors[COLOFF]);
1018 #else
1019 	snprintf(tmpbuf,sizeof(tmpbuf),"IP mismatch detected: %s%s%s != %s%s%s",
1020 		CmdsColors[COLOV].color2,word1,Colors[COLOFF],
1021                 CmdsColors[COLOV].color2,word2,Colors[COLOFF]);
1022 #endif
1023     }
1024     else if (!strncmp(tmpline,"Unauthorized connection from",28)) {
1025 	strcpy(word1,OVgetword(0,4,tmpline));  /* Nick!user@host */
1026 #ifdef OGRE
1027         snprintf(tmpbuf,sizeof(tmpbuf),"[    %sclient%s] unauthorized: %s%s%s",
1028                 CmdsColors[COLOV].color2,Colors[COLOFF],
1029                 CmdsColors[COLOV].color1,word1,Colors[COLOFF]);
1030 #else
1031 	snprintf(tmpbuf,sizeof(tmpbuf),"Unauthorized connect from %s%s%s",
1032                 CmdsColors[COLOV].color1,word1,Colors[COLOFF]);
1033 #endif
1034     }
1035     else if (!strncmp(tmpline,"Invalid username",16)) {
1036 	strcpy(word1,OVgetword(0,3,tmpline));  /* Nick */
1037 	strcpy(word2,OVgetword(0,4,tmpline));  /* username */
1038 #ifdef OGRE
1039         snprintf(tmpbuf,sizeof(tmpbuf),"[    %sclient%s] invalid username: %s%s%s %s",
1040                 CmdsColors[COLOV].color2,Colors[COLOFF],
1041                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
1042 #else
1043 	snprintf(tmpbuf,sizeof(tmpbuf),"Invalid username: %s%s%s %s",
1044                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
1045 #endif
1046     }
1047     else if (!strncmp(tmpline,"Cannot accept connect",21)) {
1048 	strcpy(word1,OVgetword(0,4,tmpline));  /* Nick? */
1049 	strcpy(word2,OVgetword(5,0,tmpline));  /* Stuff? */
1050 #ifdef OGRE
1051         snprintf(tmpbuf,sizeof(tmpbuf),"[      %slink%s] %sunlinkable%s: %s%s%s [%s]",
1052                 CmdsColors[COLOV].color5,Colors[COLOFF],
1053                 CmdsColors[COLOV].color6,Colors[COLOFF],
1054                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],word2);
1055 #else
1056 	snprintf(tmpbuf,sizeof(tmpbuf),"Unlinkable connection: %s%s%s [%s]",
1057                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],word2);
1058 #endif
1059     }
1060     else if (!strncmp(tmpline,"Lost connection to",18)) {
1061 	strcpy(word1,OVgetword(4,0,tmpline));  /* Server */
1062 #ifdef OGRE
1063         snprintf(tmpbuf,sizeof(tmpbuf),"[      %slink%s] %slost connection%s: %s%s%s",
1064                 CmdsColors[COLOV].color5,Colors[COLOFF],
1065                 CmdsColors[COLOV].color6,Colors[COLOFF],
1066                 CmdsColors[COLOV].color1,word1,Colors[COLOFF]);
1067 #else
1068 	snprintf(tmpbuf,sizeof(tmpbuf),"Link: lost connection to %s%s%s",
1069                 CmdsColors[COLOV].color2,word1,Colors[COLOFF]);
1070 #endif
1071     }
1072     else if (!my_strnicmp(tmpline,"failed oper",11)) {
1073         strcpy(word1,OVgetword(0,6,tmpline));  /* n!u@h for ircd 2.9/2.10 */
1074         if ((tmp=index(word1,'!')) && index(word1,'@')) {
1075             *tmp++='\0';
1076             snprintf(word2,sizeof(word2),"(%s)",tmp);
1077             strcpy(word3,OVgetword(0,3));
1078         }
1079         else {
1080             strcpy(word1,OVgetword(0,5,tmpline));  /* Nick */
1081             strcpy(word2,OVgetword(0,6,tmpline));  /* user@host */
1082             strcpy(word3,OVgetword(0,7,tmpline));  /* OPER nick */
1083         }
1084 #ifdef OGRE
1085         snprintf(tmpbuf,sizeof(tmpbuf),"[      %soper%s] FAILED: %s%s%s %s %s",
1086                 CmdsColors[COLOV].color1,Colors[COLOFF],
1087                 CmdsColors[COLOV].color4,word1,Colors[COLOFF],OVuh(word2),word3);
1088 #else
1089 	snprintf(tmpbuf,sizeof(tmpbuf),"Failed OPER attempt: %s%s%s %s %s",
1090                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2),word3);
1091 #endif
1092     }
1093     else if (!strncmp(tmpline,"Global -- Failed OPER attempt",29)) {
1094         strcpy(word1,OVgetword(0,7,tmpline));  /* Nick */
1095 	strcpy(word2,OVgetword(0,8,tmpline));  /* user@host */
1096 #ifdef OGRE
1097         snprintf(tmpbuf,sizeof(tmpbuf),"[      %soper%s] FAILED: %s%s%s %s",
1098                 CmdsColors[COLOV].color1,Colors[COLOFF],
1099                 CmdsColors[COLOV].color4,word1,Colors[COLOFF],OVuh(word2));
1100 #else
1101 	snprintf(tmpbuf,sizeof(tmpbuf),"Failed OPER attempt: %s%s%s %s",
1102                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
1103 #endif
1104     }
1105     else if (!strncmp(tmpline,"Sending SQUIT ",14) ||
1106              !strncmp(tmpline,"Sending SERVER ",15)) {
1107         strcpy(word1,OVgetword(0,2,tmpline));
1108         strcpy(word2,OVgetword(0,3,tmpline));
1109         strcpy(word3,OVgetword(4,0,tmpline));
1110 #ifdef OGRE
1111         snprintf(tmpbuf,sizeof(tmpbuf),"[      %slink%s] sending %s%s%s %s %s",
1112                 CmdsColors[COLOV].color5,Colors[COLOFF],
1113                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],word2,
1114                 !strncmp(tmpline,"Sending SQUIT ",14)?word3:"");
1115 #else
1116         snprintf(tmpbuf,sizeof(tmpbuf),"Sending %s%s%s %s %s",
1117                 CmdsColors[COLOV].color2,word1,Colors[COLOFF],word2,
1118                 !strncmp(tmpline,"Sending SQUIT ",14)?word3:"");
1119 #endif
1120     }
1121     else if (!strncmp(tmpline,"Rejecting connection from ",26)) {
1122         strcpy(word1,OVgetword(0,4,tmpline));
1123 #ifdef OGRE
1124         snprintf(tmpbuf,sizeof(tmpbuf),"[    %sreject%s] connection: %s%s%s",
1125                 CmdsColors[COLOV].color2,Colors[COLOFF],
1126                 CmdsColors[COLOV].color1,word1,Colors[COLOFF]);
1127 #else
1128         snprintf(tmpbuf,sizeof(tmpbuf),"Rejecting connection from %s%s%s",
1129                 CmdsColors[COLOV].color2,word1,Colors[COLOFF]);
1130 #endif
1131     }
1132     else if (!strncmp(tmpline,"Remote CONNECT",14)) {
1133         strcpy(word1,OVgetword(0,3,tmpline)); /* target */
1134         strcpy(word2,OVgetword(0,4,tmpline)); /* port */
1135         strcpy(word3,OVgetword(0,6,tmpline)); /* nick */
1136 #ifdef OGRE
1137         snprintf(tmpbuf,sizeof(tmpbuf),"[      %slink%s] %sconnect%s %s%s%s %s <- %s from %s%s%s",
1138                 CmdsColors[COLOV].color2,Colors[COLOFF],
1139                 CmdsColors[COLOV].color6,Colors[COLOFF],
1140                 CmdsColors[COLOV].color5,word1,Colors[COLOFF],word2,origfrom,
1141                 CmdsColors[COLOV].color2,word3,Colors[COLOFF]);
1142 #else
1143         snprintf(tmpbuf,sizeof(tmpbuf),"Remote connect %s%s%s %s <- %s from %s%s%s",
1144                 CmdsColors[COLOV].color5,word1,Colors[COLOFF],word2,origfrom,
1145                 CmdsColors[COLOV].color2,word3,Colors[COLOFF]);
1146 #endif
1147     }
1148     else if (!strncmp(tmpline,"TS for ",7)) {
1149         strcpy(word1,OVgetword(0,3,tmpline)); /* channel */
1150         strcpy(word2,OVgetword(0,6,tmpline)); /* TS1 */
1151         strcpy(word3,OVgetword(0,8,tmpline)); /* TS2 */
1152 #ifdef OGRE
1153         snprintf(tmpbuf,sizeof(tmpbuf),"[    %schannel%s] %sTS%s %s%s%s %s -> %s",
1154                 CmdsColors[COLOV].color2,Colors[COLOFF],
1155                 CmdsColors[COLOV].color6,Colors[COLOFF],
1156                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],word2,word3);
1157 #else
1158         snprintf(tmpbuf,sizeof(tmpbuf),"%sTS%s for %s%s%s changed %s -> %s",
1159                 CmdsColors[COLOV].color1,Colors[COLOFF],
1160                 CmdsColors[COLOV].color2,word1,Colors[COLOFF],word2,word3);
1161 #endif
1162     }
1163     else if (!strncmp(tmpline,"Too many user connections for ",30)) {
1164 	strcpy(word1,OVgetword(0,6,tmpline));  /* user */
1165 	strcpy(word2,word1);
1166         if ((tmp=index(word1,'['))) *tmp='\0';
1167 #ifdef OGRE
1168         snprintf(tmpbuf,sizeof(tmpbuf),"[      %suser%s] too many connections for %s%s%s %s",
1169                  CmdsColors[COLOV].color2,Colors[COLOFF],
1170                  CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
1171 #else
1172         snprintf(tmpbuf,sizeof(tmpbuf),"Too many user connections for %s%s%s %s",
1173                  CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
1174 #endif
1175     }
1176     else if (!strncmp(tmpline,"Too many global connections for ",32)) {
1177 	strcpy(word1,OVgetword(0,6,tmpline));  /* user */
1178 	strcpy(word2,word1);
1179         if ((tmp=index(word1,'['))) *tmp='\0';
1180 #ifdef OGRE
1181         snprintf(tmpbuf,sizeof(tmpbuf),"[    %sglobal%s] too many connections for %s%s%s %s",
1182                  CmdsColors[COLOV].color2,Colors[COLOFF],
1183                  CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
1184 #else
1185         snprintf(tmpbuf,sizeof(tmpbuf),"Too many global connections for %s%s%s %s",
1186                  CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
1187 #endif
1188     }
1189     else if (!strncmp(tmpline,"Temporary K-line for ",21)) {
1190 	strcpy(word2,OVgetword(0,4,tmpline));  /* user */
1191         OVnobrackets(word2,word1,sizeof(word1));
1192 #ifdef OGRE
1193         snprintf(tmpbuf,sizeof(tmpbuf),"[     %skline%s] expired %s%s%s",
1194                  CmdsColors[COLOV].color2,Colors[COLOFF],
1195                  CmdsColors[COLOV].color1,word1,Colors[COLOFF]);
1196 #else
1197         snprintf(tmpbuf,sizeof(tmpbuf),"Temporary K-Line for %s%s%s expired",
1198                  CmdsColors[COLOV].color1,word1,Colors[COLOFF]);
1199 #endif
1200     }
1201     else if (!strncmp(tmpline,"KLINE over-ruled for ",21)) {
1202         strcpy(word1,OVgetword(0,4,tmpline));
1203         if ((tmp=index(word1,'['))) {
1204             strcpy(word2,tmp);
1205             *tmp='\0';
1206         }
1207         else *word2='\0';
1208 #ifdef OGRE
1209         snprintf(tmpbuf,sizeof(tmpbuf),"[     %skline%s] overruled %s%s%s %s",
1210                  CmdsColors[COLOV].color2,Colors[COLOFF],
1211                  CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
1212 #else
1213         snprintf(tmpbuf,sizeof(tmpbuf),"K-Line overruled for %s%s%s %s",
1214                  CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
1215 #endif
1216     }
1217     else if (!strncmp(tmpbuf,"Opermsg from ",13)) {
1218         strcpy(word1,OVgetword(0,3,tmpline));  /* nick */
1219         if (strlen(word1)>0 && word1[strlen(word1)-1]==':')
1220             word1[strlen(word1)-1]='\0';
1221         strcpy(word2,OVgetword(0,4,tmpline));
1222         if (!strcmp(word2,"LOCOPS")) strcpy(word2,"locopermsg");
1223         else strcpy(word2,"   opermsg");
1224         strcpy(word3,OVgetword(6,0,tmpline));   /* msg */
1225 #ifdef OGRE
1226         snprintf(tmpbuf,sizeof(tmpbuf),"[%s%s%s] %s%s%s: %s",
1227                 CmdsColors[COLOV].color5,word2,Colors[COLOFF],
1228                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],word3);
1229 #else
1230         snprintf(tmpbuf,sizeof(tmpbuf),"%s from %s%s%s: %s",
1231                  word2,CmdsColors[COLOV].color1,word1,Colors[COLOFF],word3);
1232 #endif
1233     }
1234     else if (!strncmp(tmpbuf,"New Max Local Clients: ",23)) {
1235         strcpy(word1,OVgetword(0,5,tmpline));  /* number */
1236 #ifdef OGRE
1237         snprintf(tmpbuf,sizeof(tmpbuf),"[   %sclients%s] new max local %s%s%s",
1238                 CmdsColors[COLOV].color5,Colors[COLOFF],
1239                 CmdsColors[COLOV].color1,word1,Colors[COLOFF]);
1240 #else
1241         snprintf(tmpbuf,sizeof(tmpbuf),"New max local clients %s%s%s",
1242                  CmdsColors[COLOV].color1,word1,Colors[COLOFF]);
1243 #endif
1244     }
1245     else if (!strncmp(tmpbuf,"XLINE over-ruled for ",21)) {
1246         strcpy(word1,OVgetword(0,4,tmpline));  /* who */
1247         strcpy(word2,word1);
1248         tmp=index(word1,'[');
1249         if (tmp) *tmp='\0';
1250 #ifdef OGRE
1251         snprintf(tmpbuf,sizeof(tmpbuf),"[    %sxline%s] overruled for %s%s%s %s",
1252                 CmdsColors[COLOV].color2,Colors[COLOFF],
1253                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
1254 #else
1255         snprintf(tmpbuf,sizeof(tmpbuf),"X-Line overruled for %s%s%s %s",
1256                  CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
1257 #endif
1258     }
1259     else if (!strncmp(tmpbuf,"XLINE active for ",17)) {
1260         strcpy(word1,OVgetword(0,4,tmpline));  /* who */
1261         strcpy(word2,word1);
1262         tmp=index(word1,'[');
1263         if (tmp) *tmp='\0';
1264 #ifdef OGRE
1265         snprintf(tmpbuf,sizeof(tmpbuf),"[    %sxline%s] active for %s%s%s %s",
1266                 CmdsColors[COLOV].color2,Colors[COLOFF],
1267                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
1268 #else
1269         snprintf(tmpbuf,sizeof(tmpbuf),"X-Line active for %s%s%s %s",
1270                  CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
1271 #endif
1272     }
1273     else if (!strncmp(tmpbuf,"admin requested by ",19)) {
1274         strcpy(word1,OVgetword(0,4,tmpline));  /* who */
1275         strcpy(word2,OVgetword(0,5,tmpline));  /* user@host */
1276         strcpy(word3,OVgetword(0,6,tmpline));  /* server */
1277 #ifdef OGRE
1278         snprintf(tmpbuf,sizeof(tmpbuf),"[    %sadmin%s] requested by %s%s%s %s %s",
1279                 CmdsColors[COLOV].color2,Colors[COLOFF],
1280                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2),word3);
1281 #else
1282         snprintf(tmpbuf,sizeof(tmpbuf),"Admin requested by %s%s%s %s %s",
1283                  CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2),word3);
1284 #endif
1285     }
1286     else if (!strncmp(tmpbuf,"motd requested by ",18)) {
1287         strcpy(word1,OVgetword(0,4,tmpline));  /* who */
1288         strcpy(word2,OVgetword(0,5,tmpline));  /* user@host */
1289         strcpy(word3,OVgetword(0,6,tmpline));  /* server */
1290 #ifdef OGRE
1291         snprintf(tmpbuf,sizeof(tmpbuf),"[     %smotd%s] requested by %s%s%s %s %s",
1292                 CmdsColors[COLOV].color2,Colors[COLOFF],
1293                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2),word3);
1294 #else
1295         snprintf(tmpbuf,sizeof(tmpbuf),"Motd requested by %s%s%s %s %s",
1296                  CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2),word3);
1297 #endif
1298     }
1299     else if (!strncmp(tmpline,"Unauthorised client connection from ",36)) {
1300         strcpy(word1,OVgetword(0,5,tmpline));  /* nick[user@host] */
1301         tmp=index(word1,'[');
1302         if (tmp) {
1303             strcpy(word2,tmp);
1304             *tmp='\0';
1305         }
1306         else strcpy(word2,word1);
1307         strcpy(word3,OVgetword(0,6,tmpline));  /* [ip] */
1308         strcpy(word4,OVgetword(0,8,tmpline));  /* [server/port] */
1309         if (strlen(word4)>0 && word4[strlen(word4)-1]=='.')
1310             word4[strlen(word4)-1]='\0';
1311 #ifdef OGRE
1312         snprintf(tmpbuf,sizeof(tmpbuf),"[    %sclient%s] unauthorized: %s%s%s %s %s %s",
1313                 CmdsColors[COLOV].color2,Colors[COLOFF],
1314                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2),
1315                 word3,word4);
1316 #else
1317         snprintf(tmpbuf,sizeof(tmpbuf),"Unauthorized connect from %s%s%s %s %s %s",
1318                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2),
1319                 word3,word4);
1320 #endif
1321     }
1322     else if (!strncmp(tmpline,"K-Line for ",11)) {
1323 	strcpy(word1,OVgetword(0,3,tmpline));  /* pattern */
1324         tmp=word1;
1325         if (*tmp=='[') tmp++;
1326         if (strlen(word1)>0 && word1[strlen(word1)-1]==']')
1327             word1[strlen(word1)-1]='\0';
1328 #ifdef OGRE
1329         snprintf(tmpbuf,sizeof(tmpbuf),"[     %skline%s] removed %s%s%s",
1330                 CmdsColors[COLOV].color2,Colors[COLOFF],
1331                 CmdsColors[COLOV].color1,tmp,Colors[COLOFF]);
1332 #else
1333         snprintf(tmpbuf,sizeof(tmpbuf),"K-Line removed for %s%s%s",
1334                 CmdsColors[COLOV].color1,tmp,Colors[COLOFF]);
1335 #endif
1336     }
1337     else if (!strncmp(tmpline,"Un-klined ",10)) {
1338 	strcpy(word1,OVgetword(0,2,tmpline));  /* pattern */
1339         tmp=word1;
1340         if (*tmp=='[') tmp++;
1341         if (strlen(word1)>0 && word1[strlen(word1)-1]==']')
1342             word1[strlen(word1)-1]='\0';
1343 #ifdef OGRE
1344         snprintf(tmpbuf,sizeof(tmpbuf),"[     %skline%s] removed temporary %s%s%s",
1345                 CmdsColors[COLOV].color2,Colors[COLOFF],
1346                 CmdsColors[COLOV].color1,tmp,Colors[COLOFF]);
1347 #else
1348         snprintf(tmpbuf,sizeof(tmpbuf),"Temporary K-Line removed for %s%s%s",
1349                 CmdsColors[COLOV].color1,tmp,Colors[COLOFF]);
1350 #endif
1351     }
1352     else if (strstr(tmpline,"whois on you")) {
1353         strcpy(word1,OVgetword(0,1,tmpline));  /* nick */
1354         strcpy(word2,OVgetword(0,2,tmpline));  /* user@host */
1355 #ifdef OGRE
1356         snprintf(tmpbuf,sizeof(tmpbuf),"[     %swhois%s] on you by %s%s%s %s",
1357                 CmdsColors[COLOV].color1,Colors[COLOFF],
1358                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
1359 #else
1360 	snprintf(tmpbuf,sizeof(tmpbuf),"%s%s%s %s is doing a %sWhois%s on you.",
1361                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2),
1362                 CmdsColors[COLOV].color4,Colors[COLOFF]);
1363 #endif
1364     }
1365     else if (strstr(tmpline,"WHOIS on YOU")) {
1366         strcpy(word1,OVgetword(0,6,tmpline));  /* nick */
1367         strcpy(word2,OVgetword(0,7,tmpline));  /* user@host */
1368 #ifdef OGRE
1369         snprintf(tmpbuf,sizeof(tmpbuf),"[     %swhois%s] on you by %s%s%s %s",
1370                 CmdsColors[COLOV].color1,Colors[COLOFF],
1371                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
1372 #else
1373 	snprintf(tmpbuf,sizeof(tmpbuf),"%s%s%s %s is doing a %sWhois%s on you.",
1374                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2),
1375                 CmdsColors[COLOV].color4,Colors[COLOFF]);
1376 #endif
1377     }
1378     else if (strstr(tmpline,"Flooder") && strstr(tmpline,"target")) {
1379         strcpy(word1,OVgetword(0,2,tmpline)); /* nick */
1380         if (!strcmp(word1,"Flooder")) {
1381             strcpy(word3,OVgetword(0,3,tmpline));
1382             strcpy(word1,word3);
1383             if ((tmp=index(word1,'['))) *tmp='\0';
1384             strcpy(word2,word3);
1385         }
1386         else strcpy(word2,OVgetword(0,3,tmpline)); /* user@host */
1387         strcpy(word3,OVgetword(0,5,tmpline)); /* Server */
1388         strcpy(word4,OVgetword(0,7,tmpline)); /* Channel */
1389 #ifdef CELECOSM
1390         snprintf(tmpbuf,sizeof(tmpbuf),"clnt/%sflood%s %s%s%s -> %s%s%s [%s]",
1391                 CmdsColors[COLOV].color4,Colors[COLOFF],
1392                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],
1393                 CmdsColors[COLOV].color2,word4,Colors[COLOFF],word3);
1394 #elif defined(OGRE)
1395         snprintf(tmpbuf,sizeof(tmpbuf),"[    %sclient%s] flooder: %s%s%s %s -> %s%s%s [%s]",
1396                 CmdsColors[COLOV].color2,Colors[COLOFF],
1397                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2),
1398                 CmdsColors[COLOV].color1,word4,Colors[COLOFF],word3);
1399 #else
1400         snprintf(tmpbuf,sizeof(tmpbuf),"Flooder %s%s%s %s -> %s%s%s [%s]",
1401                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2),
1402                 CmdsColors[COLOV].color2,word4,Colors[COLOFF],word3);
1403 #endif
1404     }
1405     else if (strstr(tmpline,"is now operator") ||
1406              strstr(tmpline,"is now an operator")) {
1407         int opertype;
1408         char *operstr;
1409 
1410 	strcpy(word1,OVgetword(0,1,tmpline));  /* Nick */
1411         strcpy(word2,OVgetword(0,2,tmpline));  /* user@host */
1412         strcpy(word4,OVgetword(0,5,tmpline));
1413         strcpy(word3,OVgetword(0,6,tmpline));  /* o/O */
1414         tmp=word3;
1415         if (*tmp) tmp++;
1416         if (get_server_version(from_server)==Server2_11) {
1417             opertype=*tmp?(*tmp=='o'?2:1):0;
1418         }
1419         else {
1420             opertype=*tmp?(*tmp=='O'?2:1):0;
1421             if (!strcmp(word4,"an")) opertype=0;
1422         }
1423         operstr=opertype?(opertype==2?"global ":"local "):"";
1424 #ifdef CELECOSM
1425         snprintf(tmpbuf,sizeof(tmpbuf),"%s%s%s %s is an IRC warrior %s%s%s",
1426                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2),
1427                 *operstr?"(":"",operstr,operstr?")":"");
1428 #elif defined(OGRE)
1429         snprintf(tmpbuf,sizeof(tmpbuf),"[      %soper%s] %s%s%s %s is now a%s %soper",
1430                 CmdsColors[COLOV].color1,Colors[COLOFF],
1431                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2),
1432                 *operstr?"":"n",operstr);
1433 #else
1434 	snprintf(tmpbuf,sizeof(tmpbuf),"%s%s%s %s is now %sIRC Operator.",
1435                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2),
1436                 operstr);
1437 #endif
1438     }
1439     else if (strstr(tmpline,"is rehashing Server config")) {
1440         strcpy(word1,OVgetword(0,1,tmpline));  /* Nick */
1441 #ifdef CELECOSM
1442         snprintf(tmpbuf,sizeof(tmpbuf),"config rehash by %s%s%s",
1443                 CmdsColors[COLOV].color1,word1,Colors[COLOFF]);
1444 #elif defined(OGRE)
1445         snprintf(tmpbuf,sizeof(tmpbuf),"[    %srehash%s] by %s%s%s",
1446                 CmdsColors[COLOV].color4,Colors[COLOFF],
1447                 CmdsColors[COLOV].color1,word1,Colors[COLOFF]);
1448 #else
1449         snprintf(tmpbuf,sizeof(tmpbuf),"%s%s%s is rehashing the server config file.",
1450                 CmdsColors[COLOV].color1,word1,Colors[COLOFF]);
1451 #endif
1452     }
1453     else if (strstr(tmpline,"tried to msg")) {
1454         strcpy(word1,OVgetword(0,2,tmpline));  /* nick */
1455         strcpy(word2,OVgetword(0,3,tmpline));  /* user@host */
1456         strcpy(word3,OVgetword(0,7,tmpline));  /* number */
1457 #ifdef OGRE
1458         snprintf(tmpbuf,sizeof(tmpbuf),"[    %sclient%s] %s%s%s %s tried to message %s%s%s users",
1459                 CmdsColors[COLOV].color2,Colors[COLOFF],
1460                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2),
1461                 CmdsColors[COLOV].color1,word3,Colors[COLOFF]);
1462 #else
1463         snprintf(tmpbuf,sizeof(tmpbuf),"User %s%s%s %s tried to message %s%s%s users",
1464                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2),
1465                 CmdsColors[COLOV].color2,word3,Colors[COLOFF]);
1466 #endif
1467     }
1468     else if ((strstr(tmpline,"Possible")) && (strstr(tmpline,"bot"))) {
1469 	strcpy(word1,OVgetword(0,4,tmpline));  /* Bot Nick */
1470 	strcpy(word2,OVgetword(0,5,tmpline));  /* User@Host */
1471 #ifdef OGRE
1472         snprintf(tmpbuf,sizeof(tmpbuf),"[    %sclient%s] possible bot: %s%s%s %s",
1473                 CmdsColors[COLOV].color2,Colors[COLOFF],
1474                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
1475 #else
1476 	snprintf(tmpbuf,sizeof(tmpbuf),"Possible IrcBot: %s%s%s %s",
1477                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
1478 #endif
1479     }
1480     else if (strstr(tmpline,"ERROR :from")) {
1481 	strcpy(word1,OVgetword(0,3,tmpline));  /* Error Source */
1482 	strcpy(word2,OVgetword(0,7,tmpline));  /* ? */
1483 	strcpy(word3,OVgetword(8,0,tmpline));  /* Error */
1484 #ifdef OGRE
1485         snprintf(tmpbuf,sizeof(tmpbuf),"[      %slink%s] %serror%s: %s%s%s - close link %s%s%s %s",
1486                 CmdsColors[COLOV].color5,Colors[COLOFF],
1487                 CmdsColors[COLOV].color6,Colors[COLOFF],
1488                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],
1489                 CmdsColors[COLOV].color1,word2,Colors[COLOFF],word3);
1490 #else
1491 	snprintf(tmpbuf,sizeof(tmpbuf),"Error: %s%s%s - close link %s%s%s %s",
1492 		CmdsColors[COLOV].color1,word1,Colors[COLOFF],
1493                 CmdsColors[COLOV].color2,word2,Colors[COLOFF],word3);
1494 #endif
1495     }
1496     else if (strstr(tmpline,"closed the connection")) {
1497 	strcpy(word1,OVgetword(0,2,tmpline));  /* Server */
1498 #ifdef OGRE
1499         snprintf(tmpbuf,sizeof(tmpbuf),"[      %slink%s] %slink error%s: %s%s%s closed the connection",
1500                 CmdsColors[COLOV].color5,Colors[COLOFF],
1501                 CmdsColors[COLOV].color6,Colors[COLOFF],
1502                 CmdsColors[COLOV].color1,word1,Colors[COLOFF]);
1503 #else
1504 	snprintf(tmpbuf,sizeof(tmpbuf),"Link Error: %s%s%s closed the connection.",
1505                 CmdsColors[COLOV].color2,word1,Colors[COLOFF]);
1506 #endif
1507     }
1508     else if ((strstr(tmpline,"Connection to")) && (strstr(tmpline,"activated"))) {
1509 	strcpy(word1,OVgetword(0,3,tmpline));  /* Server */
1510 #ifdef OGRE
1511         snprintf(tmpbuf,sizeof(tmpbuf),"[      %slink%s] %sconnecting%s to %s%s%s",
1512                 CmdsColors[COLOV].color5,Colors[COLOFF],
1513                 CmdsColors[COLOV].color6,Colors[COLOFF],
1514                 CmdsColors[COLOV].color1,word1,Colors[COLOFF]);
1515 #else
1516         snprintf(tmpbuf,sizeof(tmpbuf),"Link: Connecting to %s%s%s",
1517                 CmdsColors[COLOV].color2,word1,Colors[COLOFF]);
1518 #endif
1519     }
1520     else if (strstr(tmpline,"connect failure:")) {
1521 	strcpy(word1,OVgetword(0,3,tmpline));  /* Failed Server */
1522 	strcpy(word2,OVgetword(4,0,tmpline));  /* Reason */
1523 #ifdef OGRE
1524         snprintf(tmpbuf,sizeof(tmpbuf),"[      %slink%s] %sfailed connect%s from %s%s%s [%s]",
1525                 CmdsColors[COLOV].color5,Colors[COLOFF],
1526                 CmdsColors[COLOV].color6,Colors[COLOFF],
1527                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],word4);
1528 #else
1529 	snprintf(tmpbuf,sizeof(tmpbuf),"Failed connect from %s%s%s [%s]",
1530                 CmdsColors[COLOV].color2,word1,Colors[COLOFF],word2);
1531 #endif
1532     }
1533     else if ((tmp=strstr(tmpline," added a ")) && strstr(tmp,"kline")) {
1534 	strcpy(word1,OVgetword(0,1,tmpline));  /* Nick */
1535         strcpy(word2,OVgetword(6,0,tmpline));  /* K-line */
1536 #ifdef OGRE
1537         snprintf(tmpbuf,sizeof(tmpbuf),"[     %skline%s] added by %s%s%s for %s%s%s",
1538                 CmdsColors[COLOV].color2,Colors[COLOFF],
1539                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],
1540                 CmdsColors[COLOV].color1,word2,Colors[COLOFF]);
1541 #else
1542         snprintf(tmpbuf,sizeof(tmpbuf),"K-Line added by %s%s%s - %s",
1543                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],word2);
1544 #endif
1545     }
1546     else if (strstr(tmpline," added K-Line ")) {
1547 	strcpy(word1,OVgetword(0,1,tmpline));  /* Nick */
1548         strcpy(word2,OVgetword(5,0,tmpline));  /* K-line */
1549 #ifdef OGRE
1550         snprintf(tmpbuf,sizeof(tmpbuf),"[     %skline%s] added by %s%s%s for %s%s%s",
1551                 CmdsColors[COLOV].color2,Colors[COLOFF],
1552                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],
1553                 CmdsColors[COLOV].color1,word2,Colors[COLOFF]);
1554 #else
1555         snprintf(tmpbuf,sizeof(tmpbuf),"K-Line added by %s%s%s - %s",
1556                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],word2);
1557 #endif
1558     }
1559     else if (strstr(tmpline," added temporary ") && strstr(tmpline," min. K-Line for ")) {
1560 	strcpy(word1,OVgetword(0,1,tmpline));  /* who */
1561         strcpy(word2,OVgetword(0,4,tmpline));  /* time */
1562         strcpy(word4,OVgetword(0,8,tmpline));  /* k-line */
1563         OVnobrackets(word4,word3,sizeof(word3));
1564         strcpy(word4,OVgetword(9,0,tmpline));  /* reason */
1565 #ifdef OGRE
1566         snprintf(tmpbuf,sizeof(tmpbuf),"[     %skline%s] %s%s%sm added by %s%s%s for %s%s%s: %s%s%s",
1567                 CmdsColors[COLOV].color2,Colors[COLOFF],
1568                 CmdsColors[COLOV].color5,word2,Colors[COLOFF],
1569                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],
1570                 CmdsColors[COLOV].color1,word3,Colors[COLOFF],
1571                 CmdsColors[COLOV].color4,word4,Colors[COLOFF]);
1572 #else
1573         snprintf(tmpbuf,sizeof(tmpbuf),"%s%s%sm K-Line added by %s%s%s for %s%s%s: %s%s%s",
1574                 CmdsColors[COLOV].color5,word2,Colors[COLOFF],
1575                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],
1576                 CmdsColors[COLOV].color1,word3,Colors[COLOFF],
1577                 CmdsColors[COLOV].color4,word4,Colors[COLOFF]);
1578 #endif
1579     }
1580     else if (strstr(tmpline," added temporary ") && strstr(tmpline," min. D-Line for ")) {
1581 	strcpy(word1,OVgetword(0,1,tmpline));  /* who */
1582         strcpy(word2,OVgetword(0,4,tmpline));  /* time */
1583         strcpy(word4,OVgetword(0,8,tmpline));  /* d-line */
1584         OVnobrackets(word4,word3,sizeof(word3));
1585         strcpy(word4,OVgetword(9,0,tmpline));  /* reason */
1586 #ifdef OGRE
1587         snprintf(tmpbuf,sizeof(tmpbuf),"[     %sdline%s] %s%s%sm added by %s%s%s for %s%s%s: %s%s%s",
1588                 CmdsColors[COLOV].color2,Colors[COLOFF],
1589                 CmdsColors[COLOV].color5,word2,Colors[COLOFF],
1590                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],
1591                 CmdsColors[COLOV].color1,word3,Colors[COLOFF],
1592                 CmdsColors[COLOV].color4,word4,Colors[COLOFF]);
1593 #else
1594         snprintf(tmpbuf,sizeof(tmpbuf),"%s%s%sm D-Line added by %s%s%s for %s%s%s: %s%s%s",
1595                 CmdsColors[COLOV].color5,word2,Colors[COLOFF],
1596                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],
1597                 CmdsColors[COLOV].color1,word3,Colors[COLOFF],
1598                 CmdsColors[COLOV].color4,word4,Colors[COLOFF]);
1599 #endif
1600     }
1601     else if (strstr(tmpline," is requesting gline for ")) {
1602 	strcpy(word1,OVgetword(0,1,tmpline));  /* who */
1603         strcpy(word2,OVgetword(0,3,tmpline));  /* server */
1604         strcpy(word4,OVgetword(0,8,tmpline));  /* g-line */
1605         OVnobrackets(word4,word3,sizeof(word3));
1606         strcpy(word5,OVgetword(9,0,tmpline));  /* reason */
1607         OVnobrackets(word5,word4,sizeof(word4));
1608 #ifdef OGRE
1609         snprintf(tmpbuf,sizeof(tmpbuf),"[     %sgline%s] requested by %s%s%s %s%s%s for %s%s%s: %s%s%s",
1610                 CmdsColors[COLOV].color2,Colors[COLOFF],
1611                 CmdsColors[COLOV].color5,word1,Colors[COLOFF],
1612                 CmdsColors[COLOV].color1,word2,Colors[COLOFF],
1613                 CmdsColors[COLOV].color1,word3,Colors[COLOFF],
1614                 CmdsColors[COLOV].color4,word4,Colors[COLOFF]);
1615 #else
1616         snprintf(tmpbuf,sizeof(tmpbuf),"G-Line requested by %s%s%s %s%s%s for %s%s%s: %s%s%s",
1617                 CmdsColors[COLOV].color5,word1,Colors[COLOFF],
1618                 CmdsColors[COLOV].color1,word2,Colors[COLOFF],
1619                 CmdsColors[COLOV].color1,word3,Colors[COLOFF],
1620                 CmdsColors[COLOV].color4,word4,Colors[COLOFF]);
1621 #endif
1622     }
1623     else if (strstr(tmpline," has triggered gline for ")) {
1624 	strcpy(word1,OVgetword(0,1,tmpline));  /* who */
1625         strcpy(word2,OVgetword(0,3,tmpline));  /* server */
1626         strcpy(word4,OVgetword(0,8,tmpline));  /* g-line */
1627         OVnobrackets(word4,word3,sizeof(word3));
1628         strcpy(word5,OVgetword(9,0,tmpline));  /* reason */
1629         OVnobrackets(word5,word4,sizeof(word4));
1630 #ifdef OGRE
1631         snprintf(tmpbuf,sizeof(tmpbuf),"[     %sgline%s] triggered by %s%s%s %s%s%s for %s%s%s: %s%s%s",
1632                 CmdsColors[COLOV].color2,Colors[COLOFF],
1633                 CmdsColors[COLOV].color5,word1,Colors[COLOFF],
1634                 CmdsColors[COLOV].color1,word2,Colors[COLOFF],
1635                 CmdsColors[COLOV].color1,word3,Colors[COLOFF],
1636                 CmdsColors[COLOV].color4,word4,Colors[COLOFF]);
1637 #else
1638         snprintf(tmpbuf,sizeof(tmpbuf),"G-Line requested by %s%s%s %s%s%s for %s%s%s: %s%s%s",
1639                 CmdsColors[COLOV].color5,word1,Colors[COLOFF],
1640                 CmdsColors[COLOV].color1,word2,Colors[COLOFF],
1641                 CmdsColors[COLOV].color1,word3,Colors[COLOFF],
1642                 CmdsColors[COLOV].color4,word4,Colors[COLOFF]);
1643 #endif
1644     }
1645     else if (strstr(tmpline," is rehashing server config file")) {
1646 	strcpy(word1,OVgetword(0,1,tmpline));  /* who */
1647 	strcpy(word2,word1);
1648         tmp=index(word1,'!');
1649         if (tmp) *tmp++='\0';
1650         tmp=index(word2,'{');
1651         if (tmp) *tmp++='\0';
1652 #ifdef OGRE
1653         snprintf(tmpbuf,sizeof(tmpbuf),"[    %srehash%s] by %s%s%s %s",
1654                 CmdsColors[COLOV].color2,Colors[COLOFF],
1655                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
1656 #else
1657         snprintf(tmpbuf,sizeof(tmpbuf),"%s%s%s %s is rehashing the server config file",
1658                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
1659 #endif
1660     }
1661     else if (strstr(tmpline," is attempting to join locally juped channel ")) {
1662 	strcpy(word1,OVgetword(0,2,tmpline));  /* nick */
1663 	strcpy(word2,OVgetword(0,3,tmpline));  /* user@host */
1664 	strcpy(word3,OVgetword(0,11,tmpline)); /* user@host */
1665 #ifdef OGRE
1666         snprintf(tmpbuf,sizeof(tmpbuf),"[    %sclient%s] %s%s%s %s attempting to join locally juped channel %s%s%s",
1667                 CmdsColors[COLOV].color2,Colors[COLOFF],
1668                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2),
1669                 CmdsColors[COLOV].color4,word3,Colors[COLOFF]);
1670 #else
1671         snprintf(tmpbuf,sizeof(tmpbuf),"%s%s%s %s is attempting to join locally juped channel %s%s%s",
1672                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2),
1673                 CmdsColors[COLOV].color4,word3,Colors[COLOFF]);
1674 #endif
1675     }
1676     else if (strstr(tmpline," added X-Line for ")) {
1677     //strcpy(tmpbuf,"markisp!mark@fibonacci.sequence{markalso} added X-Line for [*RiShuBot*] [drones]");
1678 	strcpy(word1,OVgetword(0,1,tmpline));  /* nick */
1679 	strcpy(word2,word1);
1680         tmp=index(word1,'!');
1681         if (tmp) *tmp++='\0';
1682         tmp=index(word2,'{');
1683         if (tmp) *tmp++='\0';
1684 	strcpy(word3,OVgetword(0,5,tmpline));  /* target */
1685 	strcpy(word4,OVgetword(0,6,tmpline));  /* reason */
1686 #ifdef OGRE
1687         snprintf(tmpbuf,sizeof(tmpbuf),"[     %sxline%s] added by %s%s%s %s for %s%s%s: %s",
1688                 CmdsColors[COLOV].color2,Colors[COLOFF],
1689                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2),
1690                 CmdsColors[COLOV].color4,word3,Colors[COLOFF],word4);
1691 #else
1692         snprintf(tmpbuf,sizeof(tmpbuf),"X-Line added by %s%s%s %s for %s%s%s: %s",
1693                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2),
1694                 CmdsColors[COLOV].color4,word3,Colors[COLOFF],word4);
1695 #endif
1696     }
1697     else if (strstr(tmpline," already K-Lined by ")) {
1698         char *tmp1=word1;
1699         char *tmp2=word2;
1700 
1701 	strcpy(word1,OVgetword(0,1,tmpline));  /* who */
1702         if (*tmp1=='[') tmp1++;
1703         if (strlen(word1)>0 && word1[strlen(word1)-1]==']')
1704             word1[strlen(word1)-1]='\0';
1705 	strcpy(word2,OVgetword(0,5,tmpline));  /* pattern */
1706         if (*tmp2=='[') tmp2++;
1707         if (strlen(word2)>0 && word1[strlen(word2)-1]==']')
1708             word1[strlen(word2)-1]='\0';
1709 	strcpy(word3,OVgetword(7,0,tmpline));  /* reason */
1710 #ifdef OGRE
1711         snprintf(tmpbuf,sizeof(tmpbuf),"[     %skline%s] %s%s%s already klined by %s%s%s: %s%s%s",
1712                 CmdsColors[COLOV].color2,Colors[COLOFF],
1713                 CmdsColors[COLOV].color5,tmp1,Colors[COLOFF],
1714                 CmdsColors[COLOV].color5,tmp2,Colors[COLOFF],
1715                 CmdsColors[COLOV].color4,word3,Colors[COLOFF]);
1716 #else
1717         snprintf(tmpbuf,sizeof(tmpbuf),"%s%s%s already klined by %s%s%s: %s%s%s",
1718                 CmdsColors[COLOV].color5,tmp1,Colors[COLOFF],
1719                 CmdsColors[COLOV].color5,tmp2,Colors[COLOFF],
1720                 CmdsColors[COLOV].color4,word4,Colors[COLOFF]);
1721 #endif
1722     }
1723     else if (strstr(tmpline," has removed the K-Line for: ")) {
1724         char *tmp1=word3;
1725 
1726 	strcpy(word1,OVgetword(0,1,tmpline));  /* who */
1727 	strcpy(word2,word1);
1728         tmp=index(word1,'!');
1729         if (tmp) *tmp++='\0';
1730         tmp=index(word2,'{');
1731         if (tmp) *tmp++='\0';
1732 	strcpy(word3,OVgetword(0,7,tmpline));  /* pattern */
1733         if (*tmp1=='[') tmp1++;
1734         if (strlen(word3)>0 && word3[strlen(word3)-1]==']')
1735             word3[strlen(word3)-1]='\0';
1736 #ifdef OGRE
1737         snprintf(tmpbuf,sizeof(tmpbuf),"[     %skline%s] %s%s%s removed by %s%s%s %s",
1738                 CmdsColors[COLOV].color2,Colors[COLOFF],
1739                 CmdsColors[COLOV].color4,tmp1,Colors[COLOFF],
1740                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
1741 #else
1742         snprintf(tmpbuf,sizeof(tmpbuf),"%s%s%s kline removed by %s%s%s %s",
1743                 CmdsColors[COLOV].color4,tmp1,Colors[COLOFF],
1744                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
1745 #endif
1746     }
1747     else if (strstr(tmpline," has removed the temporary K-Line for: ")) {
1748         char *tmp1=word3;
1749 
1750 	strcpy(word1,OVgetword(0,1,tmpline));  /* who */
1751 	strcpy(word2,word1);
1752         tmp=index(word1,'!');
1753         if (tmp) *tmp++='\0';
1754         tmp=index(word2,'{');
1755         if (tmp) *tmp++='\0';
1756 	strcpy(word3,OVgetword(0,8,tmpline));  /* pattern */
1757         if (*tmp1=='[') tmp1++;
1758         if (strlen(word3)>0 && word3[strlen(word3)-1]==']')
1759             word3[strlen(word3)-1]='\0';
1760 #ifdef OGRE
1761         snprintf(tmpbuf,sizeof(tmpbuf),"[     %skline%s] temporary %s%s%s removed by %s%s%s %s",
1762                 CmdsColors[COLOV].color2,Colors[COLOFF],
1763                 CmdsColors[COLOV].color4,tmp1,Colors[COLOFF],
1764                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
1765 #else
1766         snprintf(tmpbuf,sizeof(tmpbuf),"Temporary %s%s%s kline removed by %s%s%s %s",
1767                 CmdsColors[COLOV].color4,tmp1,Colors[COLOFF],
1768                 CmdsColors[COLOV].color1,word1,Colors[COLOFF],OVuh(word2));
1769 #endif
1770     }
1771 havefrom:
1772     servername=server_list[from_server].itsname;
1773     if (!servername) servername=server_list[from_server].name;
1774     if (OVTS) curtime=update_clock(0,0,GET_TIME);
1775     else curtime=TimeStamp(2);
1776     if (from) {
1777         tmp=index(tmpline,'-');
1778         if (!tmp) tmp=tmpline;
1779         else if (*(tmp+1)==' ') tmp+=2;
1780 #ifdef OGRE
1781         if (!strncmp(tmpline,"LOCOPS -",8)) strcpy(word2,"locopermsg");
1782         else strcpy(word2,"   opermsg");
1783 #else
1784         if (!strncmp(tmpline,"LOCOPS -",8)) strcpy(word2,"Locopermsg");
1785         else strcpy(word2,"Opermsg");
1786 #endif
1787         if (OVTS) {
1788 #ifdef OGRE
1789             snprintf(word1,sizeof(word1),"[%s%s%s] %s%s%s: %s",
1790                     CmdsColors[COLOV].color5,word2,Colors[COLOFF],
1791                     CmdsColors[COLOV].color1,from,Colors[COLOFF],
1792                     tmpline);
1793             put_it("[%s%s%s%s%s%s%s] %s",
1794                     CmdsColors[COLOV].color1,curtime,Colors[COLOFF],
1795                     OVTS?"|":empty_string,
1796                     CmdsColors[COLOV].color6,OVsvdmn(servername),Colors[COLOFF],
1797                     word1);
1798 #else  /* OGRE */
1799             put_it("[%s%s%s%s%s%s%s] %s from %s%s%s: %s",
1800                     CmdsColors[COLOV].color1,curtime,Colors[COLOFF],
1801                     OVTS?"|":empty_string,
1802                     CmdsColors[COLOV].color6,OVsvdmn(servername),Colors[COLOFF],
1803                     word2,CmdsColors[COLOV].color1,from,Colors[COLOFF],tmp);
1804 #endif /* OGRE */
1805         }
1806         else {
1807 #ifdef OGRE
1808             snprintf(word1,sizeof(word1),"[%s%s%s] %s%s%s: %s",
1809                     CmdsColors[COLOV].color5,word2,Colors[COLOFF],
1810                     CmdsColors[COLOV].color1,from,Colors[COLOFF],
1811                     tmp);
1812             put_it("%s[%s%s%s] %s",
1813                     curtime,
1814                     CmdsColors[COLOV].color6,OVsvdmn(servername),Colors[COLOFF],
1815                     word1);
1816 #else  /* OGRE */
1817             put_it("%s[%s%s%s] %s from %s%s%s: %s",
1818                     curtime,
1819                     CmdsColors[COLOV].color6,OVsvdmn(servername),Colors[COLOFF],
1820                     word2,CmdsColors[COLOV].color1,from,Colors[COLOFF],tmp);
1821 #endif /* OGRE */
1822         }
1823     }
1824     else {
1825         if (OVTS)
1826             put_it("[%s%s%s%s%s%s%s] %s",
1827                     CmdsColors[COLOV].color1,curtime,Colors[COLOFF],
1828                     OVTS?"|":empty_string,
1829                     CmdsColors[COLOV].color6,OVsvdmn(servername),Colors[COLOFF],tmpbuf);
1830         else
1831             put_it("%s[%s%s%s] %s",
1832                     curtime,
1833                     CmdsColors[COLOV].color6,OVsvdmn(servername),Colors[COLOFF],tmpbuf);
1834     }
1835 #ifdef MULTI_SERVER_OV
1836     to_window=oldwin;
1837 #endif
1838 }
1839 
OperVisionReinit(void)1840 void OperVisionReinit(void) {
1841     int ovwinref;
1842     int curwinref;
1843     unsigned int display;
1844     char tmpbuf[mybufsize/4+1];
1845     Window *ovwin;
1846 
1847     /* turn on additional user modes */
1848     CreateMode(tmpbuf,mybufsize/4);
1849     send_to_server("MODE %s :+%s",get_server_nickname(from_server),tmpbuf);
1850     curwinref=curr_scr_win->refnum;
1851     ovwin=get_window_by_name("OV");
1852     /* if we can't locate OperV window silently ignore */
1853     if (!ovwin) return;
1854     ovwinref=ovwin->refnum;
1855     snprintf(tmpbuf,sizeof(tmpbuf),"REFNUM %d LEVEL OPNOTE,SNOTE,WALLOP REFNUM %d",
1856             ovwinref,curwinref);
1857     display=window_display;
1858     window_display=0;
1859     windowcmd(NULL,tmpbuf,NULL);
1860     window_display=display;
1861 }
1862 #endif
1863