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