Bot IRC
Publié : jeu. 17/janv./2008 19:48
				
				Salut,
voilà un petit bot programmé vite faît just for fun pour IRC, les commandes disponibles sont les suivantes :
 mais un systéme de quote à étaît intégré, il bug encore un peu. (problème d'index)
Je fais partager ce code vu que je pense pas le reprendre ;o
Les fonctions IRC proviennent de http://www.purebasic.fr/french/viewtopi ... hlight=irc
Pour le faire venir sur un salon modifiez ceci :
le ChannelID sert pour les noms de chans spécials (genre !jr4rmcroissant)
Pour ajouter un utilisateur autorisé à accéder aux commandes du bot modifiez/ajoutez ceci:
Le code est très peu commenté 
 c'étaît juste un test et histoire de revenir un peu au PB
			voilà un petit bot programmé vite faît just for fun pour IRC, les commandes disponibles sont les suivantes :
Pour la plupart c'est des fonctions basiques de PB!nick newnick, !quit, !rndstr value, !rndquote, !quoteadd, !date, !space value, !len str, !hex value, !timelapsed,!asc str,!bin value, !chr value, !clear, !md5 str, !crc32 str, !rand value, !des pass/ key
Je fais partager ce code vu que je pense pas le reprendre ;o
Les fonctions IRC proviennent de http://www.purebasic.fr/french/viewtopi ... hlight=irc
Pour le faire venir sur un salon modifiez ceci :
Code : Tout sélectionner
Global Channel.s = "#salon"
Global ChannelD.s = "#salon"
Global Server.s = "serveur"
Global Nick.s = "pseudodubot"Pour ajouter un utilisateur autorisé à accéder aux commandes du bot modifiez/ajoutez ceci:
Code : Tout sélectionner
FetchCmd("hostname","nick")Code : Tout sélectionner
InitNetwork() 
Global ConnectionID.l 
Global NewList RecText.s() 
Global NewList Quotes.s()
Procedure IRCConnect(Server.s, Port.l) 
  Connection = OpenNetworkConnection(Server, Port) 
  If Connection <> 0 
    ConnectionID = Connection 
  EndIf 
  ProcedureReturn Connection 
EndProcedure 
Procedure IRCUseConnection(Connection) 
  ConnectionID = Connection 
EndProcedure 
Procedure IRCLogin(Server.s, Name.s, Pass.s) 
  SendNetworkString(ConnectionID,"USER "+ReplaceString(Name, " ", "_")+" localhost "+Server+" http://www.bradan.net/"+Chr(13)+Chr(10)) 
  SendNetworkString(ConnectionID,"NICK "+ReplaceString(Name, " ", "_")+Chr(13)+Chr(10)) 
  If Pass <> "" 
    SendNetworkString(ConnectionID,"PRIVMSG NickServ :IDENTIFY "+Pass+Chr(13)+Chr(10)) 
  EndIf 
EndProcedure 
Procedure IRCChangeNick(Name.s) 
  SendNetworkString(ConnectionID,"NICK "+ReplaceString(Name, " ", "_")+Chr(13)+Chr(10)) 
EndProcedure 
Procedure IRCJoin(Channel.s, Server.s) 
  SendNetworkString(ConnectionID,"JOIN "+Channel+Chr(13)+Chr(10)) 
EndProcedure 
Procedure IRCLeave(Channel.s) 
  SendNetworkString(ConnectionID,"PART "+Channel+Chr(13)+Chr(10)) 
EndProcedure 
Procedure IRCSendText(Channel.s, Text.s) 
  SendNetworkString(ConnectionID,"PRIVMSG "+Channel+" :"+Text+Chr(13)+Chr(10)) 
EndProcedure 
Procedure IRCSend(Text.s) 
  SendNetworkString(ConnectionID,Text+Chr(13)+Chr(10)) 
EndProcedure 
Procedure.s IRCGetFrom(Str.s) 
  Start = FindString(Str.s, ":", 0)+1 
  Stop = FindString(Str.s, "!~", Start) 
  ProcedureReturn Mid(Str.s, Start, Stop-Start) 
EndProcedure 
Procedure.s IRCGetTo(Str.s) 
  Start = FindString(Str.s, "PRIVMSG", 2)+Len("PRIVMSG")+1 
  Stop = FindString(Str.s, ":", Start)-1 
  ProcedureReturn Mid(Str.s, Start, Stop-Start) 
EndProcedure 
Procedure.s IRCGetPingMsg(Str.s) 
  Start = FindString(Str.s, ":", 0)+1 
  Stop = Len(Str.s)+1 
  ProcedureReturn Mid(Str.s, Start, Stop-Start) 
EndProcedure 
Procedure.s IRCGetLine() 
  If NetworkClientEvent(ConnectionID) = 2 
    LastElement(RecText()) 
    *Buffer = AllocateMemory(1024) 
    ReceiveNetworkData(ConnectionID, *Buffer, 1024) 
    txt.s = PeekS(*Buffer) 
    FreeMemory(*Buffer) 
    ReplaceString(txt, Chr(13), Chr(10)) 
    ReplaceString(txt, Chr(10)+Chr(10), Chr(10)) 
    For k=1 To CountString(txt, Chr(10)) 
      Line.s = RemoveString(RemoveString(StringField(txt, k, Chr(10)), Chr(10)), Chr(13)) 
      If Line <> "" 
        If FindString(UCase(Line), "PING", 0) Or FindString(UCase(Line), "VERSION", 0) 
          SendNetworkString(ConnectionID,ReplaceString(Line,"PING :", "PONG :",0)+Chr(13)+Chr(10)) 
        Else 
          AddElement(RecText()) 
          RecText() = Line.s 
        EndIf 
      EndIf 
    Next 
  EndIf 
  If CountList(RecText()) > 0 
  FirstElement(RecText()) 
  txt.s = RecText() 
  DeleteElement(RecText()) 
  ProcedureReturn txt 
  EndIf 
EndProcedure 
Procedure.s IRCGetText(Str.s) 
  Start = FindString(Str.s, ":", FindString(Str.s, "PRIVMSG", 2)+Len("PRIVMSG")) 
  ProcedureReturn Right(Str, Len(Str)-Start) 
EndProcedure 
Procedure.f IRCPing(Server.s, Timeout) 
  *Buffer = AllocateMemory(1024) 
  SendNetworkString(ConnectionID,"PING "+Server+Chr(13)+Chr(10)) 
  Time = ElapsedMilliseconds() 
  While NetworkClientEvent(ConnectionID) <> 2 : Delay(1) : If ElapsedMilliseconds()-Time > Timeout : Break : EndIf : Wend 
  If ElapsedMilliseconds()-Time <= Timeout 
    T = ElapsedMilliseconds()-Time 
    ReceiveNetworkData(ConnectionID, *Buffer, 1024) 
    FreeMemory(*Buffer) 
    ProcedureReturn T/1000 
  Else 
    ProcedureReturn -1 
  EndIf 
EndProcedure 
Procedure IRCDisconnect(Msg.s) ;Closes the current connection 
  SendNetworkString(ConnectionID,"QUIT "+Msg.s+Chr(13)+Chr(10)) 
  CloseNetworkConnection(ConnectionID) 
EndProcedure 
Procedure.s IRCEnumNames(Channel.s)
  SendNetworkString(ConnectionID,"NAMES "+Channel+Chr(13)+Chr(10)) 
  *Buffer = AllocateMemory(1024) 
  While NetworkClientEvent(ConnectionID) <> 2 : Delay(1) : Wend 
  ReceiveNetworkData(ConnectionID, *Buffer, 1024) 
  txt.s = PeekS(*Buffer) 
  FreeMemory(*Buffer) 
  Start = FindString(txt, Channel.s, 0)+Len(Channel.s)+2 
  Stop = FindString(txt, Chr(10), 0) 
  
  ProcedureReturn Mid(txt.s, Start, Stop-Start) 
EndProcedure 
OpenConsole()
ConsoleTitle("!croissant IRCC")   
EnableGraphicalConsole(1)
Global Channel.s = "#test"
Global ChannelD.s = "#test"
Global Server.s = "ircnet.nerim.fr" 
Global Nick.s = "IRCC"
Global Line.s = "" 
; QUOTES LOADER
AddElement(Quotes())
ec = 1
If OpenPreferences("quotes.ircc")
  PreferenceGroup("Global")
  If ExaminePreferenceKeys() 
    While NextPreferenceKey() 
      result$ = ReadPreferenceString("q"+Str(ec), "no")
      If result$ = "no"
        PrintN("Can't load the quote: " + result$)
        ec + 1
      Else
      
        Quotes() = result$
        AddElement(Quotes())
        ec + 1
      EndIf
    Wend 
  EndIf 
  ClosePreferences()
EndIf
quotes_size = ec
; END QUOTES LOADER
Procedure FetchCmd(host$,nick$)
    tmp = FindString(Line, host$, 1)
    nick.s = nick$
    If tmp <> 0
      tmp = FindString(Line, "PRIVMSG", 1)
      truc$ = Mid(Line,tmp+8+Len(ChannelD)+2,Len(Line))
      If Mid(truc$,1,5) = "!nick"
        PrintN("-- CHANGING NICK REQUESTED FROM " + nick + "--")
        IRCChangeNick(Mid(truc$,7,Len(truc$)))
      EndIf
      ; QUOTES
      If Mid(truc$,1,9) = "!quoteadd"
        PrintN("-- QUOTEADD REQUESTED FROM " + nick + "--")
        buffer.s = Mid(truc$,11,Len(truc$))
        
        quotes_size + 1
        Quotes() = buffer
        AddElement(Quotes()) ; ajoute la quote dans la liste
        
        ec + 1
        OpenPreferences("quotes.ircc")        
          PreferenceGroup("Global")
            WritePreferenceString("q"+Str(ec), buffer)
        ClosePreferences()
        
        IRCSendText(ChannelD,"Quote n° " + Str(ec-1) + " [" + buffer + "] added.")
      EndIf   
      If Mid(truc$,1,9) = "!delquote"
        PrintN("-- DELQUOTE REQUESTED FROM " + nick + "--")
        buffer.s = Mid(truc$,11,Len(truc$))
        
        SelectElement(Quotes(), Val(buffer))
        tmpbuffer$ = Quotes()
        DeleteElement(Quotes())
        
        OpenPreferences("quotes.ircc")        
          PreferenceGroup("Global")
            RemovePreferenceKey("q"+Str(ec))
        ClosePreferences()
        
        IRCSendText(ChannelD,"Quote n° " + Str(ec) + " [" + tmpbuffer$ + "] deleted.")
        ec - 1
        quotes_size - 1
      EndIf        
      If Mid(truc$,1,9) = "!rndquote"
        PrintN("-- RNDQUOTE REQUESTED FROM " + nick + "--")
        buffer.s = Mid(truc$,11,Len(truc$))
        
        RandomSeed(Random(99999999))
        rnd = Random(ec)
        SelectElement(Quotes(), rnd)
        IRCSendText(ChannelD,"<Quote n°"+Str(rnd)+"> " + Quotes())
      EndIf        
      ; END QUOTES
      If Mid(truc$,1,5) = "!quit"
        PrintN("-- QUIT REQUESTED FROM " + nick + "--")
        KeyPressed$ = Chr(27)
      EndIf
      If Mid(truc$,1,4) = "!bin"
        PrintN("-- BIN REQUESTED FROM " + nick + "--")
        buffer.s = Mid(truc$,6,Len(truc$))
        IRCSendText(ChannelD,Bin(Val(buffer)))
      EndIf 
      If Mid(truc$,1,6) = "!space"
        PrintN("-- SPACE REQUESTED FROM " + nick + "--")
        buffer.s = Mid(truc$,8,Len(truc$))
        IRCSendText(ChannelD,Space(Val(buffer)))
      EndIf                  
      If Mid(truc$,1,11) = "!timelapsed"
        PrintN("-- TIMELAPSED REQUESTED FROM " + nick + "--")
        IRCSendText(ChannelD,Str(ElapsedMilliseconds()/1000) + " sec")
      EndIf   
      If Mid(truc$,1,5) = "!date"
        PrintN("-- DATE REQUESTED FROM " + nick + "--")
        Date$ = FormatDate("%yyyy/%mm/%dd", Date())
        IRCSendText(ChannelD,Date$)
      EndIf   
      If Mid(truc$,1,4) = "!len"
        PrintN("-- LEN REQUESTED FROM " + nick + "--")
        buffer.s = Mid(truc$,6,Len(truc$))
        IRCSendText(ChannelD,Str(Len(buffer)))
      EndIf 
      If Mid(truc$,1,4) = "!hex"
        PrintN("-- HEX REQUESTED FROM " + nick + "--")
        buffer.s = Mid(truc$,6,Len(truc$))
        IRCSendText(ChannelD,Hex(Val(buffer)))
      EndIf 
      If Mid(truc$,1,4) = "!asc"
        PrintN("-- ASC REQUESTED FROM " + nick + "--")
        buffer.s = Mid(truc$,6,Len(truc$))
        IRCSendText(ChannelD,Str(Asc(buffer)))
      EndIf     
      If Mid(truc$,1,5) = "!help"
        PrintN("-- HELP REQUESTED FROM " + nick + "--")
        IRCSendText(ChannelD,"- Bot help -")
        IRCSendText(ChannelD,"- List of commands:")
        IRCSendText(ChannelD,"  !nick newnick, !quit, !rndstr value, !rndquote, !quoteadd, !date, !space value, !len str, !hex value, !timelapsed,!asc str,!bin value, !chr value, !clear, !md5 str, !crc32 str, !rand value, !des pass key")
        IRCSendText(ChannelD,"  Coded by Grz-")
      EndIf        
      If Mid(truc$,1,7) = "!rndstr"
        PrintN("-- RNDSTR REQUESTED FROM " + nick + "--")
        buffer.s = Mid(truc$,9,Len(truc$))
        
        RandomSeed(Random(99999999))
        rnd = Random(Val(buffer))
        str$ = ""
        For i = 0 To Len(buffer)
          str$ = str$ + Chr(Val(Mid(Str(rnd),i,1)))
        Next
        IRCSendText(ChannelD,str$)
      EndIf        
      If Mid(truc$,1,4) = "!chr"
        PrintN("-- CHR REQUESTED FROM " + nick + "--")
        buffer.s = Mid(truc$,6,Len(truc$))
        IRCSendText(ChannelD,Chr(Val(buffer)))
      EndIf       
      If Mid(truc$,1,6) = "!clear"
        ClearConsole()
        PrintN("-- CLEAR REQUESTED FROM " + nick + "--")
      EndIf    
      If Mid(truc$,1,4) = "!md5"
        PrintN("-- MD5 REQUESTED FROM " + nick + "--")
        buffer.s = Mid(truc$,6,Len(truc$))
        IRCSendText(ChannelD,MD5Fingerprint(@buffer, Len(buffer)))
      EndIf       
      If Mid(truc$,1,6) = "!crc32"
        PrintN("-- CRC32 REQUESTED FROM " + nick + "--")
        buffer.s = Mid(truc$,8,Len(truc$))
        IRCSendText(ChannelD,Str(CRC32Fingerprint(@buffer, Len(buffer))))
      EndIf  
      If Mid(truc$,1,5) = "!rand"
        PrintN("-- RAND REQUESTED FROM " + nick + "--")
        buffer.s = Mid(truc$,7,Len(truc$))
        IRCSendText(ChannelD,Str(Random(Val(buffer))))
      EndIf  
      If Mid(truc$,1,4) = "!des"
        PrintN("-- DES REQUESTED FROM " + nick + "--")
        tmp = FindString(truc$, "/", 1)
        If tmp <> 0
          buffer.s = Mid(truc$,6,tmp-6)
          If Len(buffer.s) > 8
            IRCSendText(ChannelD,IRCGetFrom(Line)+" -> Can't generate you'r password, lenght should be <= 8")
          Else
            key.s = Mid(truc$,FindString(truc$, "/", 1)+2,Len(truc$))
            IRCSendText(ChannelD,DESFingerprint(buffer, key))
          EndIf
        Else
          IRCSendText(ChannelD,IRCGetFrom(Line)+" -> Incorrect parameter (type !des password key)")
        EndIf
      EndIf  
    EndIf
    If Login = 1 And ElapsedMilliseconds()-LastPing > 15000 
      Ping.f = IRCPing(Server.s, 5000) 
      ConsoleTitle("!croissant IRCC"+Channel+"  Ping: "+StrF(Ping, 2)) 
      LastPing = ElapsedMilliseconds() 
    EndIf 
EndProcedure
IRCConnect(Server.s, 6667) 
IRCLogin(Server.s, Nick.s, "") 
IRCJoin(Channel.s, Server.s) 
; message à la connection
IRCSendText(ChannelD,"Hello, i'm bot")
Repeat 
KeyPressed$ = Inkey()
  Line = IRCGetLine()
  If Line <> "" 
    If IRCGetFrom(Line) <> "" 
    Names.s = IRCEnumNames(Channel.s) 
    Login = 1 
    
  Else 
  
    FetchCmd("truc@truc.fr","nick")
    
  EndIf 
  EndIf
Until KeyPressed$ = Chr(27)
CloseConsole()
IRCDisconnect("Botquit") 
End