Added greplog, nickbar and xdcc-simplequeue.
[irssi-scripts.git] / users / nickbar.pl
blobb08faadb9d60610d7df4db820f5b5221df608971
1 # nickbar.pl for irssi
2 # Copyright (c) 2005, 2008 Heikki Hokkanen <hoxu at users.sf.net>
4 use Irssi 20021117; # 0.8.6
5 use vars qw($VERSION %IRSSI);
6 $VERSION = "0.0.2";
7 %IRSSI = (
8 authors => 'Heikki Hokkanen',
9 contact => 'hoxu at users.sf.net',
10 name => 'nickbar',
11 description => 'Statusbar item for channel nicklist',
12 license => 'GPLv2',
13 sbitems => 'nickbar',
16 use Irssi::TextUI;
17 use strict;
19 # TODO
20 # - nickbar_autohide?
21 # - nickbar_show_modechar
22 # - nickbar_sortbymode
23 # - sort: ignore case, highest first
25 # -----[ Functions ]------------------------------------------------------------
27 sub redraw_nickbar {
28 my ($item, $get_size_only) = @_;
30 if (Irssi::active_win()->{active}{type} ne "CHANNEL") {
31 $item->default_handler($get_size_only, undef, undef, 1);
32 # TODO hide?
33 return;
36 my ($ops, $voices, $halfops);
37 my $text;
38 my @shownames;
40 my @nicks = Irssi::Channel::nicks(Irssi::active_win()->{active});
41 my $my_nickname = Irssi::active_win()->{active_server}->{nick}; #$item->{active_server}->{nick};
42 my $maxnicks = Irssi::settings_get_int('nickbar_max_nicks');
43 my @omit_nicks = split(/ +/, Irssi::settings_get_str('nickbar_omit_nicks'));
45 # this actually goes through all the nicks, even if maxnicks is much
46 # lower... could optimize
47 NICK: foreach my $nick (@nicks) {
48 my $tmp;
49 my $modechar = "";
50 if ($nick->{op}) {
51 $modechar = "@";
52 $ops++;
53 } elsif ($nick->{halfop}) {
54 $modechar = "%";
55 $halfops++;
56 } elsif ($nick->{voice}) {
57 $modechar = "+";
58 $voices++;
61 # don't list own nick
62 next if ($nick->{nick} eq $my_nickname);
64 # check nicks to omit
65 foreach my $omit (@omit_nicks) {
66 if ($nick->{nick} eq $omit) { next NICK; }
68 $tmp = $modechar . $nick->{nick};
69 push(@shownames, $tmp);
72 if (Irssi::settings_get_bool('nickbar_summary')) {
73 if ($ops) { $text .= "$ops@/"; }
74 if ($halfops) { $text .= $halfops ."%/"; }
75 if ($voices) { $text .= $voices ."+/"; }
76 $text .= (scalar(@nicks)) . " ";
78 $text .= join(' ', splice(@{[sort(@shownames)]},0,$maxnicks));
80 # show '...' if some nicks are not listed
81 if (scalar(@shownames) > $maxnicks) {
82 $text .= '...';
85 $item->default_handler($get_size_only, undef, $text, 1);
88 sub refresh_nickbar {
89 Irssi::statusbar_items_redraw('nickbar');
92 # -----[ Signal hooks ]---------------------------------------------------------
94 Irssi::signal_add('nicklist changed', \&refresh_nickbar);
95 Irssi::signal_add('window changed', \&refresh_nickbar);
97 # -----[ Settings ]-------------------------------------------------------------
99 Irssi::settings_add_bool('nickbar', 'nickbar_summary', 1);
100 Irssi::settings_add_int('nickbar', 'nickbar_max_nicks', 10);
101 Irssi::settings_add_str('nickbar', 'nickbar_omit_nicks', 'ChanServ Q L');
103 # -----[ Setup ]----------------------------------------------------------------
105 Irssi::statusbar_item_register('nickbar', '{sb $0-}', 'redraw_nickbar'); # name, value, func
106 Irssi::statusbars_recreate_items(); # ?
108 Irssi::print("$IRSSI{name} loaded. Remember to type /statusbar window add nickbar");