Page 1 sur 1

Bot IRC

Publié : jeu. 17/janv./2008 19:48
par garzul
Salut,

voilà un petit bot programmé vite faît just for fun pour IRC, les commandes disponibles sont les suivantes :
!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
Pour la plupart c'est des fonctions basiques de PB ;) 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 :

Code : Tout sélectionner

Global Channel.s = "#salon"
Global ChannelD.s = "#salon"
Global Server.s = "serveur"
Global Nick.s = "pseudodubot"
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:

Code : Tout sélectionner

FetchCmd("hostname","nick")
Le code est très peu commenté ;) c'étaît juste un test et histoire de revenir un peu au PB

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

Publié : jeu. 17/janv./2008 19:59
par garzul
je profite du post pour poster une autre petite création faîte y'a 3 mois, un éditeur de scripts de bots IRC en temp réel.

Voilà le principe :

Crée une page PHP qui lit le script stocké sur un FTP et l'affiche dans un textarea, ensuite permettre à l'utilisateur de mettre à jour ses modifications via un bouton. (qui rapellera la page pour que ça écrive les modifications)
Une fois que l'utilisateur à envoyé ses modifications on écris dans un fichier le chiffre 1 (ça pourrait être tout autres chiffres/mots) qui signifie que le script à étaît modifié et qu'il nécessite d'être mis à jour.
Pour lire et récupérer ce script il nous faut un programme qui tourne sur la machine du bot et qui vérifie toutes les X secondes le contenu du fichier qui contient le status, si le chiffre est 1 on récupére le script depuis le web, on le place là où il faut, on recharge le script, on appel une autre page PHP qui va s'occuper de mettre le chiffre 0 sur la page de status et voilà. (bon moi j'ai testé avec XChat sous Windows avec ActivePerl mais ça peut être un autre client IRC où directement un programme)

Voici un exemple accompagné du programme PureBasic qui s'occupe de mettre à jour si besoin le script, le programme récupére les pages grâce à la librairie de Thalius (forum anglais) HTTPGetFromWeb2, il est conçu de façon à pouvoir gérer plusieurs bots facilement et de pouvoir s'adapter à d'autres support (comme MIRC etc...), le code est commenté (en anglais) actuellement le script est écrit pour un bot de test "Estela" (donc faudra l'adapter pour votre bot).

Lib HTTPGetFromWeb2 :

http://www.garzul.tonsite.biz/pb/HTTPGetFromWeb2.pb

Programme:

Code : Tout sélectionner

; Checker configuration
#CONSOLE_ON = 1 ; 0 = silent mode
#SCRIPT_DIRECTORY = "C:\Program Files\xchat\plugins\!croissant.pl" ; where the script while added
#BASH_RELOAD = "reload_bots_scripts.bat" ; bash who reload the script
#CHECK_TIME = 10000 ; set the period of bots scripts checking in ms
#KEY_QUIT = #PB_Key_F1 ; set the key who quit the program in silent mode

; Network stuff
#HTTP_BUFFER_SIZE = 4096 ; buffer size 
#HTTP_IDLE_DELAY = 20 ; delay during inactivity 
#HTTP_LAG_DELAY = 50 ; delay during little activity 
#HTTP_TIMEOUT = 10000 ; timeout ms

; Estela bot
#ESTELA_SCRIPT_CUPDATE_URL = "http://garzul.tonsite.biz/!croissant/estela_script_up" ; scrit last change check
#ESTELA_SCRIPT_UPDATE_URL = "http://garzul.tonsite.biz/!croissant/estela_write_state.php" ; script update state check
#ESTELA_SCRIPT_URL = "http://garzul.tonsite.biz/!croissant/estela_script" ; script

; HTTPGet
IncludeFile "HTTPGetFromWeb2.pb"

; Console input event thread
Procedure Console_Event(value)
  loop = 1
  Repeat
    If #CONSOLE_ON = 1
      cmd$ = Input()
      If cmd$ = "stop"
        loop = 0
      EndIf
    EndIf
  Until loop = 1
EndProcedure

Procedure Check_HTTPGet_Error(status.l)
  Select status
    Case #HTTP_ERROR_CONNECT
      If #CONSOLE_ON = 1
        PrintN("Error -> Unable to connect to the specified server.")
      EndIf
    Case #HTTP_ERROR_MEMORY
      If #CONSOLE_ON = 1
        PrintN("Error -> Unable to allocate memory for response buffer.")
      EndIf
    Case #HTTP_ERROR_TIMEOUT
      If #CONSOLE_ON = 1
        PrintN("Error -> #HTTP_TIMEOUT exceeded.")
      EndIf
    Case #HTTP_ERROR_FILE
      If #CONSOLE_ON = 1
        PrintN("Error -> Local file could not be created.")
      EndIf
    Case #HTTP_ERROR_PROTOCOL
      If #CONSOLE_ON = 1
        PrintN("Error -> Unknown HTTP protocol (version 1.0 or 1.1 required).")
      EndIf
  EndSelect
EndProcedure

; Check an bot with selected scripts
Procedure Check_Bot(url_cupdate$, url_update$, url$)
  ; download the checker
  Status.l = HTTP_GET(url_cupdate$, GetCurrentDirectory()+"tmp") 
  ; check download errors
  Check_HTTPGet_Error(Status)
  
  ; read the checker
  If ReadFile(0, "tmp")
    While Eof(0) = 0  
      str$ = ReadString(0)
    Wend
    CloseFile(0)
  Else ; error
    If #CONSOLE_ON = 1
      PrintN("Error -> Can't open tmp file for script: " + url$)
    EndIf
    str$ = "0"
  EndIf
  
  ; we need to update the script!
  If str$ = "1"
    ; call the script who reset the checker
    Status.l = HTTP_GET(url_update$, GetCurrentDirectory()+"tmp")
    Check_HTTPGet_Error(Status) ; check dl errors
    
    ; download the script in xchat script directory
    Status.l = HTTP_GET(url$, #SCRIPT_DIRECTORY) 
    Check_HTTPGet_Error(Status) ; check dl errors
  
    ; run the bash script who reload the script
    RunProgram(#BASH_RELOAD)
    
    If #CONSOLE_ON = 1
      PrintN("Script updated: " + url$)
    EndIf
  Else
    PrintN("No update needed for the script: " + url$)
  EndIf
EndProcedure

If #CONSOLE_ON = 1
  If OpenConsole() = 0
    End ; can't open the console
  EndIf
Else
  If InitKeyboard() = 0
    End ; strange, this n00b does not have keyboard ?
  EndIf
EndIf

; init the network
If InitNetwork() = 0 
  If #CONSOLE_ON = 1
    PrintN("Error -> Can't initialize the network") 
    Input()
  EndIf
  End
EndIf

; Create the console input event thread
If #CONSOLE_ON = 1
  event_thread = CreateThread(@Console_Event(), 0)
EndIf

loop = 1

; main loop who check bots scripts
Repeat
  Check_Bot(#ESTELA_SCRIPT_CUPDATE_URL, #ESTELA_SCRIPT_UPDATE_URL, #ESTELA_SCRIPT_URL)
  Delay(#CHECK_TIME)
  
  If #CONSOLE_ON = 1
    If IsThread(event_thread) = 0 ; while the event thread running
      loop = 0
    EndIf
  Else
    ExamineKeyboard()
    If KeyboardPushed(#KEY_QUIT)
      loop = 0
    EndIf
  EndIf
Until loop = 0
Pour rajouter un bot il faut appeler la fonction : Check_Bot(#ESTELA_SCRIPT_CUPDATE_URL, #ESTELA_SCRIPT_UPDATE_URL, #ESTELA_SCRIPT_URL) et ajouter/changer les définitions qui contienne les URL/Répertoires

Pour la page d'édition de scripts :

Code : Tout sélectionner

<?php
   // vérifie qu'il n'est pas vide
   if(ISSET($script) != "")
   {
      // vire les \"
      $script = str_replace('\"', '"', $script);
      $script = stripslashes($script);
      html_entity_decode($script, ENT_QUOTES);
      // enregistre le fichier et met à 1 la valeur de l'update
      $handle = fopen("estela_script","w");
      fwrite($handle, $script);
      fclose($handle);    
      $handle = fopen("estela_script_up","w");
      fwrite($handle, "1");
      fclose($handle);            
   }
   
   $estela_script = "estela_script";
?>
<html>
<head>
<style type="text/css">
<!--
body {
   margin: 2em 0 0 0;
   padding: 0;
   text-align: center;
   font: 0.75em/1.2em Verdana, Arial, Helvetica, sans-serif;
   color: #666;
}
body * {
   margin: 0;
   padding: 0;
}
#full {
   position: relative;
   width: 65%;
   margin: 0 auto;
   text-align: left;
}

/* formz */

fieldset {
   margin-bottom: 1em;
   border: 0;
   width: auto;
   margin: 0.5em;
   background-color:#97AF12
}
fieldset p {
   padding: 0 0 0.75em 0.5em !important;
   padding: 0 0 0.35em 0.5em;
   clear: both;

}
legend {
   margin: 0 0 0.5em 0;
   padding: 0.3em;
   font: bold 0.9em Verdana, Arial, Helvetica, sans-serif;
   color: #FFD100;
   background-color:#97AF12 !important;
   background-color: none;
}
label.text {
   display: block;
   float: left;
   width: 40%;
   text-align: right; /* n'hésitez pas pas à aligner à gauche, c'est pas mal aussi */
   margin: 0 1em 0 0;
   padding: 0.1em;
   border-bottom: 1px solid #ABBF3B;
}
.radioCheck {
   margin: 0 1em 0 0.25em;   
}
input.text,
textarea {
   /*width: 0%;*/
   background-color: #FFD100;
   border: 4;
   margin-right: 0.25em;   

}
.envoy {
   margin: 1em 0;
   text-align: left;
}
.envoy label {
   border: 0;   
}
hr {
   visibility: hidden;
   clear: both;
}
span.note {
   font-size: 0.75em;
}
span.warning {
   font-weight: bold;
   font-size: 1.3em;
   color: #fff;
}
--></style><title>Edit bots in realtime.</title></head>
<body>
<b>!croissant scripts realtime editor:</b>
<br>
Edit bots realtime in Perl:
<br><br>
<b><u>Estela script:</b></u>
<br>
<?php
   $estela_file = fopen($estela_script,"r");
?>
<center>
<FORM method="POST" action=<?$PHP_SELF;?>>
<TABLE BORDER=0>
<TR>
   <TD>
   <TEXTAREA rows="25" cols="100" name="script">
   <?php
      if (file_exists($estela_script))
      {
         $estela_file = fopen($estela_script,"r");
         while (!feof($estela_file)) 
         {
            echo fgets($estela_file, 4096);
         }
      }
   ?>
   </TEXTAREA>
   </TD>
</TR>
<?php
   fclose($estela_file);
?>

<TR>
   <TD COLSPAN=2>
   <INPUT type="submit" value="Update script">
   </TD>
</TR>
</TABLE>
</FORM>
</center>
</body>
</html>
Code qui permet d'éditer le script d'un bot (avec un petit style css pour rendre la page plus jolie), par contre y'a aucunes gestion si le script est valide où pas :p donc si l'utilisateur à envie de faire buggé votre bot il peut, mais bon le but n'étaît pas la sécurité.

Page PHP qui seras appelé pour mettre à jour la variable de status :

Code : Tout sélectionner

<?php
   $handle = fopen("estela_script_up","w");
   fwrite($handle, "0"); ; on à mis à jour le bot!
   fclose($handle);    
?>
Pour le bash c'est simple, XChat permet de recharger un script via la ligne de commande dans un XChat existant, voici le code (là aussi adaptez pour ce que vous utilisez):

Code : Tout sélectionner

"C:\Program Files\xchat\xchat.exe" --command="reload !croissant.pl"
Pour tester la page qui édite les scripts des bots (pareil, c'est donné à titre d'exemple, le bot en question est un bot de test):

http://www.garzul.tonsite.biz/!croissan ... upload.php

Il y à surement de meilleurs façon de créer ça. ;)

Voilà, ça peut être utile pour permettre à tout un chan IRC de pouvoir éditer les bots sur celui ci (faudrais pouvoir vérifier la syntaxe et mettre une liste noir de commandes pour ne pas autoriser n'importe quoi non plus)

Publié : jeu. 17/janv./2008 22:57
par comtois
Merci de partager, je regarderai ça à l'occasion.

Publié : mar. 23/déc./2008 12:16
par Fortix
salut, "ChannelD.s" c'est pour quoi?