社内IRCがカビ臭くてピリピリしてたので癒し系botを投入した後、リマインダー機能を搭載した話
社内のだれからも+1みたいなリアクションされなくて切ないのですが
我が社の社内IRCにはunazu_kunというbotが生息しております。
みたいな感じで、モヒカンたちがうごめく殺伐としたIRCチャンネルに
どうでもいいことでも頷いてくれる癒し系のbotなのですが、
たまに心の潤いを求めて話しかける人はいるものの
あんまり役に立つ感じではなかったので、指定した時間になったら
メッセージをそのまま教えてくれるリマインダー機能付けてみた話です。
botはPerlで動いてて、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