html/rainbow.pl
1 #!/usr/bin/perl -w
2
3 # USAGE:
4 #
5 # /RSAY <text>
6 # - same as /say, but outputs a coloured text
7 #
8 # /RME <text>
9 # - same as /me, but outputs a coloured text
10 #
11 # /RTOPIC <text>
12 # - same as /topic, but outputs a coloured text :)
13 #
14 # /RKICK <nick> [reason]
15 # - kicks nick from the current channel with coloured reason
16
17 # Written by Jakub Jankowski <shasta@atn.pl>
18 # for Irssi 0.7.98.4 and newer
19
20 use strict;
21 use vars qw($VERSION %IRSSI);
22
23 $VERSION = "1.4";
24 %IRSSI = (
25 authors => 'Jakub Jankowski',
26 contact => 'shasta@atn.pl',
27 name => 'rainbow',
28 description => 'Prints colored text. Rather simple than sophisticated.',
29 license => 'GNU GPLv2 or later',
30 url => 'http://irssi.atn.pl/',
31 );
32
33 use Irssi;
34 use Irssi::Irc;
35
36 # colors list
37 # 0 == white
38 # 4 == light red
39 # 8 == yellow
40 # 9 == light green
41 # 11 == light cyan
42 # 12 == light blue
43 # 13 == light magenta
44 my @colors = ('0', '4', '8', '9', '11', '12', '13');
45
46 # str make_colors($string)
47 # returns random-coloured string
48 sub make_colors {
49 my ($string) = @_;
50 my $newstr = "";
51 my $last = 255;
52 my $color = 0;
53
54 for (my $c = 0; $c < length($string); $c++) {
55 my $char = substr($string, $c, 1);
56 if ($char eq ' ') {
57 $newstr .= $char;
58 next;
59 }
60 while (($color = int(rand(scalar(@colors)))) == $last) {};
61 $last = $color;
62 $newstr .= "\003";
63 $newstr .= sprintf("%02d", $colors[$color]);
64 $newstr .= (($char eq ",") ? ",," : $char);
65 }
66
67 return $newstr;
68 }
69
70 # void rsay($text, $server, $destination)
71 # handles /rsay
72 sub rsay {
73 my ($text, $server, $dest) = @_;
74
75 if (!$server || !$server->{connected}) {
76 Irssi::print("Not connected to server");
77 return;
78 }
79
80 return unless $dest;
81
82 if ($dest->{type} eq "CHANNEL" || $dest->{type} eq "QUERY") {
83 $dest->command("/msg " . $dest->{name} . " " . make_colors($text));
84 }
85 }
86
87 # void rme($text, $server, $destination)
88 # handles /rme
89 sub rme {
90 my ($text, $server, $dest) = @_;
91
92 if (!$server || !$server->{connected}) {
93 Irssi::print("Not connected to server");
94 return;
95 }
96
97 if ($dest && ($dest->{type} eq "CHANNEL" || $dest->{type} eq "QUERY")) {
98 $dest->command("/me " . make_colors($text));
99 }
100 }
101
102 # void rtopic($text, $server, $destination)
103 # handles /rtopic
104 sub rtopic {
105 my ($text, $server, $dest) = @_;
106
107 if (!$server || !$server->{connected}) {
108 Irssi::print("Not connected to server");
109 return;
110 }
111
112 if ($dest && $dest->{type} eq "CHANNEL") {
113 $dest->command("/topic " . make_colors($text));
114 }
115 }
116
117 # void rkick($text, $server, $destination)
118 # handles /rkick
119 sub rkick {
120 my ($text, $server, $dest) = @_;
121
122 if (!$server || !$server->{connected}) {
123 Irssi::print("Not connected to server");
124 return;
125 }
126
127 if ($dest && $dest->{type} eq "CHANNEL") {
128 my ($nick, $reason) = split(/ +/, $text, 2);
129 return unless $nick;
130 $reason = "Irssi power!" if ($reason =~ /^[\ ]*$/);
131 $dest->command("/kick " . $nick . " " . make_colors($reason));
132 }
133 }
134
135 Irssi::command_bind("rsay", "rsay");
136 Irssi::command_bind("rtopic", "rtopic");
137 Irssi::command_bind("rme", "rme");
138 Irssi::command_bind("rkick", "rkick");
139
140 # changes:
141 #
142 # 25.01.2002: Initial release (v1.0)
143 # 26.01.2002: /rtopic added (v1.1)
144 # 29.01.2002: /rsay works with dcc chats now (v1.2)
145 # 02.02.2002: make_colors() doesn't assign any color to spaces (v1.3)
146 # 23.02.2002: /rkick added