hogeとはワイルドカードのようなものです。日々起こった、さまざまなこと −すなわちワイルドカード− を取り上げて日記を書く、という意味で名付けたのかというとそうでもありません。適当に決めたらこんな理由が浮かんできました。
05/05/2005 うむ [長年日記]
■ [戯言] こまんどができるまで
IRCMemoBot コマンドのつくりかた.仕様が変更される可能性は大いにあり得るけども.
- コマンド名を決めます.ここでは「!hoge <url> <description>」なコマンドを作ります.
- commands ディレクトリ以下に command_hoge.py を作ります.
- command_hoge.py の中に command_hoge クラスを定義します.
- command_hoge クラスは supercommand.SuperCommand を継承します.コンストラクタは config オブジェクトと rss オブジェクトを引数にとります.
- hoge コマンドは url を第一引数に,description を第二引数にとるので,SuperCommand の初期化では SuperCommand.__init__(self, config, rss, url=1, description=2) となります.
- 処理を書きます.
ここで SuperCommand のデフォルト処理フローを見てみます.例えばこの状態でコマンド「!hoge <url> <description>」が打たれると,analyze term → modify term と処理を行います.また,デフォルトで analyze では split,modify では load_rss_for_multi が実行されるようになっています.ここで split や load_rss_for_multi 等の,term 内で実行されるものを proc と呼びます.
split proc ではコマンド引数を解析,分割して保存します.ここで保存された引数は get_arg() メソッドで取得することができます.!hoge では url と description を引数にとっているので,get_arg('url') で第一引数を取得できます.
load_rss_for_multi proc は単純に RSS をリロードします.これは設計がダメダメなことによる苦肉の策なので気にしないで下さい.
さて,各 term に入るときには _before_TERMNAME_term,term から出るときには _after_TERMNAME_term というメソッドが呼ばれます.command_hoge クラスの中でこれを定義しておくと,term に入るとき,term から出るときに何をするかを記述することができます.デフォルトでは何もしません.また,_default メソッドをオーバーライドするとデフォルト動作を変更することができますが,よっぽどのことがない限りはやらない方がいいでしょう.デバッグ等に使うのは良いと思います.
また,proc も同様に,proc を実行する前に _before_PROCNAME,後に _after_PROCNAME を呼びます.デフォルト動作も同様です.
さて,term には proc を複数関連づけておくことができます.append_proc メソッドで,既存の term に proc を追加することができます.例えば self.append_proc('modify', 'hoge_proc') などとすると,modify term で呼ぶメソッドを追加できるということです.
hoge_proc を modify term に追加したので,hoge_proc の処理内容を定義します.メソッド名を _hoge_proc として処理を書きましょう.引数はコネクション,イベント,送信されたメッセージ全文,送信者のニックネーム,送信されたチャンネル名の 5 つです.お好みに応じて _before_hoge_proc や _after_hoge_proc を定義しても良いです.これらのメソッドは真偽値を返すものとします.偽が返った場合,そこで処理がストップします.
もちろん,term も追加することができます.append_term メソッドで write term を追加してみましょう.self.append_term('write', ['write_to_rss', 'write_to_html']) で,第二引数は proc のリストです.これで,処理フローは analyze → modify → write となりました.
write term の proc である write_to_rss, write_to_html ですが,これは実は SuperCommand で用意されています.つまり _write_to_rss,_write_to_html メソッドが定義済みです.RSS や HTML への書き出しをやってくれます.また,write term を出たときに実行される _after_write_term も定義されています.もちろんオーバーライドして処理を変更しても構いません.
他にも term や proc を削除することなどもできますが,そこらへんはめんどくさいのでコード読んで下さい.
さて,できたコードはというと,
from suppercommand import SuperCommand class command_hoge(SuperCommand): def __init__(self, config, rss): SuperCommand.__init__(self, config, rss, url=1, description=2) self.append_proc('modify', 'hoge_proc') self.append_term('write', ['write_to_rss', 'write_to_html']) def _hoge_proc(self, c, e, msg, nick, channel): self.get_arg('url') # 第一引数をゲット self.get_arg('description') # 第二引数をゲット ... return True # 処理が終了した時は真偽値を返す
これだけです.ここで処理フローをもう一度確認してみると,
- _before_analyze_term
- _before_split
- _split
- _after_split
- _after_analyze_term
- _before_modify_term
- _before_load_rss_for_multi
- _load_rss_for_multi
- _after_load_rss_for_multi
- _before_hoge_proc
- _hoge_proc
- _after_hoge_proc
- _after_modify_term
- _before_write_term
- _before_write_to_rss
- _write_to_rss
- _after_write_to_rss
- _before_write_to_html
- _write_to_html
- _after_write_to_html
- _after_write_term
という順番にメソッドが呼ばれるわけです.この内,定義されていて呼び出しが行われるものだけを抜き出すと,
- _split (SuperCommand でスケジュールされている)
- _load_rss_for_multi (SuperCommand でスケジュールされている)
- _hoge_proc
- _write_to_rss (SuperCommand で定義されたものを呼ぶようにした)
- _write_to_html (SuperCommand で定義されたものを呼ぶようにした)
- _after_write_term (SuperCommand で定義されたものを呼ぶようにした)
となります.
というわけで何かおもろいコマンド思いついたら作って下さい.主に俺が喜びます.
と
ここまで書いて,IRCMemoBot 特化でなく irclib にコマンドを送るためのライブラリとして抽象化した方が良かったんじゃないかと思った.
うーん,まぁいいや.
■ [小ネタ] 個人ニュースサイト管理人の就職活動 反応リンク集
む,反応リンク集が出来ていたとは.