Mon, 09 Jan 2006

twisted.words.protocols.irc.IRCClientで自動opをするとハマる点

IRCと自動op

IRCbotではよくある機能の一つとしてなるとの自動配布があります。

IRCプロトコル的にはこんな感じ:

MODE #channel +o nickname

これを送るまでが大変で、nicknameはただnicknameとして来ることはなく、 nick!user@host の形でくるので、まずは 'nick!user@host'.split('!')[0] でnickの部分だけ取り出します。まあこのへんはtwistedの中でもやってくれてる部分もあります。

twistedのIRCClient

でまあ、タイトルの通りtwistedのIRCClientをいじってあそんでるわけですが、 IRCClientクラスにはイベントハンドラがあり、これをオーバーライドして使います。

userJoinedというハンドラメソッドがあったので、これを使いましたが、userという値にはnick(ややこしい)だけしか入っていないので、これではnickだけしか見れないのでうっかりこれで条件づけをすると危険です。

ベースになっているuserJoinedメソッドのソース:

def userJoined(self, user, channel):
    """Called when I see another user joining a channel.
    """
    pass

実のところ、userJoinedの前にbot自身のjoinかどうかで分岐させている部分があり、 ここからであればユーザ情報がひととおり取得できます。

ベースになっているirc_JOINメソッドのソース:

def irc_JOIN(self, prefix, params):
    nick = string.split(prefix,'!')[0]
    channel = params[-1]
    if nick == self.nickname:
        self.joined(channel)
    else:
        self.userJoined(nick, channel)

ひとまず、これをコピペ(イクナイけど)して、一番下のuserJoinedの部分を:

self.userJoined(prefix, channel) #prefixつっても意味わかんねえけど

にして、あとはbotがsendLineなんかでなるとを配るようハンドライベント処理を実装すればおしまいです。大変だけど。