diff options
Diffstat (limited to '')
-rw-r--r-- | scripts/len.pl | 374 |
1 files changed, 374 insertions, 0 deletions
diff --git a/scripts/len.pl b/scripts/len.pl new file mode 100644 index 0000000..fbcc759 --- /dev/null +++ b/scripts/len.pl @@ -0,0 +1,374 @@ +# $Id: len.pl 4 2006-03-11 18:30:09Z ch $ + +use Irssi 20020324; +use 5.005_62; +use strict; +use vars qw($VERSION %IRSSI); + +$VERSION = '1.0.0'; +#$VERSION = '1.0.0 SVN ($LastChangedRevision: 4 $)'; +%IRSSI = ( + authors => 'Clemens Heidinger', + changed => '$LastChangedDate: 2006-03-11 19:30:09 +0100 (Sat, 11 Mar 2006) $', + commands => 'len', + contact => 'heidinger@dau.pl', + description => 'If you try to get a nick with 11 characters but only ' . + '9 are allowed, this script will prevent the ' . + 'nickchange. The same for too long topics, kickmsgs, ' . + 'partmsgs and quitmsgs.', + license => 'BSD', + name => 'len', + ); + +################################################################################ +# # +# CHANGELOG # +# # +# 2006-03-11 release 1.0.0 # +# No big changes. As the script is stable for quite a while, # +# this is the 1.0.0 release. # +# # +# 2005-01-28 release 0.4.0 # +# Splitted up 005 event messages will cause no trouble anymore # +# # +# 2004-04-26 release 0.3.2 # +# minor changes # +# # +# 2003-01-18 release 0.3.1 # +# - revised help-message # +# - minor changes # +# # +# 2003-01-18 release 0.3.0 # +# %data-hash moved to extern file specified in setting # +# len_data_file # +# # +# 2002-10-02 release 0.2.1 # +# Changed output format of /len # +# # +# 2002-09-27 release 0.2.0 # +# Added command /len with a table containing the values for # +# NICKLEN etc. and tips if these values haven't been received # +# from the server yet # +# # +# 2002-09-26 release 0.1.0 # +# initial release # +# # +################################################################################ + +################################################################################ +# Register commands +################################################################################ + +Irssi::command_bind('len', \&command_len); + +################################################################################ +# Register settings +################################################################################ + +# String +Irssi::settings_add_str('misc', 'len_data_file', "$ENV{HOME}/.len"); + +################################################################################ +# Register signals +################################################################################ + +Irssi::signal_add_first('command kick', \&signal_command_kick); +Irssi::signal_add_first('command nick', \&signal_command_nick); +Irssi::signal_add_first('command part', \&signal_command_part); +Irssi::signal_add_first('command quit', \&signal_command_quit); +Irssi::signal_add_first('command topic', \&signal_command_topic); +Irssi::signal_add_last('event 005', \&signal_event_005); + +################################################################################ +# Register themes +################################################################################ + +Irssi::theme_register(['len_print', '[$0] {line_start} $1']); + +################################################################################ +# Global Variables +################################################################################ + +# Put values of the settings in %option-hash + +our %option; + +# Most IRC-Server send a message containing the values for NICKLEN, TOPICLEN +# and KICKLEN. +# Well, some server do not send this message. Get these values from %data-hash +# stored in file specified in setting len_data_file. + +our %data; + +################################################################################ +# Code run once at start +################################################################################ + +print CLIENTCRAP "len.pl $VERSION loaded. For further information type %9/len%9"; + +################################################################################ +# Subroutines (commands) +################################################################################ + +sub command_len { + my ($data, $server, $witem) = @_; + my $output; + + unless ($server and defined($server)) { + print_out("First connect to a server..."); + return; + } + + read_file(); + + my $kicklen = sprintf "%-8s", $data{$server->{tag}}{kicklen}; + my $nicklen = sprintf "%-8s", $data{$server->{tag}}{nicklen}; + my $partlen = sprintf "%-8s", $data{$server->{tag}}{partlen}; + my $quitlen = sprintf "%-8s", $data{$server->{tag}}{quitlen}; + my $topiclen = sprintf "%-9s", $data{$server->{tag}}{topiclen}; + + $output = &fix(<<" END"); + |=========|=================| + | | max. characters | + |=========|=================| + | kickmsg | $kicklen | + |---------|-----------------| + | nick | $nicklen | + |---------|-----------------| + | partmsg | $partlen | + |---------|-----------------| + | quitmsg | $quitlen | + |---------|-----------------| + | topic | $topiclen | + |---------|-----------------| + END + + unless ($kicklen =~ /\d/ && + $nicklen =~ /\d/ && + $partlen =~ /\d/ && + $quitlen =~ /\d/ && + $topiclen =~ /\d/) + { + $output .= &fix(<<" END"); + + Obviously there are some values missing. + When you connect to a server most send you a message (numeric 005) + with the proper values for the maximal nick length, topic length etc. + If you loaded this script after connecting to "$server->{tag}" + you should reconnect. + If this doesn't help, the server is not sending the message with these + values. + The following alternatives remain: + * Use another server of the same network and cross your fingers + that it'll send the message. + * Find out the values and adjust the data hash in the file + specified in the setting len_data_file. + The file might look like this: + + %{ \$data{$server->{tag}} } = ( + 'kicklen' => <value>, + 'nicklen' => <value>, + 'partlen' => <value>, + 'quitlen' => <value>, + 'topiclen' => <value>, + ); + + %{ \$data{someOtherNetwork} } = ( + 'kicklen' => 160, + 'nicklen' => 9, + 'partlen' => 160, + 'quitlen' => 160, + 'topiclen' => 160, + ); + END + } + + foreach my $line (split /\n/, $output) { + Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'len_print', $server->{tag}, $line); + } +} + +################################################################################ +# Subroutines (signals) +################################################################################ + +sub signal_command_kick { + my ($command, $server, $witem) = @_; + + return unless ($server and defined($server)); + + read_file(); + + # Syntax for /kick: + # KICK [<channel>] <nicks> [<reason>] + # We want to isolate <reason> to know how long it is + + # delete [<channel>] <nicks> + $command =~ s/^\s* # Start of String and optional some whitespace + (?: # Grouping + \#\S+ # This is <channel> + )? # End of Grouping, <channel> is optional + [ ]? # Maybe a single space + \S+ # Everything not whitespace. These are the nicks. + [ ]? # Maybe a single space + //x; # Delete everything + + # The rest of $command is the kickmsg + my $kickmsg = $command; + + my $len = length($kickmsg); + my $maxlen = $data{$server->{tag}}{kicklen}; + + if ($maxlen > 0 && $len > $maxlen) { + print_out("kickmsg too long! ($len/$maxlen)"); + Irssi::signal_stop(); + } +} + +sub signal_command_nick { + my ($nick, $server, $witem) = @_; + + return unless ($server and defined($server)); + + read_file(); + + my $len = length($nick); + my $maxlen = $data{$server->{tag}}{nicklen}; + + if ($maxlen > 0 && $len > $maxlen) { + print_out("Nick too long! ($len/$maxlen)"); + Irssi::signal_stop(); + } +} + +sub signal_command_part { + my ($command, $server, $witem) = @_; + + return unless ($server and defined($server)); + + read_file(); + + # Syntax for /part: + # PART [<channels>] [<message>] + # So we want to get rid of the channels to isolate the partmsg + + # Delete [<channels>] + $command =~ s/^#\S+ //; + + # The rest of $command is the partmsg + my $partmsg = $command; + + my $len = length($partmsg); + my $maxlen = $data{$server->{tag}}{partlen}; + + if ($maxlen > 0 && $len > $maxlen) { + print_out("partmsg too long! ($len/$maxlen)"); + Irssi::signal_stop(); + } +} + +sub signal_command_quit { + my ($quitmsg, $server, $witem) = @_; + + return unless ($server and defined($server)); + + read_file(); + + my $len = length($quitmsg); + my $maxlen = $data{$server->{tag}}{quitlen}; + + if ($maxlen > 0 && $len > $maxlen) { + print_out("quitmsg too long! ($len/$maxlen)"); + Irssi::signal_stop(); + } +} + +sub signal_command_topic { + my ($command, $server, $witem) = @_; + + return unless ($server and defined($server)); + + read_file(); + + # Syntax for /topic: + # TOPIC [-delete] [<channel>] [<topic>] + # We want to isolate <reason> to know how long it is + + # Delete <channel> + $command =~ s/^#\S+ //; + + # The rest of $command is the topic + my $topic = $command; + + my $len = length($topic); + my $maxlen = $data{$server->{tag}}{topiclen}; + + if ($maxlen > 0 && $len > $maxlen) { + print_out("Topic too long! ($len/$maxlen)"); + Irssi::signal_stop(); + } +} + +# Most server send this message containig the values for NICKLEN etc. on +# connect (event 005). + +sub signal_event_005 { + my ($server, $string) = @_; + + if ($string =~ /KICKLEN=(\d+)/) { + $data{$server->{tag}}{kicklen} = $1; + $data{$server->{tag}}{partlen} = $1; + $data{$server->{tag}}{quitlen} = $1; + } + if ($string =~ /NICKLEN=(\d+)/) { + $data{$server->{tag}}{nicklen} = $1; + } + if ($string =~ /TOPICLEN=(\d+)/) { + $data{$server->{tag}}{topiclen} = $1; + } +} + +################################################################################ +# Helper subroutines +################################################################################ + +sub fix { + my $string = shift; + $string =~ s/^\t+//gm; + return $string; +} + +sub print_err { + my $text = shift; + + print CLIENTCRAP '%Rlen.pl error%n: ' . $text; +} + +sub print_out { + my $text = shift; + + print CLIENTCRAP '%9len.pl%9: ' . $text; +} + +sub read_file { + set_settings(); + + my $file = $option{len_data_file}; + + unless (-e $file && -r $file) { + return; + } + unless (my $return = do $file) { + if ($@) { + print_err("parsing $file failed: $@"); + } + unless (defined($return)) { + print_err("'do $file' failed"); + } + } +} + +sub set_settings { + # String + $option{len_data_file} = Irssi::settings_get_str('len_data_file'); +} |