1use strict;
2use vars qw($VERSION %IRSSI);
3
4use Irssi qw(command_bind signal_add signal_emit signal_stop);
5
6$VERSION = '3.00';
7%IRSSI = (
8    authors	=> 'Juerd, Shiar',
9    contact	=> 'juerd@juerd.nl, shiar@shiar.org',
10    name	=> 'UeberRot encryption',
11    description	=> 'Rot n+i encryption and decryption',
12    license	=> 'Public Domain',
13    url		=> 'http://juerd.nl/site.plp/irssi',
14    changed	=> 'Tue Jan 21 01:40 CET 2003',
15);
16
17my $char1 = "\xC0-\xCF\xD2-\xD6\xD8-\xDD";
18my $char2 = "\xE0-\xF6\xF8-\xFF";
19
20sub rot {
21    my ($dir, $rotABC, $rot123, $rotshift, $msg) = @_;
22    my $i = 0;
23    for (0 .. length $msg) {
24	my $char = \substr $msg, $_, 1;
25	$i += $rotshift;
26	$$char =~ tr/a-zA-Z/b-zaB-ZA/ for 1..abs $dir *26 - ($rotABC + $i) % 26;
27	$$char =~ tr/0-9/1-90/        for 1..abs $dir *10 - ($rot123 + $i) % 10;
28    }
29    return $msg;
30}
31
32sub sig_message {
33    my $signal = shift;
34    my $msg = \$_[1];
35    return unless $$msg =~ s/^\cO(\cB+)\cO(\cB+)\cO(\cO*)//;
36    my $orig = $$msg;
37    $$msg = "\cB" . rot 1, length $1, length $2, length $3, $$msg;
38    $$msg =~ s{\c_\c_\cO([a-zA-Z])}<
39	my $char = $1;
40	eval qq{
41	    \$char =~ tr/A-Z/$char1/;
42	    \$char =~ tr/a-z/$char2/;
43	};
44	$char;
45    >ego;
46    signal_stop;
47    signal_emit($signal, $_[0], $orig, @_[2..$#_]);
48    signal_emit($signal, @_);
49}
50
51command_bind rot => sub {
52    my ($data, $server, $window) = @_;
53    $data =~ s/([$char1$char2])/\c_\c_\cO$1/og;
54    eval qq{
55        \$data =~ tr/$char1/A-Z/;
56        \$data =~ tr/$char2/a-z/;
57    };
58    my $rotABC   = 1 +     int rand 13;
59    my $rot123   = 1 + 2 * int rand 4;
60    my $rotshift = 1 +     int rand 10;
61    $window->command(
62	sprintf "say \cO%s\cO%s\cO%s%s",
63	"\cB" x $rotABC,
64	"\cB" x $rot123,
65        "\cO" x $rotshift,
66	rot 0, $rotABC, $rot123, $rotshift, $data
67    );
68};
69
70signal_add {
71    'message private'     => sub { sig_message 'message private'     => @_ },
72    'message public'      => sub { sig_message 'message public'      => @_ },
73    'message own_private' => sub { sig_message 'message own_private' => @_ },
74    'message own_public'  => sub { sig_message 'message own_public'  => @_ },
75};
76