Irssi-扩充脚本编写

官方 Tutorial

介绍

Irssi 是一个 IRC 客户端, 可以用 Perl, Python, Tcl 等脚本为其扩充功能.

官方提供的 Perl 教程有:

可以用:

1
/LOAD

查看加载的一些模块中是否包含对应语言支持. 该文章都用 Perl 的 Irssi 模块作为示例.

文件权限

由于 Irssi 脚本是直接嵌入到 irssi 的环境中并执行的 (而不是在命令行中运行), 因此不需要可执行权限. 一般设置为 600644 即可.

Irssi 模块初始化

初始化一般为:

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 交互的函数一般都在 Irssi:: namespace 下.

Irssi 是基于 Event 的, 当 event 发生时调用对应函数 (把函数绑定在 event 上, 像 hook). 有两种 events:

  • signals
  • commands

Signals 随时都可能发生, 比如:

  • 用户加入 channel
  • 用户更改 nickname 等

而 Commands 则是用户的输入来触发.

可以用 signal_addcommand_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 (window item) may be undef.

$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 消息类别, 其不会显示给其他用户.

可以直接用文件句柄控制消息的输出, 比如:

1
print CRAP 'Example';

也是 CLIENTCRAP 级别.

若想输出消息到公共频道, 可以这样写:

1
$witem->print('Example', MSGLEVEL_PUBLIC);
  • $witem 是一个窗口对象
  • Example 是消息内容, MSGLEVEL_PUBLIC 是消息级别 (都已 MSGLEVEL_ 为前缀)

注册/使用设置

有三种类型的设置:

  • string
  • integer
  • boolean

分别用:

  • 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/ 目录下.

用:

1
/script load name.pl

来加载.

用:

1
/script unload name.pl

来卸载.

也可以用:

1
/run name

(不需要加 .pl 扩展名)

Signals

signal_add 添加对 event privmsg 信号的处理:

1
2
3
4
5
6
7
8
9
sub event_privmsg {
# $data = "nick/#channel :text"
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
# Usage: /HELLO [<nick>]
sub cmd_hello {
# data - contains the parameters for /HELLO
# server - the active server in window
# witem - the active window item (eg. channel, query)
# or undef if the window is empty
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")) {
# there's query/channel active in window
$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.


Irssi-扩充脚本编写
http://example.com/2024/10/07/Irssi-扩充脚本编写/
作者
Jie
发布于
2024年10月7日
许可协议