官方 Tutorial
介绍 Irssi 是一个 IRC 客户端, 可以用 Perl, Python, Tcl 等脚本为其扩充功能.
官方提供的 Perl 教程有:
可以用:
查看加载的一些模块中是否包含对应语言支持. 该文章都用 Perl 的 Irssi
模块作为示例.
文件权限 由于 Irssi 脚本是直接嵌入到 irssi 的环境中并执行的 (而不是在命令行中运行), 因此不需要可执行权限. 一般设置为 600
或 644
即可.
初始化一般为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 use strict;use vars qw($VERSION %IRSSI) ;use Irssi; $VERSION = '1.00' ; %IRSSI = ( authors => 'A. U. Thor' , contact => 'author@far.away' , name => 'My First Script' , description => 'This script allows ' . 'you to print Hello ' . 'World using a command.' , license => 'Public Domain' , );
用于与 Irssi 交互的函数一般都在 Irssi::
namespace 下.
Irssi 是基于 Event 的, 当 event 发生时调用对应函数 (把函数绑定在 event 上, 像 hook). 有两种 events:
Signals 随时都可能发生, 比如:
用户加入 channel
用户更改 nickname 等
而 Commands 则是用户的输入来触发.
可以用 signal_add
或 command_bind
来设置, 其第一个参数为 signal 或 command name, 第二个参数则是对应的函数:
1 2 3 4 5 6 7 8 9 10 11 12 sub testing { my ($data, $server, $witem) = @_; return unless $witem; $witem->print ('It works!' ); } Irssi::command_bind test => \&testing; Irssi::command_bind hello => sub { print 'Hello, world!' ; };
或:
1 2 3 4 5 use Irssi qw(command_bind signal_add) ; ... command_bind hello => sub { print 'Hello, world!' ; };
注意 print
后, 其实 irssi 会自动加上 \n
的 (如果自己又加了一个则会出现空行).
这里需要注意 消息级别
这个概念, 即打印出的消息是否会显示给其他用户之类的.
用 Perl 内置的 print
函数, 默认使用 CLIENTCRAP
消息类别, 其不会显示给其他用户.
可以直接用文件句柄控制消息的输出, 比如:
也是 CLIENTCRAP
级别.
若想输出消息到公共频道, 可以这样写:
1 $witem->print ('Example' , MSGLEVEL_PUBLIC);
$witem
是一个窗口对象
Example
是消息内容, MSGLEVEL_PUBLIC
是消息级别 (都已 MSGLEVEL_
为前缀)
注册/使用设置 有三种类型的设置:
分别用:
settings_add_str
settings_add_int
settings_add_bool
来注册. 其有三个参数:
第一个参数: 设置的类别 (一个字符串, 用于组织设置)
第二个参数: 设置的名称 (唯一标识)
第三个参数: 默认值 (可以是字符串, 整数或布尔值)
可以用:
settings_get_str
settings_get_int
settings_get_bool
来获取设置值.
示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 use Irssi qw( command_bind settings_get_bool settings_add_bool settings_get_str settings_add_str ) ; command_bind mycommand => sub { my ($data, $server, $witem) = @_; my $msg = settings_get_str('blah_msg' ); $msg = "cC4$msg" if settings_get_bool('blah_color' ); $witem->print ($msg); }; settings_add_bool('blah' , 'blah_color' , 1 ); settings_add_str( 'blah' , 'blah_msg' , 'Hello!' );
脚本加载和卸载 脚本放在 ~/.irssi/scripts/
或 /usr/local/lib/irssi/scripts/
目录下.
用:
来加载.
用:
来卸载.
也可以用:
(不需要加 .pl
扩展名)
Signals 用 signal_add
添加对 event privmsg
信号的处理:
1 2 3 4 5 6 7 8 9 sub event_privmsg { my ($server, $data, $nick, $address) = @_; my ($target, $text) = split (/ :/ , $data, 2 ); Irssi::signal_stop() if ($text =~ /free.*porn/ || $nick =~ /idiot/ ); } Irssi::signal_add("event privmsg" , "event_privmsg" )
可以用 signal_stop
来终止一个信号.
Commands 一个较为规范的示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 sub cmd_hello { my ($data, $server, $witem) = @_; if (!$server || !$server->{connected}) { Irssi::print ("Not connected to server" ); return ; } if ($data) { $server->command("MSG $data Hello!" ); } elsif ($witem && ($witem->{type} eq "CHANNEL" || $witem->{type} eq "QUERY" )) { $witem->command("MSG " .$witem->{name}." Hello!" ); } else { Irssi::print ("Nick not given, and no active channel/query in window" ); } } Irssi::command_bind('hello' , 'cmd_hello' );
Message Level 用于控制输出的显示, irssi 提供的 message level 有:
1 2 3 CRAP, MSGS, PUBLIC, NOTICES, SNOTES, CTCPS , ACTIONS, JOINS, PARTS QUITS, KICKS, MODES, TOPICS, WALLOPS, INVITES, NICKS, DCC, DCCMSGS,CLIENTNOTICE , CLIENTCRAP , CLIENTERROR
在 Perl 脚本中, 都可以用 MSGLEVEL_
前缀来使用:
1 $server->print ("#channel" , 'Hello, world' , MSGLEVEL_CLIENTCRAP);
Window Items 一个 Window 可以有很多 items, 其可以指 a channel 获 a query.