home *** CD-ROM | disk | FTP | other *** search
/ Enigma Amiga Life 109 / EnigmaAmiga109CD.iso / software / on-line / ctcp-master / ctcp-master.amirx < prev    next >
Text File  |  1999-12-13  |  88KB  |  1,959 lines

  1. /* CTCP Master v1.12
  2.  *
  3.  * Monitors AmIRC incoming messages and acts on CTCP messages and DCC
  4.  * requests.  Supports custom commands on channel or by /MSG.
  5.  *
  6.  */
  7.  
  8. Options Results
  9. Signal On Error
  10. Signal On Syntax
  11. Signal On Halt
  12.  
  13. If ~show(L,"rexxsupport.library") then Do
  14.   If ~addlib("rexxsupport.library",0,-30,0) then Do
  15.     'Echo Could not access the rexxsupport.library!'
  16.     Exit 20
  17.   End
  18. End
  19. If ~show(L,"rexxreqtools.library") then Do
  20.   If ~addlib("rexxreqtools.library",0,-30,0) then Do
  21.     'Echo Could not access the rexxreqtools.library!'
  22.     Exit 20
  23.   End
  24. End
  25. If ~show(L,"rexxarplib.library") then Do
  26.   If ~addlib("rexxarplib.library",0,-30,0) then Do
  27.     'Echo Could not access the rexxarplib.library!'
  28.     Exit 20
  29.   End
  30. End
  31.  
  32. Address Value Address()
  33. PortNumber = Right(Address(),2)
  34. If Show("P","CTCP-MASTER"||PortNumber) = 1 then Exit
  35. 'ECHO P='d2c(27)'b«CTCPMaster» Starting...'
  36. MyPort = OpenPort("CTCP-MASTER"||PortNumber)
  37.  
  38. If Exists("AmIRC:Rexx/CTCP-Master.CFG") then Do
  39.   Call Open(In,"AmIRC:Rexx/CTCP-Master.CFG","R")
  40.   Do Until EOF(In)
  41.     CfgLine = ReadLn(In)
  42.     Interpret CfgLine
  43.   End
  44.   Call Close(In)
  45. End
  46. Else Do
  47.   'Echo P='d2c(27)'b«CTCPMaster» Unable to load config file'
  48.   Signal Error
  49. End
  50.  
  51. LastHost. = "unknown@some.domain"
  52. LastReason. = "Leaving IRC"
  53.  
  54. Call ReadOPs
  55.  
  56. NumFAQ = 0
  57. If Exists("AmIRC:Rexx/CTCP-FAQ") then Do
  58.   Call Open("FAQ","AmIRC:Rexx/CTCP-FAQ","R")
  59.     Do Until EOF("FAQ")
  60.       NumFAQ = NumFAQ + 1
  61.       FAQName.NumFAQ = ReadLn("FAQ")
  62.       FAQText.NumFAQ = ReadLn("FAQ")
  63.     End
  64.   Call Close("FAQ")
  65.   NumFAQ = NumFAQ - 1
  66.   'ECHO P='d2c(27)'b«CTCPMaster» Loaded 'NumFAQ' FAQs...'
  67. End
  68.  
  69. NumQuits = 0
  70. If Exists("AmIRC:Rexx/CTCP-QuitMsgs") then Do
  71.   Call Open("QM","AmIRC:Rexx/CTCP-QuitMsgs","R")
  72.     Do Until EOF("QM")
  73.       NumQuits = NumQuits + 1
  74.       QuitText.NumQuits = ReadLn("QM")
  75.     End
  76.   Call Close("QM")
  77.   NumQuits = NumQuits - 1
  78.   If NumQuits = 0 then Do
  79.     NumQuits = 1
  80.     QuitText.1 = "Bye!"
  81.   End
  82.   'ECHO P='d2c(27)'b«CTCPMaster» Loaded 'NumQuits' Quit Messages...'
  83. End
  84.  
  85. NumPops = 0
  86. If Exists("AmIRC:Rexx/CTCP-Popups") then Do
  87.   Call Open("QM","AmIRC:Rexx/CTCP-Popups","R")
  88.     Do Until EOF("QM")
  89.       NumPops = NumPops + 1
  90.       txt = ReadLn("QM")
  91.       If Length(txt) > 1 then Do
  92.         PopKey.NumPops = Word(txt,1)
  93.         PopText.NumPops = Subword(txt,2)
  94.       End
  95.     End
  96.   Call Close("QM")
  97.   NumPops = NumPops - 1
  98.   'ECHO P='d2c(27)'b«CTCPMaster» Loaded 'NumPops' Popup Triggers...'
  99. End
  100.  
  101. NumPings = 0
  102. If Exists("AmIRC:Rexx/CTCP-Pings") then Do
  103.   Call Open("Ping","AmIRC:Rexx/CTCP-Pings","R")
  104.     Do Until EOF("Ping")
  105.       NumPings = NumPings + 1
  106.       PingPhrase.NumPings = ReadLn("Ping")
  107.     End
  108.   Call Close("Ping")
  109.   NumPings = NumPings - 1
  110.   If NumPings = 0 then Do
  111.     NumPings = 1
  112.     PingPhrase.1 = "PONG!"
  113.   End
  114.   'ECHO P='d2c(27)'b«CTCPMaster» Loaded 'NumPings' PING Responses...'
  115.   NextPing = 1
  116. End
  117.  
  118. NumUsers = 0
  119. GetServerName ; Server = Result
  120. Server = Translate(Server,' ','.')
  121. Server = SubWord(Server,Words(Server)-1)
  122. Server = Translate(Server,'.',' ')
  123. 'ECHO P='d2c(27)'b«CTCPMaster» Connected on server 'Server', now looking for QuitLog.'
  124. If Exists("AmIRC:Rexx/CTCP-QuitLog."||Server) then Do
  125.   NumUsers = 1
  126.   Call Open("QuitLog","AmIRC:Rexx/CTCP-QuitLog."||Server,"R")
  127.     Do Until EOF("QuitLog")
  128.       Line = ReadLn("QuitLog")
  129.       If Length(Line) = 0 then Leave
  130.       UserNick.NumUsers.0 = Word(Line,1)
  131.       Temp = UserNick.NumUsers.0
  132.       Do ILoop = 1 to Temp
  133.         UserNick.NumUsers.ILoop = Word(Line,ILoop+1)
  134.       End
  135.       UserChan.NumUsers = Word(Line,Temp + 2)
  136.       UserQuit.NumUsers = Word(Line,Temp + 3)||" "||Word(Line,Temp + 4)
  137.       If Words(Line) > Temp + 4 then Do
  138.         LastHost.NumUsers = Word(Line,Temp + 5)
  139.         LastReason.NumUsers = SubWord(Line,Temp + 6)
  140.       End
  141.       NumUsers = NumUsers + 1
  142.     End
  143.   Call Close("QuitLog")
  144.   NumUsers = NumUsers - 1
  145.   'ECHO P='d2c(27)'b«CTCPMaster» Loaded 'NumUsers' Users...'
  146. End
  147. Call RateList
  148.  
  149. LastLine = ""
  150. CRNL = "0d0a"x
  151.  
  152. MainLoop:
  153. GetMyNick ; MyNick = Result
  154. GetLine
  155. If Line = LastLine then Signal MainLoop
  156. NickAddress = Word(Line,1)
  157. Parse Var NickAddress ':'Nick'!'HA
  158. LastHost.0 = HA
  159. HA = Upper(HA)
  160. Type = Upper(Word(Line,2))
  161. ToWho = Word(Line,3)
  162. Rest = Subword(Line,4)
  163. Parse Var Rest ':'Rest
  164. If (Type = "JOIN") & (NumOps > 0) & (Upper(Nick) ~= Upper(MyNick)) then Do
  165.   GetUsers
  166.   ThePeeps = Result
  167.   HaveOPs = 0
  168.   If Find(ThePeeps,'@'MyNick) = 0 then Signal MainLoop
  169.   Rest = Upper(SubStr(ToWho,2))
  170.   Call GetMask
  171.   Do OpLoop = 1 to NumOps
  172.     If (HA = OpHost.OpLoop) & (Rest = Upper(OpChannel.OpLoop)) then Do
  173.       'ECHO P='d2c(27)'b«CTCPMaster» Detected 'Nick' ('HA'), attempting to Auto-OP'
  174.       'SAY /OP 'OpChannel.OpLoop' 'Nick
  175.     End
  176.   End
  177. End
  178. If (Type = "PRIVMSG") & (Upper(Nick) = Upper(MyNick)) & (LastLine ~= "") then Do
  179.   If Upper(Word(Rest,1)) = "#HELP" then Do
  180.     'ECHO P='d2c(27)'b«CTCPMaster» Available Commands...'
  181.     'ECHO P='d2c(27)'b«CTCPMaster» #STOP  #QUIT  #SOUND  #AWAY  #OPS  #SHOWOPS  #FAQKILL  #FAQADD  #FAQREAD'
  182.     'ECHO P='d2c(27)'b«CTCPMaster» /CTCP Commands: PING  SOUND  USERINFO'
  183.     'ECHO P='d2c(27)'b«CTCPMaster» '||Trigger||' Commands:'
  184.     'ECHO P='d2c(27)'b«CTCPMaster» '||Trigger||'CALC          '||Trigger||'CONVERT       '||Trigger||'COUNTRY       '
  185.     'ECHO P='d2c(27)'b«CTCPMaster» '||Trigger||'CURRENCY      '||Trigger||'DNS           '||Trigger||'EXCHANGE      '
  186.     'ECHO P='d2c(27)'b«CTCPMaster» '||Trigger||'FAQ           '||Trigger||'FAQADD        '||Trigger||'FIND          '
  187.     'ECHO P='d2c(27)'b«CTCPMaster» '||Trigger||'HOROSCOPE     '||Trigger||'LAST          '||Trigger||'MONTH         '
  188.     'ECHO P='d2c(27)'b«CTCPMaster» '||Trigger||'PAGE          '||Trigger||'SEEN          '||Trigger||'SHOWCOMMANDS  '
  189.     'ECHO P='d2c(27)'b«CTCPMaster» '||Trigger||'STOCK         '||Trigger||'TEMP          '||Trigger||'TIME          '
  190.     'ECHO P='d2c(27)'b«CTCPMaster» '||Trigger||'TRANSLATE     '||Trigger||'WEATHER       '||Trigger||'WHERE         '
  191.     'ECHO P='d2c(27)'b«CTCPMaster» '||Trigger||'ZIP           '
  192.   End
  193.   If Upper(Word(Rest,1)) = "#STOP" then Do
  194.     'ECHO P='d2c(27)'b«CTCPMaster» Exiting...'
  195.     Call ClosePort("CTCP-MASTER")
  196.     Exit
  197.   End
  198.   If Upper(Word(Rest,1)) = "#QUIT" then Do
  199.     PickQuit = Random(1,NumQuits,Time(S))
  200.     'SAY /QUIT 'QuitText.PickQuit
  201.     Call ClosePort("CTCP-MASTER")
  202.     Exit
  203.   End
  204.   If Upper(Word(Rest,1)) = "#SOUND" then Do
  205.     GetChannel ; ToWhom = Result
  206.     ToWhom = RtGetString(ToWhom,"   CTCP Sound UserName   ","CTCP-Master.Amirx © 1997 Digital Euphoria","_OK|_Cancel","rt_pubscrname='"PubScreen"'",Option)
  207.     If Option = 0 then Signal MainLoop
  208.     SoundFile = RtFilerequest(SoundDir, SoundFile,"CTCP-Master.Amirx © 1997 Digital Euphoria","_Send|_Cancel","rt_pubscrname='"PubScreen"'",Option)
  209.     SoundFile = Translate(Soundfile,"  ",":/")
  210.     SoundFile = Word(SoundFile,Words(SoundFile))
  211.     If Option = 0 then Signal MainLoop
  212.     If Option = 1 then 'Say /CTCP 'ToWhom' Sound 'SoundFile
  213.   End
  214.   If Upper(Word(Rest,1)) = "#AWAY" then Do
  215.     If Exists("Env:Away") then Do
  216.       Call Delete("Env:Away")
  217.       'SAY /ME is back.'
  218.     End
  219.     Else Do
  220.       Reason = SubWord(Rest,2)
  221.       Call Open(Away,"Env:Away","W")
  222.         Call WriteLn(Away,Reason)
  223.       Call Close(Away)
  224.       'SAY /ME is 'd2c(2)'AWAY'd2c(2)' - 'Reason' - !PAGE 'MyNick' {reason}'
  225.     End
  226.   End
  227.   If Upper(Word(Rest,1)) = "#OPS" then Do
  228.     If Words(Rest) = 3 then Do
  229.       FountIt = 0
  230.       Nickname = Word(Rest,2)
  231.       Chan = Word(Rest,3)
  232.       GetUsers ; UserList = Compress(Result,"@+")
  233.       Do ULoop = 1 to Words(UserList)
  234.         If Upper(NickName) = Upper(Word(UserList,ULoop)) then Do
  235.           NickName = Word(UserList,ULoop)
  236.           FoundIt = 1
  237.         End
  238.       End
  239.       If FoundIt = 1 then Do
  240.         UserHost Nickname ; HA = Result
  241.         Call GetMask
  242.         NumOps = NumOps + 1
  243.         OpHost.NumOps = HA
  244.         OpChannel.NumOps = Chan
  245.         OpNick.NumOps = NickName
  246.         Call WriteOps
  247.         'ECHO P='d2c(27)'b«CTCPMaster» Added 'OpNick.NumOps' ('OpHost.NumOps') to Auto-OP List...'
  248.       End
  249.     End
  250.     Else If Words(Rest) = 4 then Do
  251.       Kill = Word(Rest,2)
  252.       If Kill ~= "-" then Signal MainLoop
  253.       Nickname = Word(Rest,3)
  254.       Chan = Word(Rest,4)
  255.       Remove = 0
  256.       Do Loop = 1 to NumOps
  257.         If (Upper(Nickname) = Upper(OpNick.Loop)) & (Upper(Chan) = Upper(OpChannel.Loop)) then Remove = Loop
  258.       End
  259.       If Remove > 0 then Do
  260.         Do Loop = Remove to (NumOps - 1)
  261.           X = Loop + 1
  262.           OpHost.Loop = OpHost.X
  263.           OpChannel.NumOps = OpChannel.X
  264.           OpNick.NumOps = OpNick.X
  265.         End
  266.         NumOps = NumOps - 1
  267.         Call WriteOps
  268.         'ECHO P='d2c(27)'b«CTCPMaster» Removed 'Nickname' from Auto-OP List...'
  269.       End
  270.     End
  271.     Else Call ReadOPs
  272.   End
  273.   If Upper(Word(Rest,1)) = "#SHOWOPS" then Do
  274.     Do Loop = 1 to NumOps
  275.       'ECHO P='d2c(27)'b«CTCPMaster» Monitoring 'OpNick.Loop' ('OpHost.Loop') on Channel 'OpChannel.Loop'...'
  276.     End
  277.   End
  278.   If (Upper(Word(Rest,1)) = "#FAQKILL") & (NumFAQ > 0) then Do
  279.     FAQFound = 0 ; DelFAQ = 0
  280.     Do FAQLoop = 1 to NumFAQ
  281.       If Upper(Word(Rest,2)) = FAQName.FAQLoop then Do
  282.         FAQFound = 1
  283.         DelFAQ = FAQLoop
  284.       End
  285.     End
  286.     Do FAQLoop = DelFAQ to NumFAQ - 1
  287.       OldFAQ = FAQLoop + 1
  288.       FAQName.FAQLoop = FAQName.OldFAQ
  289.       FAQText.FAQLoop = FAQText.OldFAQ
  290.     End
  291.     NumFAQ = NumFAQ - 1
  292.     Call Open(FAQ,"AmIRC:Rexx/CTCP-FAQ","W")
  293.       Do FAQLoop = 1 to NumFAQ
  294.         Call WriteLn("FAQ",FAQName.FAQLoop)
  295.         Call WriteLn("FAQ",FAQText.FAQLoop)
  296.       End
  297.       'ECHO P='d2c(27)'b«CTCPMaster» FAQ 'd2c(2)||Upper(Word(Rest,2))||d2c(2)' has been removed from the database.'
  298.     Call Close("FAQ")
  299.   End
  300.   If Upper(Word(Rest,1)) = "#FAQADD" then Do
  301.     FAQFound = 0
  302.     If NumFAQ > 0 then Do
  303.       Do FAQLoop = 1 to NumFAQ
  304.         If Upper(Word(Rest,2)) = FAQName.FAQLoop then Do
  305.           FAQText.FAQLoop = SubWord(Rest,3)
  306.           FAQFound = 1
  307.         End
  308.       End
  309.     End
  310.     If FAQFound = 0 then Do
  311.       NumFAQ = NumFAQ + 1
  312.       FAQName.NumFAQ = Upper(Word(Rest,2))
  313.       FAQText.NumFAQ = SubWord(Rest,3)
  314.     End
  315.     Call Open(FAQ,"AmIRC:Rexx/CTCP-FAQ","W")
  316.       Do FAQLoop = 1 to NumFAQ
  317.         Call WriteLn("FAQ",FAQName.FAQLoop)
  318.         Call WriteLn("FAQ",FAQText.FAQLoop)
  319.       End
  320.       'ECHO P='d2c(27)'b«CTCPMaster» FAQ 'd2c(2)||Upper(Word(Rest,2))||d2c(2)' has been added to the database.'
  321.     Call Close("FAQ")
  322.   End
  323.   If Upper(Word(Rest,1)) = "#FAQREAD" then Do
  324.     NumFAQ = 0
  325.     If Exists("AmIRC:Rexx/CTCP-FAQ") then Do
  326.       Call Open("FAQ","AmIRC:Rexx/CTCP-FAQ","R")
  327.         Do Until EOF("FAQ")
  328.           NumFAQ = NumFAQ + 1
  329.           FAQName.NumFAQ = ReadLn("FAQ")
  330.           FAQText.NumFAQ = ReadLn("FAQ")
  331.         End
  332.       Call Close("FAQ")
  333.       NumFAQ = NumFAQ - 1
  334.       'ECHO P='d2c(27)'b«CTCPMaster» Loaded 'NumFAQ' FAQs...'
  335.     End
  336.   End
  337. End
  338. If (Type = "QUIT") | (Type = "PART") then Do
  339.   If Type = "PART" then Channel = ToWho
  340.   Else Channel = "IRC"
  341.   HA = LastHost.0 ; Call GetMask
  342.   Found = 0
  343.   If NumUsers > 0 then Do QuitLoop = 1 to NumUsers
  344.     If Upper(HA) = Upper(LastHost.QuitLoop) then Do
  345.       Found = 1
  346.       NFound = 0
  347.       Do ILoop = 1 to UserNick.QuitLoop.0
  348.         If Upper(UserNick.QuitLoop.ILoop) = Upper(Nick) then NFound = 1
  349.       End
  350.       If NFound = 0 then Do
  351.         UserNick.QuitLoop.0 = UserNick.QuitLoop.0 + 1
  352.         Blah = UserNick.QuitLoop.0
  353.         UserNick.QuitLoop.Blah = Nick
  354.       End
  355.       LastReason.QuitLoop = Strip(SubWord(Line,3),"L",":")
  356.       If (Words(LastReason.QuitLoop) = 2) & (Pos(".",Word(LastReason.QuitLoop,1)) > 0) & (Pos(".",Word(LastReason.QuitLoop,1)) > 0) then LastReason.QuitLoop = "NetSplit!"
  357.       If Type = "PART" then LastReason.QuitLoop = "Left the channel."
  358.       TempTime = Time("M")
  359.       TempDate = Date("I")
  360.       UserQuit.QuitLoop = TempTime||" "||TempDate
  361.       UserChan.QuitLoop = Channel
  362.       Leave QuitLoop
  363.     End
  364.     If Found = 0 then Do
  365.       Do NLoop = 1 to UserNick.QuitLoop.0
  366.         If Upper(Nick) = Upper(UserNick.QuitLoop.NLoop) then Do
  367.           Found = 1
  368.           LastReason.QuitLoop = Strip(SubWord(Line,3),"L",":")
  369.           If (Words(LastReason.QuitLoop) = 2) & (Pos(".",Word(LastReason.QuitLoop,1)) > 0) & (Pos(".",Word(LastReason.QuitLoop,1)) > 0) then LastReason.QuitLoop = "NetSplit!"
  370.           If Type = "PART" then LastReason.QuitLoop = "Left the channel."
  371.           TempTime = Time("M")
  372.           TempDate = Date("I")
  373.           LastHost.QuitLoop = HA
  374.           UserQuit.QuitLoop = TempTime||" "||TempDate
  375.           UserChan.QuitLoop = Channel
  376.           Leave QuitLoop
  377.         End
  378.       End
  379.     End
  380.   End
  381.   If Found = 0 then Do
  382.     NumUsers = NumUsers + 1
  383.     UserNick.NumUsers.0 = 1
  384.     UserNick.NumUsers.1 = Nick
  385.     LastHost.NumUsers = HA
  386.     LastReason.NumUsers = Strip(SubWord(Line,3),"L",":")
  387.     If (Words(LastReason.NumUsers) = 2) & (Pos(".",Word(LastReason.NumUsers,1)) > 0) & (Pos(".",Word(LastReason.NumUsers,1)) > 0) then LastReason.NumUsers = "NetSplit!"
  388.     If Type = "PART" then LastReason.NumUsers = "Left the channel."
  389.     UserChan.NumUsers = Channel
  390.     TempTime = Time("M")
  391.     TempDate = Date("I")
  392.     UserQuit.NumUsers = TempTime||" "||TempDate
  393.   End
  394.   Call Open("QuitLog","AmIRC:Rexx/CTCP-QuitLog."||Server,"W")
  395.     Do QuitLoop = 1 to NumUsers
  396.       Call WriteCh("QuitLog",UserNick.QuitLoop.0||" ")
  397.       Do ILoop = 1 to UserNick.QuitLoop.0
  398.         Call WriteCh("QuitLog",UserNick.QuitLoop.ILoop||" ")
  399.       End
  400.       Call WriteLn("QuitLog",UserChan.QuitLoop||" "||UserQuit.QuitLoop||" "||LastHost.QuitLoop||" "||LastReason.QuitLoop)
  401.     End
  402.   Call Close("QuitLog")
  403. End
  404. If (Type = "PRIVMSG") & (Left(Rest,1) = D2C(1)) & (Right(Rest,1) = D2C(1)) then Do
  405.   Rest = SubStr(Rest,2,Length(Rest)-2)
  406.   If Upper(Word(Rest,1)) = "PING" then Do
  407.     'RAW NOTICE 'NICK' :'PingPhrase.NextPing
  408.     NextPing = NextPing + 1
  409.     If NextPing > NumPings then NextPing = 1
  410.   End
  411.   If Upper(Word(Rest,1)) = "SOUND" then Do
  412.     SoundToPlay = Word(Rest,2)
  413.     If ~Exists(SoundDir||SoundToPlay) then 'SAY /MSG '||NICK||' !'||NICK||' '||SoundToPlay
  414.   End
  415.   If Upper(Word(Rest,1)) = "GETSOUND" then Do
  416.     FileToSend = Word(Rest,2)
  417.     If Exists(SoundDir||FileToSend) then "Say /DCC SEND "Nick" "SoundDir||FileToSend
  418.     Else "Raw Notice "Nick" :Sorry, couldn't find the sound file -> "FileToSend
  419.   End
  420.   If Upper(Word(Rest,1)) = "USERINFO" | Upper(Word(Rest,1)) = "FINGER" then Do
  421.     'Raw Notice 'Nick' :'d2c(3)'5System:'d2c(3)||'4 '||SysDesc
  422.     'Raw Notice 'Nick' :'d2c(3)'5Location:'d2c(3)||'4 '||Location
  423.     'Raw Notice 'Nick' :'d2c(3)'5EMail:'d2c(3)||'4 '||EMail
  424.     'Raw Notice 'Nick' :'d2c(3)'5HomePage:'d2c(3)||'4 '||HomePage
  425.     'Raw Notice 'Nick' :'d2c(3)'5Comment:'d2c(3)||'4 '||Comment
  426.     'Raw Notice 'Nick' :'d2c(3)'4This reply brought to you by CTCP-Master.AMIRX v1.12'
  427.   End
  428. End
  429. If (Type = "PRIVMSG") & (Upper(Word(Rest,1)) = Trigger||Upper(MyNick)) then Do
  430.   FileToSend = Word(Rest,2)
  431.   If Upper(Right(FileToSend,4)) = ".MP3" then Do
  432.     If Exists(MP3Dir||FileToSend) then "Say /DCC SEND "Nick" "MP3Dir||FileToSend
  433.     Else "Raw Notice "Nick" :Sorry, couldn't find the MP3 file -> "FileToSend
  434.   End
  435.   If Upper(Right(FileToSend,4)) = ".WAV" then Do
  436.     If Exists(SoundDir||FileToSend) then "Say /DCC SEND "Nick" "SoundDir||FileToSend
  437.     Else "Raw Notice "Nick" :Sorry, couldn't find the sound file -> "FileToSend
  438.   End
  439. End
  440. If (Type = "PRIVMSG") & (Upper(Word(Rest,1)) = Trigger||Upper("PAGE") & Upper(Word(Rest,2)) = Upper(MyNick)) then Do
  441.   Reason = SubWord(Rest,3)
  442.   If Reason = "" Then Reason = "No reason given."
  443.   'ECHO P='d2c(27)'b«CTCPMaster» 'd2c(3)'1,8'd2c(2)'Paged'd2c(2)' by 'NICK'...'d2c(2)'Reason: 'd2c(2)||Reason
  444.   Address Command 'SetEnv Pager Paged by 'Nick'. 'Reason
  445.   Address Command PageCmd
  446. End
  447. If (Type = "PRIVMSG") & ((Upper(Word(Rest,1)) = Trigger||"COUNTRY") | (Upper(Word(Rest,1)) = Trigger||"WHERE")) then Do
  448.   FindIt = SubWord(Rest,2)
  449.   If ~Exists("AmIRC:Rexx/Country-Codes.TXT") Then Do
  450.     'Echo P='d2c(27)'b«CTCPMaster» Unable to find AmIRC:Rexx/Country-Codes.TXT'
  451.     Signal MainLoop
  452.   End
  453.   Call Open(Listing,"Amirc:Rexx/Country-Codes.TXT","R")
  454.     FoundIt = FindIt||" was not found in the Database!"
  455.     Do Until EOF(Listing)
  456.       Line = ReadLn(Listing)
  457.       If Upper(Word(Line,1)) = Upper(FindIt) then FoundIt = Upper(FindIt)||" is "SubWord(Line,2)
  458.       If Upper(SubWord(Line,2)) = Upper(FindIt) then FoundIt = "Apparently, "SubWord(Line,2)" is "Upper(Word(Line,1))
  459.     End
  460.   Call Close(Listing)
  461.   If (Upper(ToWho) = Upper(MyNick) | AlwaysPriv = TRUE) then Do
  462.     'Raw Notice 'Nick' :'FoundIt
  463.   End
  464.   Else Do
  465.     'Say /Notice 'ToWho' 'Nick': 'FoundIt
  466.   End
  467. End
  468. If (Type = "PRIVMSG") & (Upper(Word(Rest,1)) = Trigger||"SHOWCOMMANDS") | (Upper(Word(Rest,1)) = Trigger||"HELP") then Do
  469.   'Raw Notice 'Nick' :Available Commands...'
  470.   'Raw Notice 'Nick' :/CTCP Commands: PING  SOUND USERINFO'
  471.   'Raw Notice 'Nick' :'||Trigger||' Commands:'
  472.   'Raw Notice 'Nick' :'||Trigger||'CALC          '||Trigger||'CONVERT       '||Trigger||'COUNTRY       '
  473.   'Raw Notice 'Nick' :'||Trigger||'CURRENCY      '||Trigger||'DNS           '||Trigger||'EXCHANGE      '
  474.   'Raw Notice 'Nick' :'||Trigger||'FAQ           '||Trigger||'FAQADD        '||Trigger||'FIND          '
  475.   'Raw Notice 'Nick' :'||Trigger||'HOROSCOPE     '||Trigger||'LAST          '||Trigger||'MONTH         '
  476.   'Raw Notice 'Nick' :'||Trigger||'PAGE          '||Trigger||'SEEN          '||Trigger||'SHOWCOMMANDS  '
  477.   'Raw Notice 'Nick' :'||Trigger||'STOCK         '||Trigger||'TEMP          '||Trigger||'TIME          '
  478.   'Raw Notice 'Nick' :'||Trigger||'TRANSLATE     '||Trigger||'WEATHER       '||Trigger||'WHERE         '
  479.   'Raw Notice 'Nick' :'||Trigger||'ZIP           '
  480. End
  481. If (Type = "PRIVMSG") & (Upper(Word(Rest,1)) = Trigger||"TIME") then Do
  482.   DayPlus = 0
  483.   TempTime = Time(H) + GMTOffSet
  484.   If TempTime > 23 then Do
  485.     TempTime = TempTime - 24
  486.     DayPlus = 1
  487.   End
  488.   If TempTime < 0 then Do
  489.     TempTime = TempTime + 24
  490.     DayPlus = -1
  491.   End
  492.   TempTime = Right("0"||TempTime,2)||SubStr(Time(),3)
  493.   TempDate = Translate(Date(N,Date(I)+DayPlus,I),"-"," ")
  494.   If (Upper(ToWho) = Upper(MyNick) | AlwaysPriv = TRUE) then Do
  495.     "Raw Notice "Nick" :The current time is "TempTime", "TempDate" GMT."
  496.   End
  497.   Else Do
  498.     "Say /Notice "ToWho" "Nick": The current time is "TempTime", "TempDate" GMT."
  499.   End
  500. End
  501. If (Type = "PRIVMSG") & ((Upper(Word(Rest,1)) = Trigger||"DNS") | (Upper(Word(Rest,1)) = Trigger||"NSLOOKUP")) then Do
  502.   HostToFind = Word(Rest,2)
  503.   If Upper(HostToFind) = "-S" then Do
  504.     HostToFind = SubWord(Rest,2)
  505.   End
  506.   If Pos(".",HostToFind)=0 then Do
  507.     GetUsers ; ThePeeps = Result
  508.     Do XLoop = 1 to Words(ThePeeps)
  509.       If Upper(Word(ThePeeps,XLoop))=Upper(HostToFind) | Upper(Word(ThePeeps,XLoop))=Upper("@"||HostToFind) Then Do
  510.         UserHost HostToFind ; HostToFind = Result
  511.         HostToFind = Word(Translate(HostToFind," ","@"),2)
  512.       End
  513.     End
  514.   End
  515.   Address Command ("Miami:MiamiResolve "||HostToFind||" >Ram:DNS.Result")
  516.   Call Open(In,"Ram:DNS.Result","R")
  517.     DNS1= ReadLn(In)
  518.     If Word(DNS1,1) = "service:" then Do
  519.       DNS2 = ReadLn(In)
  520.       If DNS2 = "aliases:" then Do Forever
  521.         DNS3 = ReadLn(In)
  522.         If Word(DNS3,1) = "port:" then leave
  523.       End
  524.       If (Upper(ToWho) = Upper(MyNick) | AlwaysPriv = TRUE) then Do
  525.         "Raw Notice "Nick" :"d2c(2)||DNS1||d2c(2)||" is mapped to "d2c(2)||Strip(DNS3)||d2c(2)
  526.       End
  527.       Else Do
  528.         "Say /Notice "ToWho" "Nick": "||d2c(2)||DNS1||d2c(2)||" is mapped to "d2c(2)||Strip(DNS3)||d2c(2)
  529.       End
  530.     End
  531.     Else If Word(DNS1,1) = "host:" then Do
  532.       DNS2= ReadLn(In)
  533.       DNS3= ReadLn(In)
  534.       If (Upper(ToWho) = Upper(MyNick) | AlwaysPriv = TRUE) then Do
  535.         "Raw Notice "Nick" :"DNS1" is "Strip(DNS3)
  536.       End
  537.       Else Do
  538.         "Say /Notice "ToWho" "Nick": "DNS1" is "Strip(DNS3)
  539.       End
  540.     End
  541.     Else Do
  542.       If (Upper(ToWho) = Upper(MyNick) | AlwaysPriv = TRUE) then Do
  543.         "Raw Notice "Nick" :"DNS1
  544.       End
  545.       Else Do
  546.         "Say /Notice "ToWho" "Nick": "DNS1
  547.       End
  548.     End
  549.   Call Close(In)
  550. End
  551. If (Type = "PRIVMSG") & (Upper(Word(Rest,1)) = Trigger||"PHOTO") then Do
  552.   If Exists(Photo) then "Say /DCC SEND "Nick" "Photo
  553. End
  554. If (Type = "PRIVMSG") & (Upper(Word(Rest,1)) = Trigger||"CALC") then Do
  555.   Expression = "Math = "||SubWord(Rest,2)
  556.   Interpret Expression
  557.   If (Upper(ToWho) = Upper(MyNick) | AlwaysPriv = TRUE) then Do
  558.     "Raw Notice "Nick" :Answer is "||d2c(2)||Math||d2c(2)
  559.   End
  560.   Else Do
  561.     "Say /Notice "ToWho" "Nick": Answer is "||d2c(2)||Math||d2c(2)
  562.   End
  563. End
  564. If (Type = "PRIVMSG") & (Upper(Word(Rest,1)) = Trigger||"FAQLIST") & (NumFAQ > 0) then Do
  565.   Response = ""
  566.   Do FAQLoop = 1 to NumFAQ
  567.     Response = Response||FAQName.FAQLoop||", "
  568.   End
  569.   Response = Strip(Response)
  570.   Response = Strip(Response,"T",",")
  571.   If (Upper(ToWho) = Upper(MyNick) | AlwaysPriv = TRUE) then Do
  572.     "Raw Notice "Nick" : Available FAQs - "d2c(2)||Response||d2c(2)
  573.   End
  574.   Else Do
  575.     "Say /Notice "ToWho" "Nick": Available FAQs - "d2c(2)||Response||d2c(2)
  576.   End
  577. End
  578. If (Type = "PRIVMSG") & (((Upper(Word(rest,1)) = Trigger||"SEEN") | (Upper(Word(rest,1)) = "SEEN")) & Words(Rest) = 2) then Do
  579.   FindNick = Strip(Word(Rest,2),"T","?")
  580.   Found = 0
  581.   GetChannel ; Channel = Result
  582.   If Upper(ToWho) ~= Upper(MyNick) then Channel = ToWho
  583.   Channels ; Joined = Result
  584.   IsOn = 0
  585.   Do CLoop = 1 to Words(Joined)
  586.     'GetUsers Channel='Word(Joined,CLoop) ; OnChannel = " "||Upper(Compress(Result,"@+"))||" "
  587.     If Pos(Upper(" "||FindNick||" "),OnChannel) > 0 then Do
  588.       IsOn = IsOn + 1
  589.       OnChan.IsOn = Word(Joined,CLoop)
  590.     End
  591.   End
  592.   If IsOn > 0 Then Do
  593.     If Upper(FindNick) = Upper(Nick) then Findnick = "You are"
  594.     Else Findnick = Findnick||" is"
  595.     If IsOn = 1 then ReplyStr = FindNick" on "OnChan.1" right now!"
  596.     If IsOn > 1 then Do
  597.       ReplyStr = FindNick" on "
  598.       Do CLoop = 1 to IsOn - 1
  599.         ReplyStr = ReplyStr||OnChan.CLoop||" "
  600.       End
  601.       ReplyStr = ReplyStr||"and "||OnChan.IsOn||" right now!"
  602.     End
  603.     If (Upper(ToWho) = Upper(MyNick) | AlwaysPriv = TRUE) then Do
  604.       "Raw Notice "Nick" :"ReplyStr
  605.     End
  606.     Else Do
  607.       "Say /Notice "ToWho" "Nick": "ReplyStr
  608.     End
  609.   End
  610.   If IsOn = 0 then Do
  611.     Do QuitLoop = 1 to NumUsers
  612.       Do ILoop = 1 to UserNick.QuitLoop.0
  613.         If Upper(FindNick) = Upper(UserNick.QuitLoop.ILoop) then Do
  614.           Found = 1
  615.           ReplyText = ""
  616.           TimeThen = Word(UserQuit.QuitLoop,1)
  617.           DateThen = Word(UserQuit.QuitLoop,2)
  618.           TimeNow = Time("M")
  619.           DateNow = Date("I")
  620.           DaysAgo = DateNow - DateThen
  621.           TimePast = ABS(TimeNow - TimeThen)
  622.           TempHour = TimePast % 60
  623.           TempMin = TimePast - (TempHour * 60)
  624.           If DaysAgo = 1 then ReplyText = ReplyText||DaysAgo" day, "
  625.           If DaysAgo > 1 then ReplyText = ReplyText||DaysAgo" days, "
  626.           If TempHour = 1 then ReplyText = ReplyText||TempHour" hour, "
  627.           If TempHour > 1 then ReplyText = ReplyText||TempHour" hours, "
  628.           If TempMin = 1 then ReplyText = ReplyText||TempMin" minute ago."
  629.           Else ReplyText = ReplyText||TempMin" minutes ago."
  630.           If (Upper(ToWho) = Upper(MyNick) | AlwaysPriv = TRUE) then Do
  631.             "Raw Notice "Nick" :I last saw "UserNick.QuitLoop.ILoop" ("LastHost.QuitLoop") on "UserChan.QuitLoop" "ReplyText" Reason for leaving: "LastReason.QuitLoop
  632.           End
  633.           Else Do
  634.             "Say /Notice "ToWho" "Nick": I last saw "UserNick.QuitLoop.ILoop" ("LastHost.QuitLoop") on "UserChan.QuitLoop" "ReplyText" Reason for leaving: "LastReason.QuitLoop
  635.           End
  636.           Leave QuitLoop
  637.         End
  638.       End
  639.     End
  640.     If Found = 0 then Do
  641.       If (Upper(ToWho) = Upper(MyNick) | AlwaysPriv = TRUE) then Do
  642.         "Raw Notice "Nick" :I have not seen "FindNick" on "Channel" yet."
  643.       End
  644.       Else Do
  645.         "Say /Notice "ToWho" "Nick": I have not seen "FindNick" on "Channel" yet."
  646.       End
  647.     End
  648.   End
  649. End
  650. If (Type = "PRIVMSG") & (Upper(Word(rest,1)) = Trigger||"LAST") then Do
  651.   If Words(rest) > 1 then FindNick = Word(rest,2)
  652.   Else FindNick = Nick
  653.   Found = 0
  654.   GetChannel ; Channel = Result
  655.   If Upper(ToWho) ~= Upper(MyNick) then Channel = ToWho
  656.   Do QuitLoop = 1 to NumUsers
  657.     Do ILoop = 1 to UserNick.QuitLoop.0
  658.       If Upper(FindNick) = Upper(UserNick.QuitLoop.ILoop) then Do
  659.         Found = 1
  660.         ReplyText = "Last quit message for "UserNick.QuitLoop.ILoop" was '"d2c(2)||LastReason.QuitLoop||d2c(2)"'"
  661.         If (Upper(ToWho) = Upper(MyNick) | AlwaysPriv = TRUE) then Do
  662.           "Raw Notice "Nick " :"ReplyText
  663.         End
  664.         Else Do
  665.           "Say /Notice "ToWho" "Nick": "ReplyText
  666.         End
  667.       End
  668.     End
  669.   End
  670.   If Found = 0 then Do
  671.     If (Upper(ToWho) = Upper(MyNick) | AlwaysPriv = TRUE) then Do
  672.       "Raw Notice "Nick" :I have not seen a /QUIT message from "FindNick" on "Channel" yet."
  673.     End
  674.     Else Do
  675.       "Say /Notice "ToWho" "Nick": I have not seen a /QUIT message from "FindNick" on "Channel" yet."
  676.     End
  677.   End
  678. End
  679. If (Type = "PRIVMSG") & (Upper(Word(Rest,1)) = Trigger||"FAQADD") then Do
  680.   FAQFound = 0
  681.   If NumFAQ > 0 then Do
  682.     Do FAQLoop = 1 to NumFAQ
  683.       If Upper(Word(Rest,2)) = FAQName.FAQLoop then Do
  684.         FAQFound = 1
  685.         If (Upper(ToWho) = Upper(MyNick) | AlwaysPriv = TRUE) then Do
  686.           "Raw Notice "Nick" : «FAQ» "d2c(2)||Upper(Word(Rest,2))||d2c(2)" already exists in the database!"
  687.         End
  688.         Else Do
  689.           "Say /Notice "ToWho" «FAQ» "d2c(2)||Upper(Word(Rest,2))||d2c(2)" already exists in the database!"
  690.         End
  691.       End
  692.     End
  693.   End
  694.   If FAQFound = 0 then Do
  695.      NumFAQ = NumFAQ + 1
  696.     FAQName.NumFAQ = Upper(Word(Rest,2))
  697.     FAQText.NumFAQ = SubWord(Rest,3)
  698.     Call Open(FAQ,"AmIRC:Rexx/CTCP-FAQ","W")
  699.       Do FAQLoop = 1 to NumFAQ
  700.         Call WriteLn("FAQ",FAQName.FAQLoop)
  701.         Call WriteLn("FAQ",FAQText.FAQLoop)
  702.       End
  703.       If (Upper(ToWho) = Upper(MyNick) | AlwaysPriv = TRUE) then Do
  704.         "Raw Notice "Nick" : «FAQ» "d2c(2)||Upper(Word(Rest,2))||d2c(2)" has been added to the database."
  705.       End
  706.       Else Do
  707.         "Say /Notice "ToWho" «FAQ» "d2c(2)||Upper(Word(Rest,2))||d2c(2)" has been added to the database."
  708.       End
  709.     Call Close("FAQ")
  710.   End
  711. End
  712. If (Type = "PRIVMSG") & (Upper(Word(Rest,1)) = Trigger||"FAQ") & (NumFAQ > 0) then Do
  713.   FAQFound= 0
  714.   Do FAQLoop = 1 to NumFAQ
  715.     If FAQName.FAQLoop = Upper(Word(Rest,2)) Then Do
  716.       Response = FAQText.FAQLoop
  717.       FAQFound = 1
  718.     End
  719.   End
  720.   If FAQFound = 1 then Do
  721.     If (Upper(ToWho) = Upper(MyNick) | AlwaysPriv = TRUE) then Do
  722.       "Raw Notice "Nick" : «FAQ» "d2c(2)||Upper(Word(Rest,2))||d2c(2)" - "Response
  723.     End
  724.     Else Do
  725.       "Say /Notice "ToWho" «FAQ» "d2c(2)||Upper(Word(Rest,2))||d2c(2)" - "Response
  726.     End
  727.   End
  728. End
  729. If (Type = "PRIVMSG") & (Upper(Word(Rest,1)) = Trigger||"CONVERT") then Do
  730.   CnvtNum  = Word(Rest,2)
  731.   CnvtFrom = Upper(Word(Rest,3))
  732.   CnvtTo   = Upper(Word(Rest,4))
  733.   NewNum = "NOT!"
  734.   If Upper(CnvtNum) = "LIST" |  DataType(CnvtNum,"N") = 0 then do
  735.     'RAW NOTICE 'NICK' :Conversion options include the following.'
  736.     'RAW NOTICE 'NICK' :Measurements: 'd2c(2)'MM'd2c(2)','d2c(2)' CM'd2c(2)','d2c(2)' M'd2c(2)','d2c(2)' KM'd2c(2)' <--> 'd2c(2)'IN'd2c(2)','d2c(2)' FT'd2c(2)','d2c(2)' YD'd2c(2)','d2c(2)' MI'd2c(2)
  737.     'RAW NOTICE 'NICK' :Weights: 'd2c(2)'G'd2c(2)', 'd2c(2)'KG'd2c(2)' <--> 'd2c(2)'OZ'd2c(2)','d2c(2)' LB'd2c(2)
  738.     'RAW NOTICE 'NICK' :Temperature: 'd2c(2)'F'd2c(2)' <--> 'd2c(2)'C'd2c(2)' <--> 'd2c(2)'K'd2c(2)
  739.     'RAW NOTICE 'NICK' :Volume: 'd2c(2)'TSP'd2c(2)','d2c(2)' TBSP'd2c(2)','d2c(2)' FLOZ'd2c(2)','d2c(2)' CUP'd2c(2)','d2c(2)' PT'd2c(2)','d2c(2)' QT'd2c(2)','d2c(2)' GAL'd2c(2)' <--> 'd2c(2)'ML'd2c(2)','d2c(2)' L'd2c(2)
  740.     Signal MainLoop
  741.   End
  742.   If CnvtFrom = "F"    & CnvtTo = "C"    & DataType(CnvtNum,"N") = 1 then NewNum = ((CnvtNum - 32) * 5) / 9
  743.   If CnvtFrom = "F"    & CnvtTo = "K"    & DataType(CnvtNum,"N") = 1 then NewNum = (((CnvtNum - 32) * 5) / 9) + 273.15
  744.   If CnvtFrom = "C"    & CnvtTo = "F"    & DataType(CnvtNum,"N") = 1 then NewNum = ((CnvtNum * 9) / 5) + 32
  745.   If CnvtFrom = "C"    & CnvtTo = "K"    & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum + 273.15
  746.   If CnvtFrom = "K"    & CnvtTo = "C"    & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum - 273.15
  747.   If CnvtFrom = "K"    & CnvtTo = "F"    & DataType(CnvtNum,"N") = 1 then NewNum = (((CnvtNum - 273.15) * 9) / 5) + 32
  748.  
  749.   If CnvtFrom = "MM"   & CnvtTo = "IN"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 0.039
  750.   If CnvtFrom = "MM"   & CnvtTo = "FT"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 0.039) * 12
  751.   If CnvtFrom = "MM"   & CnvtTo = "YD"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 0.039) * 36
  752.   If CnvtFrom = "MM"   & CnvtTo = "MI"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 0.039) * 63360
  753.  
  754.   If CnvtFrom = "CM"   & CnvtTo = "IN"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 0.39
  755.   If CnvtFrom = "CM"   & CnvtTo = "FT"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 0.39) * 12
  756.   If CnvtFrom = "CM"   & CnvtTo = "YD"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 0.39) * 36
  757.   If CnvtFrom = "CM"   & CnvtTo = "MI"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 0.39) * 63360
  758.  
  759.   If CnvtFrom = "M"    & CnvtTo = "IN"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 3.28) / 12
  760.   If CnvtFrom = "M"    & CnvtTo = "FT"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 3.28
  761.   If CnvtFrom = "M"    & CnvtTo = "YD"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 3.28) * 3
  762.   If CnvtFrom = "M"    & CnvtTo = "MI"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 3.28) * 5280
  763.  
  764.   If CnvtFrom = "KM"   & CnvtTo = "IN"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 0.6) * 63360
  765.   If CnvtFrom = "KM"   & CnvtTo = "FT"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 0.6) * 5280
  766.   If CnvtFrom = "KM"   & CnvtTo = "YD"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 0.6) * 1760
  767.   If CnvtFrom = "KM"   & CnvtTo = "MI"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 0.6
  768.  
  769.   If CnvtFrom = "IN"   & CnvtTo = "MM"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 25.4
  770.   If CnvtFrom = "IN"   & CnvtTo = "CM"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 25.4) / 10
  771.   If CnvtFrom = "IN"   & CnvtTo = "M"    & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 25.4) / 1000
  772.   If CnvtFrom = "IN"   & CnvtTo = "KM"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 25.4) / 1000000
  773.   If CnvtFrom = "IN"   & CnvtTo = "FT"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 12
  774.   If CnvtFrom = "IN"   & CnvtTo = "YD"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 36
  775.   If CnvtFrom = "IN"   & CnvtTo = "MI"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 63360
  776.  
  777.   If CnvtFrom = "FT"   & CnvtTo = "MM"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 0.304) * 1000
  778.   If CnvtFrom = "FT"   & CnvtTo = "CM"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 0.304) * 100
  779.   If CnvtFrom = "FT"   & CnvtTo = "M"    & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 0.304
  780.   If CnvtFrom = "FT"   & CnvtTo = "KM"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 0.304) /1000
  781.   If CnvtFrom = "FT"   & CnvtTo = "IN"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 12
  782.   If CnvtFrom = "FT"   & CnvtTo = "YD"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 3
  783.   If CnvtFrom = "FT"   & CnvtTo = "MI"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 5280
  784.  
  785.   If CnvtFrom = "YD"   & CnvtTo = "MM"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 0.91) * 1000
  786.   If CnvtFrom = "YD"   & CnvtTo = "CM"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 0.91) * 100
  787.   If CnvtFrom = "YD"   & CnvtTo = "M"    & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 0.91
  788.   If CnvtFrom = "YD"   & CnvtTo = "KM"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 0.91) / 1000
  789.   If CnvtFrom = "YD"   & CnvtTo = "IN"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 36
  790.   If CnvtFrom = "YD"   & CnvtTo = "FT"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 3
  791.   If CnvtFrom = "YD"   & CnvtTo = "MI"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 1760
  792.  
  793.   If CnvtFrom = "MI"   & CnvtTo = "MM"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 1.9) * 1000000
  794.   If CnvtFrom = "MI"   & CnvtTo = "CM"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 1.9) * 100000
  795.   If CnvtFrom = "MI"   & CnvtTo = "M"    & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 1.9) * 1000
  796.   If CnvtFrom = "MI"   & CnvtTo = "KM"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 1.9
  797.   If CnvtFrom = "MI"   & CnvtTo = "IN"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 63360
  798.   If CnvtFrom = "MI"   & CnvtTo = "FT"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 5280
  799.   If CnvtFrom = "MI"   & CnvtTo = "YD"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 1760
  800.  
  801.   If CnvtFrom = "G"    & CnvtTo = "OZ"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 0.035
  802.   If CnvtFrom = "G"    & CnvtTo = "LB"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 0.035) / 16
  803.  
  804.   If CnvtFrom = "KG"   & CnvtTo = "OZ"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 35.2
  805.   If CnvtFrom = "KG"   & CnvtTo = "LB"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 2.2
  806.  
  807.   If CnvtFrom = "OZ"   & CnvtTo = "G"    & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 28.44
  808.   If CnvtFrom = "OZ"   & CnvtTo = "KG"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 28.44) / 1000
  809.   If CnvtFrom = "OZ"   & CnvtTo = "LB"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 16
  810.  
  811.   If CnvtFrom = "LB"   & CnvtTo = "G"    & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 455
  812.   If CnvtFrom = "LB"   & CnvtTo = "KG"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 0.455
  813.   If CnvtFrom = "LB"   & CnvtTo = "OZ"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 16
  814.  
  815.   If CnvtFrom = "TSP"  & CnvtTo = "ML"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 5
  816.   If CnvtFrom = "TSP"  & CnvtTo = "L"    & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 5) / 1000
  817.   If CnvtFrom = "TSP"  & CnvtTo = "TBSP" & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 3
  818.   If CnvtFrom = "TSP"  & CnvtTo = "FLOZ" & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 6
  819.   If CnvtFrom = "TSP"  & CnvtTo = "CUP"  & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 48
  820.   If CnvtFrom = "TSP"  & CnvtTo = "PT"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 96
  821.   If CnvtFrom = "TSP"  & CnvtTo = "QT"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 192
  822.   If CnvtFrom = "TSP"  & CnvtTo = "GAL"  & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 768
  823.  
  824.   If CnvtFrom = "TBSP" & CnvtTo = "ML"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 15
  825.   If CnvtFrom = "TBSP" & CnvtTo = "L"    & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 15) / 1000
  826.   If CnvtFrom = "TBSP" & CnvtTo = "TSP"  & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 3
  827.   If CnvtFrom = "TBSP" & CnvtTo = "FLOZ" & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 2
  828.   If CnvtFrom = "TBSP" & CnvtTo = "CUP"  & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 16
  829.   If CnvtFrom = "TBSP" & CnvtTo = "PT"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 32
  830.   If CnvtFrom = "TBSP" & CnvtTo = "QT"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 64
  831.   If CnvtFrom = "TBSP" & CnvtTo = "GAL"  & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 256
  832.  
  833.   If CnvtFrom = "FLOZ" & CnvtTo = "ML"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 30
  834.   If CnvtFrom = "FLOZ" & CnvtTo = "L"    & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum * 30) / 1000
  835.   If CnvtFrom = "FLOZ" & CnvtTo = "TSP"  & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 6
  836.   If CnvtFrom = "FLOZ" & CnvtTo = "TBSP" & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 2
  837.   If CnvtFrom = "FLOZ" & CnvtTo = "CUP"  & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 8
  838.   If CnvtFrom = "FLOZ" & CnvtTo = "PT"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 16
  839.   If CnvtFrom = "FLOZ" & CnvtTo = "QT"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 32
  840.   If CnvtFrom = "FLOZ" & CnvtTo = "GAL"  & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 128
  841.  
  842.   If CnvtFrom = "CUP"  & CnvtTo = "ML"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 240
  843.   If CnvtFrom = "CUP"  & CnvtTo = "L"    & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * .24
  844.   If CnvtFrom = "CUP"  & CnvtTo = "TSP"  & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 48
  845.   If CnvtFrom = "CUP"  & CnvtTo = "TBSP" & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 16
  846.   If CnvtFrom = "CUP"  & CnvtTo = "FLOZ" & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 8
  847.   If CnvtFrom = "CUP"  & CnvtTo = "PT"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 2
  848.   If CnvtFrom = "CUP"  & CnvtTo = "QT"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 4
  849.   If CnvtFrom = "CUP"  & CnvtTo = "GAL"  & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 16
  850.  
  851.   If CnvtFrom = "PT"   & CnvtTo = "ML"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 470
  852.   If CnvtFrom = "PT"   & CnvtTo = "L"    & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * .47
  853.   If CnvtFrom = "PT"   & CnvtTo = "TSP"  & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 96
  854.   If CnvtFrom = "PT"   & CnvtTo = "TBSP" & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 32
  855.   If CnvtFrom = "PT"   & CnvtTo = "FLOZ" & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 16
  856.   If CnvtFrom = "PT"   & CnvtTo = "CUP"  & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 2
  857.   If CnvtFrom = "PT"   & CnvtTo = "QT"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 2
  858.   If CnvtFrom = "PT"   & CnvtTo = "GAL"  & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 8
  859.  
  860.   If CnvtFrom = "QT"   & CnvtTo = "ML"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 950
  861.   If CnvtFrom = "QT"   & CnvtTo = "L"    & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * .95
  862.   If CnvtFrom = "QT"   & CnvtTo = "TSP"  & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 192
  863.   If CnvtFrom = "QT"   & CnvtTo = "TBSP" & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 64
  864.   If CnvtFrom = "QT"   & CnvtTo = "FLOZ" & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 32
  865.   If CnvtFrom = "QT"   & CnvtTo = "CUP"  & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 4
  866.   If CnvtFrom = "QT"   & CnvtTo = "PT"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 2
  867.   If CnvtFrom = "QT"   & CnvtTo = "GAL"  & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 4
  868.  
  869.   If CnvtFrom = "GAL"  & CnvtTo = "ML"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 3800
  870.   If CnvtFrom = "GAL"  & CnvtTo = "L"    & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 3.8
  871.   If CnvtFrom = "GAL"  & CnvtTo = "TSP"  & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 768
  872.   If CnvtFrom = "GAL"  & CnvtTo = "TBSP" & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 256
  873.   If CnvtFrom = "GAL"  & CnvtTo = "FLOZ" & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 128
  874.   If CnvtFrom = "GAL"  & CnvtTo = "CUP"  & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 16
  875.   If CnvtFrom = "GAL"  & CnvtTo = "PT"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 8
  876.   If CnvtFrom = "GAL"  & CnvtTo = "QT"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 4
  877.  
  878.   If CnvtFrom = "ML"   & CnvtTo = "TSP"  & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum / 30) * 6
  879.   If CnvtFrom = "ML"   & CnvtTo = "TBSP" & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum / 30) * 2
  880.   If CnvtFrom = "ML"   & CnvtTo = "FLOZ" & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum / 30
  881.   If CnvtFrom = "ML"   & CnvtTo = "CUP"  & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum / 30) / 8
  882.   If CnvtFrom = "ML"   & CnvtTo = "PT"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum / 30) / 16
  883.   If CnvtFrom = "ML"   & CnvtTo = "QT"   & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum / 30) / 32
  884.   If CnvtFrom = "ML"   & CnvtTo = "GAL"  & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum / 30) / 128
  885.   If CnvtFrom = "ML"   & CnvtTo = "L"    & DataType(CnvtNum,"N") = 1 then NewNum = (CnvtNum / 1000)
  886.  
  887.   If CnvtFrom = "L"    & CnvtTo = "ML"   & DataType(CnvtNum,"N") = 1 then NewNum = CnvtNum * 1000
  888.   If CnvtFrom = "L"    & CnvtTo = "TSP"  & DataType(CnvtNum,"N") = 1 then NewNum = ((CnvtNum * 1000) / 30) * 6
  889.   If CnvtFrom = "L"    & CnvtTo = "TBSP" & DataType(CnvtNum,"N") = 1 then NewNum = ((CnvtNum * 1000) / 30) * 2
  890.   If CnvtFrom = "L"    & CnvtTo = "FLOZ" & DataType(CnvtNum,"N") = 1 then NewNum = ((CnvtNum * 1000) / 30
  891.   If CnvtFrom = "L"    & CnvtTo = "CUP"  & DataType(CnvtNum,"N") = 1 then NewNum = ((CnvtNum * 1000) / 30) / 8
  892.   If CnvtFrom = "L"    & CnvtTo = "PT"   & DataType(CnvtNum,"N") = 1 then NewNum = ((CnvtNum * 1000) / 30) / 16
  893.   If CnvtFrom = "L"    & CnvtTo = "QT"   & DataType(CnvtNum,"N") = 1 then NewNum = ((CnvtNum * 1000) / 30) / 32
  894.   If CnvtFrom = "L"    & CnvtTo = "GAL"  & DataType(CnvtNum,"N") = 1 then NewNum = ((CnvtNum * 1000) / 30) / 128
  895.  
  896.   If NewNum ~= "NOT!" then Do
  897.     If NewNum < 0 then NewNum = NewNum - .0001
  898.     Else NewNum = NewNum + .0001
  899.     NewNum = Left(NewNum,Pos(".",NewNum)+2)
  900.     If (Upper(ToWho) = Upper(MyNick) | AlwaysPriv = TRUE) then Do
  901.       'RAW NOTICE 'NICK' :'d2c(2)||CnvtNum||' '||CnvtFrom||d2c(2)' is approximately 'd2c(2)||NewNum||' '||CnvtTo||d2c(2)
  902.     End
  903.     Else Do
  904.       'Say /Notice 'ToWho' 'NICK': 'd2c(2)||CnvtNum||' '||CnvtFrom||d2c(2)' is approximately 'd2c(2)||NewNum||' '||CnvtTo||d2c(2)
  905.     End
  906.   End
  907. End
  908. If (Type = "PRIVMSG") & ((Upper(Word(Rest,1)) = Trigger||"EXCHANGE") | (Upper(Word(Rest,1)) = Trigger||"CURRENCY")) then Do
  909.   Amount = Upper(Word(Rest,2))
  910.   Cur1 = Upper(Word(Rest,3))
  911.   Cur2 = Upper(Word(Rest,4))
  912.   CRNL = "0d0a"x
  913.  
  914.   If Amount = "" then Do
  915.     If (Upper(ToWho) = Upper(MyNick) | AlwaysPriv = TRUE) then "Raw Notice "Nick" :Try using "D2C(2)||Trigger||"Exchange {Amount} {From Currency} {To Currency}"D2C(2)
  916.     Else "Say /Notice "ToWho" "Nick": Try using "D2C(2)||Trigger||"Exchange {Amount} {From Currency} {To Currency}"D2C(2)
  917.     Signal MainLoop
  918.   End
  919.  
  920.   cntout = 0
  921.   IF Amount = 'LIST' THEN DO
  922.     IF UPPER(cur1) = "ALL" THEN DO
  923.       DO x = 1 to 70
  924.         'Raw Notice 'Nick' :'ratelist.x
  925.         Call Delay(35)
  926.       END
  927.       cntout = 1
  928.     END
  929.     ELSE DO x = 1 to 70
  930.       IF UPPER(cur1) = SUBSTR(ratelist.x,7,1) THEN DO
  931.         cntout = 1
  932.         'Raw Notice 'Nick' :'ratelist.x
  933.         Call Delay(35)
  934.       END
  935.     END
  936.     IF cntout = 0 THEN 'Raw Notice 'Nick' :No Country match for 'cur1
  937.   END
  938.   ELSE IF amount < 0 | amount > 100000000000000000 THEN DO
  939.     If (Upper(ToWho) = Upper(MyNick) | AlwaysPriv = TRUE) then Do
  940.       "Raw Notice "Nick" :I'm Sorry you entered an invalid amount..."
  941.       "Raw Notice "Nick" :Try using "D2C(2)||Trigger||"Exchange {Amount} {From Currency} {To Currency}"D2C(2)
  942.     End
  943.     Else Do
  944.       "Say /Notice "ToWho" "Nick": I'm Sorry you entered an invalid amount..."
  945.       "Say /Notice "ToWho" "Nick": Try using "D2C(2)||Trigger||"Exchange {Amount} {From Currency} {To Currency}"D2C(2)
  946.     End
  947.   END
  948.   ELSE DO
  949.     SELECT
  950.       WHEN Strip(Cur1) = "ARP" Then FromCurr = "Argentine Pesos"
  951.       WHEN Strip(Cur1) = "ATS" Then FromCurr = "Austrian Schillings"
  952.       WHEN Strip(Cur1) = "AUD" Then FromCurr = "Australian Dollars"
  953.       WHEN Strip(Cur1) = "BBD" Then FromCurr = "Barbados Dollars"
  954.       WHEN Strip(Cur1) = "BEF" Then FromCurr = "Belgium Francs"
  955.       WHEN Strip(Cur1) = "BGL" Then FromCurr = "Bulgarian Lev"
  956.       WHEN Strip(Cur1) = "BMD" Then FromCurr = "Bermuda Dollars"
  957.       WHEN Strip(Cur1) = "BRR" Then FromCurr = "Brazilian Real"
  958.       WHEN Strip(Cur1) = "BSD" Then FromCurr = "Bahamas Dollars"
  959.       WHEN Strip(Cur1) = "CAD" Then FromCurr = "Canadian Dollars"
  960.       WHEN Strip(Cur1) = "CHF" Then FromCurr = "Swiss Francs"
  961.       WHEN Strip(Cur1) = "CLP" Then FromCurr = "Chilean Pesos"
  962.       WHEN Strip(Cur1) = "CNY" Then FromCurr = "Chinese Yuan Renmimbi"
  963.       WHEN Strip(Cur1) = "CSK" Then FromCurr = "Czech Republic Koruna"
  964.       WHEN Strip(Cur1) = "CYP" Then FromCurr = "Cyprus Pounds"
  965.       WHEN Strip(Cur1) = "DEM" Then FromCurr = "German Deutsche Marks"
  966.       WHEN Strip(Cur1) = "DKK" Then FromCurr = "Danish Kroner"
  967.       WHEN Strip(Cur1) = "DZD" Then FromCurr = "Algerian Dinars"
  968.       WHEN Strip(Cur1) = "EGP" Then FromCurr = "Egyptian Pounds"
  969.       WHEN Strip(Cur1) = "ESP" Then FromCurr = "Spanish Pesetas"
  970.       WHEN Strip(Cur1) = "EUR" Then FromCurr = "European Currency"
  971.       WHEN Strip(Cur1) = "FIM" Then FromCurr = "Finnish Markka"
  972.       WHEN Strip(Cur1) = "FJD" Then FromCurr = "Fijian Dollars"
  973.       WHEN Strip(Cur1) = "FRF" Then FromCurr = "French Francs"
  974.       WHEN Strip(Cur1) = "GBP" Then FromCurr = "British Pounds"
  975.       WHEN Strip(Cur1) = "GRD" Then FromCurr = "Greek Drachmas"
  976.       WHEN Strip(Cur1) = "HKD" Then FromCurr = "Hong Kong Dollars"
  977.       WHEN Strip(Cur1) = "HUF" Then FromCurr = "Hungarian Forint"
  978.       WHEN Strip(Cur1) = "IDR" Then FromCurr = "Indonesian Rupiah"
  979.       WHEN Strip(Cur1) = "IEP" Then FromCurr = "Irish Punt"
  980.       WHEN Strip(Cur1) = "ILS" Then FromCurr = "Israeli New Shekels"
  981.       WHEN Strip(Cur1) = "INR" Then FromCurr = "Indian Rupees"
  982.       WHEN Strip(Cur1) = "ISK" Then FromCurr = "Icelandic Krona"
  983.       WHEN Strip(Cur1) = "ITL" Then FromCurr = "Italian Lira"
  984.       WHEN Strip(Cur1) = "JMD" Then FromCurr = "Jamaican Dollars"
  985.       WHEN Strip(Cur1) = "JOD" Then FromCurr = "Jordan Dinar"
  986.       WHEN Strip(Cur1) = "JPY" Then FromCurr = "Japanese Yen"
  987.       WHEN Strip(Cur1) = "KRW" Then FromCurr = "South Korean Won"
  988.       WHEN Strip(Cur1) = "LBP" Then FromCurr = "Lebanonise Pounds"
  989.       WHEN Strip(Cur1) = "LUF" Then FromCurr = "Luxembourg Francs"
  990.       WHEN Strip(Cur1) = "MXP" Then FromCurr = "Mexican Pesos"
  991.       WHEN Strip(Cur1) = "MYR" Then FromCurr = "Malaysian Ringgit"
  992.       WHEN Strip(Cur1) = "NLG" Then FromCurr = "Dutch Guilders"
  993.       WHEN Strip(Cur1) = "NOK" Then FromCurr = "Norwegian Kroner"
  994.       WHEN Strip(Cur1) = "NZD" Then FromCurr = "New Zealand Dollars"
  995.       WHEN Strip(Cur1) = "PHP" Then FromCurr = "Philippine Pesos"
  996.       WHEN Strip(Cur1) = "PKR" Then FromCurr = "Pakistan Rupees"
  997.       WHEN Strip(Cur1) = "PLZ" Then FromCurr = "Polish Zloty"
  998.       WHEN Strip(Cur1) = "PTE" Then FromCurr = "Portugese Escudo"
  999.       WHEN Strip(Cur1) = "ROL" Then FromCurr = "Romanian Leu"
  1000.       WHEN Strip(Cur1) = "RUR" Then FromCurr = "Russian Rubles"
  1001.       WHEN Strip(Cur1) = "SAR" Then FromCurr = "Saudi Arabian Riyal"
  1002.       WHEN Strip(Cur1) = "SDD" Then FromCurr = "Sudanese Dinar"
  1003.       WHEN Strip(Cur1) = "SEK" Then FromCurr = "Swedish Krona"
  1004.       WHEN Strip(Cur1) = "SGD" Then FromCurr = "Singapore Dollars"
  1005.       WHEN Strip(Cur1) = "SKK" Then FromCurr = "Slovakia Koruna"
  1006.       WHEN Strip(Cur1) = "THB" Then FromCurr = "Thailand Baht"
  1007.       WHEN Strip(Cur1) = "TRL" Then FromCurr = "Turkish Lira"
  1008.       WHEN Strip(Cur1) = "TTD" Then FromCurr = "Trinidad and Tobago Dollars"
  1009.       WHEN Strip(Cur1) = "TWD" Then FromCurr = "Taiwanese Dollars"
  1010.       WHEN Strip(Cur1) = "USD" Then FromCurr = "American Dollars"
  1011.       WHEN Strip(Cur1) = "VEB" Then FromCurr = "Venezuelan Bolivar"
  1012.       WHEN Strip(Cur1) = "XAG" Then FromCurr = "Silver Ounces"
  1013.       WHEN Strip(Cur1) = "XAU" Then FromCurr = "Gold Ounces"
  1014.       WHEN Strip(Cur1) = "XCD" Then FromCurr = "Eastern Caribbean Dollars"
  1015.       WHEN Strip(Cur1) = "XDR" Then FromCurr = "Special Drawing Right (IMF)"
  1016.       WHEN Strip(Cur1) = "XPD" Then FromCurr = "Palladium Ounces"
  1017.       WHEN Strip(Cur1) = "XPT" Then FromCurr = "Platinum Ounces"
  1018.       WHEN Strip(Cur1) = "ZAR" Then FromCurr = "South African Rand"
  1019.       WHEN Strip(Cur1) = "ZMK" Then FromCurr = "Zambia Kwacha"
  1020.       OTHERWISE Do
  1021.         'Raw Notice 'Nick' :'cur1 'is an unknown Country code. Try '||Trigger||'EXCHANGE LIST <ALL or Letter> where Letter is first letter of country you are looking for.'
  1022.         Signal MainLoop
  1023.       End
  1024.     END
  1025.  
  1026.     SELECT
  1027.       WHEN Strip(Cur2) = "ARP" Then ToCurr = "Argentine Pesos"
  1028.       WHEN Strip(Cur2) = "ATS" Then ToCurr = "Austrian Schillings"
  1029.       WHEN Strip(Cur2) = "AUD" Then ToCurr = "Australian Dollars"
  1030.       WHEN Strip(Cur2) = "BBD" Then ToCurr = "Barbados Dollars"
  1031.       WHEN Strip(Cur2) = "BEF" Then ToCurr = "Belgium Francs"
  1032.       WHEN Strip(Cur2) = "BGL" Then ToCurr = "Bulgarian Lev"
  1033.       WHEN Strip(Cur2) = "BMD" Then ToCurr = "Bermuda Dollars"
  1034.       WHEN Strip(Cur2) = "BRR" Then ToCurr = "Brazilian Real"
  1035.       WHEN Strip(Cur2) = "BSD" Then ToCurr = "Bahamas Dollars"
  1036.       WHEN Strip(Cur2) = "CAD" Then ToCurr = "Canadian Dollars"
  1037.       WHEN Strip(Cur2) = "CHF" Then ToCurr = "Swiss Francs"
  1038.       WHEN Strip(Cur2) = "CLP" Then ToCurr = "Chilean Pesos"
  1039.       WHEN Strip(Cur2) = "CNY" Then ToCurr = "Chinese Yuan Renmimbi"
  1040.       WHEN Strip(Cur2) = "CSK" Then ToCurr = "Czech Republic Koruna"
  1041.       WHEN Strip(Cur2) = "CYP" Then ToCurr = "Cyprus Pounds"
  1042.       WHEN Strip(Cur2) = "DEM" Then ToCurr = "German Deutsche Marks"
  1043.       WHEN Strip(Cur2) = "DKK" Then ToCurr = "Danish Kroner"
  1044.       WHEN Strip(Cur2) = "DZD" Then ToCurr = "Algerian Dinars"
  1045.       WHEN Strip(Cur2) = "EGP" Then ToCurr = "Egyptian Pounds"
  1046.       WHEN Strip(Cur2) = "ESP" Then ToCurr = "Spanish Pesetas"
  1047.       WHEN Strip(Cur2) = "EUR" Then ToCurr = "European Currency"
  1048.       WHEN Strip(Cur2) = "FIM" Then ToCurr = "Finnish Markka"
  1049.       WHEN Strip(Cur2) = "FJD" Then ToCurr = "Fijian Dollars"
  1050.       WHEN Strip(Cur2) = "FRF" Then ToCurr = "French Francs"
  1051.       WHEN Strip(Cur2) = "GBP" Then ToCurr = "British Pounds"
  1052.       WHEN Strip(Cur2) = "GRD" Then ToCurr = "Greek Drachmas"
  1053.       WHEN Strip(Cur2) = "HKD" Then ToCurr = "Hong Kong Dollars"
  1054.       WHEN Strip(Cur2) = "HUF" Then ToCurr = "Hungarian Forint"
  1055.       WHEN Strip(Cur2) = "IDR" Then ToCurr = "Indonesian Rupiah"
  1056.       WHEN Strip(Cur2) = "IEP" Then ToCurr = "Irish Punt"
  1057.       WHEN Strip(Cur2) = "ILS" Then ToCurr = "Israeli New Shekels"
  1058.       WHEN Strip(Cur2) = "INR" Then ToCurr = "Indian Rupees"
  1059.       WHEN Strip(Cur2) = "ISK" Then ToCurr = "Icelandic Krona"
  1060.       WHEN Strip(Cur2) = "ITL" Then ToCurr = "Italian Lira"
  1061.       WHEN Strip(Cur2) = "JMD" Then ToCurr = "Jamaican Dollars"
  1062.       WHEN Strip(Cur2) = "JOD" Then ToCurr = "Jordan Dinar"
  1063.       WHEN Strip(Cur2) = "JPY" Then ToCurr = "Japanese Yen"
  1064.       WHEN Strip(Cur2) = "KRW" Then ToCurr = "South Korean Won"
  1065.       WHEN Strip(Cur2) = "LBP" Then ToCurr = "Lebanonise Pounds"
  1066.       WHEN Strip(Cur2) = "LUF" Then ToCurr = "Luxembourg Francs"
  1067.       WHEN Strip(Cur2) = "MXP" Then ToCurr = "Mexican Pesos"
  1068.       WHEN Strip(Cur2) = "MYR" Then ToCurr = "Malaysian Ringgit"
  1069.       WHEN Strip(Cur2) = "NLG" Then ToCurr = "Dutch Guilders"
  1070.       WHEN Strip(Cur2) = "NOK" Then ToCurr = "Norwegian Kroner"
  1071.       WHEN Strip(Cur2) = "NZD" Then ToCurr = "New Zealand Dollars"
  1072.       WHEN Strip(Cur2) = "PHP" Then ToCurr = "Philippine Pesos"
  1073.       WHEN Strip(Cur2) = "PKR" Then ToCurr = "Pakistan Rupees"
  1074.       WHEN Strip(Cur2) = "PLZ" Then ToCurr = "Polish Zloty"
  1075.       WHEN Strip(Cur2) = "PTE" Then ToCurr = "Portugese Escudo"
  1076.       WHEN Strip(Cur2) = "ROL" Then ToCurr = "Romanian Leu"
  1077.       WHEN Strip(Cur2) = "RUR" Then ToCurr = "Russian Rubles"
  1078.       WHEN Strip(Cur2) = "SAR" Then ToCurr = "Saudi Arabian Riyal"
  1079.       WHEN Strip(Cur2) = "SDD" Then ToCurr = "Sudanese Dinar"
  1080.       WHEN Strip(Cur2) = "SEK" Then ToCurr = "Swedish Krona"
  1081.       WHEN Strip(Cur2) = "SGD" Then ToCurr = "Singapore Dollars"
  1082.       WHEN Strip(Cur2) = "SKK" Then ToCurr = "Slovakia Koruna"
  1083.       WHEN Strip(Cur2) = "THB" Then ToCurr = "Thailand Baht"
  1084.       WHEN Strip(Cur2) = "TRL" Then ToCurr = "Turkish Lira"
  1085.       WHEN Strip(Cur2) = "TTD" Then ToCurr = "Trinidad and Tobago Dollars"
  1086.       WHEN Strip(Cur2) = "TWD" Then ToCurr = "Taiwanese Dollars"
  1087.       WHEN Strip(Cur2) = "USD" Then ToCurr = "American Dollars"
  1088.       WHEN Strip(Cur2) = "VEB" Then ToCurr = "Venezuelan Bolivar"
  1089.       WHEN Strip(Cur2) = "XAG" Then ToCurr = "Silver Ounces"
  1090.       WHEN Strip(Cur2) = "XAU" Then ToCurr = "Gold Ounces"
  1091.       WHEN Strip(Cur2) = "XCD" Then ToCurr = "Eastern Caribbean Dollars"
  1092.       WHEN Strip(Cur2) = "XDR" Then ToCurr = "Special Drawing Right (IMF)"
  1093.       WHEN Strip(Cur2) = "XPD" Then ToCurr = "Palladium Ounces"
  1094.       WHEN Strip(Cur2) = "XPT" Then ToCurr = "Platinum Ounces"
  1095.       WHEN Strip(Cur2) = "ZAR" Then ToCurr = "South African Rand"
  1096.       WHEN Strip(Cur2) = "ZMK" Then ToCurr = "Zambia Kwacha"
  1097.       OTHERWISE Do
  1098.         'Raw Notice 'Nick' :'cur2 'is an unknown Country code. Try '||Trigger||'EXCHANGE LIST <ALL or Letter> where Letter is first letter of country you are looking for.'
  1099.         Signal MainLoop
  1100.       End
  1101.     END
  1102.  
  1103.     ratesendline ='Amount='amount'&From='cur1'&To='cur2
  1104.     contentlength = length(ratesendline)
  1105.  
  1106.     IF ~SHOWLIST(H,'TCP') THEN ADDRESS COMMAND 'Mount TCP:'
  1107.     IF SHOWLIST(H,'TCP') THEN DO
  1108.       IF OPEN(1,'TCP:www.xe.net/80','W') THEN DO
  1109.         CALL WRITECH(1,'POST /cgi-bin/ucc/convert HTTP/1.0')
  1110.         CALL WRITECH(1,'User-Agent: CTCP-Master/1.12; (AmIRC Extension Package)'||crnl)
  1111.         CALL WRITECH(1,'Accept: *;q=1'||crnl)
  1112.         CALL WRITECH(1,'Host: www.xe.net'||crnl)
  1113.         CALL WRITECH(1,'Content-Length: 'contentlength||crnl)
  1114.         CALL WRITECH(1,'Content-Type: application/x-www-form-urlencodedwidth'||crnl)
  1115.         CALL WRITECH(1,crnl)
  1116.         CALL WRITECH(1,ratesendline||crnl)
  1117.  
  1118.         txt=READLN(1)
  1119.         IF SUBWORD(txt,2,1)='500' THEN DO
  1120.           'ECHO P='d2c(27)'b«CTCPMaster» Server Error!'
  1121.           CALL WRITELN(1,'Quit')
  1122.           CALL CLOSE(1)
  1123.         END
  1124.         ELSE IF SUBWORD(txt,2,1)='200' THEN DO
  1125.           DO UNTIL EOF(1)
  1126.             txt=READLN(1)
  1127.             IF subword(txt,2,2)='as of' THEN DO
  1128.               OnDate = Translate(Date("N",Compress(Word(txt,4),"."),"S"),"-"," ")
  1129.             END
  1130.             IF Left(Word(txt,8),3) = cur1 then Do
  1131.                parse var txt blah '<B>' d1 '</B>' blah .
  1132.             END
  1133.             IF Left(Word(txt,8),3) = cur2 then Do
  1134.                parse var txt blah '<B>' d2 '</B>' blah .
  1135.                d2 = left(word(d2,1),pos(".",d2)+2)||" "||word(d2,2)
  1136.             END
  1137.           END
  1138.           CALL WRITELN(1,'Quit')
  1139.           CALL CLOSE(1)
  1140.           dataline = d1||' ('||FromCurr||') is worth '||d2||' ('||ToCurr||')'
  1141.           If (Upper(ToWho) = Upper(MyNick) | AlwaysPriv = TRUE) then 'Raw Notice 'Nick' :On 'OnDate',' dataline 'at http://www.xe.net/ucc/'
  1142.           Else 'Say /Notice 'ToWho' 'Nick': On 'OnDate',' dataline 'at http://www.xe.net/ucc/'
  1143.         END
  1144.       END
  1145.     END
  1146.   END
  1147. END
  1148. If (Type = "PRIVMSG") & (Upper(Word(Rest,1)) = Trigger||"STOCK") then DO
  1149.   If Words(Rest) = 2 then DO
  1150.   Avail = TRUE
  1151.     SSym = Upper(Word(Rest,2))
  1152.     IF ~SHOWLIST(H,'TCP') THEN ADDRESS COMMAND 'Mount TCP:'
  1153.     IF SHOWLIST(H,'TCP') THEN DO
  1154.       IF OPEN(1,'TCP:www.snap.com/80','W') THEN DO
  1155.         CALL WRITECH(1,'GET /main/finance/stock/quote/1,204,-1,00.html?ticker='SSym' HTTP/1.0')
  1156.         CALL WRITECH(1,'User-Agent: CTCP-Master/1.12; (AmIRC Extension Package)'||crnl)
  1157.         CALL WRITECH(1,'Accept: *;q=1'||crnl)
  1158.         CALL WRITECH(1,'Accept-Language: en'||crnl)
  1159.         CALL WRITECH(1,'Host: www.snap.com'||crnl)
  1160.         CALL WRITECH(1,'Referer: http://www.snap.com/main/channel/0,2,-mn,00.html?st.sn.fdfv.0.ic-mn'||crnl)
  1161.         CALL WRITECH(1,crnl)
  1162.         txt = readln(1)
  1163.         IF SUBWORD(txt,2,1)='500' THEN DO
  1164.           'ECHO P='d2c(27)'b«CTCPMaster» Server Error!'
  1165.           CALL WRITELN(1,'Quit')
  1166.           CALL CLOSE(1)
  1167.         END
  1168.         ELSE IF SUBWORD(txt,2,1)='200' THEN DO
  1169.           DO UNTIL EOF(1)
  1170.             txt=READLN(1)
  1171.             If txt ~= "" THEN DO
  1172.               If txt = '<font face="Arial,Helvetica" size=-1><b>'SSym'  ' then Do
  1173.                 txt = readln(1)
  1174.                 txt = readln(1)
  1175.                 Parse VAR txt Curr'   '
  1176.                 txt = readln(1)
  1177.                 Parse VAR txt '">'Change'</font>'
  1178.                 txt = readln(1)
  1179.                 Parse VAR txt '">'PerChange'</font></b></font><br><font face="Arial,Helvetica" size=-2>'Company'</font><br>'
  1180.               END
  1181.               If Pos("Data not available for",txt) > 0 then Avail = FALSE
  1182.             END
  1183.           END
  1184.           CALL WRITELN(1,'Quit')
  1185.           CALL CLOSE(1)
  1186.           If Avail = TRUE then Do
  1187.             If (Upper(ToWho) = Upper(MyNick) | AlwaysPriv = TRUE) then 'Raw Notice 'Nick' :Latest Quote for 'Company': 'Curr', 'Change', 'PerChange'.'
  1188.             Else 'Say /Notice 'ToWho' 'Nick': Latest Quote for 'Company': 'Curr', 'Change', 'PerChange'.'
  1189.           END
  1190.           Else Do
  1191.             If (Upper(ToWho) = Upper(MyNick) | AlwaysPriv = TRUE) then 'Raw Notice 'Nick' :Data not available for 'SSym'.'
  1192.             Else 'Say /Notice 'ToWho' 'Nick': Data not available for 'SSym'.'
  1193.           END
  1194.         END
  1195.       END
  1196.     END
  1197.   END
  1198. END
  1199. If (Type = "PRIVMSG") & (Upper(Word(Rest,1)) = Trigger||"HOROSCOPE") then DO
  1200.   If Words(Rest) = 2 then DO
  1201.     signID = "0"
  1202.     StarSign = Upper(Word(Rest,2))
  1203.     If Left(StarSign,3) = "ARI" then signID = "1"
  1204.     If Left(StarSign,3) = "TAU" then signID = "2"
  1205.     If Left(StarSign,3) = "GEM" then signID = "3"
  1206.     If Left(StarSign,3) = "CAN" then signID = "4"
  1207.     If Left(StarSign,3) = "LEO" then signID = "5"
  1208.     If Left(StarSign,3) = "VIR" then signID = "6"
  1209.     If Left(StarSign,3) = "LIB" then signID = "7"
  1210.     If Left(StarSign,3) = "SCO" then signID = "8"
  1211.     If Left(StarSign,3) = "SAG" then signID = "9"
  1212.     If Left(StarSign,3) = "CAP" then signID = "10"
  1213.     If Left(StarSign,3) = "AQU" then signID = "11"
  1214.     If Left(StarSign,3) = "PIS" then signID = "12"
  1215.     IF ~SHOWLIST(H,'TCP') THEN ADDRESS COMMAND 'Mount TCP:'
  1216.     IF SHOWLIST(H,'TCP') THEN DO
  1217.       IF OPEN(1,'TCP:www.snap.com/80','W') THEN DO
  1218.         CALL WRITECH(1,'GET /main/commodity/horoscope/0,25,home-'signID',00.html HTTP/1.0')
  1219.         CALL WRITECH(1,'User-Agent: CTCP-Master/1.12; (AmIRC Extension Package)'||crnl)
  1220.         CALL WRITECH(1,'Accept: *;q=1'||crnl)
  1221.         CALL WRITECH(1,'Accept-Language: en'||crnl)
  1222.         CALL WRITECH(1,'Host: www.snap.com'||crnl)
  1223.         CALL WRITECH(1,'Referer: http://www.snap.com/main/commodity/horoscope/0,25,home-0,00.html'||crnl)
  1224.         CALL WRITECH(1,crnl)
  1225.         txt = readln(1)
  1226.         IF SUBWORD(txt,2,1)='500' THEN DO
  1227.           'ECHO P='d2c(27)'b«CTCPMaster» Server Error!'
  1228.           CALL WRITELN(1,'Quit')
  1229.           CALL CLOSE(1)
  1230.         END
  1231.         ELSE IF SUBWORD(txt,2,1)='200' THEN DO
  1232.           DO UNTIL EOF(1)
  1233.             txt=READLN(1)
  1234.             If txt ~= "" THEN DO
  1235.               If Left(txt,36) = '<td><font face="Arial,Helvetica"><b>' then Do
  1236.                 Parse VAR txt '<td><font face="Arial,Helvetica"><b>'StarSign'</b></font> <font face="Arial,Helvetica" size="-1">'StarDate'<br clear="left"><br>'
  1237.                 txt = readln(1)
  1238.                 txt = readln(1)
  1239.                 txt = readln(1)
  1240.                 Parse VAR txt Horoscope'<br><font size=-2>'
  1241.                 Leave
  1242.               END
  1243.             END
  1244.           END
  1245.           CALL WRITELN(1,'Quit')
  1246.           CALL CLOSE(1)
  1247.           'Raw Notice 'Nick' :'d2c(2)||StarSign' 'StarDate||d2c(2)
  1248.           TempScope = ""
  1249.           Do PLoop = 1 to Words(Horoscope)
  1250.             TempScope = TempScope||Word(Horoscope,PLoop)||" "
  1251.             If Length(TempScope) > 80 then Do
  1252.               'Raw Notice 'Nick' :'TempScope
  1253.               TempScope = ""
  1254.             END
  1255.           END
  1256.           If Length(TempScope) > 1 then 'Raw Notice 'Nick' :'TempScope
  1257.         END
  1258.       END
  1259.     END
  1260.   END
  1261. END
  1262. If (Type = "PRIVMSG") & (Upper(Word(Rest,1)) = Trigger||"TEMP") then Do
  1263.   If Words(Rest) = 1 then Rest = Rest||" 78660"
  1264.   CityZip = SubWord(Rest,2)
  1265.   ZIP = Translate(CityZip,"+"," ")
  1266.   NewCity = "NOWHERE"
  1267.   IF ~SHOWLIST(H,'TCP') THEN ADDRESS COMMAND 'Mount TCP:'
  1268.   IF SHOWLIST(H,'TCP') THEN DO
  1269.     IF OPEN(1,'TCP:www.wunderground.com/80','W') THEN DO
  1270.       CALL WRITECH(1,'GET /cgi-bin/findweather/getForecast?query='ZIP' HTTP/1.1')
  1271.       CALL WRITECH(1,'User-Agent: CTCP-Master/1.12; (AmIRC Extension Package)'||crnl)
  1272.       CALL WRITECH(1,'Accept: *;q=1'||crnl)
  1273.       CALL WRITECH(1,'Accept-Language: en'||crnl)
  1274.       CALL WRITECH(1,'Host: www.wunderground.com'||crnl)
  1275.       CALL WRITECH(1,'Referer: http://www.wunderground.com/cgi-bin/findweather/getForecast?query='ZIP||crnl)
  1276.       CALL WRITECH(1,crnl)
  1277.       txt=READLN(1)
  1278.       IF SUBWORD(txt,2,1)='500' THEN DO
  1279.         'ECHO P='d2c(27)'b«CTCPMaster» Server Error!'
  1280.         CALL WRITELN(1,'Quit')
  1281.         CALL CLOSE(1)
  1282.       END
  1283.       ELSE IF SUBWORD(txt,2,1)='200' THEN DO
  1284.         DO UNTIL EOF(1)
  1285.           txt=READLN(1)
  1286.           If txt ~= "" then Do
  1287.             IF Left(txt,37) = '<td><b><font size="+1" color=#ffffff>' Then Do
  1288.               Parse VAR txt '<td><b><font size="+1" color=#ffffff>'Location' Forecast'
  1289.             End
  1290.             IF Word(txt,1) = "Updated:" THEN DO
  1291.               Parse VAR txt "<b>"UpdateTime"</b>"
  1292.             END
  1293.             IF txt='<tr ><td>Temperature</td>' THEN DO
  1294.               txt = readln(1)
  1295.               Parse VAR txt 'F / <b>'CTemp'</b>'
  1296.               Parse VAR txt '<td><b>'FTemp'</b>'
  1297.               Parse VAR FTemp FTemp'°'
  1298.               If CTemp = "" then Temperature = FTemp||"°F"
  1299.               Else Temperature = FTemp||"°F / "CTemp"°C"
  1300.               NewCity = "FOUND"
  1301.               Leave
  1302.             END
  1303.             IF Left(txt,28)='<tr bgcolor=#ffffff  ><td  >' Then Do
  1304.               Parse VAR txt '.html">'Location'</a>'
  1305.               Parse VAR txt 'F / 'CTemp'° C'
  1306.               Parse VAR txt '<td>'FTemp'° F'
  1307.               If CTemp = "" then Temperature = FTemp||"°F"
  1308.               Else Temperature = FTemp||"°F / "CTemp"°C"
  1309.               NewCity = "FOUND"
  1310.               Leave
  1311.             END
  1312.             IF txt="We're sorry but the page you requested was not found." THEN DO
  1313.               NewCity = 'NOWHERE'
  1314.               Leave
  1315.             END
  1316.           END
  1317.         END
  1318.         CALL WRITELN(1,'Quit')
  1319.         CALL CLOSE(1)
  1320.         If NewCity = 'FOUND' then Do
  1321.           If (Upper(ToWho) = Upper(MyNick) | AlwaysPriv = TRUE) then 'Raw Notice 'Nick' :Last reported temperature for 'Location': 'Temperature' (at 'UpdateTime').'
  1322.           Else 'Say /Notice 'ToWho' 'Nick': Last reported temperature for 'Location': 'Temperature' (at 'UpdateTime').'
  1323.         End
  1324.         Else Do
  1325.           If (Upper(ToWho) = Upper(MyNick) | AlwaysPriv = TRUE) then 'Raw Notice 'Nick' :Sorry, 'CityZip' was not found in the weather database.'
  1326.           Else 'Say /Notice 'ToWho' 'Nick': Sorry, 'CityZip' was not found in the weather database.'
  1327.         END
  1328.       END
  1329.     END
  1330.   END
  1331. End
  1332. If (Type = "PRIVMSG") & (Upper(Word(Rest,1)) = Trigger||"WEATHER" | Upper(Word(Rest,1)) = Trigger||"FORECAST" ) then Do
  1333.   If Words(Rest) = 1 then Rest = Rest||" 78660"
  1334.   CityZip = SubWord(Rest,2)
  1335.   Forecast = "" ; fc = 1
  1336.   ZIP = Translate(CityZip,"+"," ")
  1337.   NewCity = "NOWHERE"
  1338.   IF ~SHOWLIST(H,'TCP') THEN ADDRESS COMMAND 'Mount TCP:'
  1339.   IF SHOWLIST(H,'TCP') THEN DO
  1340.     IF OPEN(1,'TCP:www.wunderground.com/80','W') THEN DO
  1341.       CALL WRITECH(1,'GET /cgi-bin/findweather/getForecast?query='ZIP' HTTP/1.1')
  1342.       CALL WRITECH(1,'User-Agent: CTCP-Master/1.12; (AmIRC Extension Package)'||crnl)
  1343.       CALL WRITECH(1,'Accept: *;q=1'||crnl)
  1344.       CALL WRITECH(1,'Accept-Language: en'||crnl)
  1345.       CALL WRITECH(1,'Host: www.wunderground.com'||crnl)
  1346.       CALL WRITECH(1,'Referer: http://www.wunderground.com/cgi-bin/findweather/getForecast?query='ZIP||crnl)
  1347.       CALL WRITECH(1,crnl)
  1348.       txt=READLN(1)
  1349.       IF SUBWORD(txt,2,1)='500' THEN DO
  1350.         'ECHO P='d2c(27)'b«CTCPMaster» Server Error!'
  1351.         CALL WRITELN(1,'Quit')
  1352.         CALL CLOSE(1)
  1353.       END
  1354.       ELSE IF SUBWORD(txt,2,1)='200' THEN DO
  1355.         DO UNTIL EOF(1)
  1356.           txt=READLN(1)
  1357.           If txt ~= "" then Do
  1358.             IF Left(txt,37) = '<td><b><font size="+1" color=#ffffff>' Then Do
  1359.               Parse VAR txt '<td><b><font size="+1" color=#ffffff>'Location' Forecast'
  1360.             End
  1361.             IF Word(txt,1) = "Updated:" THEN DO
  1362.               Parse VAR txt "<b>"UpdateTime"</b>"
  1363.             END
  1364.             IF txt='<tr ><td>Temperature</td>' THEN DO
  1365.               txt = readln(1)
  1366.               Parse VAR txt 'F / <b>'CTemp'</b>'
  1367.               Parse VAR txt '<td><b>'FTemp'</b>'
  1368.               Parse VAR FTemp FTemp'°'
  1369.               If CTemp = "" then Temperature = FTemp||"°F"
  1370.               Else Temperature = FTemp||"°F / "CTemp"°C"
  1371.               NewCity = "FOUND"
  1372.             END
  1373.             IF txt='<tr ><td>Humidity</td>' THEN DO
  1374.               txt = readln(1)
  1375.               Parse VAR txt '<td><b>'Humid'</b>'
  1376.             END
  1377.             IF txt='<tr ><td>Dewpoint</td>' THEN DO
  1378.               txt = readln(1)
  1379.               Parse VAR txt 'F / <b>'CDew'</b>'
  1380.               Parse VAR txt '<td><b>'FDew'</b>'
  1381.               Parse VAR FDew FDew'°'
  1382.               If CDew = "" then DewPoint = FDew||"°F"
  1383.               Else DewPoint = FDew||"°F / "CDew"°C"
  1384.             END
  1385.             IF txt='<tr ><td>Wind</td>' THEN DO
  1386.               txt = readln(1)
  1387.               Parse VAR txt '<td><b>'WDir'</b>'
  1388.               Parse VAR txt 'at <b>'MPH'</b>'
  1389.               If MPH = "" then MPH = 0
  1390.             END
  1391.             IF txt='<tr ><td>Conditions</td>' THEN DO
  1392.               txt = readln(1)
  1393.               Parse VAR txt '<td><b>'Cond'</b></td></tr>'
  1394.             END
  1395.             IF Left(txt,28)='<tr bgcolor=#ffffff  ><td  >' THEN DO
  1396.               Parse VAR txt '.html">'Location'</a>'
  1397.               Parse VAR txt 'F / 'CTemp'° C'
  1398.               Parse VAR txt '<td>'FTemp'° F'
  1399.               If CTemp = "" then Temperature = FTemp||"°F"
  1400.               Else Temperature = FTemp||"°F / "CTemp"°C"
  1401.               NewCity = "FOUND"
  1402.             END
  1403.             IF Left(txt,61)='<table width=100%><tr bgcolor=#000080><td><font color=ffffff>' THEN DO
  1404.               ftxt = " as of"||readln(1)
  1405.             END
  1406.             IF Left(txt,18)='<td align=left><b>' THEN DO
  1407.               Parse VAR txt '<td align=left><b>'Period'</b><br>'
  1408.               Forecast.fc = d2c(2)||Period||d2c(2)||": "readln(1)
  1409.               fc = fc + 1
  1410.             END
  1411.             IF Left(txt,19) = '<center><b>Updated:' THEN DO
  1412.               Parse VAR txt '<center><b>Updated:'ftxt'</b></center><br>'
  1413.               ftxt = ' as of'||ftxt
  1414.             END
  1415.             IF txt = '<td align=left>' THEN DO
  1416.               txt = readln(1)
  1417.               Parse VAR txt '<b>'Period'</b><br>'
  1418.               Forecast.fc = d2c(2)||Period||d2c(2)||": "readln(1)
  1419.               Forecast.fc = Left(Forecast.fc,Pos('°',Forecast.fc)-1)||'°'||SubStr(Forecast.fc,Pos('°',Forecast.fc)+6)
  1420.               Forecast.fc = Left(Forecast.fc,Pos('°',Forecast.fc)-1)||'°'||SubStr(Forecast.fc,Pos('°',Forecast.fc)+6)
  1421.               fc = fc + 1
  1422.             END
  1423.             IF txt="We're sorry but the page you requested was not found." THEN DO
  1424.               NewCity = 'NOWHERE'
  1425.               Leave
  1426.             END
  1427.           END
  1428.         END
  1429.         CALL WRITELN(1,'Quit')
  1430.         CALL CLOSE(1)
  1431.         If NewCity = 'FOUND' then Do
  1432.           If (Upper(ToWho) = Upper(MyNick) | AlwaysPriv = TRUE) then Do
  1433.             'Raw Notice 'Nick' :Last reported weather for 'Location' as of 'UpdateTime'.'
  1434.             'Raw Notice 'Nick' :Temp 'Temperature', Humidity 'Humid', Dewpoint 'DewPoint', Wind 'WDir' at 'MPH'mph, Conditions 'Cond'.'
  1435.             If Upper(Word(Rest,1)) = Trigger||"FORECAST" Then DO
  1436.               'Raw Notice 'Nick' :Extended Forecast for 'Location||ftxt||':'
  1437.               DO Floop = 1 TO fc - 1
  1438.                 'Raw Notice 'Nick' :'Forecast.Floop
  1439.               END
  1440.             END
  1441.           End
  1442.           Else Do
  1443.             'Say /Notice 'ToWho' Last reported weather for 'Location' as of 'UpdateTime'.'
  1444.             'Say /Notice 'ToWho' Temp 'Temperature', Humidity 'Humid', Dewpoint 'DewPoint', Wind 'WDir' at 'MPH'mph, Conditions 'Cond'.'
  1445.             If Upper(Word(Rest,1)) = Trigger||"FORECAST" Then DO
  1446.               'Raw Notice 'Nick' :Extended Forecast for 'Location||ftxt||':'
  1447.               DO Floop = 1 TO 7
  1448.                 'Raw Notice 'Nick' :'Forecast.Floop
  1449.               END
  1450.             END
  1451.           End
  1452.         End
  1453.         Else Do
  1454.           If (Upper(ToWho) = Upper(MyNick) | AlwaysPriv = TRUE) then 'Raw Notice 'Nick' :Sorry, 'CityZip' was not found in the weather database.'
  1455.           Else 'Say /Notice 'ToWho' 'Nick': Sorry, 'CityZip' was not found in the weather database.'
  1456.         END
  1457.       END
  1458.     END
  1459.   END
  1460. End
  1461. If (Type = "PRIVMSG") & (Upper(Word(Rest,1)) = Trigger||"ZIP") then Do
  1462.   ZIP = Word(Rest,2)
  1463.   sendline = "ctystzip="zip"&Submit=Process"
  1464.   contentlength = length(sendline)
  1465.   IF ~SHOWLIST(H,'TCP') THEN ADDRESS COMMAND 'Mount TCP:'
  1466.   IF SHOWLIST(H,'TCP') THEN DO
  1467.     IF OPEN(1,'TCP:www.usps.gov/80','W') THEN DO
  1468.       CALL WRITECH(1,'POST /cgi-bin/zip4/ctystzip2 HTTP/1.0')
  1469.       CALL WRITECH(1,'User-Agent: CTCP-Master/1.12; (AmIRC Extension Package)'||crnl)
  1470.       CALL WRITECH(1,'Accept: *;q=1'||crnl)
  1471.       CALL WRITECH(1,'Accept-Language: en'||crnl)
  1472.       CALL WRITECH(1,'Host: www.usps.gov'||crnl)
  1473.       CALL WRITECH(1,'Referer: http://www.usps.gov/ncsc/lookups/lookup_ctystzip.html'||crnl)
  1474.       CALL WRITECH(1,'Content-Type: application/x-www-form-urlencodedwidth'||crnl)
  1475.       CALL WRITECH(1,'Content-Length: 'contentlength||crnl)
  1476.       CALL WRITECH(1,crnl)
  1477.       CALL WRITECH(1,sendline||crnl)
  1478.       txt=READLN(1)
  1479.       IF SUBWORD(txt,2,1)='500' THEN DO
  1480.         'ECHO P='d2c(27)'b«CTCPMaster» Server Error!'
  1481.         CALL WRITELN(1,'Quit')
  1482.         CALL CLOSE(1)
  1483.       END
  1484.       ELSE IF SUBWORD(txt,2,1)='200' THEN DO
  1485.         DO UNTIL EOF(1)
  1486.           txt=READLN(1)
  1487.           If txt ~= "" then Do
  1488.             IF subword(txt,1,4)='For this ZIP Code,' THEN DO
  1489.               Parse VAR txt '<BR>'City'ACCEPTABLE'
  1490.               NewCity = SubWord(City,1,Words(City)-1)||", "Word(City,Words(City))
  1491.               Leave
  1492.             END
  1493.             IF subword(txt,1,4)='The ZIP Code you' THEN DO
  1494.               NewCity = 'NOWHERE'
  1495.               Leave
  1496.             END
  1497.           END
  1498.         END
  1499.         CALL WRITELN(1,'Quit')
  1500.         CALL CLOSE(1)
  1501.         If NewCity ~='NOWHERE' then Do
  1502.           If (Upper(ToWho) = Upper(MyNick) | AlwaysPriv = TRUE) then 'Raw Notice 'Nick' :Zip Code 'Zip' is assigned to 'NewCity'.'
  1503.           Else 'Say /Notice 'ToWho' 'Nick': Zip Code 'Zip' is assigned to 'NewCity'.'
  1504.         End
  1505.         Else Do
  1506.           If (Upper(ToWho) = Upper(MyNick) | AlwaysPriv = TRUE) then 'Raw Notice 'Nick' :Zip Code 'Zip' is not currently assigned.'
  1507.           Else 'Say /Notice 'ToWho' 'Nick': Zip Code 'Zip' is not currently assigned.'
  1508.         END
  1509.       END
  1510.     END
  1511.   END
  1512. End
  1513. If (Type = "PRIVMSG") & (Upper(Word(Rest,1)) = Trigger||"FIND") then Do
  1514.   Target = SubWord(Rest,2)
  1515.   CRNL = "0d0a"x
  1516.   sendline ='find?'||Target
  1517.   contentlength = length(sendline)
  1518.   IF ~SHOWLIST(H,'TCP') THEN ADDRESS COMMAND 'Mount TCP:'
  1519.   IF SHOWLIST(H,'TCP') THEN DO
  1520.     IF OPEN(1,'TCP:ftp.uni-paderborn.de/80','W') THEN DO
  1521.       CALL WRITECH(1,'POST /aminetbin/find?'||Target||' HTTP/1.0')
  1522.       CALL WRITECH(1,'User-Agent: CTCP-Master/1.12; (AmIRC Extension Package)'||crnl)
  1523.       CALL WRITECH(1,'Accept: *;q=1'||crnl)
  1524.       CALL WRITECH(1,'Host: wuarchive.wustl.edu'||crnl)
  1525.       CALL WRITECH(1,'Content-Length: 'contentlength||crnl)
  1526.       CALL WRITECH(1,'Content-Type: application/x-www-form-urlencodedwidth'||crnl)
  1527.       CALL WRITECH(1,crnl)
  1528.       CALL WRITECH(1,sendline||crnl)
  1529.       txt=READLN(1)
  1530.       IF SUBWORD(txt,2,1)='500' THEN DO
  1531.         'ECHO P='d2c(27)'b«CTCPMaster» Server Error!'
  1532.         CALL WRITELN(1,'Quit')
  1533.         CALL CLOSE(1)
  1534.       END
  1535.       ELSE IF SUBWORD(txt,2,1)='200' THEN DO
  1536.         Report = 0
  1537.         DO UNTIL EOF(1)
  1538.           txt=READLN(1)
  1539.           If Length(txt) > 0 then DO
  1540.             If Words(txt) >= 4 THEN DO
  1541.               If Word(txt,1) = "First" & SubWord(txt,3,2) = "files matching" then Do
  1542.                 'Raw Notice 'Nick' :Over 'SubWord(txt,2,3)' 'Target'.'
  1543.                 'Raw Notice 'Nick' :First 10 matches are listed.'
  1544.               End
  1545.               If SubWord(txt,2,2)='files matching' THEN DO
  1546.                 FoundFiles = Word(txt,1)
  1547.                 'Raw Notice 'Nick' :'SubWord(txt,1,4)
  1548.                 If FoundFiles > 10 Then 'Raw Notice 'Nick' :First 10 matches are listed.'
  1549.               END
  1550.             END
  1551.             IF Word(txt,1)='<hr><a' THEN DO
  1552.               txt = SubStr(txt,5)
  1553.             END
  1554.             If Left(Word(txt,2),5)='HREF=' THEN DO
  1555.               FilePath = Word(Translate(Word(txt,2)," ","/"),4)||"/"Word(Translate(Word(txt,2)," ","/"),5)
  1556.               FileComment = Strip(SubWord(Translate(Word(txt,8),"   ","</>"),7)||Subword(txt,9),"T","</A>")
  1557.               FileName = Word(Translate(Word(txt,2),"   ","</>"),7)
  1558.               'Raw Notice 'Nick' :'FileName||Copies(" ",25 - Length(FileName))||FilePath||Copies(" ",12 - Length(FilePath))||Right("   "||Word(txt,5),5)||"  "||FileComment
  1559.               Report = Report + 1
  1560.               Call Delay(75)
  1561.               If Report > 9 then Leave
  1562.             END
  1563.           END
  1564.         END
  1565.         CALL WRITELN(1,'Quit')
  1566.         CALL CLOSE(1)
  1567.       END
  1568.     END
  1569.     Else 'Echo Failed to connect to Aminet!'
  1570.   END
  1571. END
  1572. If (Type = "PRIVMSG") & (Upper(Word(Rest,1)) = Trigger||"MONTH") then Do
  1573.   Call Calendar
  1574. End
  1575. If (Type = "PRIVMSG") & (Upper(Word(Rest,1)) = Trigger||"TRANSLATE") then Do
  1576.   FromLang = Translate(Word(Rest,2),XRange("a","z"),XRange("A","Z"))
  1577.   ToLang = Translate(Word(Rest,3),XRange("a","z"),XRange("A","Z"))
  1578.   If FromLang = "from" then Do
  1579.     If ToLang = "spanish" then FromLang = "es"
  1580.     If ToLang = "french" then FromLang = "fr"
  1581.     If ToLang = "italian" then FromLang = "it"
  1582.     If ToLang = "german" then FromLang = "de"
  1583.     If ToLang = "portuguese" then FromLang = "pt"
  1584.     ToLang = "en"
  1585.   End
  1586.   If FromLang = "to" then Do
  1587.     If ToLang = "spanish" then ToLang = "es"
  1588.     If ToLang = "french" then ToLang = "fr"
  1589.     If ToLang = "italian" then ToLang = "it"
  1590.     If ToLang = "german" then ToLang = "de"
  1591.     If ToLang = "portuguese" then ToLang = "pt"
  1592.     FromLang = "en"
  1593.   End
  1594.   If FromLang ~= "es" & FromLang ~= "en" & FromLang ~= "fr" & FromLang ~= "de" & FromLang ~= "it" & FromLang ~= "pt" & ToLang ~= "es" & ToLang ~= "en" & ToLang ~= "fr" & ToLang ~= "de" & ToLang ~= "it" & ToLang ~= "pt" Then Do
  1595.     If (Upper(ToWho) = Upper(MyNick) | AlwaysPriv = TRUE) then Do
  1596.       'Raw Notice 'Nick' :Invalid language option.  EN-English, ES-Spanish, FR-French, DE-German, IT-Italian, or PT-Portuguese'
  1597.       'Raw Notice 'Nick' :Format is  '||Trigger||'TRANSLATE {From} {To} {Text to translate}'
  1598.       'Raw Notice 'Nick' :You must translate to or from English'
  1599.     End
  1600.     Else Do
  1601.       'Say /Notice 'ToWho' 'Nick': Invalid language option.  EN-English, ES-Spanish, FR-French, DE-German, IT-Italian, or PT-Portuguese'
  1602.       'Say /Notice 'ToWho' 'Nick': Format is  '||Trigger||'TRANSLATE {From} {To} {Text to translate}'
  1603.       'Say /Notice 'ToWho' 'Nick': You must translate to or from English'
  1604.     End
  1605.   End
  1606.   Phrase = Translate(SubWord(Rest,4),"+"," ")
  1607.   CRNL = "0d0a"x
  1608.   sendline ="doit=done&urltext="Phrase"&lp="FromLang"_"ToLang
  1609.   contentlength = length(sendline)
  1610.   IF ~SHOWLIST(H,'TCP') THEN ADDRESS COMMAND 'Mount TCP:'
  1611.   IF SHOWLIST(H,'TCP') THEN DO
  1612.     IF OPEN(1,'TCP:babelfish.altavista.com/80','W') THEN DO
  1613.       CALL WRITECH(1,'POST /cgi-bin/translate? HTTP/1.0')
  1614.       CALL WRITECH(1,'Referer: http://babelfish.altavista.com/cgi-bin/translate?'||sendline||crnl)
  1615.       CALL WRITECH(1,'User-Agent: CTCP-Master/1.12; (AmIRC Extension Package)'||crnl)
  1616.       CALL WRITECH(1,'Host: babelfish.altavista.com'||crnl)
  1617.       CALL WRITECH(1,'If-Modified-Since: 'Left(Date(W),3)||' '||Date()||' 'Time()' GMT'||crnl)
  1618.       CALL WRITECH(1,'Content-Length: 'contentlength||crnl)
  1619.       CALL WRITECH(1,'Content-Type: application/x-www-form-urlencoded'||crnl)
  1620.       CALL WRITECH(1,'Accept: text/html;level=3'||crnl)
  1621.       CALL WRITECH(1,'Accept: text/html;version=3.0'||crnl)
  1622.       CALL WRITECH(1,'Accept: */*'||crnl)
  1623.       CALL WRITECH(1,crnl)
  1624.       CALL WRITECH(1,sendline)
  1625.       txt=READLN(1)
  1626.       IF SUBWORD(txt,2,1)='500' THEN DO
  1627.         'ECHO P='d2c(27)'b«CTCPMaster» Server Error!'
  1628.         CALL WRITELN(1,'Quit')
  1629.         CALL CLOSE(1)
  1630.       END
  1631.       ELSE IF SUBWORD(txt,2,1)='200' THEN DO
  1632.         Report = 0
  1633.         DO UNTIL EOF(1)
  1634.           txt=READLN(1)
  1635.           If Length(txt) > 30 then DO
  1636.             If Left(txt,30) = '<font face="arial, helvetica">' & Right(txt,7) ~= "</font>" THEN DO
  1637.               NewPhrase = SubStr(txt,31)
  1638.               Do Forever
  1639.                 txt=READLN(1)
  1640.                 If Left(txt,8) = "<br><br>" then Break
  1641.                 NewPhrase = NewPhrase||" "||txt
  1642.               End
  1643.               If (Upper(ToWho) = Upper(MyNick) | AlwaysPriv = TRUE) then 'Raw Notice 'Nick' :Translation is "'NewPhrase'"'
  1644.               Else 'Say /Notice 'ToWho' 'Nick': Translation is "'NewPhrase'"'
  1645.             END
  1646.           END
  1647.         END
  1648.         CALL WRITELN(1,'Quit')
  1649.         CALL CLOSE(1)
  1650.       END
  1651.     END
  1652.     Else 'Echo Failed to connect to Altavista!'
  1653.   END
  1654. END
  1655. If Type = "PRIVMSG" then Do
  1656.   Do PLoop = 1 to NumPops
  1657.     If Left(PopKey.PLoop,1) = "*" & Right(PopKey.PLoop,1) = "*" then Do
  1658.       Do TLoop = 1 to Words(Rest)
  1659.         If Upper(Word(Rest,TLoop)) = Strip(Upper(PopKey.PLoop),"B","*") Then Do
  1660.           TextToSend = PopText.PLoop
  1661.           If (Upper(ToWho) = Upper(MyNick) | AlwaysPriv = TRUE) then Do
  1662.             TextToSend = '/Describe 'Nick' 'TextToSend
  1663.             If Pos("$1",TextToSend) > 0 Then TextToSend = Left(TextToSend,Pos("$1",TextToSend)-1)||"you"||SubStr(TextToSend,Pos("$1",TextToSend)+2)
  1664.             If Pos("$2",TextToSend) > 0 Then TextToSend = Left(TextToSend,Pos("$2",TextToSend)-1)||"your"||SubStr(TextToSend,Pos("$2",TextToSend)+2)
  1665.           END
  1666.           Else Do
  1667.             TextToSend = '/Describe 'ToWho' 'TextToSend
  1668.             If Pos("$1",TextToSend) > 0 Then TextToSend = Left(TextToSend,Pos("$1",TextToSend)-1)||Nick||SubStr(TextToSend,Pos("$1",TextToSend)+2)
  1669.             If Pos("$2",TextToSend) > 0 Then TextToSend = Left(TextToSend,Pos("$2",TextToSend)-1)||"their"||SubStr(TextToSend,Pos("$2",TextToSend)+2)
  1670.           END
  1671.           'Say 'TextToSend
  1672.           Leave PLoop
  1673.         END
  1674.       END
  1675.     END
  1676.     If Left(PopKey.PLoop,1) = "*" & Right(PopKey.PLoop,1) ~= "*" then Do
  1677.       TLoop = Words(Rest)
  1678.       If Upper(Word(Rest,TLoop)) = Strip(Upper(PopKey.PLoop),"B","*") Then Do
  1679.         TextToSend = PopText.PLoop
  1680.         If (Upper(ToWho) = Upper(MyNick) | AlwaysPriv = TRUE) then Do
  1681.           TextToSend = '/Describe 'Nick' 'TextToSend
  1682.           If Pos("$1",TextToSend) > 0 Then TextToSend = Left(TextToSend,Pos("$1",TextToSend)-1)||"you"||SubStr(TextToSend,Pos("$1",TextToSend)+2)
  1683.           If Pos("$2",TextToSend) > 0 Then TextToSend = Left(TextToSend,Pos("$2",TextToSend)-1)||"your"||SubStr(TextToSend,Pos("$2",TextToSend)+2)
  1684.         END
  1685.         Else Do
  1686.           TextToSend = '/Describe 'ToWho' 'TextToSend
  1687.           If Pos("$1",TextToSend) > 0 Then TextToSend = Left(TextToSend,Pos("$1",TextToSend)-1)||Nick||SubStr(TextToSend,Pos("$1",TextToSend)+2)
  1688.           If Pos("$2",TextToSend) > 0 Then TextToSend = Left(TextToSend,Pos("$2",TextToSend)-1)||"their"||SubStr(TextToSend,Pos("$2",TextToSend)+2)
  1689.         END
  1690.         'Say 'TextToSend
  1691.         Leave PLoop
  1692.       END
  1693.     END
  1694.     If (Left(PopKey.PLoop,1) ~= "*" & Right(PopKey.PLoop,1) = "*") then Do
  1695.       TLoop = 1
  1696.       If Upper(Word(Rest,TLoop)) = Strip(Upper(PopKey.PLoop),"B","*") Then Do
  1697.         TextToSend = PopText.PLoop
  1698.         If (Upper(ToWho) = Upper(MyNick) | AlwaysPriv = TRUE) then Do
  1699.           TextToSend = '/Describe 'Nick' 'TextToSend
  1700.           If Pos("$1",TextToSend) > 0 Then TextToSend = Left(TextToSend,Pos("$1",TextToSend)-1)||"you"||SubStr(TextToSend,Pos("$1",TextToSend)+2)
  1701.           If Pos("$2",TextToSend) > 0 Then TextToSend = Left(TextToSend,Pos("$2",TextToSend)-1)||"your"||SubStr(TextToSend,Pos("$2",TextToSend)+2)
  1702.         END
  1703.         Else Do
  1704.           TextToSend = '/Describe 'ToWho' 'TextToSend
  1705.           If Pos("$1",TextToSend) > 0 Then TextToSend = Left(TextToSend,Pos("$1",TextToSend)-1)||Nick||SubStr(TextToSend,Pos("$1",TextToSend)+2)
  1706.           If Pos("$2",TextToSend) > 0 Then TextToSend = Left(TextToSend,Pos("$2",TextToSend)-1)||"their"||SubStr(TextToSend,Pos("$2",TextToSend)+2)
  1707.         END
  1708.         'Say 'TextToSend
  1709.         Leave PLoop
  1710.       END
  1711.     END
  1712.     If (Left(PopKey.PLoop,1) ~= "*" & Right(PopKey.PLoop,1) ~= "*" & Words(Rest) = 1) then Do
  1713.       If Upper(Word(Rest,1)) = Strip(Upper(PopKey.PLoop),"B","*") Then Do
  1714.         TextToSend = PopText.PLoop
  1715.         If (Upper(ToWho) = Upper(MyNick) | AlwaysPriv = TRUE) then Do
  1716.           TextToSend = '/Describe 'Nick' 'TextToSend
  1717.           If Pos("$1",TextToSend) > 0 Then TextToSend = Left(TextToSend,Pos("$1",TextToSend)-1)||"you"||SubStr(TextToSend,Pos("$1",TextToSend)+2)
  1718.           If Pos("$2",TextToSend) > 0 Then TextToSend = Left(TextToSend,Pos("$2",TextToSend)-1)||"your"||SubStr(TextToSend,Pos("$2",TextToSend)+2)
  1719.         END
  1720.         Else Do
  1721.           TextToSend = '/Describe 'ToWho' 'TextToSend
  1722.           If Pos("$1",TextToSend) > 0 Then TextToSend = Left(TextToSend,Pos("$1",TextToSend)-1)||Nick||SubStr(TextToSend,Pos("$1",TextToSend)+2)
  1723.           If Pos("$2",TextToSend) > 0 Then TextToSend = Left(TextToSend,Pos("$2",TextToSend)-1)||"their"||SubStr(TextToSend,Pos("$2",TextToSend)+2)
  1724.         END
  1725.         'Say 'TextToSend
  1726.         Leave PLoop
  1727.       END
  1728.     END
  1729.   END
  1730. END
  1731. LastLine = Line
  1732. Signal MainLoop
  1733.  
  1734. ReadOPs:
  1735. NumOps = 0
  1736. If Exists("AmIRC:Rexx/CTCP-OPsList") then Do
  1737.   Call Open(Ops,"AmIRC:Rexx/CTCP-OPsList","R")
  1738.     NumOps = 1
  1739.     Do Until EOF(Ops)
  1740.       Line = ReadLn(Ops)
  1741.       If Left(Line,1) = ";" then Iterate
  1742.       If Left(Line,1) = "#" then Do
  1743.         OpChannel.NumOps = Word(Line,1)
  1744.         OpHost.NumOps    = Word(Line,2)
  1745.         OpNick.NumOps    = Word(Line,3)
  1746.         NumOps = NumOps + 1
  1747.       End
  1748.     End
  1749.   Call Close(Ops)
  1750.   NumOps = NumOps - 1
  1751.   If NumOps = 1 then 'ECHO P='d2c(27)'b«CTCPMaster» Monitoring 'NumOps' Auto-OP Hostmask...'
  1752.   Else 'ECHO P='d2c(27)'b«CTCPMaster» Monitoring 'NumOps' Auto-OP Hostmasks...'
  1753. End
  1754. Return
  1755.  
  1756. WriteOps:
  1757. Call Open(Ops,"AmIRC:Rexx/CTCP-OPsList","W")
  1758.   Call WriteLn(Ops,"; List of people to Auto-OP and on which channel.")
  1759.   Call WriteLn(Ops,"; Entries are not case sensitive.")
  1760.   Call WriteLn(Ops,";")
  1761.   Call WriteLn(Ops,";Channel        HostMask                       Nick")
  1762.   Call WriteLn(Ops,";-------------- ------------------------------ -------------------")
  1763.   Do Loop = 1 to NumOps
  1764.     Call WriteLn(Ops,Left(OpChannel.Loop,15)||" "||Left(OpHost.Loop,30)||" "||OpNick.Loop)
  1765.   End
  1766. Call Close(Ops)
  1767. Return
  1768.  
  1769. GetMask:
  1770. HA = Translate(HA,XRange("a","z"),XRange("A","Z"))
  1771. HA = Strip(HA,"L","~")
  1772. HA2 = SubStr(HA,Pos("@",HA)+1)
  1773. User = Left(HA,Pos("@",HA)-1)
  1774. HA = Translate(HA2,"  ","@.")
  1775. Number = 0
  1776. Found = 0
  1777. If Words(HA) = 4 then Do
  1778.   If Datatype(Compress(HA),"N") = 1 then Do
  1779.     HATemp = User"@"HA2
  1780.     Found = 1
  1781.   End
  1782. End
  1783. If Found = 0 then Do
  1784.   Do Loop = 1 to Words(HA)
  1785.     Do X = 0 to 9
  1786.       If Pos(X,Word(HA,Loop)) > 0 then Number = Loop
  1787.     End
  1788.   End
  1789.   If Number ~= 0 then Do
  1790.     HATemp = User"@*"
  1791.     Do Loop = Number +1 to Words(HA)
  1792.       HATemp = HATemp||"."Word(HA,Loop)
  1793.     End
  1794.     Found = 1
  1795.   End
  1796. End
  1797. If Found = 1 then HA = HATemp
  1798. Else HA = USER||"@"||HA2
  1799. Return
  1800.  
  1801. Calendar:
  1802. Now = Date("S")
  1803. Year = Left(Now,4)
  1804. Mon = SubStr(Now,5,2)
  1805. Today = Right(Now,2)
  1806. If Left(Mon,1) = 0 then Mon = Right(Mon,1)
  1807. If Left(Today,1) = 0 then Today = Right(Today,1)
  1808. If Year < 1978 then Year = 1978
  1809.  
  1810. Month.1 = 31
  1811. Month.2 = 28
  1812. Month.3 = 31
  1813. Month.4 = 30
  1814. Month.5 = 31
  1815. Month.6 = 30
  1816. Month.7 = 31
  1817. Month.8 = 31
  1818. Month.9 = 30
  1819. Month.10= 31
  1820. Month.11= 30
  1821. Month.12= 31
  1822.  
  1823. If (Year/4 = Year%4) then Do
  1824.   Month.2 = 29
  1825.   If (Year/100 = Year%100) then Do
  1826.     If (Year/400 ~= Year%400) then Month.2 = 28
  1827.   End
  1828. End
  1829.  
  1830. Day = Date("W",Year||Right("00"||Mon,2)||"01","S")
  1831. Select
  1832.  When Day = "Sunday" then Buffer = 0
  1833.  When Day = "Monday" then Buffer = 1
  1834.  When Day = "Tuesday" then Buffer = 2
  1835.  When Day = "Wednesday" then Buffer = 3
  1836.  When Day = "Thursday" then Buffer = 4
  1837.  When Day = "Friday" then Buffer = 5
  1838.  When Day = "Saturday" then Buffer = 6
  1839.  Otherwise NOP
  1840. End
  1841. Hot = ((Today + Buffer) * 2 ) - 1
  1842.  
  1843. Dates = Copies("  ",Buffer)||Left(" 1 2 3 4 5 6 7 8 910111213141516171819202122232425262728293031",Month.Mon * 2)
  1844.  
  1845. Count = 0
  1846. 'ECHO P='d2c(27)'b«CTCPMaster» Sending the Calendar to 'Nick'...'
  1847. 'Raw Notice 'Nick' :          'Date('M')||' 'Year
  1848. 'Raw Notice 'Nick' :Sun  Mon  Tues Weds Thur Fri  Sat'
  1849. Week = " "
  1850. Do Loop = 1 to Length(Dates) by 2
  1851.   If Loop = Hot then Week = Week||D2C(22)||SubStr(Dates,Loop,2)||D2C(22)||"   "
  1852.   Else Week = Week||SubStr(Dates,Loop,2)"   "
  1853.   Count = Count + 1
  1854.   If Count = 7 then Do
  1855.     Count = 0
  1856.     'Raw Notice 'Nick' :'Week
  1857.     Week = " "
  1858.   End
  1859. End
  1860. If Week ~= " " then 'Raw Notice 'Nick' :'Week
  1861. Return
  1862.  
  1863. Halt:
  1864. Syntax:
  1865. Error:
  1866. Call ClosePort("CTCP-MASTER")
  1867. ErrorLine= SigL
  1868. 'ECHO P='d2c(27)'b«CTCPMaster» Exiting...Error in line 'ErrorLine'!'
  1869. Exit
  1870.  
  1871. RateList:
  1872.  
  1873. ratelist.1 = "ARP = Argentina Pesos"
  1874. ratelist.2 = "ATS = Austria Schillings"
  1875. ratelist.3 = "AUD = Australia Dollars"
  1876. ratelist.4 = "BBD = Barbados Dollars"
  1877. ratelist.5 = "BEF = Belgium Francs"
  1878. ratelist.6 = "BGL = Bulgaria Lev"
  1879. ratelist.7 = "BMD = Bermuda Dollars"
  1880. ratelist.8 = "BRR = Brazil Real"
  1881. ratelist.9 = "BSD = Bahamas Dollars"
  1882. ratelist.10 = "CAD = Canada Dollars"
  1883. ratelist.11 = "CHF = Switzerland Francs"
  1884. ratelist.12 = "CLP = Chile Pesos"
  1885. ratelist.13 = "CNY = China Yuan Renmimbi"
  1886. ratelist.14 = "CSK = Czech Republic Koruna"
  1887. ratelist.15 = "CYP = Cyprus Pounds"
  1888. ratelist.16 = "DEM = Germany Deutsche Marks"
  1889. ratelist.17 = "DKK = Denmark Kroner"
  1890. ratelist.18 = "DZD = Algeria Dinars"
  1891. ratelist.19 = "EGP = Egypt Pounds"
  1892. ratelist.20 = "ESP = Spain Pesetas"
  1893. ratelist.21 = "EUR = Euro"
  1894. ratelist.22 = "FIM = Finland Markka"
  1895. ratelist.23 = "FJD = Fiji Dollars"
  1896. ratelist.24 = "FRF = France Francs"
  1897. ratelist.25 = "GBP = United Kingdom Pounds"
  1898. ratelist.26 = "GRD = Greece Drachmas"
  1899. ratelist.27 = "HKD = Hong Kong Dollars"
  1900. ratelist.28 = "HUF = Hungary Forint"
  1901. ratelist.29 = "IDR = Indonesia Rupiah"
  1902. ratelist.30 = "IEP = Ireland Punt"
  1903. ratelist.31 = "ILS = Israel New Shekels"
  1904. ratelist.32 = "INR = India Rupees"
  1905. ratelist.33 = "ISK = Iceland Krona"
  1906. ratelist.34 = "ITL = Italy Lira"
  1907. ratelist.35 = "JMD = Jamaica Dollars"
  1908. ratelist.36 = "JOD = Jordan Dinar"
  1909. ratelist.37 = "JPY = Japan Yen"
  1910. ratelist.38 = "KRW = South Korea Won"
  1911. ratelist.39 = "LBP = Lebanon Pounds"
  1912. ratelist.40 = "LUF = Luxembourg Francs"
  1913. ratelist.41 = "MXP = Mexico Pesos"
  1914. ratelist.42 = "MYR = Malaysia Ringgit"
  1915. ratelist.43 = "NLG = Dutch Guilders"
  1916. ratelist.44 = "NOK = Norway Kroner"
  1917. ratelist.45 = "NZD = New Zealand Dollars"
  1918. ratelist.46 = "PHP = Philippines Pesos"
  1919. ratelist.47 = "PKR = Pakistan Rupees"
  1920. ratelist.48 = "PLZ = Poland Zloty"
  1921. ratelist.49 = "PTE = Portugal Escudo"
  1922. ratelist.50 = "ROL = Romania Leu"
  1923. ratelist.51 = "RUR = Russia Rubles"
  1924. ratelist.52 = "SAR = Saudi Arabia Riyal"
  1925. ratelist.53 = "SDD = Sudan Dinar"
  1926. ratelist.54 = "SEK = Sweden Krona"
  1927. ratelist.55 = "SGD = Singapore Dollars"
  1928. ratelist.56 = "SKK = Slovakia Koruna"
  1929. ratelist.57 = "THB = Thailand Baht"
  1930. ratelist.58 = "TRL = Turkey Lira"
  1931. ratelist.59 = "TTD = Trinidad and Tobago Dollars"
  1932. ratelist.60 = "TWD = Taiwan Dollars"
  1933. ratelist.61 = "USD = United States Dollars"
  1934. ratelist.62 = "VEB = Venezuela Bolivar"
  1935. ratelist.63 = "XAG = Silver Ounces"
  1936. ratelist.64 = "XAU = Gold Ounces"
  1937. ratelist.65 = "XCD = Eastern Caribbean Dollars"
  1938. ratelist.66 = "XDR = Special Drawing Right (IMF)"
  1939. ratelist.67 = "XPD = Palladium Ounces"
  1940. ratelist.68 = "XPT = Platinum Ounces"
  1941. ratelist.69 = "ZAR = South Africa Rand"
  1942. ratelist.70 = "ZMK = Zambia Kwacha"
  1943. Return
  1944.  
  1945. CaseConvert: Procedure
  1946.   Arg cc
  1947.   cc = Translate(cc,XRange("a","z"),XRange("A","Z"))
  1948.   tmp = ""
  1949.   Do a = 1 To Words(cc)
  1950.     Select
  1951.       When Upper(Left(Word(cc,a),2)) = "O'" Then tmp = tmp||"O'"||Upper(SubStr(Word(cc,a),3,1))||SubStr(Word(cc,a),4)||" "
  1952.       When Upper(Left(Word(cc,a),2)) = "MC" Then tmp = tmp||"Mc"||Upper(SubStr(Word(cc,a),3,1))||SubStr(Word(cc,a),4)||" "
  1953.       When Upper(Left(Word(cc,a),3)) = "MAC" Then tmp = tmp||"Mac"||Upper(SubStr(Word(cc,a),4,1))||SubStr(Word(cc,a),5)||" "
  1954.       Otherwise tmp = tmp||Upper(Left(Word(cc,a),1))||SubStr(Word(cc,a),2)||" "
  1955.     End
  1956.   End
  1957.   cc = Strip(tmp)
  1958. Return cc
  1959.