Bonjour,
Bon nombreux d'entre nous connaisses IRC (Internet Relay Chat) ... et certains l'utilise surement tout les jours (comme moi).
Pour ceux qui ne connaisse pas IRC :
(Internet Relay Chat), application qui permet à différents Internautes de dialoguer. Cela se présente sous forme de messages qui s'affichent en temps réel et permettent donc une réponse immédiate de l'interlocuteur.
source : http://securinet.free.fr/def/irc.html
Vous allez me dire mais qu'est ce que IRC peut bien faire dans cette partie du forum, sous AutoIT on automatise ! Nah Nah Nah !
Pour ceux ayant la prétention de pouvoir coder des bots, ou d'autres applications, IRC peut intervenir dans votre code.
Mais Comment?! Je t'écoute!
- Pourquoi pas utiliser IRC pour faire une TAB "Chat" sur votre bot, ce qui permettrait de dialoguer avec d'autres utilisateurs qui eux même utilisent votre bot.
- Pourquoi pas utiliser une TAB "Chat" pour permettre de rendre le bot, plus "dynamique", j'entends par la que le fait que ca bouge, que vous puissiez dialoguer améliore l'usage (ou plutôt l'utilité) Plus qu'un bot, une communauté
- Cela peut permettre a tout les utilisateurs de dialoguer, de se donner des conseils, de s'aider, de se retrouver sur le jeux, et d'être plus que des joueurs isolés.
Donc coté "client" (utilisateur) du bot on a trouvé l'intérêt... mais coté "programmeur" (créateur du bot) a quoi bon?
Alors là , je vois 2 réponses tout suite :
- Savoir qui utilise le bot (donc fréquence d'utilisation, et nombre de personnes), le fait d'avoir une communauté, et de voir que notre bot est utilisé, cela (en quelque sorte) donne une satisfaction, et qui dit "programmeur satisfait", dit "programmeur
productif"
- Permet d'être en contacte directe avec les utilisateurs (recevoir des conseils d'usagés, des reports bug en directe, etc...)
Un exemple (j'ai juste fait la form)
Loading Image
voici, tout comme mIRC (le client Windows de madkaley), une fenêtre composée :
- En haut à gauche : Message reçu sur le canal de tout les utilisateurs
- En haut à droite : Les utilisateurs connectés sur le canal
- en bas : Zone de saisie, pour envoyer du texte.
Autre chose à savoir : comment fonctionne "a peu prêt" IRC
Donc vous êtes un utilisateur, vous vous connectez à un serveur, et vous allez sur un canal.
Le canal / channel, est le salon de discutions, et tout les canaux de discutions sont sur un serveur (bah oui! faut bien que quelqu'un héberge tout ca, c'est pas dans le néant.). Mais aucune crainte il existe déjà beaucoup de serveur IRC, vous n'aurez pas
besoin d'en héberger un!
Donc voici, j'ai tout dit sur IRC, maintenant il faut savoir utiliser le protocole pour s'y connecter / écrire / et lire
Vous pouvez trouver la RFC en français ici : iprelax.fr
Mais je vais tacher de vous expliquer moi même les fonctions principales et importante à connaitre :
Pour établir la connexion
- Message NICK : permet d'envoyer au serveur votre NICKname, c'est à dire votre "pseudonyme"
structure : NICK <pseudonyme>
exemple : NICK n0way
- Message USER : permet d'envoyer au serveur vos identifiants, c'est ce qui vous caractérises, vous prenez pas le choux, c'est inutile (où presque, mais tout de même obligatoire!)
structure : USER <nom d'utilisateur> <hôte> <nom de serveur> <nom réel>
exemple : USER n0way 0 0 n0way
- Message JOIN : permet d'établir la connexion à un channel de discution
structure : JOIN <channel>
exemple : JOIN #test
Envoyer du message
- Message PRIVMSG : permet d'envoyer un message sur le canal de discution ou a une personne en privé
structure : PRIVMSG <destinataire> :<message>
Exemple 1 sur un canal : PRIVMSG #test :test
Exemple 2 à une personne : PRIVMSG n0way :test
Vérification de l'éxistence
- Message PING : le serveur envois un PING, pour vérifier que vous êtes toujours là, et il attend une réponse de votre part, si vous ne répondez pas il vous déconnecte. La réponse se fait par un PONG
Donc vous recevez "PING", vous envoyez "PONG", vous verrez plus bas comment je m'y prend.
Passons sous AutoIT maintenant
les fonctions qu'on va utiliser, et que je vous invite à aller lire une fois au moins dans l'aide :
- TCPStartup()
- TCPConnect ( IPAddr, port )
- TCPSend ( mainsocket, data )
- TCPNameToIP()
Donc nous y voilà, SciTe allumé, notre bouteille de coca à droite fermé, et notre clavier prêt à l'emploie.
Avant tout, et surtout pour pas l'oublier :
TCPStartup()
Ensuite, je définie les variable qui nous seras utile
Global $serveur = "irc.freenode.org"
Global $port = 6667
Global $channel = "#test"
Global $pseudo = "n0way"
Global $masock
- $serveur : le serveur sur lequel on va se connecter => ici : irc.freenode.org (je vous le conseille il est stable)
- $port : le port sur lequel on se connecte (sous irc c'est souvent 6667, ou pas loin) => ici : 6667
- $channel : le canal de discution sur lequel on ira (le notre) => ici : #test
- $pseudo : votre pseudonyme => ici : n0way
à savoir que sur le même serveur il ne peut pas y avoir 2 fois le même pseudonyme, pensez à demander a votre utilisateur de votre cheat de préciser un nom ou alors récupérer le nom du pc, désagréable à mon avis de voir son pseudo pc afficher au yeux
de tous, alors préférer le InputBox au moins une fois (au premier lancement par exemple)
- $masock, la variable sur laquelle on créera notre socket (TCPConnect)
Nous y voilà , il faut établir la connexion maintenant au serveur :
$masock = TCPConnect(TCPNameToIP($serveur), $port) ;établir la connexion au serveur
TCPSend($masock, "NICK " & $pseudo & @CRLF) ; on envoi le message NICK
TCPSend($masock, "USER " & $pseudo & " test test2 :OhMyGod " & @CRLF) ; on envoi le message USER
et ensuite on créer notre boucle infinie, qui traitera tout ce qu'on reçoit :
While 1
$data = TCPRecv($masock, 4000) ; on insere ce qu'on recoit dans $data
If @error Then Exit ; si il y a une erreur, on ferme la boucle.
If Not $data Then ContinueLoop ; sinon on continue à lire
$datasplit = StringSplit($data, @CRLF, 1) ;on decompose dans un array le packet qu'on a recu pour differencier chaque ligne recu
For $i = 1 To $datasplit[0] ;on forme une boucle pour étudier chacune des lignes recu
$datasplit2 = StringSplit($datasplit[$i], " ") ;on decompose dans un array la ligne qu'on a recu pour differencier chaque mot de la ligne
If $datasplit2[1] = "PING" Then TCPSend($masock, "PONG " & $datasplit2[2] & @CRLF) ;Respond to PING requests from the server
If $datasplit2[0] < 3 Then ContinueLoop ; on verifie qu'il y a plus de 3 mot dans la ligne, si oui on continue (ca permet de verifier que la donnée recu est importante
Switch $datasplit2[2] ;on fait un switch pour faire des différences si le deuxieme mot est :
Case "PRIVMSG" ; privmsg (donc on recoit du texte)
$qui = StringMid($datasplit2[1], 2, StringInStr($datasplit2[1], "!") - 2) ;recuperer le pseudo de celui qui a écrit
$quoi = StringMid($datasplit[$i], StringInStr($datasplit[$i], ":", 0, 2) + 1) ;qu'est ce qu'il a dit
$ou = $datasplit2[3] ;et sur quel canal
Case "001" ; 001 (c'est à dire qu'on a fini de se connecter, on établie la connexion au channel
TCPSend($masock, "JOIN " & $channel & @CRLF) ;JOIN #channel
EndSwitch
Next
WEnd
Voilà un exemple, très brouillon mais qui vous aidera à comprendre (je l'espère)
#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <GUIListBox.au3>
#include <WindowsConstants.au3>
Global $Form1 = GUICreate("Form1", 625, 422, 192, 124)
Global $List1 = GUICtrlCreateList("", 2, 2, 505, 383)
Global $List2 = GUICtrlCreateList("", 512, 2, 105, 383)
Global $Input1 = GUICtrlCreateInput("", 2, 392, 505, 21)
Global $Button1 = GUICtrlCreateButton("envoyer", 512, 392, 107, 21, $WS_GROUP)
GUISetState(@SW_SHOW)
Global $serveur = "Vidar.IRC.Worldnet.Net"
Global $port = 6667
Global $channel = "#test"
Global $pseudo = "n0way2"
Global $masock
TCPStartup()
$masock = TCPConnect(TCPNameToIP($serveur), $port)
sleep(5000)
TCPSend($masock, "NICK " & $pseudo & @CRLF)
TCPSend($masock, "USER " & $pseudo & " test test2 :OhMyGod " & @CRLF)
While 1
$nMsg = GUIGetMsg()
Switch $nMsg
Case $GUI_EVENT_CLOSE
Exit
Case $Button1
TCPSend($masock, "PRIVMSG " & $channel & " :" & GUICTrlRead($Input1) & @CRLF)
_GUICTrlListBox_AddString($List1, "<" & $pseudo & "> " & GUICTRLRead($input1))
GUiCtrlsEtData($Input1, "")
EndSwitch
$data = TCPRecv($masock, 4000) ; on insere ce qu'on recoit dans $data
If @error Then Exit ; si il y a une erreur, on ferme la boucle.
If Not $data Then ContinueLoop ; sinon on continue à lire
$datasplit = StringSplit($data, @CRLF, 1) ;on decompose dans un array le packet qu'on a recu pour differencier chaque ligne recu
For $i = 1 To $datasplit[0] ;on forme une boucle pour étudier chacune des lignes recu
$datasplit2 = StringSplit($datasplit[$i], " ") ;on decompose dans un array la ligne qu'on a recu pour differencier chaque mot de la ligne
If $datasplit2[1] = "PING" Then TCPSend($masock, "PONG " & $datasplit2[2] & @CRLF) ;Respond to PING requests from the server
If $datasplit2[0] < 3 Then ContinueLoop ; on verifie qu'il y a plus de 3 mot dans la ligne, si oui on continue (ca permet de verifier que la donnée recu est importante
Switch $datasplit2[2] ;on fait un switch pour faire des différences si le deuxieme mot est :
Case "PRIVMSG" ; privmsg (donc on recoit du texte)
$qui = StringMid($datasplit2[1], 2, StringInStr($datasplit2[1], "!") - 2) ;recuperer le pseudo de celui qui a écrit
$quoi = StringMid($datasplit[$i], StringInStr($datasplit[$i], ":", 0, 2) + 1)
$ou = $datasplit2[3] ;et sur quel canal
_GUICtrlListBox_AddString($List1, "<" & $qui & "> " & $quoi)
Case "001" ; 001 (c'est à dire qu'on a fini de se connecter, on établie la connexion au channel
TCPSend($masock, "JOIN " & $channel & @CRLF) ;JOIN #channel
Case "353"
For $j = 6 To $datasplit2[0]
_GUICTrlListBox_AddString($List2, $datasplit2[$j])
Next
EndSwitch
Next
WEnd
Voilà, j'espère que ce tuto vous aura aider, et donné des idées
J'espère qu'il prouvera ma bonne foi, et qu'il me permettra d'accéder aussi à d'autres parties du forum, que j'en apprenne un peu plus.
Je suis ouvert à toutes questions.
Cordialement,
n0way