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