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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
|
__END__
=head1 NAME
Guide To Irssi Scripting.
=head1 DESCRIPTION
=head1 LOADING AND UNLOADING SCRIPTS
=head2 File Locations
=head2 Testing
=head2 Loading
Scripts are loaded via C</SCRIPT LOAD I<filename>>. A default Irssi
configuration also provides the C</RUN> alias as an alternative to C</SCRIPT
LOAD>.
Loaded scripts will exist in the Irssi namespace as:
C<Irssi::Script::I<E<lt>nameE<gt>>>, where I<name> is the filename stripped of its
F<.pl> extension.
=head2 Unloading
A script can be unloaded via the C</SCRIPT UNLOAD I<name>> command. The name is
typically the script filename without the F<.pl> extension, so F<nickcolor.pl>
becomes C</SCRIPT UNLOAD nickcolor>.
As part of the unloading process, if the script contains a
sub UNLOAD {
...
}
function, it will be run just before the script is unloaded and all variables
destroyed. This can be used to clean up any temporary files, shut down any
network connections or processes, and restore any Irssi modifications made.
=head1 ANATOMY OF A SCRIPT
In this section, we develop a very simplistic script and look at the
necessary code.
=head2 Preamble
All scripts should contain a header as follows:
use strict;
use warnings;
use vars qw($VERSION %IRSSI);
use Irssi;
$VERSION = '1.00';
%IRSSI = (
authors => 'Author Name(s)',
contact => 'author_email@example.com',
name => 'Script Title',
description => 'Longer script description ',
license => 'Public Domain',
);
The first two lines should be used in B<all> perl scripts, not just Irssi. They
provide far greater error checking and diagnostics should you make a mistake in your
code.
The C<use vars qw($VERSION %IRSSI)> defines two global variables, which are then
set below to the appropriate values.
C<use Irssi> tells the script to make the various L<Irssi> support functions available.
=head1 COMMONLY SCRIPTED TASKS
=head2 Modifying an input line before sending
B<TODO: catch "send text", modify it if necessary, signal_emit it>
=head2 Responding to a public message
B<TODO: catch "messsage public", check params, generate response>
=head2 Responding to a private message
B<TODO: catch "messsage private", check params, generate response>
=head1 USEFUL THINGS
=head2 Getting the Response Value of a Remote Command
B<TODO: use server redirections?>
=head2 Getting the Response Value of a Local Command
B<TODO: How?!??>
Maybe, look up the format, intercept gui print text, try to match it against
what you're expecting?
Can this be generalised at all?
=head2 Sharing Code Between Scripts
There are 2 main ways for scripts to communicate, either via emitting and
handling Irssi signals, or by calling functions from one another directly.
=head3 Using Signals
=head3 Using Functions
=head2 If In Doubt, Dump!
C<Data::Dumper> is an extremely good way to inspect Irssi internals if you're
looking for an undocumented feature.
The C<DUMP> alias by L<Wouter
Coekaerts|http://wouter.coekaerts.be/site/irssi/aliases> provides an easy way to
check object fields.
Dump perl object (e.g. C</dump Irssi::active_win>):
/alias DUMP script exec use Data::Dumper\; print Data::Dumper->new([\\$0-])->Dump
=head2 Making Scripts Act Native
An important part of creating a good script is to make it behave as though it
were a part of Irssi. Adhering to some of the standard conventions can make this
easier.
=head3 Provide Help
Scripts commonly store information about how to use them in comments at the top
of their file. Whilst better than no documentation at all, a preferable approach
is to allow that help to be accessed from within Irssi itself, using the C</HELP>
command.
B<TODO: how>
=head3 Use Tab Completion
One of the great features of Irssi is the ability to complete commands,
subcommands and even certain arguments.
=head3 Use Settings for Customisation
B<TODO: why?>
B<TODO: different types of settings>
B<TODO: register/set/get>
=head3 Use Subcommands to Group Script Functionality
A common theme in Irssi scripts is to define commands with a prefix, such as
C</myscript_foo>, C<myscript_bar>, etc. This helps to avoid accidentally clobbering
native commands and those defined by other scripts, but is a problem better solved
with I<subcommands>.
Subcommands allow you to bind commands such as C</myscript foo> and C</myscript bar>.
Completions are automatically handled for both the primary command, and any
subcommands contained within it.
The following example demonstrates how to use subcommands from within a script:
Irssi::command_bind("foo bar", \&subcmd_bar);
Irssi::command_bind("foo", \&subcmd_handler);
sub subcmd_handler {
my ($data, $server, $item) = @_;
$data =~ s/\s+$//g; # strip trailing whitespace.
Irssi::command_runsub('foo', $data, $server, $item);
}
sub subcmd_bar {
my ($args) = @_;
print "subcommand called with: $args";
}
=head1 OTHER RESOURCES
The documentation assembled here and elsewhere on this site has been drawn from
many different places, and a lot of valuable information is available from the
following sites.
=over
=item L<http://irssi.org/documentation/perl>
=item L<http://irssi.org/documentation/signals>
=item L<http://irssi.org/documentation/special_vars>
=item L<http://irssi.org/documentation/formats>
=item L<http://irssi.org/documentation/settings>
=item L<http://juerd.nl/site.plp/irssiscripttut>
=item L<http://irchelp.org/irchelp/rfc/rfc.html>
=item L<http://wouter.coekaerts.be/site/irssi/irssi>
=back
|