まらんさんのチラ裏

その日暮らしのおじさん

IRCClient.py bug fix

PING がきたとき、PONG を送れなくて落ちる不具合を修正。
他に細かいところ修正。
ついでなのでクラスとコール部を分けた。


IRCClient.py

#!/usr/bin/env python2.4
# -*- coding: utf-8 -*-

import socket, string

class IRCClient:
    def __init__(self, debug):
        self.debug = debug

    def dlog(self, text):
        if self.debug != 0:
            print("%s" % unicode(text, "iso-2022-jp"))

    def connect(self, server, port):
        self.con = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.con.connect((server, port))
        self.dlog("connected")

    def disconnect(self):
        self.con.send("QUIT\r\n")
        self.dlog("QUIT")
        self.con.close()

    def set_nick(self, nick):
        self.con.send("NICK %s\r\n" % nick)
        self.dlog("NICK %s" % nick)

    def set_userinfo(self, username, hostname, servername, realname):
        self.con.send("USER %s %s %s %s\r\n" % (username, hostname, servername, realname))
        self.dlog("USER %s %s %s %s" % (username, hostname, servername, realname))

    def join(self, channel):
        self.con.send("JOIN %s\r\n" % channel)
        self.dlog("JOIN %s" % channel)

    def leave(self, channel):
        self.con.send("PART %s\r\n" % channel)
        self.dlog("PART %s" % channel)

    def recv(self, byte):
        while (1):
            recv = self.con.recv(byte)
            msg = string.split(recv)
            if msg[0] == "PING":
                self.dlog("%s" % recv)
                self.con.send("PONG %s" % msg[1])
                self.dlog("PONG %s" % msg[1])
            else:
                self.dlog(recv)
                text = {
                        "userinfo":msg[0],
                        "command":msg[1],
                        "channel":msg[2],
                        "message":msg[3]
                        }
                text["message"] = unicode(text["message"], "iso-2022-jp")
                if text["command"] == "PRIVMSG":
                    break
        return text

    def send(self, text):
        self.con.send("%s\r\n" % text)
        self.dlog("%s" % text)

    def send_msg(self, text, channel):
        self.con.send("PRIVMSG %s :%s\r\n" % (channel, text))
        self.dlog("PRIVMSG %s :%s" % (channel, text))

    def send_notice(self, text, channel):
        self.con.send("NOTICE %s :%s\r\n" % (channel, text))
        self.dlog("NOTICE %s :%s" % (channel, text))



example.py

#!/usr/bin/env python2.4
# -*- coding: utf-8 -*-

import IRCClient, string


if __name__ == '__main__':

    server = 'irc.media.kyoto-u.ac.jp'
    port = 6667
    nick = 'yournick'
    channel = '#hogech'

    irc = IRCClient.IRCClient(1)
    irc.connect(server, port)
    irc.set_nick(nick)
    irc.set_userinfo(nick, nick, nick, nick)
    irc.join(channel)

    while (1):
        recv = irc.recv(1024)
        msg_ary = string.split(recv['message'])

        if msg_ary[0] == u":hoge":
            print "Hit: hoge"

    irc.leave(channel)
    irc.disconnect()