<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://www.bonz.org/tech/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
  <title>ZenTech - irc</title>
  <link>http://www.bonz.org/tech/</link>
  <description>Om Mani Padme Hum</description>
  <language>fr</language>
  <pubDate>Tue, 16 Dec 2008 23:57:46 +0100</pubDate>
  <copyright></copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>HAL&gt; Affirmative, Dave, I read you.</title>
    <link>http://www.bonz.org/tech/post/2008/01/10/HAL-Affirmative-Dave-I-read-you</link>
    <guid isPermaLink="false">urn:md5:1b24cb50e2d7f4d973321a63fd0da31d</guid>
    <pubDate>Fri, 11 Jan 2008 17:39:00 +0100</pubDate>
    <dc:creator>hr</dc:creator>
        <category>code</category>
        <category>freebsd</category><category>irc</category><category>linux</category><category>python</category>    
    <description>&lt;p&gt;&lt;img src=&quot;http://www.bonz.org/tech/public/tech/Hal-9000.jpg&quot; alt=&quot;HAL&quot; style=&quot;float:right; margin: 0 0 1em 1em;&quot; /&gt; Ah la vacuité d'une session &lt;a href=&quot;http://www.faqs.org/rfcs/rfc1459.html&quot; hreflang=&quot;en&quot;&gt;IRC&lt;/a&gt; sur un canal dirigé par un automate. Quoi de plus extraordinaire que pouvoir connaitre la météo de &lt;a href=&quot;http://www.mairie-felletin.fr/&quot; hreflang=&quot;fr&quot;&gt;Felletin dans la Creuse&lt;/a&gt; ou d'avoir une &lt;a href=&quot;http://eggnet.warpzone.org/moduledesc.php?module=9&quot; hreflang=&quot;en&quot;&gt;blague carambar&lt;/a&gt; à la demande. En ce moment je fais beaucoup de python, donc je me suis penché sur le problème pour un &lt;a href=&quot;http://www.binaries.fr/blog/&quot; hreflang=&quot;fr&quot;&gt;ami&lt;/a&gt;. Je vais essayer de vous exposer les clés de l'utilisation d'&lt;code&gt;&lt;a href=&quot;http://python-irclib.sourceforge.net/&quot; hreflang=&quot;en&quot;&gt;irclib&lt;/a&gt;&lt;/code&gt; pour construire un automate irc simple.&lt;/p&gt;    &lt;p&gt;L'automate est présenté ci-après, ses fonctions sont simplement la connexion à un serveur irc local sur le port 6667 et l'entrée dans le canal #test. L'automate s'attend à lire des commandes préfixées de '&lt;code&gt;!&lt;/code&gt;' dans le canal. La commande &lt;code&gt;!cycle&lt;/code&gt; demande à l'automate de partir et revenir sur le canal, la commande &lt;code&gt;!die&lt;/code&gt; provoque la déconnexion du serveur puis l'arrêt de l'automate. Le script de l'automate ci-après se trouve en téléchargement &lt;a href=&quot;http://www.bonz.org/files/mybot.py&quot;&gt;ici&lt;/a&gt; et peut être lancé par la commande &lt;code&gt;python mybot.py&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;
import sys
try:
    from ircbot import SingleServerIRCBot
    import irclib
except ImportError, e:
    print e
    sys.exit(1)

class pybot(SingleServerIRCBot):
    def __init__(self, server, nick, realname, chan):
        SingleServerIRCBot.__init__(self, server, nick, realname)
        self.chan = chan
        self.nick = nick

    ## Event callbacks
    def on_welcome(self, c, e):
        if self.chan:
            c.join(self.chan)

    def on_join(self, c, e):
        who = e.source().split('!', 1)
        if who[0] == self.nick:
            c.privmsg(e.target(), 'Hello world!')

    def on_pubmsg(self, c, e):
        msg = e.arguments()[0].strip()
        if msg.startswith('!'):
            cmd = msg[1:].split(' ', 1)[0]
            self.trigger(c, e, cmd)

    ## Command triggers
    def trigger(self, c, e, cmd):
        try:
            getattr(self, 'cmd_%s' % cmd)(c, e)
        except AttributeError:
            pass

    def cmd_cycle(self, c, e):
        chan = e.target()
        c.part(chan, 'cycle')
        c.join(chan)

    def cmd_die(self, c, e):
        SingleServerIRCBot.die(self, 'Argh')

## Here comes the real script
if __name__ == '__main__':
    server = [('localhost', 6667)]
    nick = 'monbot'
    realname = 'monbot'
    channel = '#test'

    bot = pybot(server, nick, realname, channel)
    try:
        bot.start()
    except KeyboardInterrupt:
        bot.connection.disconnect(&amp;quot;Ctrl-C m'a tuer&amp;quot;)
        bot.connection.close()
&lt;/pre&gt;


&lt;p&gt;La librairie &lt;code&gt;irclib&lt;/code&gt; est basée sur la gestion d'évènements, des méthodes vont être lancées sur apparition d'un évènement au sens IRC. Les méthodes de l'objet &lt;code&gt;pybot&lt;/code&gt; commençant par '&lt;code&gt;on_&lt;/code&gt;' sont les méthodes de gestion d'évènements, par exemple lorsqu'un message est envoyé sur un canal (&lt;code&gt;PUBMSG&lt;/code&gt;) la méthode on_pubsmg() est appelée. La création de l'automate se base sur la surcharge des méthodes de gestion d'évènements. Ces méthodes ont toutes la même définition d'appel&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
def on_foo(self, c, e):
    [...]
&lt;/pre&gt;

&lt;p&gt;La variable &lt;code&gt;c&lt;/code&gt; est un objet &lt;code&gt;ServerConnection&lt;/code&gt;, cet objet permet de manipuler tout ce qui concerne le serveur irc d'où provient l'évènement. On peut par exemple rejoindre un canal (&lt;code&gt;c.join()&lt;/code&gt;) ou envoyer un message à un canal ou une personne (commande &lt;code&gt;PRIVMSG&lt;/code&gt; via &lt;code&gt;c.privmsg()&lt;/code&gt;). La variable &lt;code&gt;e&lt;/code&gt; est un objet &lt;code&gt;Event&lt;/code&gt;, elle permet d'obtenir toutes les informations sur l'évènement qui a provoqué l'appel de la méthode. L'origine de l'évènement (&lt;code&gt;e.source()&lt;/code&gt;), la destination de cet évènement (&lt;code&gt;e.target()&lt;/code&gt;) ou encore les arguments de cet évènement (&lt;code&gt;e.arguments()&lt;/code&gt;). Toutes les informations sur ces 2 méthodes se trouvent dans le module irclib (&lt;code&gt;pydoc irclib&lt;/code&gt;).&lt;/p&gt;


&lt;p&gt;A partir de la connaissance de ces éléments de base, la construction d'un automate devient assez simple. Si l'automate doit effectuer des tâches régulières, les méthodes &lt;code&gt;execute_at()&lt;/code&gt; et &lt;code&gt;execute_delayed()&lt;/code&gt; (héritage de l'objet IRC parent de SingleServerIRCBot) peuvent être utilisées. Plus d'information sur &lt;code&gt;irclib&lt;/code&gt; devrait se trouver sur mon &lt;a href=&quot;http://wiki.bonz.org/python/irclib&quot; hreflang=&quot;fr&quot;&gt;wiki&lt;/a&gt;.&lt;/p&gt;


&lt;p&gt;Il est également possible d'utiliser &lt;a href=&quot;http://twistedmatrix.com/documents/current/api/twisted.words.protocols.irc.html&quot; hreflang=&quot;en&quot;&gt;twisted.words&lt;/a&gt; pour effectuer la même chose mais ça me semble une librairie un peu imposante pour un simple automate.&lt;/p&gt;


&lt;p&gt;Il faut noter qu'on peut faire également le même genre de chose en &lt;a href=&quot;http://search.cpan.org/~bingos/POE-Component-IRC-5.48/lib/POE/Component/IRC.pm&quot; hreflang=&quot;en&quot;&gt;Perl&lt;/a&gt;.&lt;/p&gt;</description>
    
    
    
      </item>
    
</channel>
</rss>