Vous êtes sur la page 1sur 14

Programmer un bot IRC simplement avec ircbot - Python - C...

http://www.siteduzero.com/tutoriel-3-102516-programmer-un...

Programmer un bot IRC simplement avec ircbot


Informations sur le tutoriel
Auteur : Dentuk Difficult : Visualisations : 4 673 Licence :

Plus d'informations Ce tutoriel prsente l'utilisation du module ircbot de Joel Rosdahl pour Python. Comme son nom l'indique, celui-ci permet de programmer son propre bot IRC. Il utilise le module irclib du mme auteur, qui est plus gnral et qui ne sera que partiellement prsent ici. Sont prrequises pour suivre ce tutoriel : des bases en Python, notamment au niveau de la POO (dclaration d'une classe, hritage...) ; et des connaissances sur ce qu'est IRC et les possibilits qu'il offre.

C'est bon ? Alors, suivez le guide. Sommaire du tutoriel :

Se procurer les fichiers La programmation vnementielle et ircbot Application un bot simpliste Allons un peu plus loin

Se procurer les fichiers


Les deux modules que nous allons tudier, irclib et ircbot, ont t dvelopps par un programmeur tiers et ne sont donc pas livrs directement avec Python ; vous allez donc devoir vous les procurer avant de commencer !

Le module ircbot utilise irclib. Vous ne pouvez donc pas utiliser ircbot sans avoir install au pralable irclib.

Si vous tes sous une distribution Linux grant les installations par paquets, alors il existe probablement un

1 sur 14

4/07/09 3:43

Programmer un bot IRC simplement avec ircbot - Python - C...

http://www.siteduzero.com/tutoriel-3-102516-programmer-un...

paquet python-irclib qui regroupe irclib et ircbot. Par exemple, sous Ubuntu, taper sudo apt-get install python-irclib installera les modules. Cependant, la version publique des modules gre les demi-oprateurs ou half operators de la mme manire que les utilisateurs normaux. Pour cette raison, je vous invite utiliser une version modifie par mes soins qui fait bien la distinction ici. Si vous dsirez malgr tout utiliser la version publique, tlchargez la dernire version depuis la page du projet sur SourceForge.net. Aprs cela, dcompressez l'archive l'aide de votre logiciel favori. La plupart des fichiers sont des programmes d'exemple, que je vous conseille de regarder plutt aprs qu'avant d'avoir lu ce tutoriel. Maintenant, deux choix s'offrent vous : lancer le script d'installation via setup.py comme indiqu dans le fichier README, de sorte que tous vos codes aient accs ces deux modules ; placer les deux fichiers irclib.py et ircbot.py dans le rpertoire du programme pour chaque script utilisant ces modules. La premire solution est conseille si vous utilisez vos bots pour vous-mmes, puisqu'elle vous vitera de copier les fichiers chaque fois que vous programmerez un nouveau bot. En revanche, si vous comptez distribuer vos programmes, il est fortement recommand de livrer les fichiers des modules avec, puisque l'utilisateur n'aura pas ncessairement install irclib et ircbot sur son ordinateur, d'autant plus si vous utilisez la version modifie. Vous pouvez aussi installer les fichiers pour la priode de dveloppement et les distribuer une fois le bot termin.

La programmation vnementielle et ircbot


Avant de commencer coder, il va falloir faire un brin de thorie. Rien de bien compliqu, bien entendu. Si vous utilisez irclib ou ircbot, vous allez devoir faire ce que l'on appelle de la programmation vnementielle. Il s'agit d'une logique de programmation raisonnant sur des vnements : quand il se passe telle chose, alors on fait cela. Pour un exemple concret : quand quelqu'un rejoint le canal, alors je lui dis bonjour. Il s'avre que c'est particulirement adapt IRC, ce qui explique son utilisation ici. Dans vos programmes, vous allez dfinir pour chaque vnement que vous souhaitez traiter une mthode qui sera appele automatiquement par ircbot, lorsque l'vnement en question se produira. Pour cela, vos bots devront hriter de la classe ircbot.SingleServerIRCBot. Chaque mthode devra tre de la forme suivante : Code : Python class MonBot(ircbot.SingleServerIRCBot): def on_evenement(self, serv, ev): # gestion de l'vnement

Dans le nom de la mthode, evenement sera remplac par le nom de l'vnement traiter, ce qui donnera par exemple on_join, on_kick, etc. La mthode prend deux paramtres (ici nomms serv et ev). Le premier sert communiquer avec le serveur, et le second nous renseigne sur l'vnement, nous permettant de savoir qui a t kick, par qui et sur quel canal par exemple.

Nous allons maintenant tudier plus en dtail ces deux arguments.

Communication avec le serveur

2 sur 14

4/07/09 3:43

Programmer un bot IRC simplement avec ircbot - Python - C...

http://www.siteduzero.com/tutoriel-3-102516-programmer-un...

travers la classe irclib.ServerConnection, l'argument serv dont nous avons parl plus haut est une instance, irclib nous permet de faire dialoguer notre bot avec le serveur comme le ferait un client IRC habituel. Elle dispose de nombreuses mthodes et seules les plus utilises seront rapidement prsentes ici. Commandes gnrales irclib.ServerConnection. nick(self, pseudonyme) get_nickname(self) privmsg(self, destinataire, message) action(self, destinataire, message) notice(self, destinataire, message) invite(self, pseudonyme, canal) join(self, canal, cle='') Change le pseudonyme du bot. Renvoie votre pseudonyme actuel. Celui-ci n'est pas forcment celui que vous souhaitiez, en particulier si vous demandez un pseudonyme rserv. Envoie un message ; le destinataire peut tre soit un canal tel que #kikoo, soit un nom d'utilisateur tel que dentuk. Envoie une action ; sous la plupart des clients, cela correspond la commande /me. Envoie une notice. Invite un autre utilisateur rejoindre le canal prcis. Rejoint le canal prcis, en utilisant la cl donne si le canal est protg par mot de passe. Quitte le serveur, ventuellement avec un message d'au revoir, et dconnecte le bot. Utilit

part(self, canal, message='') Quitte le canal prcis, ventuellement avec un message d'au revoir. disconnect(self, message='')

Commandes d'oprateur irclib.ServerConnection. kick(self, canal, pseudonyme, raison='') mode(self, canal, commande) Utilit Exclut un utilisateur du canal, ventuellement avec une raison. Active ou retire un mode. Nous verrons comment utiliser les modes plus loin dans le tutoriel.

Voil dj de quoi bien vous amuser. Pour la liste complte des mthodes, lancez un shell Python et procdez ainsi : Code : Python >>> import irclib >>> help(irclib.ServerConnection)

Toutefois, la documentation n'est pas trs prcise, le plus souvent on a droit un envoie telle commande au serveur , vous aurez donc peut-tre besoin de la complter par une recherche.

La variable d'vnement
Il y a dans irclib trois catgories d'vnements : ceux qui dcoulent du protocole IRC en lui-mme, et sont les plus utiles tels que la rception d'un message ou l'exclusion d'un utilisateur ;

3 sur 14

4/07/09 3:43

Programmer un bot IRC simplement avec ircbot - Python - C...

http://www.siteduzero.com/tutoriel-3-102516-programmer-un...

ceux qui sont gnrs pour les besoins de irclib, concernant principalement le CTCP et le DCC que nous n'tudierons pas ici ; et les vnements dits numriques , parce qu'ils correspondent un code numrique dans le protocole IRC dont vous, en tant qu'utilisateur de irclib, n'aurez pas vous soucier ; ils prcisent une tape dans la communication (dbut / fin d'envoi du message du jour...), une erreur (si l'on essaie d'envoyer un message un pseudonyme inexistant...) ou autre chose ; ils sont trs nombreux et nous n'en tudierons qu'un seul dans ce tutoriel, qui est celui de bienvenue.

Un vnement est reprsent par une instance de la classe irclib.Event, c'est le cas de l'argument ev de notre mthode modle. Cette classe possde trois mthodes d'information qui nous seront utiles, et une autre qui, en gnral, ne sert pas quand on utilise ircbot. irclib.Event. source(self) target(self) Renseigne sur... ... l'origine de l'vnement ; c'est--dire, selon l'vnement, soit un serveur, soit un utilisateur, soit un canal. ... la cible de l'vnement ; c'est--dire, selon l'vnement, soit un utilisateur, soit un canal.

arguments(self) ... divers paramtres relatifs l'vnement, toujours sous la forme d'une liste. eventtype(self) ... le type de l'vnement ; par exemple, "welcome" pour l'vnement de bienvenue. Nous allons maintenant voir quelques vnements que vous pouvez choisir de traiter. Bien entendu, vous n'avez pas besoin de tout savoir par coeur, vous pouvez toujours garder les tableaux de ct quand vous programmez. Je vous propose deux tableaux : dans le premier, il y a ce que reprsente la valeur de retour de chaque mthode de irclib.Event pour chaque vnement ; et dans l'autre, des exemples de ces valeurs de retour pour bien comprendre.

4 sur 14

4/07/09 3:43

Programmer un bot IRC simplement avec ircbot - Python - C...

http://www.siteduzero.com/tutoriel-3-102516-programmer-un...

Tableau des vnements mis quand... ev.eventtype() ev.source() Serveur ev.target() Votre pseudonyme Nouveau pseudonyme Votre pseudonyme Canal Canal Votre pseudonyme Canal Pseudonyme invit Canal Canal Message d'au revoir Message d'au revoir Pseudonyme de la victime Raison du kick Message envoy Message envoy Message d'action Message envoy Message envoy Canal ev.arguments() Message d'accueil

... vous tes connects au serveur. welcome ... quelqu'un change de pseudonyme. ... quelqu'un vous envoie un message priv. ... quelqu'un envoie un message sur le canal. nick privmsg pubmsg

Utilisateur Utilisateur Utilisateur Utilisateur Utilisateur Utilisateur Utilisateur Utilisateur Utilisateur Utilisateur

... quelqu'un utilise la commande action /me sur le canal. ... quelqu'un vous envoie une notice. privnotice

... quelqu'un envoie une notice au pubnotice canal. ... quelqu'un invite une autre personne rejoindre le canal. ... quelqu'un rejoint le canal. ... quelqu'un quitte le canal. ... quelqu'un quitte le serveur. invite join part quit

... un oprateur expulse un utilisateur.

kick

Utilisateur

Canal

... un oprateur applique un ou des modes.

mode

Utilisateur

Canal

Mode(s) appliqu(s) Argument ventuel Argument ventuel ...

5 sur 14

4/07/09 3:43

Programmer un bot IRC simplement avec ircbot - Python - C...

http://www.siteduzero.com/tutoriel-3-102516-programmer-un...

mis quand...

ev.eventtype() ev.source()

ev.target()

ev.arguments()

Exemples de valeurs de retour ev.eventtype() 'welcome' ev.source() 'marseille.fr.epiknet.org' 'dentuk!~dentuk@EpiKBE9687C2.fbx.proxad.net' 'dentuk!~dentuk@EpiKBE9687C2.fbx.proxad.net' 'dentuk!~dentuk@EpiKBE9687C2.fbx.proxad.net' 'dentuk!~dentuk@EpiKBE9687C2.fbx.proxad.net' 'dentuk!~dentuk@EpiKBE9687C2.fbx.proxad.net' 'dentuk!~dentuk@EpiKBE9687C2.fbx.proxad.net' 'dentuk!~dentuk@EpiKBE9687C2.fbx.proxad.net' 'dentuk!~dentuk@EpiKBE9687C2.fbx.proxad.net' 'dentuk!~dentuk@EpiKBE9687C2.fbx.proxad.net' 'dentuk!~dentuk@EpiKBE9687C2.fbx.proxad.net' 'dentuk!~dentuk@EpiKBE9687C2.fbx.proxad.net' 'dentuk!~dentuk@EpiKBE9687C2.fbx.proxad.net' ev.target() 'bottuk' ev.arguments() ['Welcome to the EpiKnet IRC Network bottuk!~bottuk@[...].net'] [] ['salut bottuk, comment va ?'] ['bonjour tout le monde !'] ['est heureux !'] ['salut bottuk !'] ['je notice tout le canal !']

'nick' 'privmsg' 'pubmsg' 'action' 'privnotice' 'pubnotice' 'invite' 'join' 'part' 'quit' 'kick' 'mode'

'palatuk' 'bottuk' '#kikoo' '#kikoo' 'bottuk' '#kikoo'

'TomicBomb' ['#kikoo'] '#kikoo' '#kikoo' None '#kikoo' '#kikoo' [] ['je reviens'] ['Quit: Konversation terminated!'] ['bouletman', "pas d'insultes, merci !"] ['+hh', 'bouh', 'A-dream']

Vous vous demandez peut-tre comment exploiter les valeurs de retour de la mthode irclib.Event.source, que j'appellerai des masques pour la suite du tutoriel. Bien que l'on puisse extraire les diffrentes parties assez facilement avec Python seul, irclib fournit plusieurs fonctions pour procder l'extraction. Le tableau ci-dessous utilise un masque de la forme 'pseudonyme!utilisateur@domaine' . Fonctions d'extraction irclib. Origine du nom Extrait... ... le pseudonyme. ... l'utilisateur. ... le domaine. nm_to_n(masque) nickmask to nick nm_to_u(masque) nickmask to user nm_to_h(masque) nickmask to host

nm_to_uh(masque) nickmask to userhost ... l'utilisateur et le domaine. Pour illustrer, je vous propose une petite session dans un shell Python. Code : Python

6 sur 14

4/07/09 3:43

Programmer un bot IRC simplement avec ircbot - Python - C...

http://www.siteduzero.com/tutoriel-3-102516-programmer-un...

>>> import irclib >>> masque = 'dentuk!~dentuk@EpiK-BE9687C2.fbx.proxad.net' >>> irclib.nm_to_n(masque) 'dentuk' >>> irclib.nm_to_u(masque) '~dentuk' >>> irclib.nm_to_h(masque) 'EpiK-BE9687C2.fbx.proxad.net' >>> irclib.nm_to_uh(masque) '~dentuk@EpiK-BE9687C2.fbx.proxad.net'

Parlons maintenant un peu de la classe ircbot.SingleServerIRCBot.

tude de la classe mre


Nous allons maintenant voir quelques mthodes de la classe mre qui vous seront utiles pour la plupart de vos bots.

Mthode d'initialisation
En voici le prototype : Code : Python ircbot.SingleServerIRCBot.__init__(self, liste_serveurs, pseudonyme, nom_reel

tudions les paramtres un un. liste_serveurs est... une liste de serveurs ! En effet, la classe utilise permet de changer de

serveur en cours d'excution, mme si nous n'approfondirons pas cette possibilit dans ce tutoriel. Chaque serveur est indiqu par une liste de la forme [serveur, port, mot_de_passe] qui renseigne les informations utiliser sur ce serveur, les autres paramtres tant communs tous les serveurs. Vous n'tes pas obligs de prciser un mot de passe. pseudonyme et nom_reel ont, je pense, un nom assez prcis pour que vous vous doutiez de ce qu'ils renseignent. Mais savez-vous ce qu'est le nom rel ? Il s'agit d'une information que le serveur envoie aux personnes dsirant en savoir plus sur vous par la commande /whois. intervalle_reconnexion possde aussi un nom quivoque puisqu'il s'agit du temps en secondes pendant lequel le bot doit patienter avant d'essayer de se reconnecter s'il est dconnect. Ce paramtre est facultatif et vaut 60 par dfaut.

Lancer le bot
On ne peut plus simple, le lancement se fait par l'appel de la mthode ircbot.SingleServerIRCBot.start qui ne prend aucun paramtre. Notez que cela interrompt

l'excution du script pour se consacrer uniquement au bot, comme une boucle infinie. On peut en sortir en levant une exception, par consquent l'interruption Ctrl-C arrte le bot.

Arrter le bot
La mthode ircbot.SingleServerIRCBot.die(self, message='') quitte le serveur, dconnecte le bot et met fin l'excution du script. C'est en gnral cette mthode que l'on utilise pour arrter le bot. Si

7 sur 14

4/07/09 3:43

Programmer un bot IRC simplement avec ircbot - Python - C...

http://www.siteduzero.com/tutoriel-3-102516-programmer-un...

vous avez besoin de poursuivre l'excution du script aprs la dconnexion, utilisez plutt la mthode ircbot.SingleServerIRCBot.disconnect(self, message='') suivie de la leve d'une exception que vous intercepterez dans le code principal. Notez que si vous employez cette dernire seule, le bot se reconnectera au bout d'un certain temps prcis l'initialisation.

Rpondre aux commandes VERSION


Par dfaut, la rponse envoye une commande VERSION est "ircbot.py by Joel Rosdahl <joel@rosdahl.net>" . Si vous dsirez changer cela, vous pouvez rimplmenter la mthode ircbot.SingleServerIRCBot.get_version(self) , et lui faire retourner le message de votre choix.

C'est la mthode ircbot.SingleServerIRCBot.on_ctcp(self) qui, par dfaut, rpond automatiquement aux commandes PING et VERSION de cette faon. Pensez-y si vous souhaitez rimplmenter cette mthode.

Application un bot simpliste


Pour mieux comprendre tout ce que l'on a vu jusqu'ici, je propose de vous montrer un exemple de bot cod avec ircbot. Il s'agit d'un bot de modration simplifi au maximum, qui exclut les personnes crivant des insultes dans leurs messages. Analysez bien le code et revoyez au besoin ce qui a dj t vu, le but tant que vous soyez capables de faire un bot vous-mmes aprs avoir vu cet exemple. J'ai comment les parties du code qui le ncessitaient, les autres parties sont simples et je ne m'tendrai donc pas dessus. Code : Python

8 sur 14

4/07/09 3:43

Programmer un bot IRC simplement avec ircbot - Python - C...

http://www.siteduzero.com/tutoriel-3-102516-programmer-un...

#!/usr/bin/env python # -*- coding: utf8 -*import irclib import ircbot class BotModeration(ircbot.SingleServerIRCBot): def __init__(self): """ Constructeur qui pourrait prendre des paramtres dans un "vrai" programme. """ ircbot.SingleServerIRCBot.__init__(self, [("irc.epiknet.org", 6667)], "moderator", "<italique>Bot</italique> de modration ralis en Python avec ircbot") self.insultes = ["con", "pute"] # Liste agrandir pour un "vrai" programme. def on_welcome(self, serv, ev): """ Mthode appele une fois connect et identifi. Notez qu'on ne peut rejoindre les canaux auparavant. """ serv.join("#test-ircbot") def on_pubmsg(self, serv, ev): """ Mthode appele la rception d'un message, qui exclut son expditeur s'il crit une insulte. """ # Il n'est pas indispensable de passer par des variables, ici elles permettent de clarifier le tout. auteur = irclib.nm_to_n(ev.source()) canal = ev.target() message = ev.arguments()[0].lower() # Les insultes sont crites en minuscules. for insulte in self.insultes: if insulte in message: serv.kick(canal, auteur, "Les insultes ne sont pas autorises ici break

!")

if __name__ == "__main__": BotModeration().start()

La gestion des insultes pourrait bien sr tre grandement amliore, mais ce n'est pas le but de cet exemple. Si vous avez tout compris jusqu'ici, vous devriez dj tre capables de programmer des bots intressants. Si vous estimez ces connaissances suffisantes, vous pouvez arrter ici le tutoriel. En revanche, si vous souhaitez aller un peu plus loin, passez la partie suivante.

Allons un peu plus loin


Dans cette partie, nous allons voir diverses choses qui pourraient vous tre utiles un jour, sans ordre prcis. Si une sous-partie ne vous intresse pas, passez la suivante.

Masques de bannissement
Si vous tes oprateurs d'un canal, vous avez probablement dj vu des masques de bannissement. Par exemple, le masque *tuk!*@* englobe les personnes ayant un pseudo finissant par tuk , quels que soient leur nom d'utilisateur et leur domaine. irclib fournit une fonction pour vrifier si un utilisateur vrifie un

9 sur 14

4/07/09 3:43

Programmer un bot IRC simplement avec ircbot - Python - C...

http://www.siteduzero.com/tutoriel-3-102516-programmer-un...

masque ainsi form, dont voici le prototype : Code : Python irclib.mask_matches(masque_utilisateur, masque_a_verifier)

Cette fonction, l'instar de la fonction re.match, retourne un objet de matches en cas de succs et None en cas d'chec. noter que l'objet de matches est inexploitable. En gnral, on utilise la valeur de retour comme s'il s'agissait d'un boolen, parce que bool(None) vaut False et bool(un_objet_de_matches) vaut True . Toujours pour illustrer, une autre session dans le shell Python : Code : Python >>> import irclib >>> masque = 'dentuk!~dentuk@EpiK-BE9687C2.fbx.proxad.net' >>> irclib.mask_matches(masque, '*tuk!*@*') <_sre.SRE_Match object at 0xb7a6d7c8> >>> irclib.mask_matches(masque, 'Tomic*!*@*') >>> bool(irclib.mask_matches(masque, '*tuk!*@*')) True >>> bool(irclib.mask_matches(masque, 'Tomic*!*@*')) False

Cela peut, par exemple, servir faire une commande !quit qui dit au bot de partir, mais rserve son possesseur en identifiant ce dernier par un masque : Code : Python class Bot(ircbot.SingleServerIRCBot): def on_pubmsg(self, serv, ev): masque_auteur = ev.source() message = ev.arguments()[0].lower() if message == "!quit" and irclib.mask_matches(masque_auteur, "*!*@EpiK-BE9687C2.fbx.proxad.net"): self.die()

Excution dlimite dans le temps


Vous pouvez avoir besoin d'attendre un certain temps avant d'excuter une action. Par exemple, si vous faites un bot de quiz et que vous devez attendre une minute, avant de changer de question si personne n'a trouv la question, pour viter que le jeu ne soit bloqu. Mais si vous utilisiez time.sleep, vous bloqueriez l'excution et irclib ne pourrait pas traiter les nouveaux vnements pendant ce temps. Pour rgler ce problme, irclib propose deux mthodes.

Excution au bout d'un certain temps


Voici la mthode utiliser : Code : Python irclib.ServerConnection.execute_delayed(self, temps, fonction, arguments=())

Lorsque vous appelez cette mthode, irclib prend en compte qu'il faudra appeler la fonction fonction dans temps secondes avec les arguments arguments, et fera l'appel le moment voulu. temps peut tre un nombre

10 sur 14

4/07/09 3:43

Programmer un bot IRC simplement avec ircbot - Python - C...

http://www.siteduzero.com/tutoriel-3-102516-programmer-un...

entier ou flottant, et arguments est un tuple contenant les arguments passer la fonction, qui est vide par dfaut. Par exemple, si vous tiez sadiques et que vous souhaitiez adapter le code du bot de modration, vu plus haut, en mettant un compte rebours avant l'exclusion, vous pourriez implmenter la mthode on_pubmsg ainsi : Code : Python class BotModeration(ircbot.SingleServerIRCBot): def on_pubmsg(self, serv, ev): auteur = irclib.nm_to_n(ev.source()) canal = ev.target() message = ev.arguments()[0].lower() for insulte in self.insultes: if insulte in message: serv.privmsg(canal, "3...") serv.execute_delayed(1, serv.privmsg, (canal, "2...")) serv.execute_delayed(2, serv.privmsg, (canal, "1...")) serv.execute_delayed(3, serv.kick, (canal, auteur, "0 !")) break

Excution un moment prcis


Code : Python irclib.ServerConnection.execute_at(self, timestamp, fonction, arguments=())

Trs similaire, cette mthode fonctionne exactement de la mme manire. Simplement, le premier paramtre est maintenant un timestamp tel que ceux retourns par time.time et time.mktime .

Gestion des canaux


Vous vous rappelez quand je vous ai parl de la mthode irclib.ServerConnection.mode(self, canal, mode) ? Il est temps de voir quelques modes qui peuvent tre activs et leur effet. Les principaux modes de canaux sans paramtre Mode m s p i Signification Le canal est modr, seuls les privilgis, les demi-oprateurs et les oprateurs peuvent y parler. Le canal est secret, il est cach lors d'une commande /whois et il n'est pas prsent dans la liste des canaux du serveur. Le canal est protg, ce qui a le mme effet qu'tre secret. Le canal est accessible uniquement sur invitation.

Si par exemple vous vouliez que le canal devienne modr, vous devriez utiliser serv.mode(canal, "+m") . Pour qu'il ne le soit plus, ce serait serv.mode(canal, "-m") . Vous pouvez cumuler l'ajout et / ou le retrait de modes. Par exemple, si vous utilisez serv.mode(canal, "+is-m") , alors : le canal n'est dsormais accessible que sur invitation ; il devient secret ; et il n'est plus modr.

11 sur 14

4/07/09 3:43

Programmer un bot IRC simplement avec ircbot - Python - C...

http://www.siteduzero.com/tutoriel-3-102516-programmer-un...

Viennent ensuite les modes avec paramtres. Les principaux modes de canaux avec paramtre Mode v h o b e k Paramtre Utilisateur Utilisateur Utilisateur Masque de bannissement Masque d'exception Cl La personne est privilgie. La personne est un demi-oprateur. La personne est un oprateur. Si une personne correspond au masque, elle ne peut pas rejoindre le canal. Si une personne correspond au masque, les bannissements ne l'empchent pas de rejoindre le canal. Il faut connatre la cl pour rejoindre le canal. Signification

Mettons que vous vouliez que bouh devienne demi-oprateur. La commande serait alors serv.mode(canal, "+h bouh") . Pour qu'il ne le soit plus, ce serait serv.mode(canal, "-h bouh") . L aussi, vous pouvez combiner les modes, en sparant les paramtres par des espaces et en les mettant dans l'ordre o les modes correspondants apparaissent. Par exemple, voici ce que fait le code serv.mode(canal, "+ohhm-v TomicBomb bouh A-dream bouletman") en lisant de gauche droite : TomicBomb devient oprateur ; bouh et A-dream deviennent demi-oprateurs ; le canal devient modr ; et bouletman perd son statut privilgi.

ircbot dfinit une classe pour savoir qui est prsent sur un canal et quels modes y sont activs, la classe ircbot.Channel. Nous allons voir les mthodes correspondant aux modes tudis plus haut, dans des tableaux pour changer. Mthodes en rapport avec les utilisateurs En franais Utilisateurs Privilgis Demi-oprateurs Oprateurs En anglais Users Voices Liste des... irclib.Channel.users(self) irclib.Channel.voiced(self) pseudonyme en est-il un ? irclib.Channel.has_user(self, pseudonyme) irclib.Channel.is_voiced(self, pseudonyme)

Half irclib.Channel.is_halfoper(self, irclib.Channel.halfopers(self) operators pseudonyme) Operators irclib.Channel.opers(self) irclib.Channel.is_oper(self, pseudonyme)

Les utilisateurs regroupent la fois les utilisateurs lambda, les privilgis, les demi-oprateurs et les oprateurs. Les mthodes en rapport avec les demi-oprateurs ne sont prsentes que dans la version modifie ; dans la version publique, celles-ci sont situes dans la liste des utilisateurs avec le prfixe %.

12 sur 14

4/07/09 3:43

Programmer un bot IRC simplement avec ircbot - Python - C...

http://www.siteduzero.com/tutoriel-3-102516-programmer-un...

Mthodes pour savoir les modes activs Le canal est-il... ... modr ? ... secret ? ... protg ? ... protg par une cl ? irclib.Channel. is_moderated(self) is_secret(self) is_protected(self) has_key(self)

... accessible uniquement sur invitation ? is_invite_only(self)

13 sur 14

4/07/09 3:43

Programmer un bot IRC simplement avec ircbot - Python - C...

http://www.siteduzero.com/tutoriel-3-102516-programmer-un...

Le canal est-il...

irclib.Channel.

Vous pouvez rcuprer la cl du canal avec la mthode irclib.Channel.key(self) , qui retourne None s'il n'y en a pas. Pour ceux qui prfrent utiliser les noms des modes plutt que de longs noms de mthodes, la classe prvoit une mthode irclib.Channel.has_mode(self, mode) . Maintenant que l'on a vu ce que permettait la classe, il serait bon de l'utiliser. La classe mre ircbot.SingleServerIRCBot possde un attribut channels qui est un dictionnaire faisant correspondre un canal un objet ircbot.Channel, lequel est mis jour automatiquement suivant les vnements. Retournons donc voir notre bot de modration pour lui interdire d'exclure les membres privilgis : Code : Python class BotModeration(ircbot.SingleServerIRCBot): def on_pubmsg(self, serv, ev): auteur = irclib.nm_to_n(ev.source()) canal = (ev.target(), self.channels[ev.target()]) # tuple (nom, ircbot.Channel) message = ev.arguments()[0].lower() if not canal[1].is_voiced(auteur) and not canal[1].is_halfoper(auteur) and not canal[1].is_oper(auteur): for insulte in self.insultes: if insulte in message: serv.kick(canal[0], auteur, "Les insultes ne sont pas autorises ici !") break

Vous devriez maintenant pouvoir faire le bot IRC que vous souhaitez. Vous pouvez complter ce tutoriel en lisant la documentation et / ou le code des modules tudis, ou en vous renseignant sur le protocole IRC. Laissez libre cours votre imagination, et amusez-vous bien ! Les images 16x16 associes aux serveurs, utilisateurs et canaux dans le tableau des vnements proviennent de http://www.famfamfam.com/.

14 sur 14

4/07/09 3:43

Vous aimerez peut-être aussi