1# /binary huora
2# tuolostaa k.o. ikkunaan huora:n sijaan 01101001 ....
3#
4# and modified by carl 2004-03-09
5
6# Changelog
7# Version 1: original version by nchip
8# Version 1.1: added unbinary function
9# Verison 1.2: added server truncate detection (requested by Andr�, thanks for spotting the problem) and choice to have spaces in the binary or not (reqested by Tapio)
10
11
12use strict;
13use Irssi;
14use Irssi qw(command_bind command signal_add_last signal_stop settings_get_bool settings_add_bool);
15
16use vars qw($VERSION %IRSSI);
17
18#%IRSSI = (
19#        authors     => "Riku Voipio",
20#        contact     => "riku.voipio\@iki.fi",
21#        name        => "binary",
22#        description => "adds /binary command that converts what you type into 2-base string representation",
23#        license     => "GPLv2",
24#        url         => "http://nchip.ukkosenjyly.mine.nu/irssiscripts/",
25#    );
26
27$VERSION = "1.2";
28%IRSSI = (
29        authors     => "Carl Fischer",
30        contact     => "carl.fischer\@netcourrier.com",
31        name        => "binary",
32        description => "adds /binary command that converts what you type into 2-base string representation, also decodes other peoples binary automatically",
33        license     => "GPLv2",
34	  );
35
36
37sub cmd_binary {
38	$_=join(" ",$_[0]);
39	$_=reverse;
40	my (@r);
41	if (settings_get_bool('binary_spaces')) {
42	    $r[0]="/say";
43	} else {
44	    $r[0]="/say ";
45	}
46	while ($a = chop($_)) {
47	    push (@r,unpack ("B*", $a));}
48
49	my $window = Irssi::active_win();
50	if (settings_get_bool('binary_spaces')) {
51	    $window->command(join (" ",@r));
52	} else {
53	    $window->command(join ("",@r));
54	}
55    }
56
57# here ends the original code
58# some of the following was strongly inspired by the kenny script
59
60sub cmd_unbinary {
61    pop @_;
62    pop @_;
63    my $window = Irssi::active_win();
64    $window->print(unbinary($_[0]));
65}
66
67sub unbinary {
68    my $r;
69    if (settings_get_bool('binary_spaces')) {
70	$r=pack("B*", join ("", split(" ", @_[0])));
71    } else {
72	$r=pack("B*", @_[0]);
73    }
74    return $r;
75}
76
77sub sig_binary {
78    my ($server, $msg, $nick, $address, $target) = @_;
79    if (($msg=~m/^([01]{8}( [01]{8})*)( [01]{1,7})*$/ and settings_get_bool('binary_spaces')) or ($msg=~m/^([01]{8}([01]{8})*)([01]{1,7})*$/ and not settings_get_bool('binary_spaces'))) {
80	my $leftover="";
81	$leftover="* (truncated by server)" if $3;
82	$target=$nick if $target eq "";
83	# the address may _never_ be emtpy, if it is its own_public
84	$nick=$server->{'nick'} if $address eq "";
85	$server->window_item_find($target)->print("[binary] <$nick> " .
86						  unbinary($1) . $leftover, 'MSGLEVEL_CRAP');
87	signal_stop() if not settings_get_bool('show_binary_too');
88    }
89}
90
91signal_add_last('message own_public',  'sig_binary');
92signal_add_last('message public',      'sig_binary');
93signal_add_last('message own_private', 'sig_binary');
94signal_add_last('message private',     'sig_binary');
95
96settings_add_bool('lookandfeel', 'show_binary_too', 0);
97settings_add_bool('lookandfeel', 'binary_spaces', 1);
98
99Irssi::command_bind('binary', 'cmd_binary');
100Irssi::command_bind('unbinary', 'cmd_unbinary');
101
102Irssi::print("binary obfuscator vanity script loaded");
103Irssi::print("written by nchip and updated by carl");
104Irssi::print("--------------------------------------");
105Irssi::print("/binary message");
106Irssi::print("will send binary text to the current channel");
107Irssi::print("");
108Irssi::print("/unbinary obfuscated_text");
109Irssi::print("will print the unobfuscated equivalent to your window (and not to the channel)");
110Irssi::print("");
111Irssi::print("/set show_binary_too on");
112Irssi::print("will make this script print the binary equivalent as well as the translation to your screen whenever someone uses binary on the channel");
113Irssi::print("/set binary_spaces off");
114Irssi::print("will make the binary be printed as a single word with no spaces");
115