scalaでirc botを書く場合

Javaのライブラリを使うのがらくちんみたいだ。 PircBotを使う場合はこんな感じ。 package com.example.IRCBot import org.jibble.pircbot._ class Bot() extends PircBot { overridedef onMessage( channel: String, sender: String, login: String, host: String, message: String) { message match { case m if m.startsWith(this.getName) => this.sendMessage("hi") case _ => } } } object SimpleBotApp extends App { val bot = new Bot() bot.setName("echo-bot") bot.setEncoding("utf-8") bot.connect("irc.example.com", 6667) bot.joinChannel("#hoge") } »

直前の発言を置換する 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! »

IRC に issue 番号に反応する bot がいると捗る

IRC bot のはなし。 #123 みたいな文字列に反応して、 github の issue のタイトル github の issue の URL を返してくれる bot をつくったら思いの外便利だった。 #!/usr/bin/env perl use strict; use warnings; use utf8; use AnyEvent::IRC::Client; use AnyEvent; use Config::Pit; use Encode; use Furl; use HTTP::Request; use JSON::XS; use Log::Minimal; use App::Options( option => { nick => { type => 'string', default => 'issue-bot' }, channel => { type => 'string' }, join_message => { type => 'string', default => '' }, org_name => { type => 'string' }, project_name => { type => 'string' }, }, ); my %opts = %App::options; $Log::Minimal::PRINT = sub { my ($time, $type, $message, $trace, $raw_message) = @_; print STDERR "$time[$type] $messageat $trace\n"; }; my $github = pit_get('github', require => { username => 'github username', password => 'github password', }); my $irc_conf = pit_get('irc', require => { host => 'irc host', port => 'irc port', password => 'irc password', }); my $json = JSON::XS->new->utf8; my $furl = Furl->new(); my $cv = AnyEvent->condvar; my $con = AnyEvent::IRC::Client->new(); $con->reg_cb( connect => sub { my ($con, $err) = @_; if (defined $err) { warnf "connection error: %s", $err; $cv->send(); } else { infof 'connected'; } } ); $con->reg_cb( registered => sub { infof 'registered'; if ($opts{join_message}) { $con->send_chan( $opts{channel}, 'PRIVMSG', $opts{channel}, $opts{join_message}, ); } } ); $con->reg_cb( disconnect => sub { infof 'disconnected'; $cv->broadcast(); } ); $con->reg_cb( publicmsg => sub { my ($con, $channel, $irc_message) = @_; return unless $irc_message->{command} eq 'PRIVMSG'; my @issue_nums = $irc_message->{params}[1] =~ /#([0-9]+)/g; return unless @issue_nums; for my $issue_num (@issue_nums) { my $message = retrieve_issue_info($issue_num); next unless $message; infof $message; send_message($con, $message); } } ); $con->enable_ssl(); $con->connect($irc_conf->{host}, $irc_conf->{port}, { nick => $opts{nick}, password => $irc_conf->{password}, }); $con->send_srv('JOIN', $opts{channel}); $cv->recv(); $con->disconnect(); sub retrieve_issue_info { my ($issue_num) = @_; my $url = sprintf 'https://api. »

ZNCってひとつのアカウントで複数サーバーに接続できるよね?

znc 1.0 IPv6: yes, SSL: yes, DNS: threads irssi 0.8.15 (20100403 1617) 「複数のサーバーに繋ぐときにはアカウントを同じ数作ろう」っていう エントリをいくつか見かけたけど、 わざわざそんなことする必要ないような。 単に Network タグを並べればOK。 <User handlename> ... <Network freenode> <Chan #minecraft> ... </Chan> ... </Network> <Network 2ch> <Chan #ロビー> ... </Chan> ... </Network> </User> irssiでつないだ時のチャンネル表示も freenode/minecraft みたいになるので 別のサーバーで同じチャンネル名があっても問題ないはず。 いまのところこれで不便はしてないです。 »