読者です 読者をやめる 読者になる 読者になる

社内IRCがカビ臭くてピリピリしてたので癒し系botを投入した後、リマインダー機能を搭載した話

perl redis

社内のだれからも+1みたいなリアクションされなくて切ないのですが
我が社の社内IRCにはunazu_kunというbotが生息しております。

みたいな感じで、モヒカンたちがうごめく殺伐としたIRCチャンネルに
どうでもいいことでも頷いてくれる癒し系のbotなのですが、
たまに心の潤いを求めて話しかける人はいるものの
あんまり役に立つ感じではなかったので、指定した時間になったら
メッセージをそのまま教えてくれるリマインダー機能付けてみた話です。

botPerlで動いてて、AnyEvent::IRC::ClientとかAnyEvent::DateTime::Cronとか使っていて
今回実装したのは、時間をkeyにして(例えば 10:00 => "1000"、9:9 => "0909")
valueを対象メッセージにする感じにしました。

my $r = Redis->new(server => 'localhost:6379');
$r->lpush($hour . $min => "$nick: $hour:$minだよー。");

みたいな感じでLPUSH。$hourと$minの中身は

$hour = sprintf("%02d", $hour);

などとして強制的に2桁で格納するようにしています(もっと優雅な方法ありそう)

Redisは(L|R)PUSHでLIST型で登録すれば
同じ時間にいくつもメッセージが貯めておけるので便利ですね。
メッセージがあるかないかも

$type = $r->type($key);

if ("list" eq $type) {
    ...
}

keyのtypeがlistであれば真みたいな回し方でできます。
値があれば

$message = $r->rpop($key);

という感じでvalueを持ってくるようにしました。

このようにvalueがなければ(LIST値として戻り値がなければ)
実行されないのでコストがかからなくて良い感じです。

一応 00:00 になったら flushall で全てを無に返すぐらいのカジュアルさを持って
データの肥大化を避けています。そもそもリマインダーは
時間と分しか指定できないので、当日以外の値を持っていても仕方ないのでそうしています。

本当はソース晒した方がいいのですが、なにぶんビールドリブンで酔いながら
リマインダー機能追加したので、今でも何が書いてあるのかよくわかってないところがあります。

Perl初心者ながら、短時間でこれぐらいの実装できるようになったのは、
天女が降りてきて岩を羽衣で撫でるぐらいの進歩はあるのかなーと思ったり思わなかったり。

こういう無駄機能追加できるの、社内IRCbotならではな感じしますので
社内IRC持て余していたら、実務的なbotももちろん良いですが
変なbot生息させるのも面白いのではないでしょうか。

...

( '-')-3