diff options
| author | Ailin Nemui | 2016-08-15 18:01:45 +0200 |
|---|---|---|
| committer | Ailin Nemui | 2016-08-15 18:01:45 +0200 |
| commit | 542987a4b18ab278a2e658783d3ec0190f8b4b9b (patch) | |
| tree | 404326e12033e778bbf9521ae8ce1002d851da19 /scripts | |
| parent | 51cc823059fe1c394e0505ac300a2f44f4af93d2 (diff) | |
| download | scripts.irssi.org-542987a4b18ab278a2e658783d3ec0190f8b4b9b.tar.bz2 | |
some anames improvements
Diffstat (limited to 'scripts')
| -rw-r--r-- | scripts/anames.pl | 193 |
1 files changed, 111 insertions, 82 deletions
diff --git a/scripts/anames.pl b/scripts/anames.pl index 686323b..e365a2a 100644 --- a/scripts/anames.pl +++ b/scripts/anames.pl @@ -6,7 +6,7 @@ # evil code to sort the nicklist by the alphabet and rank in nicklist.pl # # 1.6 - optional support for unicode nicknames, realnames script, -# formattable summary line (Nei) +# formattable summary line (default away colour changed!) (Nei) # # 1.5 - Fixed halfop display bug (patch by epinephrine), 20100712 # @@ -36,18 +36,18 @@ # 0.9 - Initial test release use strict; -use Irssi; +use Irssi 20140918; use POSIX; -#use Data::Dumper; +use List::Util 'max'; use vars qw($VERSION %IRSSI); -$VERSION = '1.6'; # d34833f077fa302 +$VERSION = '1.6'; # f200e871df81c77 %IRSSI = ( authors => 'Matt "f0rked" Sparks, Miklos Vajna', contact => 'ms+irssi@quadpoint.org', name => 'anames', - description => 'a /names display with away nicks colored', + description => 'a /names display with away nicks coloured', license => 'GPLv2', url => 'http://quadpoint.org', changed => '2010-07-12', @@ -59,34 +59,12 @@ $VERSION = '1.6'; # d34833f077fa302 my $tmp_server; my $tmp_chan; + Irssi::theme_register([ - 'endofanames', '{channel $0}: Total of {hilight $1} nicks {comment {hilight $2} ops, {hilight $3} halfops, {hilight $4} voices, {hilight $5} normal, {hilight $6} away}', + 'endofanames' => '{channel $0}: Total of {hilight $1} nicks {comment {hilight $2} ops, {hilight $3} halfops, {hilight $4} voices, {hilight $5} normal, {hilight $6} away}', + 'names_awaynick' => '{channick $0}', ]); -sub cmd_anames -{ - my($args, $server, $item) = @_; - my $channel = Irssi::active_win->{active}; - $tmp_server = $server; - $tmp_chan = $channel->{"name"}; - - if ($args ne "") { - $server = $args; - $server =~ s/-([^ ]*) .*/\1/; - $tmp_server = Irssi::server_find_tag($server); - $tmp_chan = $args; - $tmp_chan =~ s/-[^ ]* (.*)/\1/; - } - - # set up redirection - $tmp_server->redirect_event("who", 1, $tmp_chan, 0, undef, - { - "event 352" => "redir who_reply", - "event 315" => "redir who_reply_end", - }); - - $tmp_server->command("who $tmp_chan"); -} local $@; eval { require Text::CharWidth; }; @@ -96,30 +74,63 @@ unless ($@) { *screen_length = sub { length($_[0]); } } + sub object_printformat_module { my ($object, $level, $module, $format, @args) = @_; { - # deeeeeeep black magic. local *CORE::GLOBAL::caller = sub { $module }; $object->printformat($level, $format, @args); } } + sub core_printformat_module { my ($level, $module, $format, @args) = @_; { - # deeeeeeep black magic. local *CORE::GLOBAL::caller = sub { $module }; Irssi::printformat($level, $format, @args); } } +sub cmd_anames +{ + my($args, $server, $item) = @_; + my $channel = $item; + $tmp_server = $server->{"tag"}; + $tmp_chan = $channel->{"name"}; + + if ($args ne "") { + my @args = split ' ', $args; + if ($args[0] =~ /-(.*)/) { + $tmp_server = $1; + $server = Irssi::server_find_tag($tmp_server); + shift @args; + } + $tmp_chan = $args[0]; + } + + unless ($server) { + core_printformat_module(MSGLEVEL_CLIENTERROR, 'fe-common/core', 'not_connected'); + return; + } + + # set up redirection + $server->redirect_event("who", 1, $tmp_chan, 0, undef, + { + "event 352" => "silent event who", + "event 315" => "redir who_reply_end", + }); + + $server->command("who $tmp_chan"); +} + + sub print_anames { - my $server = $tmp_server; + my $server = Irssi::server_find_tag($tmp_server); my $chan = $tmp_chan; - my $channel = Irssi::Server::channel_find($server, $chan); + my $channel = $server ? $server->channel_find($chan) : undef; my $nick; if (!$channel) { @@ -130,50 +141,80 @@ sub print_anames my @nicks; my($ops, $halfops, $voices, $normal, $away) = (0, 0, 0, 0, 0); - # sorting from nicklist.pl my $prefer_real; if (exists $Irssi::Script::{'realnames::'}) { - my $code = "Irssi::Script::realnames"->can('use_realnames'); - $prefer_real = $code && $code->($channel); + my $code = "Irssi::Script::realnames"->can('use_realnames'); + $prefer_real = $code && $code->($channel); } my $_real = sub { - my $nick = shift; - $prefer_real && length $nick->{'realname'} ? $nick->{'realname'} : $nick->{'nick'} + my $nick = shift; + $prefer_real && length $nick->{'realname'} ? $nick->{'realname'} : $nick->{'nick'} }; + # sorting from nicklist.pl foreach my $nick (sort {($a->{'op'}?'1':$a->{'halfop'}?'2':$a->{'voice'}?'3':$a->{'other'}>32?'0':'4').lc($_real->($a)) cmp ($b->{'op'}?'1':$b->{'halfop'}?'2':$b->{'voice'}?'3':$b->{'other'}>32?'0':'4').lc($_real->($b))} $channel->nicks()) { my $realnick = $_real->($nick); my $gone = $nick->{'gone'}; my $prefix; - if ($nick->{'op'}) { + if ($nick->{'other'}) { + $prefix = chr $nick->{'other'}; + } elsif ($nick->{'op'}) { $prefix = "@"; + } elsif ($nick->{'halfop'}) { + $prefix = "%"; + } elsif ($nick->{'voice'}) { + $prefix = "+"; + } else { + $prefix = " "; + } + + my $format; + if ($nick->{'op'}) { $ops++; + $format = 'names_nick_op'; } elsif ($nick->{'halfop'}) { - $prefix = "%%"; $halfops++; + $format = 'names_nick_halfop'; } elsif ($nick->{'voice'}) { - $prefix = "+"; $voices++; + $format = 'names_nick_voice'; } else { - $prefix = " "; $normal++; + $format = 'names_nick'; } - $prefix = "%W$prefix%n"; if ($gone) { - $realnick = "%K$realnick%n"; + $realnick = $channel->window->format_get_text(__PACKAGE__, $server, $chan, 'names_awaynick', $realnick); $away++; } + my $text = $channel->window->format_get_text('fe-common/core', $server, $chan, $format, $prefix, $realnick); + my $bleak = Irssi::strip_codes($text); - push @nicks, "$prefix" . $realnick; + push @nicks, [ $prefix, $realnick, $format, screen_length($bleak) ]; } my $total = @nicks; object_printformat_module($channel, MSGLEVEL_CLIENTCRAP, 'fe-common/core', 'names', $chan); columnize_nicks($channel,@nicks); $channel->printformat(MSGLEVEL_CLIENTNOTICE, 'endofanames', $chan, $total, $ops, - $halfops, $voices, $normal, $away); + $halfops, $voices, $normal, $away); + } +} + + +{ my %strip_table = ( + # fe-common::core::formats.c:format_expand_styles + # delete format_backs format_fores bold_fores other stuff + (map { $_ => '' } (split //, '04261537' . 'kbgcrmyw' . 'KBGCRMYW' . 'U9_8I:|FnN>#[' . 'pP')), + # escape + (map { $_ => $_ } (split //, '{}%')), + ); + sub ir_strip_codes { # strip %codes + my $o = shift; + $o =~ s/(%(%|Z.{6}|z.{6}|X..|x..|.))/exists $strip_table{$2} ? $strip_table{$2} : + $2 =~ m{x(?:0[a-f]|[1-6][0-9a-z]|7[a-x])|z[0-9a-f]{6}}i ? '' : $1/gex; + $o } } @@ -188,7 +229,17 @@ sub columnize_nicks # determine max columns # FIXME: this could be more intelligent (i.e., read window size) my $cols = Irssi::settings_get_int("names_max_columns"); - $cols = 6 if $cols == 0; + if ($cols == 0) { + my $width = $channel->window->{width}; + my $ts_format = Irssi::settings_get_str('timestamp_format'); + my $render_str = Irssi::current_theme->format_expand( + Irssi::current_theme->get_format('fe-common/core', 'timestamp')); + (my $ts_escaped = $ts_format) =~ s/([%\$])/$1$1/g; + $render_str =~ s/(?|\$(.)(?!\w)|\$\{(\w+)\})/$1 eq 'Z' ? $ts_escaped : $1/ge; + $render_str = ir_strip_codes($render_str); + $width -= screen_length($render_str); + $cols = max(1, int( $width / max(1, map { 1+ $_->[-1] } @nicks) )); + } # determine number of rows my $rows = round(ceil($total / $cols)); @@ -197,19 +248,21 @@ sub columnize_nicks my @r; for (my $i = 0; $i < $cols; $i++) { # peek at next $rows items, determine max length - my $max_length = find_max_length(@nicks[0 .. $rows - 1]); + my $max_length = max map { $_->[-1] } @nicks[0 .. $rows - 1]; # fill rows for (my $j = 0; $j < $rows; $j++) { my $n = shift @nicks; # single nick - if ($n ne "") { - $r[$j] .= "%K[%n$n" . fill_spaces($n,$max_length) . "%K]%n "; + if ($n->[-1]) { + $r[$j] .= $channel->window->format_get_text('fe-common/core', $channel->{server}, $channel->{visible_name}, + $n->[2], $n->[0], $n->[1] . fill_spaces($n->[-1],$max_length) ); } } } for (my $m = 0; $m < $rows; $m++) { chomp $r[$m]; + $r[$m] =~ s/%/%%/g; $channel->print($r[$m], MSGLEVEL_CLIENTCRAP); } } @@ -217,23 +270,8 @@ sub columnize_nicks sub fill_spaces { - my($text, $max_length) = @_; - $text =~ s/%[a-zA-Z]//g; - return " " x ($max_length - screen_length($text)); -} - - -sub find_max_length -{ - my $max_length = 0; - for (my $i = 0; $i < @_; $i++) { - my $nick = $_[$i]; - $nick =~ s/%[a-zA-Z]//g; - if (screen_length($nick) > $max_length) { - $max_length = screen_length($nick); - } - } - return $max_length; + my($length, $max_length) = @_; + return " " x max (0, $max_length - $length); } @@ -244,20 +282,10 @@ sub round } -sub who_reply -{ - my($server, $data) = @_; - my(undef, $c, $i, $h, $n, $s) = split / /, $data; - if ($tmp_chan ne $c) { - $tmp_chan = $c; - #print "Got who info for $c"; - } -} - - sub who_reply_end { print_anames(); + Irssi::signal_emit('chanquery who end', @_); $tmp_chan = ""; } @@ -266,6 +294,7 @@ Irssi::Irc::Server::redirect_register("who", 0, 0, {"event 352" => 1}, {"event 315" => 1}, undef); -Irssi::signal_add("redir who_reply", \&who_reply); -Irssi::signal_add("redir who_reply_end", \&who_reply_end); -Irssi::command_bind("anames", \&cmd_anames); +Irssi::signal_register({'chanquery who end' => [qw[iobject string]]}); +Irssi::signal_add("redir who_reply", 'who_reply'); +Irssi::signal_add("redir who_reply_end", 'who_reply_end'); +Irssi::command_bind("anames", 'cmd_anames'); |
