handlename's blog

コード片など

直前の発言を置換する IRC bot

タイポして投稿した時に

handlename: 毛根な時間
handlename: s/毛根/もうこん/

みたいな感じで発言を訂正することがある。

Skype だと実際に自分の発言が修正されるので、IRC でもやってみた。 過去の発言を修正することはできないので、修正版の発言を再投稿するだけ。 メタ文字とかオプションとかの判別は面倒なのでやってない。 evalすればいいんや!

#!/usr/bin/env perl

use strict;
use warnings;

use AnySan;
use AnySan::Provider::IRC;
use Log::Minimal;

use App::Options(
    option => {
        host    => { type => 'string', required => 1 },
        port    => { type => 'string', default  => '6666' },
        ssl     => { type => 'bool',   default  => 0 },
        nick    => { type => 'string', required => 1 },
        channel => { type => 'string', required => 1 },
    },
);
my %opts = %App::options;

my $password = password();

my $messages = {};

my $irc = irc(
    $opts{host},
    port       => $opts{port},
    enable_ssl => $opts{ssl},
    password   => $password,
    key        => $opts{host},
    nickname   => $opts{nick},
    channels   => { $opts{channel} => {} },
);

AnySan->register_listener(
    replace => {
        cb => sub {
            my ($receive) = @_;

            if ($receive->message =~ qr!(s/[^/]+/[^/]*/[gi]*)! &&
                defined $messages->{$receive->from_nickname})
            {
                my $regex   = $1;
                my $message = $messages->{$receive->from_nickname};
                eval "\$message =~ $regex";
                $receive->send_replay($message);

                infof '%s: %s, %s -> %s',
                    $receive->from_nickname,
                    $receive->message,
                    $messages->{$receive->from_nickname},
                    $message;
            }
            else {
                $messages->{$receive->from_nickname} = $receive->message;
            }
        },
    },
);

AnySan->run();

sub password {
    print 'password []:';

    system 'stty -echo';
    my $password = <STDIN>;
    system 'stty echo';
    print "\n";

    chomp $password;

    return $password;
}```

AnySan を使ってみたかっただけだから、役にはたたない感じする。
https://github.com/handlename/p5-replace-irc-bot