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