/* AmSeen v2.7 ©2001 Michael Trebilcock $VER: AmSeen.amirx 2.7 (7.10.01) AmSeen v2.7 ©2001 Michael Trebilcock */ Options Results Signal On Syntax Signal On Halt Signal On Break_C Parse Arg Channel IF Right(Upper(Channel),5)="FORCE" THEN Call SetClip("SeenRun","0") IF Right(Upper(Channel),5)="CHECK" THEN CheckExp="1" Channel=Word(Channel,1) IF Upper(Channel)="FORCE"|Upper(Channel)="CHECK" THEN Channel="" /* Configuration */ PrivOnly="0" /* Respond to private messages only? 1 = Yes, 0 = No */ DelOld="1" /* Automatically remove nicks last seen 30+ days ago? (If you run with the CHECK argument) */ NLength="9" /* Maximum allowed characters in a nickname. (Stupidity kick setting) */ /* End Configuration */ IF GetClip("SeenRun")="1" THEN DO;Call cEcho("AmSeen is already running..");Exit;End Call SetClip("SeenRun","1") IF ~Exists("Seen.db") THEN DO IF ~Open(File,"Seen.db","W") THEN DO;Call cEcho("Unable to open Seen.db");Exit;End Call WriteLn(File,"AmSeen database file, do not modify..") Call WriteLn(File," ") Call Close(File) End i="0" IF ~Open(File,"Seen.db","R") THEN DO;Call cEcho("Unable to open Seen.db");Exit;End IF CheckExp="1" THEN Call cEcho("Checking Seen.db for expired nicks...") Call cEcho("Loading database into memory...") DO UNTIL EOF(File) Del="0" Output=ReadLn(File) IF Length(Output)>0 THEN DO Seen.i=Output;SNick=Upper(Word(Output,1));Info=Seen.i Call PCode();Seen.SNick=Output IF CheckExp="1"&i>1 THEN DO Date=Date(B);DAgo=Date-Day IF DAgo>29 THEN DO;Call cEcho(Nick2" has expired..");IF DelOld="1" THEN Del="1";End ELSE IF DAgo<0 THEN Call cEcho(Nick2" was last seen in the future?") End End IF Del="0" THEN i=i+1 End Call Close(File) Call cEcho("AmSeen is now active") IF Channel~="" THEN Call cEcho("Now monitoring channel "Channel) Call cEcho("Message yourself with ASQuit to quit AmSeen..") FStart="1" Call Time(R) DO FOREVER drop prefix drop comm drop dest drop rest "GETLINE" prefix=line.prefix comm=line.command dest=line.dest rest=line.rest Parse Var Rest KNick":"Rest Parse Var Prefix Nick"!"User"@"Host SNick=Upper(Nick) IF Left(dest,1)=":" THEN dest=SubStr(dest,2) "GETMYNICK";MNick=Result IF Change="1"|FStart="1" THEN Call GUsers() Date=Date(B) Time=Time(S) IF Time(E)>179&Change="1" THEN DO Call Delete("T:Seen.db") i="0" IF ~Open(File,"T:Seen.db","W") THEN DO;Call cEcho("Unable to open T:Seen.db");Call ASQuit();End DO UNTIL Seen.i="SEEN."i Call WriteLn(File,Seen.i) i=i+1 End Call Close(File) IF Seen.i="SEEN."i THEN ADDRESS COMMAND "C:Copy T:Seen.db TO Seen.db" Call Time(R) Change="0" End SELECT WHEN Comm="PRIVMSG"&Left(Upper(Rest),5)="!SEEN" THEN DO Priv="0";IF Upper(Dest)=Upper(MNick) THEN DO;Dest=Nick;Priv="1";End IF Channel~=""&Upper(Dest)~=Upper(Channel)&Priv="0"|PrivOnly="1"&Dest~=Nick THEN NOP ELSE Call Seen() End WHEN Comm="PRIVMSG"&Upper(Nick)=Upper(MNick)&Upper(Rest)="ASQUIT" THEN Call ASQuit() WHEN Comm="JOIN"|Comm="PART" THEN DO IF Channel~=""&Upper(Dest)~=Upper(Channel) THEN NOP ELSE Call JoinPart() End WHEN Comm="KICK" THEN DO IF Channel~=""&Upper(Dest)~=Upper(Channel) THEN NOP ELSE Call Kick() End WHEN Comm="NICK"|Comm="QUIT" THEN Call NickQuit() OTHERWISE NOP End End Seen: Nik=Word(Rest,2) SNick=Upper(Nik) SELECT WHEN Length(Nik)>NLength THEN DO;"SAY /kick "Dest Nick" Stupidity detected..";Return 0;End WHEN Pos("**",Nik)>0 THEN DO;"SAY /msg "Dest Nick": One * is equivalent to many *'s";Return 0;End WHEN Nik="" THEN DO;"SAY /msg "Dest Nick": Give me a nickname to look up!";Return 0;End WHEN Upper(Nik)=Upper(MNick) THEN DO;"SAY /msg "Dest Nick": Sorry, i haven't seen myself lately..";Return 0;End WHEN Upper(Nik)=Upper(Nick) THEN DO;"SAY /msg "Dest Nick": Looking for yourself? ure an idiot";Return 0;End WHEN Find(Upper(Users),Upper(Nik))>0 THEN DO;"SAY /msg "Dest Nick": "Nik" is already in this channel!";Return 0;End OTHERWISE NOP End i="2" i2="0" Found="0" Info2="" DO UNTIL Seen.i="SEEN."i|Found>1 IF Pos("*",Nik)>0 THEN DO "MATCHUSERHOST" Upper(Word(Seen.i,1))"!*@*" Upper(Nik)"!*@*" IF RC="1" THEN DO Info=Seen.i;Info2=Info2""Word(Seen.i,1) "";Found="1";i2=i2+1 IF i2>15 THEN Found="2" End End ELSE DO IF Words(Seen.SNick)>1 THEN DO;Info=Seen.SNick;Found="2";End ELSE Found="3" End i=i+1 End IF Found="0"|Found="3" THEN DO IF Pos("*",Nik)~="0" THEN DO "SAY /msg "Dest Nick": No matches were found.." Return 0 End "SAY /msg "Dest Nick": Sorry, i haven't seen "Nik Return 0 End IF Words(Info2)>1 THEN DO IF Words(Info2)>15 THEN "SAY /msg "Dest Nick": Found over 15 matches, try using less wildcards" ELSE "SAY /msg "Dest Nick": Found multiple matches, please select one of the following nicks: "Info2 Return 0 End Call PCode() UHost=Compress(Translate(UHost,,"~")) drop Result i="0" DO UNTIL i=Amount "GETUSER "i" Channel="Dest TheUser=Result "USERHOST" TheUser TheHost=Result IF Upper(TheHost)=Upper(UHost) THEN DO;"SAY /msg "Dest Nick": "Nick2" is "TheUser" and "TheUser" is on the channel right now!";Return 0;End i=i+1 End DaysAgo=Date-Day TimeAgo=Time-Time2 Days="0" Hours="0" Minutes="0" Seconds="0" IF DaysAgo>0 THEN DO TimeAgo=TimeAgo+86400*DaysAgo Calc=TimeAgo/86400 Parse Var Calc Days"."Calc2 IF Calc2="" THEN Call Continue() Calc3="0."Calc2 Calc4=Calc3*86400 End IF DaysAgo="0" THEN Calc4=TimeAgo Calc5=Calc4/3600 Parse Var Calc5 Hours"."Calc6 IF Calc6="" THEN Call Continue() Calc7="0."Calc6 Calc8=Calc7*60 Parse Var Calc8 Minutes"."Calc9 IF Calc9="" THEN Call Continue() Calc10="0."Calc9 Calc11=Calc10*60 Parse Var Calc11 Seconds"."Blank Continue: SELECT WHEN Act="JOIN" THEN "SAY /msg "Dest Nick": I last saw "Nick2" joining "Chan Days" days, "Hours" hours, "Minutes" minutes, "Seconds" seconds ago.." WHEN Act="PART" THEN "SAY /msg "Dest Nick": I last saw "Nick2" leaving "Chan Days" days, "Hours" hours, "Minutes" minutes, "Seconds" seconds ago.." WHEN Act="KICK" THEN "SAY /msg "Dest Nick": I last saw "Nick2" getting kicked from "Chan Days" days, "Hours" hours, "Minutes" minutes, "Seconds" seconds ago.. Kick reason ("Reason")" WHEN Act="QUIT" THEN "SAY /msg "Dest Nick": I last saw "Nick2" quitting the server "Days" days, "Hours" hours, "Minutes" minutes, "Seconds" seconds ago.. Quit reason ("Reason")" WHEN Act="NICK" THEN "SAY /msg "Dest Nick": I last saw "Nick2" changing his/her nickname to "TNick Days" days, "Hours" hours, "Minutes" minutes, "Seconds" seconds ago.." OTHERWISE NOP End Return 0 JoinPart: i="0" DO UNTIL Seen.i="SEEN."i|Upper(Word(Seen.i,1))=Upper(Nick) i=i+1 End Seen.i=Nick Comm User"@"Host Dest Date Time Seen.SNick=Nick Comm User"@"Host Dest Date Time Change="1" Return 0 Kick: i="0" KNick=Left(KNick,Length(KNick)-1) SNick=Upper(KNick) "USERHOST" KNick UserHost=Result Parse Var UserHost User"@"Host DO UNTIL Seen.i="SEEN."i|Upper(Word(Seen.i,1))=Upper(KNick) i=i+1 End Seen.i=KNick Comm User"@"Host Dest Date Time Rest Seen.SNick=KNick Comm User"@"Host Dest Date Time Rest Change="1" Return 0 NickQuit: i="0" DO UNTIL Seen.i="SEEN."i|Upper(Word(Seen.i,1))=Upper(Nick) i=i+1 End Seen.i=Nick Comm User"@"Host Date Time Dest Seen.SNick=Nick Comm User"@"Host Date Time Dest Change="1" Return 0 cEcho: "ECHO P="d2c(27)"b«AmSeen» TEXT="Arg(1) Return 0 Syntax: "ECHO P="d2c(27)"b«Syntax» Command on line" SIGL "returned" RC ":" errortext(rc) sourceline(SIGL) Call SetClip("SeenRun","0") Call MemRemove() Exit Break_C: Halt: Call ASQuit() Exit MemRemove: i="0" DO UNTIL Seen.i="SEEN."i SNick=Upper(Word(Seen.i,1)) drop Seen.i drop Seen.SNick i=i+1 End Return 0 ASQuit: Call SetClip("SeenRun","0") Call MemRemove() Call cEcho("AmSeen has quit..") Exit GUsers: "GETUSERS Channel="Dest Users=Result Users=Translate(Users,,"+@%") Amount=Words(Users) FStart="0" Return 0 PCode: Parse Var Info Nick2" "Act" "UHost" "Chan" "Day" "Time2 IF Word(Info,2)="KICK" THEN Parse Var Info Nick2" "Act" "UHost" "Chan" "Day" "Time2" "Reason IF Word(Info,2)="QUIT" THEN Parse Var Info Nick2" "Act" "UHost" "Day" "Time2" "Reason IF Word(Info,2)="NICK" THEN Parse Var Info Nick2" "Act" "UHost" "Day" "Time2" "TNick Return 0