aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTom Feist <shabble@metavore.org>2011-10-10 17:43:02 +0000
committerTom Feist <shabble@metavore.org>2011-10-10 17:43:02 +0000
commit1934fad608584cc040a95745e35df17f291a4b15 (patch)
tree6f3c9401fe749dbebec1bc497465b53b4e4242e6
parentmoving a lot of the sigil processing code into tables rather than hardcoded c... (diff)
downloadirssi-scripts-1934fad608584cc040a95745e35df17f291a4b15.tar.gz
irssi-scripts-1934fad608584cc040a95745e35df17f291a4b15.zip
nicklist: now with support for +a (admin, & sigil), and +q (~ sigil - channel owner)
-rw-r--r--fixery/nicklist.pl175
1 files changed, 88 insertions, 87 deletions
diff --git a/fixery/nicklist.pl b/fixery/nicklist.pl
index 303c303..03f7754 100644
--- a/fixery/nicklist.pl
+++ b/fixery/nicklist.pl
@@ -4,23 +4,26 @@ use Irssi;
use strict;
use IO::Handle; # for (auto)flush
use Fcntl; # for sysopen
-use vars qw($VERSION %IRSSI);
-$VERSION = '0.4.6';
-%IRSSI = (
+
+use Data::Dumper;
+
+our $VERSION = '0.4.6';
+our %IRSSI = (
authors => 'Wouter Coekaerts',
contact => 'coekie@irssi.org',
name => 'nicklist',
- description => 'draws a nicklist to another terminal, or at the right of your irssi in the same terminal',
+ description => 'draws a nicklist to another terminal, '
+ . 'or at the right of your irssi in the same terminal',
license => 'GPLv2',
url => 'http://wouter.coekaerts.be/irssi',
- changed => '29/06/2004'
+ changed => '10/10/2011'
);
sub cmd_help {
print ( <<EOF
Commands:
NICKLIST HELP
-NICKLIST SCROLL <nr of lines>
+NICKLIST SCROLL <number of lines>
NICKLIST SCREEN
NICKLIST FIFO
NICKLIST OFF
@@ -58,14 +61,21 @@ my $active_channel; # (REC)
# TODO: have this use isupport('PREFIX') where supported to check mappings.
my $server_prefix_mapping
= {
- '@' => { sigil => '@', mode => 'o', name => 'op' },
- '&' => { sigil => '&', mode => 'a', name => 'admin' },
- '~' => { sigil => '~', mode => 'q', name => 'owner' },
- '%' => { sigil => '%', mode => 'h', name => 'halfop' },
- '+' => { sigil => '+', mode => 'v', name => 'voice' },
- '' => { sigil => '', mode => '', name => 'normal' },
+ '~' => { priority => 1, sigil => '~', mode => 'q', name => 'owner' },
+ '&' => { priority => 2, sigil => '&', mode => 'a', name => 'admin' },
+ '@' => { priority => 3, sigil => '@', mode => 'o', name => 'op' },
+ '%' => { priority => 4, sigil => '%', mode => 'h', name => 'halfop' },
+ '+' => { priority => 5, sigil => '+', mode => 'v', name => 'voice' },
+ '' => { priority => 6, sigil => '', mode => '', name => 'normal' },
};
+
+# order the sigils by priority (lowest = first) from the table above.
+my @sigil_priorities = map { $_->{sigil} }
+ sort { $a->{priority} <=> $b->{priority} }
+ values %$server_prefix_mapping;
+
+
my $sigil_cache = {};
my $DEBUG = 0;
@@ -75,12 +85,13 @@ sub _debug {
Irssi::print($msg) if $DEBUG;
}
-sub _select_nick_sigil {
+
+sub _select_prefix_umode {
my ($nick) = @_;
my $prefixes = { map { $_ => 1 } split '', $nick->{prefixes} };
# first check for each of the prefix sigils in given order of precedence.
- for my $sigil_priority (('~', '&', '@', '%', '+')) {
+ for my $sigil_priority (@sigil_priorities) {
if (exists $prefixes->{$sigil_priority}) {
return $server_prefix_mapping->{$sigil_priority};
}
@@ -98,23 +109,10 @@ sub _select_nick_sigil {
}
-sub _render_sigil {
- my ($sigil) = @_;
-
- return $value;
-}
-
# array of hashes, containing the internal nicklist of the active channel
my @nicklist = ();
# nick => realnick
# mode =>
-#sub UMODE_OP () { 0 } # +o
-#sub UMODE_HALFOP () { 1 } # +h
-#sub UMODE_VOICE () { 2 } # +v
-#sub UMODE_NORMAL () { 3 } # none
-#sub UMODE_OWNER () { 4 } # +q
-#sub UMODE_ADMIN () { 5 } # +a
-#my ($MODE_OP, $MODE_HALFOP, $MODE_VOICE, $MODE_NORMAL) = (0,1,2,3);
# status =>
my ($STATUS_NORMAL, $STATUS_JOINING, $STATUS_PARTING,
$STATUS_QUITING, $STATUS_KICKED, $STATUS_SPLIT) = (0,1,2,3,4,5);
@@ -123,8 +121,7 @@ my ($STATUS_NORMAL, $STATUS_JOINING, $STATUS_PARTING,
# 'cached' settings
-my ($screen_prefix, $irssi_width,
- @prefix_mode, @prefix_status, $height, $nicklist_width);
+my ($screen_prefix, $irssi_width, $height, $nicklist_width);
sub read_settings {
@@ -145,28 +142,6 @@ sub read_settings {
$sigil_cache->{$umode_name} = $value;
}
- # $prefix_mode[UMODE_OP]
- # = Irssi::settings_get_str('nicklist_prefix_mode_op');
- # $prefix_mode[UMODE_HALFOP]
- # = Irssi::settings_get_str('nicklist_prefix_mode_halfop');
- # $prefix_mode[UMODE_VOICE]
- # = Irssi::settings_get_str('nicklist_prefix_mode_voice');
- # $prefix_mode[UMODE_NORMAL]
- # = Irssi::settings_get_str('nicklist_prefix_mode_normal');
- # $prefix_mode[UMODE_ADMIN]
- # = Irssi::settings_get_str('nicklist_prefix_mode_admin');
- # $prefix_mode[UMODE_OWNER]
- # = Irssi::settings_get_str('nicklist_prefix_mode_owner');
-
- # ($prefix_mode[MODE_HALFOP] = Irssi::settings_get_str('nicklist_prefix_mode_halfop')) =~ s/\\e/\033/g;
- # ($prefix_mode[MODE_VOICE] = Irssi::settings_get_str('nicklist_prefix_mode_voice')) =~ s/\\e/\033/g;
- # ($prefix_mode[MODE_NORMAL] = Irssi::settings_get_str('nicklist_prefix_mode_normal')) =~ s/\\e/\033/g;
-
-
- # for (@prefix_mode) {
- # s/\\e/\033/g;
- # }
-
if ($mode != $SCREEN) {
$height = Irssi::settings_get_int('nicklist_height');
}
@@ -246,18 +221,18 @@ sub cmd_screen_start {
fifo_stop();
}
$mode = $SCREEN;
- Irssi::signal_add_last('gui print text finished', \&sig_gui_print_text_finished);
- Irssi::signal_add_last('gui page scrolled', \&sig_page_scrolled);
- Irssi::signal_add('terminal resized', \&sig_terminal_resized);
+ Irssi::signal_add_last('gui print text finished', 'sig_gui_print_text_finished');
+ Irssi::signal_add_last('gui page scrolled', 'sig_page_scrolled');
+ Irssi::signal_add('terminal resized', 'sig_terminal_resized');
screen_size();
make_nicklist();
}
sub screen_stop {
$mode = $OFF;
- Irssi::signal_remove('gui print text finished', \&sig_gui_print_text_finished);
- Irssi::signal_remove('gui page scrolled', \&sig_page_scrolled);
- Irssi::signal_remove('terminal resized', \&sig_terminal_resized);
+ Irssi::signal_remove('gui print text finished', 'sig_gui_print_text_finished');
+ Irssi::signal_remove('gui page scrolled', 'sig_page_scrolled');
+ Irssi::signal_remove('terminal resized', 'sig_terminal_resized');
system 'screen -x '.$ENV{'STY'}.' -X fit';
}
@@ -307,7 +282,7 @@ sub screen_size {
my ($new_irssi_width) = @_;
system 'screen -x '.$ENV{'STY'}.' -X width -w ' . $new_irssi_width;
# and then we wait another second for the resizing, and then redraw.
- Irssi::timeout_add_once(1000,sub {$screen_resizing = 0; redraw()}, []);
+ Irssi::timeout_add_once(1000, sub {$screen_resizing = 0; redraw()}, []);
}, $irssi_width);
}
@@ -355,10 +330,19 @@ sub nicklist_write_line {
# recalc the text of the nicklist item
sub calc_text {
my ($nick) = @_;
- my $tmp = $nicklist_width-3;
- (my $text = $nick->{'nick'}) =~ s/^(.{$tmp})..+$/$1\033[34m~\033[m/;
- $nick->{'text'} = $prefix_mode[$nick->{'mode'}] . $text . (' ' x ($nicklist_width-length($nick->{'nick'})-1));
- $nick->{'cmp'} = $nick->{'mode'}.lc($nick->{'nick'});
+
+ # handle truncation of long nicks.
+ my $tmp = $nicklist_width - 3;
+
+ my $text = $nick->{nick};
+ $text =~ s/^(.{$tmp})..+$/$1\033[34m~\033[m/;
+
+ my $mode = $nick->{mode};
+
+ $nick->{text} = $sigil_cache->{$mode->{name}} . $text .
+ (' ' x ($nicklist_width - length($nick->{nick}) - 1));
+
+ $nick->{cmp} = $mode->{priority} . lc($nick->{nick});
}
# redraw the given nick (nr) if it is visible
@@ -513,32 +497,38 @@ sub make_nicklist {
$active_channel = $channel;
### make nicklist ###
- my @sorted_nicks = sort nicksort $channel->nicks();
+ my @nicks = $channel->nicks();
+
+ my @mode_decorated_nicks =
+ map { [ _select_prefix_umode($_), $_ ] } @nicks;
+
+ my @sorted_nicks = map { $_->[1] }
+ sort sort_prefixed_nicks @mode_decorated_nicks;
+
+ # TODO: find a way to reuse these prefix lookups.
+ #_debug(Dumper(\@sorted_nicks));
foreach my $nick (@sorted_nicks) {
- my $this_nick = { 'nick' => $nick->{'nick'} };
-
- if ($nick->{}) {
- $this_nick->{mode} = x
-
- if ($nick->{op}) {
- $this_nick->{mode}
- 'mode' => ($nick->{'op'}
- ? UMODE_OP
- :$nick->{'halfop'}
- ? UMODE_HALFOP
- :$nick->{'voice'}
- ? UMODE_VOICE
- :MODE_NORMAL)
+
+ my $this_nick = {
+ nick => $nick->{nick},
+ mode => _select_prefix_umode($nick),
};
- calc_text($this_nick);
+
+ calc_text($this_nick);
push @nicklist, $this_nick;
}
}
need_redraw();
}
-sub nicksort {
+sub sort_prefixed_nicks {
+ ($a->[0]->{priority} . lc $a->[1]->{nick})
+ cmp
+ ($b->[0]->{priority} . lc $b->[1]->{nick});
+}
+
+sub blahblah {
(
($a->{'op'}
? '1'
@@ -618,7 +608,10 @@ sub sig_join {
if (!is_active_channel($server,$channel)) {
return;
}
- my $newnick = {'nick' => $nick, 'mode' => $MODE_NORMAL};
+ my $newnick = {
+ nick => $nick,
+ mode => $server_prefix_mapping->{''}
+ };
calc_text($newnick);
insert_nick($newnick);
}
@@ -670,7 +663,9 @@ sub sig_nick {
if ($nr != -1) { # if nick was found (nickchange is in current channel)
my $nick = $nicklist[$nr];
remove_nick($nr);
- $nick->{'nick'} = $newnick;
+
+ $nick->{nick} = $newnick;
+
calc_text($nick);
insert_nick($nick);
}
@@ -681,13 +676,18 @@ sub sig_mode {
if ($channel->{'server'}->{'tag'} ne $active_channel->{'server'}->{'tag'} || $channel->{'name'} ne $active_channel->{'name'}) {
return;
}
- my $nr = find_nick($nick->{'nick'});
+ my $nr = find_nick($nick->{nick});
if ($nr == -1) {
- Irssi::print("nicklist warning: $nick->{'nick'} had mode set on $channel->{'name'}, but was not found in nicklist");
+ Irssi::print("nicklist warning: $nick->{'nick'} had mode set on " .
+ "$channel->{'name'}, but was not found in nicklist");
} else {
my $nicklist_item = $nicklist[$nr];
remove_nick($nr);
- $nicklist_item->{'mode'} = ($nick->{'op'}?$MODE_OP:$nick->{'halfop'}?$MODE_HALFOP:$nick->{'voice'}?$MODE_VOICE:$MODE_NORMAL);
+
+ $nicklist_item->{mode} = _select_prefix_umode($nick);
+
+# $nicklist_item->{'mode'} = ($nick->{'op'}?$MODE_OP:$nick->{'halfop'}?$MODE_HALFOP:$nick->{'voice'}?$MODE_VOICE:$MODE_NORMAL);
+
calc_text($nicklist_item);
insert_nick($nicklist_item);
}
@@ -727,11 +727,11 @@ Irssi::signal_add('setup changed', \&read_settings);
##### settings #####
Irssi::settings_add_str('nicklist', 'nicklist_screen_prefix', '\e[m ');
-Irssi::settings_add_str('nicklist', 'nicklist_prefix_mode_owner', '\e[32m~\e[39m');
-Irssi::settings_add_str('nicklist', 'nicklist_prefix_mode_admin', '\e[32m&\e[39m');
+Irssi::settings_add_str('nicklist', 'nicklist_prefix_mode_owner', '\e[31m~\e[39m');
+Irssi::settings_add_str('nicklist', 'nicklist_prefix_mode_admin', '\e[33m&\e[39m');
Irssi::settings_add_str('nicklist', 'nicklist_prefix_mode_op', '\e[32m@\e[39m');
Irssi::settings_add_str('nicklist', 'nicklist_prefix_mode_halfop', '\e[34m%\e[39m');
-Irssi::settings_add_str('nicklist', 'nicklist_prefix_mode_voice', '\e[33m+\e[39m');
+Irssi::settings_add_str('nicklist', 'nicklist_prefix_mode_voice', '\e[3m+\e[39m');
Irssi::settings_add_str('nicklist', 'nicklist_prefix_mode_normal', ' ');
Irssi::settings_add_int('nicklist', 'nicklist_width',11);
@@ -752,3 +752,4 @@ if (uc(Irssi::settings_get_str('nicklist_automode')) eq 'SCREEN') {
} elsif (uc(Irssi::settings_get_str('nicklist_automode')) eq 'FIFO') {
cmd_fifo_start();
}
+