diff options
Diffstat (limited to '')
-rw-r--r-- | scripts/ascii.pl | 405 |
1 files changed, 405 insertions, 0 deletions
diff --git a/scripts/ascii.pl b/scripts/ascii.pl new file mode 100644 index 0000000..557ebb0 --- /dev/null +++ b/scripts/ascii.pl @@ -0,0 +1,405 @@ +# +# Commands: /ASCII, /COLSAY, /COLME, /COLTOPIC, /COLKICK, /COLQUIT +# Usage: +# /ASCII [-c1234] [-f <fontname>] [-p <prefix>] [-l|-s|-m <where>] <text> +# /COLSAY [-1234] [-m <where>] <text> +# /COLME [-1234] <text> +# /COLTOPIC [-1234] <text> +# /COLKICK [-1234] [nick(,nick_1,...,nick_n)] <reason> +# /COLQUIT [-1234] <reason> +# Settings: +# /SET ascii_figlet_path [path] +# /SET ascii_default_font [fontname] +# /SET ascii_default_colormode [1-4] +# /SET ascii_default_prefix [prefix] +# /SET ascii_default_kickreason [reason] +# /SET ascii_default_quitreason [reason] +# +# Script is bassed on figlet. +# + +use strict; +use Irssi; +use Irssi::Irc; + +use vars qw($VERSION %IRSSI); + +$VERSION = "1.6.3"; +%IRSSI = ( + "authors" => "Marcin Rozycki", + "contact" => "derwan\@irssi.pl", + "name" => "ascii-art", + "description" => "Ascii-art bassed on figlet. Available commands: /ASCII, /COLSAY, /COLME, /COLTOPIC, /COLKICK, /COLQUIT.", + "url" => "http://derwan.irssi.pl", + "license" => "GNU GPL v2", + "changed" => "Fri Jun 21 17:17:53 CEST 2002" +); + +use IPC::Open3; + +# defaults +my $ascii_default_font = "small.flf"; +my $ascii_default_kickreason = "Irssi BaBy!"; +my $ascii_default_quitreason = "I Quit!"; +my $ascii_last_color = undef; +my @ascii_colors = (12, 12, 12, 9, 5, 4, 13, 8, 7, 3, 11, 10, 2, 6, 6, 6, 6, 10, 8, 7, 4, 3, 9, 11, 2, 12, 13, 5); + +# registering themes +Irssi::theme_register([ + 'ascii_not_connected', '%_$0:%_ You\'re not connected to server', + 'ascii_not_window', '%_$0:%_ Not joined to any channel or query window', + 'ascii_not_chanwindow', '%_$0:%_ Not joined to any channel', + 'ascii_not_chanop', '%_$0:%_ You\'re not channel operator in {hilight $1}', + 'ascii_figlet_notfound', '%_Ascii:%_ Cannot execute {hilight $0} - file not found or bad permissions', + 'ascii_figlet_notset', '%_Ascii:%_ Cannot find external program %_figlet%_, usign /SET ascii_figlet_path [path], to set it', + 'ascii_cmd_syntax', '%_$0:%_ $1, usage: $2', + 'ascii_figlet_error', '%_Ascii: Figlet returns error:%_ $0-', + 'ascii_fontlist', '%_Ascii:%_ Available fonts [in $0]: $1 ($2)', + 'ascii_empty_fontlist', '%_Ascii:%_ Cannot find figlet fonts in $0', + 'ascii_unknown_fontdir', '%_Ascii:%_ Cannot find figlet fontdir', + 'ascii_show_line', '$0-' + +]); + +# str find_figlet_path() +sub find_figlet_path { + foreach my $dir (split(/\:/, $ENV{'PATH'})) + { + return "$dir/figlet" if ($dir and -x "$dir/figlet"); + } +} + +# int randcolor() +sub randcolor { + return $ascii_colors[int(rand(12)+2)]; +} + +# str colorline($colormode, $text) +sub colorline { + my ($colormode, $text) = @_; + my $colortext = undef; + my $last = ($ascii_last_color) ? $ascii_last_color : randcolor(); + my $indx = $last; + + if ($colormode =~ /3/) { + $ascii_last_color = randcolor(); + }elsif ($colormode =~ /4/) { + $ascii_last_color = $ascii_colors[$last]; + }elsif ($colormode !~ /2/) { + $ascii_last_color = $ascii_colors[14+$last]; + } + + while ($text =~ /./g) + { + my $char = "$&"; + + if ($colormode =~ /3/) { + while ($indx == $last) { $indx = randcolor(); }; + $last = $indx; + }elsif ($colormode =~ /4/) { + $indx = $ascii_colors[$indx]; + }elsif ($last) { + $indx = $ascii_colors[$last]; + undef $last; + } else { + $indx = $ascii_colors[$indx]; + $last = $indx + 14; + }; + + $colortext .= $char, next if ($char eq " "); + $colortext .= "\003" . sprintf("%02d", $indx) . $char; + $colortext .= $char if ($char eq ","); + }; + + return $colortext; +}; + +# int colormode() +sub colormode { + my $mode = Irssi::settings_get_int("ascii_default_colormode"); + $mode =~ s/-//g; + return (!$mode or $mode > 4) ? 1 : $mode; +}; + +# bool ascii_test($command, $flags, $server, $window) +sub ascii_test { + my ($cmd, $test, $server, $window) = @_; + + if ($test =~ /s/ and !$server || !$server->{connected}) { + Irssi::printformat(MSGLEVEL_CRAP, "ascii_not_connected", $cmd); + return 0; + }; + if ($test =~ /W/ and !$window || $window->{type} !~ /(channel|query)/i) { + Irssi::printformat(MSGLEVEL_CRAP, "ascii_not_window", $cmd); + return 0; + }; + if ($test =~ /(w|o)/ and !$window || $window->{type} !~ /channel/i) { + Irssi::printformat(MSGLEVEL_CRAP, "ascii_not_chanwindow", $cmd); + return 0; + }; + if ($test =~ /o/ and !$window->{chanop}) { + Irssi::printformat(MSGLEVEL_CRAP, "ascii_not_chanop", $cmd, Irssi::active_win()->get_active_name()); + return 0; + }; + + return 1; +} + +# void cmd_ascii() +# handles /ascii +sub cmd_ascii +{ + my $usage = "/ASCII [-c1234] [-f <fontname>] [-p <prefix>] [-l|-s|-m <where>] <text>"; + my $font = Irssi::settings_get_str("ascii_default_font"); + my $prefix = Irssi::settings_get_str("ascii_default_prefix"); + my ($arguments, $server, $witem) = @_; + my ($text, $cmd, $mode); + + $font = $ascii_default_font unless ($font); + $ascii_last_color = randcolor(); + + my $figlet = Irssi::settings_get_str("ascii_figlet_path"); + if (!$figlet or !(-x $figlet)) { + my $theme = ($figlet) ? "ascii_figlet_notfound" : "ascii_figlet_notset"; + Irssi::printformat(MSGLEVEL_CRAP, $theme, $figlet); + return; + }; + + my @foo = split(/ +/, $arguments); + while ($_ = shift(@foo)) + { + /^-l$/ and show_figlet_fonts($figlet), return; + /^-c$/ and $mode = colormode(), next; + /^-(1|2|3|4)$/ and s/-//g, $mode = $_, next; + /^-f$/ and $font = shift(@foo), next; + /^-p$/ and $prefix = shift(@foo), next; + /^-m$/ and $cmd = shift(@foo), next; + /^-s$/ and $cmd = 0, next; + /^-/ and Irssi::printformat(MSGLEVEL_CRAP, "ascii_cmd_syntax", "Ascii", "Unknown argument: $_", $usage), return; + $text = ($#foo < 0) ? $_ : $_ . " " . join(" ", @foo); + last; + } + + unless (length($text)) { + Irssi::printformat(MSGLEVEL_CRAP, "ascii_cmd_syntax", "Ascii", "Missing arguments", $usage); + return; + }; + + if ($cmd eq "") { + return unless (ascii_test("Ascii", "sW", $server, $witem)); + $cmd = Irssi::active_win()->get_active_name(); + } elsif ($cmd ne "0" and !ascii_test("Ascii", "s", $server, $witem)) { + return; + } + + my $pid = open3(*FIGIN, *FIGOUT, *FIGERR, $figlet, qw(-k -f), $font, $text); + + while (<FIGOUT>) + { + chomp; + next unless (/[^ ]/); + $_ = colorline($mode, $_) if ($mode); + Irssi::printformat(MSGLEVEL_CLIENTCRAP, "ascii_show_line", $prefix.$_), next if ($cmd eq "0"); + $server->command("msg $cmd $prefix$_"); + } + + while (<FIGERR>) + { + chomp; + Irssi::printformat(MSGLEVEL_CRAP, "ascii_figlet_error", $_); + }; + + close FIGIN; + close FIGOUT; + close FIGERR; + + waitpid $pid, 0; +} + +# void show_figlet_fonts(figlet path) +sub show_figlet_fonts { + my @fontlist; + if (my $fontdir = `"$_[0]" -I 2 2>/dev/null`) { + chomp $fontdir; + foreach my $font (glob $fontdir."/*.flf") + { + $font =~ s/^$fontdir\///; + $font =~ s/\.flf$//; + push @fontlist, $font; + } + if ($#fontlist < 0) { + Irssi::printformat(MSGLEVEL_CRAP, "ascii_fontlist_empty", $fontdir); + } else { + Irssi::printformat(MSGLEVEL_CRAP, "ascii_fontlist", $fontdir, join(", ", @fontlist), scalar(@fontlist)); + } + } else { + Irssi::printformat(MSGLEVEL_CRAP, "ascii_unknown_fontdir"); + } +} + +# void cmd_colsay() +# handles /colsay +sub cmd_colsay { + my $usage = "/COLSAY [-1234] [-m <where>] <text>"; + my ($arguments, $server, $witem) = @_; + my ($cmd, $text); + my $mode = colormode(); + + $ascii_last_color = randcolor(); + + my @foo = split(/ /, $arguments); + while ($_ = shift(@foo)) + { + /^-(1|2|3|4)$/ and $mode = $_, next; + /^-m$/i and $cmd = shift(@foo), next; + /^-/ and Irssi::printformat(MSGLEVEL_CRAP, "ascii_cmd_syntax", "Colsay", "Unknown argument: $_", $usage), return; + $text = ($#foo < 0) ? $_ : $_ . " " . join(" ", @foo); + last; + }; + + unless (length($text)) { + Irssi::printformat(MSGLEVEL_CRAP, "ascii_cmd_syntax", "Colsay", "Missing arguments", $usage); + return; + }; + + if ($cmd) { + return unless (ascii_test("Colsay", "s", $server, $witem)); + } else { + return unless (ascii_test("Colsay", "sW", $server, $witem)); + $cmd = Irssi::active_win()->get_active_name(); + }; + + $server->command("msg $cmd ".colorline($mode, $text)); +} + + +sub cmd_colme { + my $usage = "/COLME [-1234] <text>"; + my ($arguments, $server, $witem) = @_; + my $mode = colormode(); + my $text; + + $ascii_last_color = randcolor(); + + my @foo = split(/ /, $arguments); + while ($_ = shift(@foo)) + { + /^-(1|2|3|4)$/ and $mode = $_, next; + /^-/ and Irssi::printformat(MSGLEVEL_CRAP, "ascii_cmd_syntax", "Colme", "Unknown argument: $_", $usage), return; + $text = ($#foo < 0) ? $_ : $_ . " " . join(" ", @foo); + last; + }; + + unless (length($text)) { + Irssi::printformat(MSGLEVEL_CRAP, "ascii_cmd_syntax", "Colme", "Missing arguments", $usage); + return; + }; + + return unless (ascii_test("Colme", "sW", $server, $witem)); + $witem->command("me ".colorline($mode, $text)); +} + +# void cmd_coltopic() +# handles /coltopic +sub cmd_coltopic { + my $usage = "/COLTOPIC [-1234] <text>"; + my ($arguments, $server, $witem) = @_; + my $mode = colormode(); + my $text; + + $ascii_last_color = randcolor(); + + my @foo = split(/ /, $arguments); + while ($_ = shift(@foo)) + { + /^-(1|2|3|4)$/ and $mode = $_, next; + /^-/ and Irssi::printformat(MSGLEVEL_CRAP, "ascii_cmd_syntax", "Coltopic", "Unknown argument: $_", $usage), return; + $text = ($#foo < 0) ? $_ : $_ . " " . join(" ", @foo); + last; + }; + + unless (length($text)) { + Irssi::printformat(MSGLEVEL_CRAP, "ascii_cmd_syntax", "Coltopic", "Missing arguments", $usage); + return; + }; + + return unless (ascii_test("Coltopic", "sw", $server, $witem)); + + $server->command("topic " . Irssi::active_win()->get_active_name() . " " . colorline($mode, $text)); +}; + +# void cmd_colkick() +# handles /colkick +sub cmd_colkick { + my $usage = "/COLKICK [-1234] [nick(,nick_1,...,nick_n)] <reason>"; + my ($arguments, $server, $witem) = @_; + my $kickreason = Irssi::settings_get_str("ascii_default_kickreason"); + my $mode = colormode(); + my $who = undef; + + $ascii_last_color = randcolor(); + $kickreason = $ascii_default_kickreason unless ($kickreason); + + my @foo = split(/ /, $arguments); + while ($_ = shift(@foo)) + { + /^-(1|2|3|4)$/ and $mode = $_, next; + /^-/ and Irssi::printformat(MSGLEVEL_CRAP, "ascii_cmd_syntax", "Colkick", "Unknown argument: $_", $usage), return; + $kickreason = join(" ", @foo) if ($#foo >= 0); + $who = $_; + last; + }; + + if (!$who or !length($kickreason)) { + Irssi::printformat(MSGLEVEL_CRAP, "ascii_cmd_syntax", "Colkick", "Missing arguments", $usage); + return; + }; + + return unless (ascii_test("Colkick", "swo", $server, $witem)); + $witem->command("kick $who ".colorline($mode, $kickreason)); +}; + +# void cmd_colquit() +# handles /colquit +sub cmd_colquit { + my $usage = "/COLQUIT [-1234] <reason>"; + my ($arguments, $server, $witem) = @_; + my $quitreason = Irssi::settings_get_str("ascii_default_quitreason"); + my $mode = colormode(); + + $ascii_last_color = randcolor(); + $quitreason = $ascii_default_quitreason unless ($quitreason); + + my @foo = split(/ /, $arguments); + while ($_ = shift(@foo)) + { + /^-(1|2|3|4)$/ and $mode = $_, next; + /^-/ and Irssi::printformat(MSGLEVEL_CRAP, "ascii_cmd_syntax", "Colquit", "Unknown argument: $_", $usage), return; + $quitreason = ($#foo < 0) ? $_ : $_ . " " . join(" ", @foo); + last; + }; + + unless (length($quitreason)) { + Irssi::printformat(MSGLEVEL_CRAP, "ascii_cmd_syntax", "Colquit", "Missing arguments", $usage); + return; + }; + + return unless (ascii_test("Colquit", "s", $server, $witem)); + $server->command("quit " . colorline($mode, $quitreason)); +} + +# registering settings +Irssi::settings_add_str("misc", "ascii_default_font", $ascii_default_font); +Irssi::settings_add_str("misc", "ascii_default_kickreason", $ascii_default_kickreason); +Irssi::settings_add_str("misc", "ascii_default_quitreason", $ascii_default_quitreason); +Irssi::settings_add_str("misc", "ascii_default_prefix", ""); +Irssi::settings_add_int("misc", "ascii_default_colormode", 1); +Irssi::settings_add_str("misc", "ascii_figlet_path", find_figlet_path); + +# binding commands +Irssi::command_bind("ascii", "cmd_ascii"); +Irssi::command_bind("colsay", "cmd_colsay"); +Irssi::command_bind("colme", "cmd_colme"); +Irssi::command_bind("coltopic", "cmd_coltopic"); +Irssi::command_bind("colkick", "cmd_colkick"); +Irssi::command_bind("colquit", "cmd_colquit"); |