Plagger、daemon化の断片

なんか daemon 関係が著しくヤバイことになってきたようでドキドキしてきました。。。
yappoさんスゴス。
ていうか新しい Hook point の追加はいいですよね。


ちなみにローカルではこんなことやって遊んでるです。
肝心の CustomFeed 、Publish および Notify はまだもう少しだけ公開ムリぽ。
ここら辺を Hackathon で作り込みたいと考えてますのでよろしくお願いいたします<誰

patch-file : plagger-daemon.diff

--- plagger.org	2006-05-09 22:06:22.000000000 +0900
+++ plagger	2006-05-09 22:07:08.000000000 +0900
@@ -13,7 +13,7 @@
 use Getopt::Long;
 
 my $config = File::Spec->catfile($FindBin::Bin, 'config.yaml');
-GetOptions('--config=s', \$config, '--version' => \my $version);
+GetOptions('--config=s', \$config, '--version' => \my $version, '--daemon' => \my $daemon);
 Getopt::Long::Configure("bundling"); # allows -c -v
 
 if ($version) {
@@ -21,5 +21,5 @@
     exit;
 }
 
-Plagger->bootstrap(config => $config);
+Plagger->bootstrap(config => $config, daemon => $daemon);

どうせここまでやるんだったら /usr/bin/plagger でいっぺん fork したいところ。

次。

patch-file : PlaggerDaemon.diff

--- Plagger.pm.org	2006-05-09 22:01:56.000000000 +0900
+++ Plagger.pm	2006-05-09 22:04:40.000000000 +0900
@@ -34,7 +34,8 @@
         subscription => Plagger::Subscription->new,
         plugins_path => {},
         plugins => [],
-        rewrite_tasks => []
+        rewrite_tasks => [],
+        daemon => $opt{daemon} || undef,
     }, $class;
 
     my $config;
@@ -276,6 +277,8 @@
         $self->load_plugin({ module => 'Aggregator::Simple' });
     }
 
+DAEMON_LOOP:
+
     for my $feed ($self->subscription->feeds) {
         if (my $sub = $feed->aggregator) {
             $sub->($self, { feed => $feed });
@@ -321,6 +324,8 @@
         }
     }
 
+    goto DAEMON_LOOP if ($self->{daemon});
+
     $self->run_hook('publish.finalize');
 }
 

otsuneさんにご指摘いただき、diff -u に変更しました。


Plagger の歴史を踏まえて最大限に尊重した上で、機能をエレガントに実装するために goto 文を使っています。
とか、力の限りうそぶいてみる(ネタにもなってませんorz)。


肝心のデータのインプットは、CustomFeed を受け口にすることで解決としています。
これだけじゃ何の役にも立てないけど、とりあえず常駐型アグリゲートエンジンだったり対話型ボットにはなってくれる。