Hatena::Groupangelos

Angelos in Action RSSフィード

Fork me on GitHub
 | 

2009-09-20

Bot::BasicBot::PluggableのAnyEvent版みたいなやつを作ってみた

03:34 | Bot::BasicBot::PluggableのAnyEvent版みたいなやつを作ってみた - Angelos in Action を含むブックマーク はてなブックマーク - Bot::BasicBot::PluggableのAnyEvent版みたいなやつを作ってみた - Angelos in Action Bot::BasicBot::PluggableのAnyEvent版みたいなやつを作ってみた - Angelos in Action のブックマークコメント

AnyEventデビューとして、Bot::BasicBot::PluggableのAnyEvent版みたいなやつを作ってみた。

http://github.com/dann/p5-bot-irc-lite

yusukebeさんのblogに書いてあったものをPluginとして使えるように、sampleとしてcommitしておきました。

http://yusukebe.com/archives/09/09/08/201227.html

http://yusukebe.com/archives/09/09/10/020033.html


使い方はこんな感じ

 bin/botirclite.pl --conf conf/example.conf

config.yaml

---
global:
  server: irc.example.net
  port: 6667
  channels:
    - '#botirclitetest'
  nick: botirclite
  username: botirclite
  name: botirclite,
  ignore_list:
    - ignorename
  charset: utf-8

plugins:
  - module: Echo
  - module: RSS 
    config:
      interval: 60
      subscriptions:
        - channel: #botirclite
          urls:
            - http://dann.g.hatena.ne.jp/dann/rss
  - module: Twitter::TrackHashTag
    config:
      user: test
      password: test
      subscriptions:
        - channel: #botirclite
          hashtags:
            - '#test'
            - '#hoge'

これで、Plugin::RSSplagger-ircbotみたいなのはできるようになった。これであとは、Store実装してKarma Pluginをportingすればそれでいいかも。KVSライクなシンプルな実装があればそれ使ってさくっと実装したいなぁ。

TODO

  • Storeの実装
  • hook point増やす
  • PluginのAPI見直したりとか。
    • AnyEventのircmsgをまんま渡すのは見直すかなぁくらい。

ひと頑張りすれば、Bot::BasitBotよりはいいものになるんじゃないかと思う。暇なときにpluginでもportingしよっかなと。

# IKC的なのもできるようにしたいなぁってことで探してたらtypesterさんのモジュールAnyEvent::JSONRPC::Liteが!ということで、プラグイン化してみた。typester++ と思ったら、JSONRPCのはPlugin化したのは動いてないなぁ...AnyEvent::JSONRPC::Lite単体で動いてPlugin化して動いてないってことは、AnyEvent関連ではまってるんだとは思うんだけど... あとで、AnyEvent::JSONRPC::Liteのコードも後で読むことにしよう...

# 結果的に、AnyEvent->condvar => AnyEvent->condvarと多段になっちゃってるのは極めて怪しいなぁ。AnyEvent::CondVarをAnyEvent::JSONRPC::Lite::Serverに渡せるようにすればいいのかも。AnyEvent::Handleの理解がいまいちだから、後はそれよんでみてといったところかなぁ。

# Storeの実装はCHIでいいかと思ったら、CHIがいつのまにかMooseになってた... Moose依存がさけられなくなるのも時間の問題といったところかなぁ。

# tokuhiromさんのブクマコメントに今更気づいたんですが、AnyEventのdebugでは結構はまってる気がします... roleのプラグイン機構とあわせるとどうハマりやすくなるのかは、まだいまいちわかっておらず。roleそのものがデバッグしずらいという話なんですかね。

tokuhiromtokuhirom2009/09/23 07:15Role そのものがデバッグしにくいとおもっていて、とくに自分が書いたものならともかく他人がかいたコードだと、スパゲッティになりがちな上に、AE もまた condvar などの関係で直線的なコードにならないので、この2つがくみあわさると、追うのが大変なのかなーと感じた次第です。

danndann2009/09/23 08:59roleそのもののデバッグが難しいというのは、Pluginをroleではなくて、別のクラスにして、委譲する形におきかえればわかりやすくなったりしますかね。roleも委譲もある種の責務の単位をまとめる役割をもっていて、それは特にスパゲッティにはならないかなぁと思ってるんですよね。

作っている人以外にとっては、どの責務にどのクラス(or Role)が対応しているのかがわかりにくくなるというのはあるとは思うんですが、それはクラスデザインの問題であって、この問題はroleでも別クラスに委譲する形でも同じことが起きうるので、roleの問題ではないかなぁと思ってます。なので、スパゲッティになる理由が他にあるのかが一番知りたいところだったりします。

あと少し思っているのは、roleベースのプラグインだとhook pointがわかりにくいというのは、あるかなぁという気はしてるんですが。これは解決策は色々あるかなぁと。

AEのほうは確かにそうだなぁと思ってます。

# 大分前にroleをつかっていたときには、role内のコードでエラーがでたときに、roleを withしている側のクラスのエラーとして表示されて、どのroleでエラーが起きたのかわからずに、デバッグ時に困った気はしたんですが。

 |