[AutoIT] protocole IRC, faire un chat sur votre bot

    Publicités

Users Who Are Viewing This Thread (Total: 0, Members: 0, Guests: 0)

n0way

Membre actif
Nov 21, 2010
311
0
581
Earth
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 :


PHP:
(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)

irc001.PNG
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 : Ce lien n'est pas visible, veuillez vous connecter pour l'afficher. Je m'inscris!

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 :

PHP:
TCPStartup()

Ensuite, je définie les variable qui nous seras utile

PHP:
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 :

PHP:
$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 :

PHP:
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 :

PHP:
#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

Je suis ouvert à toutes questions, je tacherais de vous aider au mieux.

J'espère que ce tuto pourra m'aider à acceder à la Zone Programmeur

Cordialement,
n0way

PS : Mathis je crois que ca pourra t'aider

MERCI CA COUTE RIEN
 
Last edited:
G

Guest 10587

Génial comme idée , en effet ça serait pratique de savoir quels autre joueurs utilisent les mêmes hack/cheat que nous.
Et le meilleur , c'est que mettre en place le chat n'est vraiment pas compliqué.

Merci bien ;D
 

n0way

Membre actif
Nov 21, 2010
311
0
581
Earth
C'est pas si compliqué, faut juste avoir compris comment fonctionne le protocole...

Et tu peux très nettement améliorer ce bout de code pour rajouter des fonctions sympathique :)

Mais je vous laisse le soin de réfléchir la dessus :)

Cordialement,
n0way
 

n0way

Membre actif
Nov 21, 2010
311
0
581
Earth
Ou j'ai appris quoi ?

A utiliser TCP ? dans l'aide de autoit...
Le protocole de IRC ? en cherchant sur internet le fonctionnement du protocole... mais je le connaissais déjà étant donnée que j'avais déjà eu affaire avec le protocole la fois ou je voulais faire un bot irc en PHP (pour mon site).

Donc j'ai fais un mélange des deux (ce qui je pense est utile pour vous) et je vous en ai fait un petit tuto (intéressant je pense).

A bientôt,
n0way
 
X

xYoh

En clair ta appris tout sa dans l’autiot pas sur d’autre site ?
 

n0way

Membre actif
Nov 21, 2010
311
0
581
Earth
Bonsoir,

J'ai appris à utiliser les fonctions utiles avec l'aide oui... et j'ai adapté avec mon besoin.

J'ai demandé le grade programmeur il y a 2 ou 3 jours, et je n'ai toujours pas eu de réponse, je crois que mon travail n'est pas suffisant ici.

A bientôt,
n0way
 
Oct 30, 2011
616
0
442
Merci , tuto très détailler , même si je savait déjà faire sa , se n'ai pas le cas de tout le monde , Merci ! :)
 

S0BAD

Membre
May 27, 2012
49
0
306
Merci , moi qui m'etait lancé dans le visual basic et en apprenant que microsoft a laissé tombé Vb , Je vais me metre à l'autoit , je pense metre une semaine a tout apprendre dumoin les base/socket le mousemove , pixelsearch tout le monde connais :) Mon projet
Final un bot socket dofus :) en éspérant que je ne fasse pas comme les autre langage lol
que japprend la moitié et ke jpâsse a un autre x)