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なんかでなるとを配るようハンドライベント処理を実装すればおしまいです。大変だけど。

