KaoSDlanor

IRCBOT

Nov 4th, 2014
232
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #SingleInstance, force
  2. #Include %A_ScriptDir%\AHKsock.ahk
  3.  
  4. global bInitiated:=false
  5. global bLoggedin:=false
  6. global sServer:="esper.net"
  7. global bNickTaken:=false
  8. global aTabs:=["General","Temp"]
  9. global aTabElements:={General: ["IRCOutput"],Temp: []}
  10. global sCurTab:="General"
  11. global aChanLogs:={}
  12.  
  13. Gui,Add,Text,,Username
  14. Gui,Add,Edit,xs w300 vNick,KaoBot
  15. Gui,Add,Text,,Password
  16. Gui,Add,Edit,xs w300 vPass,
  17. Gui,Add,Text,,Channel(s)
  18. Gui,Add,Edit,xs w300 vChan,bottest
  19. Gui,Add,Button,Default gInitiate,Log In
  20. Gui,Show
  21.  
  22. Return ;---------------------------------------------------------------------------
  23.  
  24. Initiate:
  25.     Gui,Submit
  26.  
  27.     Gui,Destroy
  28.     global hEdit
  29.     Gui,Add,Button,vGeneral gChangeTab,General
  30.     Gui,Add,Button,vTemp gChangeTab,Temp
  31.     Gui,Add,Button,vAddTab gAddTab,+
  32.     Gui,Add,Edit,r20 vIRCOutput w400 ReadOnly hwndhEdit
  33.     Gui,Add,Edit,vIRCInput
  34.     Gui,Add,Button,vSubmitIRC gSendIRC Default,>
  35.     Gui,+Resize
  36.     GuiControl,Focus,IRCInput
  37.     Gui,Show
  38.     if (strLen(Nick)=0)
  39.         MsgBox,No Nick Specified
  40.     If (i := AHKsock_Connect("irc." . sServer, 6667, "IRC"))
  41.     {
  42.         MsgBox, % "AHKsock_Connect() failed with return value = " i " and ErrorLevel = " ErrorLevel
  43.     } else {
  44.         global bInitiated:=true
  45.     }
  46. return
  47.  
  48. ChangeTab:
  49.     global sCurTab:=A_GuiControl
  50.     for nTabNum,sTabName in aTabs
  51.     {
  52.         if (sTabName<>A_GuiControl)
  53.         {
  54.             for nElementNum,sElementName in aTabElements[sTabName]
  55.             {
  56.                 GuiControl,Hide,%sElementName%
  57.             }
  58.         }
  59.         for nElementNum,sElementName in aTabElements[A_GuiControl]
  60.         {
  61.             GuiControl,Show,%sElementName%
  62.         }
  63.     }
  64.     GuiControl,Focus,IRCInput
  65. Return
  66.  
  67. AddTab:
  68.  
  69. Return
  70.  
  71. IRC(sEvent, iSocket = 0, sName = 0, sAddr = 0, sPort = 0, ByRef bData = 0, bDataLength = 0)
  72. {
  73.     global Nick,Chan
  74.     global iSock:=iSocket
  75.     sData:=StrGet(&bData,bDataLength,"UTF-8")
  76.     global sOutput:=sOutput . sEvent . " """ . sData . """`r`n"
  77.     if sEvent=SEND
  78.     {
  79.         AHKSend("NICK " . Nick)
  80.         AHKSend("USER " . Nick . " . . :KaoChat")
  81.     }
  82.     if sEvent=RECEIVED
  83.         HandleEvents(sData)
  84.     GuiControl,,IRCOutput,% sOutput
  85.     global hEdit
  86.     sendmessage, 0x115, 7, 0,, ahk_id %hEdit%
  87. }
  88.  
  89. HandleEvents(sEvent)
  90. {
  91.     global Nick,Chan,Pass,bLoggedin,bNickTaken,sServer
  92.     if (RegExMatch(sEvent,"^PING :")>0)
  93.     {
  94.         sPingReference:=RegExReplace(sEvent,"PING :(.*)$","$1")
  95.         AHKSend("PONG :" . sPingReference)
  96.     }
  97.     if (bLoggedin=false) and (RegExMatch(sEvent,"Nickname is already in use")>0)
  98.     {
  99.         AHKSend("NICK " . Nick . "_")
  100.         bNickTaken:=true
  101.     }
  102.     if (RegExMatch(sEvent,"End of /MOTD command")>0)
  103.     {
  104.         global bLoggedin:=true
  105.         if (StrLen(Pass)>0)
  106.         {
  107.             AHKSEND("PRIVMSG NickServ :IDENTIFY " . Nick . " " . Pass)
  108.             if bNickTaken
  109.             {
  110.                 AHKSEND("PRIVMSG NickServ :GHOST " . Nick . " " . Pass)
  111.                 AHKSEND("NICK " . Nick)
  112.             }
  113.         }
  114.         if (strLen(Chan)>0)
  115.         {
  116.             Chan:=RegExReplace(Chan,"#?(.+)$","#$1")
  117.             AHKSend("JOIN " . Chan)
  118.         }
  119.     }
  120.     if (RegExMatch(sEvent,"^:[^!]+![^\s]+ NICK :.+`r?`n?$")>0)
  121.     {
  122.         if (RegExMatch(sEvent,"^:" . Nick . "![^\s]+ NICK :.+`r?`n?$")>0)
  123.         {
  124.             global Nick:=RegExReplace(sEvent,"^:[^!]+![^\s]+ NICK :(.+)`r?`n?$","$1")
  125.         }
  126.         sOldNick:=RegExReplace(sEvent,"^:([^!]+)![^\s]+ NICK :.+`r?`n?$","$1")
  127.         sNewNick:=RegExReplace(sEvent,"^:[^!]+![^\s]+ NICK :(.+)`r?`n?$","$1")
  128.         for sChanName,sChanLog in aChanLogs
  129.         {
  130.             aChanLogs[sChanName]:=sChanLog . sOldNick . " has changed nick to " . sNewNick . "`r`n"
  131.             GuiControl,,%sChanName%Output,% aChanLogs[sChanName]
  132.         }
  133.     }
  134.     if (RegExMatch(sEvent,"PRIVMSG #.+ :.+`r?`n?")>0)
  135.     {
  136.         sChan:=RegExReplace(sEvent,"^.+PRIVMSG #(.+) :.*`r?`n?$","$1")
  137.         sMessage:=RegExReplace(sEvent,"^.+PRIVMSG #.+ :(.*)`r?`n?$","$1")
  138.         sSender:=RegExReplace(sEvent,"s)^:([^!]+)!.+$","$1")
  139.         aChanLogs[sChan]:=aChanLogs[sChan] . "<" . sSender . "> " . sMessage . "`r`n"
  140.         GuiControl,,%sChan%Output,% aChanLogs[sChan]
  141.     }
  142.     sNewChan:=RegExReplace(sEvent,":" . Nick . "![^@]+@.+ JOIN #([^`r`n]+)`r?`n?$","$1",nReplacements)
  143.     if (nReplacements>0)
  144.     {
  145.         NewChan(sNewChan)
  146.         Gosub,GuiSize
  147.     }
  148. }
  149.  
  150. NewChan(sNewChan)
  151. {
  152.     global
  153.     aTabs.Insert(sNewChan)
  154.     Gui,Add,Button,v%sNewChan% gChangeTab,% sNewChan
  155.     Gui,Add,Edit,r20 v%sNewChan%Output w400 ReadOnly hwndhEdit
  156.     aTabElements[sNewChan]:=[sNewChan . "Output"]
  157.     aChanLogs[sNewChan]:="Joined Channel`r`n"
  158.     GuiControl,,%sNewChan%Output,% aChanLogs[sNewChan]
  159. }
  160.  
  161. GuiSize:
  162.     if ErrorLevel=1
  163.         return
  164.     if A_GuiHeight
  165.         global GUIH:=A_GuiHeight
  166.     if A_GuiWidth
  167.         global GUIW:=A_GuiWidth
  168.     nTabControlH:=GUIH-25
  169.     nIRCOutputH:=nTabControlH-25
  170.     nInputW:=GUIW-25
  171.     for nTabNum,sTabName in aTabs
  172.     {
  173.         nTabX:=(nTabNum-1)*50
  174.         GuiControl,Move,%sTabName%,X%nTabX% Y0 W50 H25
  175.     }
  176.     nTabX:=aTabs.MaxIndex()*50
  177.     GuiControl,Move,AddTab,X%nTabX% Y0 W25 H25
  178.     for sTabName,aTabElems in aTabElements
  179.         GuiControl,Move,% aTabElems[1],X0 Y25 W%GUIW% H%nIRCOutputH%
  180.     GuiControl,Move,IRCInput,X0 Y%nTabControlH% W%nInputW% H25
  181.     GuiControl,Move,SubmitIRC,X%nInputW% Y%nTabControlH% W25 H25
  182.     global hEdit
  183.     sendmessage, 0x115, 7, 0,, ahk_id %hEdit%
  184. Return
  185.  
  186. GuiClose:
  187.     ExitApp
  188. Return
  189.  
  190. SendIRC:
  191.     global aChanLogs,sCurTab,aTabs
  192.     Gui,Submit,NoHide
  193.     if (sCurTab=aTabs[1]) or (RegExMatch(IRCInput,"^/")>0)
  194.     {
  195.         IRCInput:=RegExReplace(IRCInput,"^/","")
  196.         AHKSend(IRCInput)
  197.     }
  198.     else if (StrLen(aChanLogs[sCurTab])>0)
  199.     {
  200.         AHKSend("PRIVMSG #" . sCurTab . " :" . IRCInput)
  201.     }
  202.     GuiControl,,IRCInput,
  203. Return
  204.  
  205. AHKSend(sMsg)
  206. {
  207.     global iSock
  208.     sMsg:=RegExReplace(sMsg,"^(.+)`r?`n?$","$1`r`n")
  209.     nDataLen:=strlen(sMsg)
  210.     VarSetCapacity(sData,nDataLen)
  211.     StrPut(sMsg,&sData,"UTF-8")
  212.     if (i:=AHKsock_Send(iSock,&sData,nDataLen))<0
  213.         msgbox,% "ERROR " . i
  214.     global sOutput:=sOutput . "SENT """ . StrGet(&sData,nDataLen,"UTF-8") . """`r`n"
  215.     GuiControl,,IRCOutput,% sOutput
  216.     if (RegExMatch(sMsg,"i)^PRIVMSG #.+ :.+`r?`n?")>0)
  217.     {
  218.         global Nick,aChanLogs
  219.         sChan:=RegExReplace(sMsg,"i)^PRIVMSG #(.+) :.*`r?`n?$","$1")
  220.         sMessage:=RegExReplace(sMsg,"i)^PRIVMSG #.+ :(.*)`r?`n?$","$1")
  221.         aChanLogs[sChan]:=aChanLogs[sChan] . "<" . Nick . "> " . sMessage . "`r`n"
  222.         GuiControl,,%sChan%Output,% aChanLogs[sChan]
  223.         ;msgbox,% "<" . Nick . "> " . sMessage . "`r`n"
  224.     }
  225.     global hEdit
  226.     sendmessage, 0x115, 7, 0,, ahk_id %hEdit%
  227.     return i
  228. }
Advertisement
Add Comment
Please, Sign In to add comment