summaryrefslogtreecommitdiffstats
path: root/scripts/ascii.pl
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/ascii.pl')
-rw-r--r--scripts/ascii.pl405
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");