annotate irssi/scripts/nicklist.pl @ 148:4e92ca6c779a

add irssi conf
author zegervdv <zegervdv@me.com>
date Sat, 18 Oct 2014 10:06:58 +0200
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
148
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
1 # for documentation: see http://wouter.coekaerts.be/site/irssi/nicklist
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
2
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
3 use Irssi;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
4 use strict;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
5 use IO::Handle; # for (auto)flush
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
6 use Fcntl; # for sysopen
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
7 use vars qw($VERSION %IRSSI);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
8 $VERSION = '0.4.6';
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
9 %IRSSI = (
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
10 authors => 'Wouter Coekaerts',
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
11 contact => '[email protected]',
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
12 name => 'nicklist',
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
13 description => 'draws a nicklist to another terminal, or at the right of your irssi in the same terminal',
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
14 license => 'GPLv2',
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
15 url => 'http://wouter.coekaerts.be/irssi',
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
16 changed => '29/06/2004'
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
17 );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
18
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
19 sub cmd_help {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
20 print ( <<EOF
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
21 Commands:
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
22 NICKLIST HELP
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
23 NICKLIST SCROLL <nr of lines>
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
24 NICKLIST SCREEN
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
25 NICKLIST FIFO
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
26 NICKLIST OFF
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
27 NICKLIST UPDATE
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
28
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
29 For help see: http://wouter.coekaerts.be/site/irssi/nicklist
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
30
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
31 in short:
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
32
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
33 1. FIFO MODE
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
34 - in irssi: /NICKLIST FIFO (only the first time, to create the fifo)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
35 - in a shell, in a window where you want the nicklist: cat ~/.irssi/nicklistfifo
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
36 - back in irssi:
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
37 /SET nicklist_heigth <height of nicklist>
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
38 /SET nicklist_width <width of nicklist>
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
39 /NICKLIST FIFO
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
40
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
41 2. SCREEN MODE
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
42 - start irssi inside screen ("screen irssi")
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
43 - /NICKLIST SCREEN
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
44 EOF
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
45 );
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
46 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
47
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
48 my $prev_lines = 0; # number of lines in previous written nicklist
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
49 my $scroll_pos = 0; # scrolling position
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
50 my $cursor_line; # line the cursor is currently on
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
51 my ($OFF, $SCREEN, $FIFO) = (0,1,2); # modes
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
52 my $mode = $OFF; # current mode
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
53 my $need_redraw = 0; # nicklist needs redrawing
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
54 my $screen_resizing = 0; # terminal is being resized
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
55 my $active_channel; # (REC)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
56
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
57 my @nicklist=(); # array of hashes, containing the internal nicklist of the active channel
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
58 # nick => realnick
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
59 # mode =>
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
60 my ($MODE_OP, $MODE_HALFOP, $MODE_VOICE, $MODE_NORMAL) = (0,1,2,3);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
61 # status =>
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
62 my ($STATUS_NORMAL, $STATUS_JOINING, $STATUS_PARTING, $STATUS_QUITING, $STATUS_KICKED, $STATUS_SPLIT) = (0,1,2,3,4,5);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
63 # text => text to be printed
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
64 # cmp => text used to compare (sort) nicks
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
65
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
66
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
67 # 'cached' settings
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
68 my ($screen_prefix, $irssi_width, @prefix_mode, @prefix_status, $height, $nicklist_width);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
69
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
70 sub read_settings {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
71 ($screen_prefix = Irssi::settings_get_str('nicklist_screen_prefix')) =~ s/\\e/\033/g;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
72
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
73 ($prefix_mode[$MODE_OP] = Irssi::settings_get_str('nicklist_prefix_mode_op')) =~ s/\\e/\033/g;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
74 ($prefix_mode[$MODE_HALFOP] = Irssi::settings_get_str('nicklist_prefix_mode_halfop')) =~ s/\\e/\033/g;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
75 ($prefix_mode[$MODE_VOICE] = Irssi::settings_get_str('nicklist_prefix_mode_voice')) =~ s/\\e/\033/g;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
76 ($prefix_mode[$MODE_NORMAL] = Irssi::settings_get_str('nicklist_prefix_mode_normal')) =~ s/\\e/\033/g;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
77
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
78 if ($mode != $SCREEN) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
79 $height = Irssi::settings_get_int('nicklist_height');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
80 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
81 my $new_nicklist_width = Irssi::settings_get_int('nicklist_width');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
82 if ($new_nicklist_width != $nicklist_width && $mode == $SCREEN) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
83 sig_terminal_resized();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
84 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
85 $nicklist_width = $new_nicklist_width;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
86 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
87
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
88 sub update {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
89 read_settings();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
90 make_nicklist();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
91 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
92
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
93 ##################
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
94 ##### OUTPUT #####
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
95 ##################
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
96
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
97 ### off ###
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
98
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
99 sub cmd_off {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
100 if ($mode == $SCREEN) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
101 screen_stop();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
102 } elsif ($mode == $FIFO) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
103 fifo_stop();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
104 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
105 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
106
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
107 ### fifo ###
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
108
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
109 sub cmd_fifo_start {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
110 read_settings();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
111 my $path = Irssi::settings_get_str('nicklist_fifo_path');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
112 unless (-p $path) { # not a pipe
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
113 if (-e _) { # but a something else
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
114 die "$0: $path exists and is not a pipe, please remove it\n";
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
115 } else {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
116 require POSIX;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
117 POSIX::mkfifo($path, 0666) or die "can\'t mkfifo $path: $!";
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
118 Irssi::print("Fifo created. Start reading it (\"cat $path\") and try again.");
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
119 return;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
120 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
121 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
122 if (!sysopen(FIFO, $path, O_WRONLY | O_NONBLOCK)) { # or die "can't write $path: $!";
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
123 Irssi::print("Couldn\'t write to the fifo ($!). Please start reading the fifo (\"cat $path\") and try again.");
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
124 return;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
125 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
126 FIFO->autoflush(1);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
127 print FIFO "\033[2J\033[1;1H"; # erase screen & jump to 0,0
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
128 $cursor_line = 0;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
129 if ($mode == $SCREEN) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
130 screen_stop();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
131 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
132 $mode = $FIFO;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
133 make_nicklist();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
134 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
135
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
136 sub fifo_stop {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
137 close FIFO;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
138 $mode = $OFF;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
139 Irssi::print("Fifo closed.");
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
140 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
141
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
142 ### screen ###
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
143
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
144 sub cmd_screen_start {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
145 if (!defined($ENV{'STY'})) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
146 Irssi::print 'screen not detected, screen mode only works inside screen';
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
147 return;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
148 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
149 read_settings();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
150 if ($mode == $SCREEN) {return;}
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
151 if ($mode == $FIFO) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
152 fifo_stop();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
153 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
154 $mode = $SCREEN;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
155 Irssi::signal_add_last('gui print text finished', \&sig_gui_print_text_finished);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
156 Irssi::signal_add_last('gui page scrolled', \&sig_page_scrolled);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
157 Irssi::signal_add('terminal resized', \&sig_terminal_resized);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
158 screen_size();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
159 make_nicklist();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
160 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
161
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
162 sub screen_stop {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
163 $mode = $OFF;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
164 Irssi::signal_remove('gui print text finished', \&sig_gui_print_text_finished);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
165 Irssi::signal_remove('gui page scrolled', \&sig_page_scrolled);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
166 Irssi::signal_remove('terminal resized', \&sig_terminal_resized);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
167 system 'screen -x '.$ENV{'STY'}.' -X fit';
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
168 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
169
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
170 sub screen_size {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
171 if ($mode != $SCREEN) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
172 return;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
173 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
174 $screen_resizing = 1;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
175 # fit screen
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
176 system 'screen -x '.$ENV{'STY'}.' -X fit';
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
177 # get size (from perldoc -q size)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
178 my ($winsize, $row, $col, $xpixel, $ypixel);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
179 eval 'use Term::ReadKey; ($col, $row, $xpixel, $ypixel) = GetTerminalSize';
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
180 # require Term::ReadKey 'GetTerminalSize';
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
181 # ($col, $row, $xpixel, $ypixel) = Term::ReadKey::GetTerminalSize;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
182 #};
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
183 if ($@) { # no Term::ReadKey, try the ugly way
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
184 eval {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
185 require 'sys/ioctl.ph';
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
186 # without this reloading doesn't work. workaround for some unknown bug
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
187 do 'asm/ioctls.ph';
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
188 };
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
189
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
190 # ugly way not working, let's try something uglier, the dg-hack(tm) (constant for linux only?)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
191 if($@) { no strict 'refs'; *TIOCGWINSZ = sub { return 0x5413 } }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
192
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
193 unless (defined &TIOCGWINSZ) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
194 die "Term::ReadKey not found, and ioctl 'workaround' failed. Install the Term::ReadKey perl module to use screen mode.\n";
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
195 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
196 open(TTY, "+</dev/tty") or die "No tty: $!";
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
197 unless (ioctl(TTY, &TIOCGWINSZ, $winsize='')) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
198 die "Term::ReadKey not found, and ioctl 'workaround' failed ($!). Install the Term::ReadKey perl module to use screen mode.\n";
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
199 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
200 close(TTY);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
201 ($row, $col, $xpixel, $ypixel) = unpack('S4', $winsize);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
202 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
203
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
204 # set screen width
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
205 $irssi_width = $col-$nicklist_width-1;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
206 $height = $row-1;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
207
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
208 # on some recent systems, "screen -X fit; screen -X width -w 50" doesn't work, needs a sleep in between the 2 commands
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
209 # so we wait a second before setting the width
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
210 Irssi::timeout_add_once(1000, sub {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
211 my ($new_irssi_width) = @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
212 system 'screen -x '.$ENV{'STY'}.' -X width -w ' . $new_irssi_width;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
213 # and then we wait another second for the resizing, and then redraw.
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
214 Irssi::timeout_add_once(1000,sub {$screen_resizing = 0; redraw()}, []);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
215 }, $irssi_width);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
216 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
217
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
218 sub sig_terminal_resized {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
219 if ($screen_resizing) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
220 return;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
221 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
222 $screen_resizing = 1;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
223 Irssi::timeout_add_once(1000,\&screen_size,[]);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
224 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
225
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
226
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
227 ### both ###
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
228
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
229 sub nicklist_write_start {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
230 if ($mode == $SCREEN) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
231 print STDERR "\033P\033[s\033\\"; # save cursor
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
232 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
233 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
234
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
235 sub nicklist_write_end {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
236 if ($mode == $SCREEN) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
237 print STDERR "\033P\033[u\033\\"; # restore cursor
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
238 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
239 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
240
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
241 sub nicklist_write_line {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
242 my ($line, $data) = @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
243 if ($mode == $SCREEN) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
244 print STDERR "\033P\033[" . ($line+1) . ';'. ($irssi_width+1) .'H'. $screen_prefix . $data . "\033\\";
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
245 } elsif ($mode == $FIFO) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
246 $data = "\033[m$data"; # reset color
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
247 if ($line == $cursor_line+1) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
248 $data = "\n$data"; # next line
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
249 } elsif ($line == $cursor_line) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
250 $data = "\033[1G".$data; # back to beginning of line
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
251 } else {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
252 $data = "\033[".($line+1).";0H".$data; # jump
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
253 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
254 $cursor_line=$line;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
255 print(FIFO $data) or fifo_stop();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
256 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
257 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
258
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
259 # recalc the text of the nicklist item
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
260 sub calc_text {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
261 my ($nick) = @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
262 my $tmp = $nicklist_width-3;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
263 (my $text = $nick->{'nick'}) =~ s/^(.{$tmp})..+$/$1\033[34m~\033[m/;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
264 $nick->{'text'} = $prefix_mode[$nick->{'mode'}] . $text . (' ' x ($nicklist_width-length($nick->{'nick'})-1));
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
265 $nick->{'cmp'} = $nick->{'mode'}.lc($nick->{'nick'});
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
266 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
267
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
268 # redraw the given nick (nr) if it is visible
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
269 sub redraw_nick_nr {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
270 my ($nr) = @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
271 my $line = $nr - $scroll_pos;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
272 if ($line >= 0 && $line < $height) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
273 nicklist_write_line($line, $nicklist[$nr]->{'text'});
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
274 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
275 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
276
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
277 # nick was inserted, redraw area if necessary
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
278 sub draw_insert_nick_nr {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
279 my ($nr) = @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
280 my $line = $nr - $scroll_pos;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
281 if ($line < 0) { # nick is inserted above visible area
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
282 $scroll_pos++; # 'scroll' down :)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
283 } elsif ($line < $height) { # line is visible
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
284 if ($mode == $SCREEN) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
285 need_redraw();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
286 } elsif ($mode == $FIFO) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
287 my $data = "\033[m\033[L". $nicklist[$nr]->{'text'}; # reset color & insert line & write nick
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
288 if ($line == $cursor_line) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
289 $data = "\033[1G".$data; # back to beginning of line
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
290 } else {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
291 $data = "\033[".($line+1).";1H".$data; # jump
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
292 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
293 $cursor_line=$line;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
294 print(FIFO $data) or fifo_stop();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
295 if ($prev_lines < $height) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
296 $prev_lines++; # the nicklist has one line more
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
297 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
298 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
299 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
300 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
301
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
302 sub draw_remove_nick_nr {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
303 my ($nr) = @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
304 my $line = $nr - $scroll_pos;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
305 if ($line < 0) { # nick removed above visible area
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
306 $scroll_pos--; # 'scroll' up :)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
307 } elsif ($line < $height) { # line is visible
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
308 if ($mode == $SCREEN) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
309 need_redraw();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
310 } elsif ($mode == $FIFO) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
311 #my $data = "\033[m\033[L[i$line]". $nicklist[$nr]->{'text'}; # reset color & insert line & write nick
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
312 my $data = "\033[M"; # delete line
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
313 if ($line != $cursor_line) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
314 $data = "\033[".($line+1)."d".$data; # jump
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
315 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
316 $cursor_line=$line;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
317 print(FIFO $data) or fifo_stop();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
318 if (@nicklist-$scroll_pos >= $height) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
319 redraw_nick_nr($scroll_pos+$height-1);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
320 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
321 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
322 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
323 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
324
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
325 # redraw the whole nicklist
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
326 sub redraw {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
327 $need_redraw = 0;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
328 #make_nicklist();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
329 nicklist_write_start();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
330 my $line = 0;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
331 ### draw nicklist ###
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
332 for (my $i=$scroll_pos;$line < $height && $i < @nicklist; $i++) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
333 nicklist_write_line($line++, $nicklist[$i]->{'text'});
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
334 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
335
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
336 ### clean up other lines ###
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
337 my $real_lines = $line;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
338 while($line < $prev_lines) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
339 nicklist_write_line($line++,' ' x $nicklist_width);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
340 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
341 $prev_lines = $real_lines;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
342 nicklist_write_end();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
343 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
344
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
345 # redraw (with little delay to avoid redrawing to much)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
346 sub need_redraw {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
347 if(!$need_redraw) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
348 $need_redraw = 1;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
349 Irssi::timeout_add_once(10,\&redraw,[]);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
350 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
351 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
352
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
353 sub sig_page_scrolled {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
354 $prev_lines = $height; # we'll need to redraw everything if he scrolled up
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
355 need_redraw;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
356 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
357
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
358 # redraw (with delay) if the window is visible (only in screen mode)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
359 sub sig_gui_print_text_finished {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
360 if ($need_redraw) { # there's already a redraw 'queued'
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
361 return;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
362 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
363 my $window = @_[0];
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
364 if ($window->{'refnum'} == Irssi::active_win->{'refnum'} || Irssi::settings_get_str('nicklist_screen_split_windows') eq '*') {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
365 need_redraw;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
366 return;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
367 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
368 foreach my $win (split(/[ ,]/, Irssi::settings_get_str('nicklist_screen_split_windows'))) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
369 if ($window->{'refnum'} == $win || $window->{'name'} eq $win) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
370 need_redraw;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
371 return;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
372 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
373 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
374 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
375
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
376 ####################
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
377 ##### NICKLIST #####
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
378 ####################
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
379
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
380 # returns the position of the given nick(as string) in the (internal) nicklist
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
381 sub find_nick {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
382 my ($nick) = @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
383 for (my $i=0;$i < @nicklist; $i++) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
384 if ($nicklist[$i]->{'nick'} eq $nick) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
385 return $i;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
386 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
387 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
388 return -1;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
389 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
390
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
391 # find position where nick should be inserted into the list
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
392 sub find_insert_pos {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
393 my ($cmp)= @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
394 for (my $i=0;$i < @nicklist; $i++) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
395 if ($nicklist[$i]->{'cmp'} gt $cmp) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
396 return $i;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
397 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
398 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
399 return scalar(@nicklist); #last
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
400 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
401
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
402 # make the (internal) nicklist (@nicklist)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
403 sub make_nicklist {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
404 @nicklist = ();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
405 $scroll_pos = 0;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
406
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
407 ### get & check channel ###
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
408 my $channel = Irssi::active_win->{active};
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
409
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
410 if (!$channel || (ref($channel) ne 'Irssi::Irc::Channel' && ref($channel) ne 'Irssi::Silc::Channel' && ref($channel) ne 'Irssi::Xmpp::Channel') || $channel->{'type'} ne 'CHANNEL' || ($channel->{chat_type} ne 'SILC' && !$channel->{'names_got'}) ) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
411 $active_channel = undef;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
412 # no nicklist
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
413 } else {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
414 $active_channel = $channel;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
415 ### make nicklist ###
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
416 my $thisnick;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
417 foreach my $nick (sort {(($a->{'op'}?'1':$a->{'halfop'}?'2':$a->{'voice'}?'3':'4').lc($a->{'nick'}))
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
418 cmp (($b->{'op'}?'1':$b->{'halfop'}?'2':$b->{'voice'}?'3':'4').lc($b->{'nick'}))} $channel->nicks()) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
419 $thisnick = {'nick' => $nick->{'nick'}, 'mode' => ($nick->{'op'}?$MODE_OP:$nick->{'halfop'}?$MODE_HALFOP:$nick->{'voice'}?$MODE_VOICE:$MODE_NORMAL)};
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
420 calc_text($thisnick);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
421 push @nicklist, $thisnick;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
422 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
423 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
424 need_redraw();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
425 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
426
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
427 # insert nick(as hash) into nicklist
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
428 # pre: cmp has to be calculated
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
429 sub insert_nick {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
430 my ($nick) = @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
431 my $nr = find_insert_pos($nick->{'cmp'});
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
432 splice @nicklist, $nr, 0, $nick;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
433 draw_insert_nick_nr($nr);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
434 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
435
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
436 # remove nick(as nr) from nicklist
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
437 sub remove_nick {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
438 my ($nr) = @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
439 splice @nicklist, $nr, 1;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
440 draw_remove_nick_nr($nr);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
441 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
442
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
443 ###################
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
444 ##### ACTIONS #####
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
445 ###################
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
446
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
447 # scroll the nicklist, arg = number of lines to scroll, positive = down, negative = up
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
448 sub cmd_scroll {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
449 if (!$active_channel) { # not a channel active
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
450 return;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
451 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
452 my @nicks=Irssi::active_win->{active}->nicks;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
453 my $nick_count = scalar(@nicks)+0;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
454 my $channel = Irssi::active_win->{active};
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
455 if (!$channel || $channel->{type} ne 'CHANNEL' || !$channel->{names_got} || $nick_count <= Irssi::settings_get_int('nicklist_height')) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
456 return;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
457 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
458 $scroll_pos += @_[0];
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
459
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
460 if ($scroll_pos > $nick_count - $height) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
461 $scroll_pos = $nick_count - $height;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
462 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
463 if ($scroll_pos <= 0) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
464 $scroll_pos = 0;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
465 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
466 need_redraw();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
467 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
468
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
469 sub is_active_channel {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
470 my ($server,$channel) = @_; # (channel as string)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
471 return ($server && $server->{'tag'} eq $active_channel->{'server'}->{'tag'} && $server->channel_find($channel) && $active_channel && $server->channel_find($channel)->{'name'} eq $active_channel->{'name'});
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
472 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
473
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
474 sub sig_channel_wholist { # this is actualy a little late, when the names are received would be better
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
475 my ($channel) = @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
476 if (Irssi::active_win->{'active'} && Irssi::active_win->{'active'}->{'name'} eq $channel->{'name'}) { # the channel joined is active
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
477 make_nicklist
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
478 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
479 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
480
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
481 sub sig_join {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
482 my ($server,$channel,$nick,$address) = @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
483 if (!is_active_channel($server,$channel)) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
484 return;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
485 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
486 my $newnick = {'nick' => $nick, 'mode' => $MODE_NORMAL};
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
487 calc_text($newnick);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
488 insert_nick($newnick);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
489 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
490
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
491 sub sig_kick {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
492 my ($server, $channel, $nick, $kicker, $address, $reason) = @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
493 if (!is_active_channel($server,$channel)) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
494 return;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
495 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
496 my $nr = find_nick($nick);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
497 if ($nr == -1) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
498 Irssi::print("nicklist warning: $nick was kicked from $channel, but not found in nicklist");
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
499 } else {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
500 remove_nick($nr);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
501 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
502 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
503
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
504 sub sig_part {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
505 my ($server,$channel,$nick,$address, $reason) = @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
506 if (!is_active_channel($server,$channel)) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
507 return;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
508 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
509 my $nr = find_nick($nick);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
510 if ($nr == -1) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
511 Irssi::print("nicklist warning: $nick has parted $channel, but was not found in nicklist");
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
512 } else {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
513 remove_nick($nr);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
514 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
515
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
516 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
517
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
518 sub sig_quit {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
519 my ($server,$nick,$address, $reason) = @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
520 if ($server->{'tag'} ne $active_channel->{'server'}->{'tag'}) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
521 return;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
522 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
523 my $nr = find_nick($nick);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
524 if ($nr != -1) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
525 remove_nick($nr);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
526 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
527 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
528
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
529 sub sig_nick {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
530 my ($server, $newnick, $oldnick, $address) = @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
531 if ($server->{'tag'} ne $active_channel->{'server'}->{'tag'}) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
532 return;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
533 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
534 my $nr = find_nick($oldnick);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
535 if ($nr != -1) { # if nick was found (nickchange is in current channel)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
536 my $nick = $nicklist[$nr];
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
537 remove_nick($nr);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
538 $nick->{'nick'} = $newnick;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
539 calc_text($nick);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
540 insert_nick($nick);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
541 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
542 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
543
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
544 sub sig_mode {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
545 my ($channel, $nick, $setby, $mode, $type) = @_; # (nick and channel as rec)
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
546 if ($channel->{'server'}->{'tag'} ne $active_channel->{'server'}->{'tag'} || $channel->{'name'} ne $active_channel->{'name'}) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
547 return;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
548 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
549 my $nr = find_nick($nick->{'nick'});
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
550 if ($nr == -1) {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
551 Irssi::print("nicklist warning: $nick->{'nick'} had mode set on $channel->{'name'}, but was not found in nicklist");
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
552 } else {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
553 my $nicklist_item = $nicklist[$nr];
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
554 remove_nick($nr);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
555 $nicklist_item->{'mode'} = ($nick->{'op'}?$MODE_OP:$nick->{'halfop'}?$MODE_HALFOP:$nick->{'voice'}?$MODE_VOICE:$MODE_NORMAL);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
556 calc_text($nicklist_item);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
557 insert_nick($nicklist_item);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
558 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
559 }
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
560
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
561 ##### command binds #####
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
562 Irssi::command_bind 'nicklist' => sub {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
563 my ( $data, $server, $item ) = @_;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
564 $data =~ s/\s+$//g;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
565 Irssi::command_runsub ('nicklist', $data, $server, $item ) ;
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
566 };
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
567 Irssi::signal_add_first 'default command nicklist' => sub {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
568 # gets triggered if called with unknown subcommand
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
569 cmd_help();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
570 };
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
571 Irssi::command_bind('nicklist update',\&update);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
572 Irssi::command_bind('nicklist help',\&cmd_help);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
573 Irssi::command_bind('nicklist scroll',\&cmd_scroll);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
574 Irssi::command_bind('nicklist fifo',\&cmd_fifo_start);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
575 Irssi::command_bind('nicklist screen',\&cmd_screen_start);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
576 Irssi::command_bind('nicklist screensize',\&screen_size);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
577 Irssi::command_bind('nicklist off',\&cmd_off);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
578
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
579 ##### signals #####
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
580 Irssi::signal_add_last('window item changed', \&make_nicklist);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
581 Irssi::signal_add_last('window changed', \&make_nicklist);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
582 Irssi::signal_add_last('channel wholist', \&sig_channel_wholist);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
583 Irssi::signal_add_first('message join', \&sig_join); # first, to be before ignores
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
584 Irssi::signal_add_first('message part', \&sig_part);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
585 Irssi::signal_add_first('message kick', \&sig_kick);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
586 Irssi::signal_add_first('message quit', \&sig_quit);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
587 Irssi::signal_add_first('message nick', \&sig_nick);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
588 Irssi::signal_add_first('message own_nick', \&sig_nick);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
589 Irssi::signal_add_first('nick mode changed', \&sig_mode);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
590
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
591 Irssi::signal_add('setup changed', \&read_settings);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
592
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
593 ##### settings #####
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
594 Irssi::settings_add_str('nicklist', 'nicklist_screen_prefix', '\e[m ');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
595 Irssi::settings_add_str('nicklist', 'nicklist_prefix_mode_op', '\e[32m@\e[39m');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
596 Irssi::settings_add_str('nicklist', 'nicklist_prefix_mode_halfop', '\e[34m%\e[39m');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
597 Irssi::settings_add_str('nicklist', 'nicklist_prefix_mode_voice', '\e[33m+\e[39m');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
598 Irssi::settings_add_str('nicklist', 'nicklist_prefix_mode_normal', ' ');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
599
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
600 Irssi::settings_add_int('nicklist', 'nicklist_width',11);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
601 Irssi::settings_add_int('nicklist', 'nicklist_height',24);
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
602 Irssi::settings_add_str('nicklist', 'nicklist_fifo_path', Irssi::get_irssi_dir . '/nicklistfifo');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
603 Irssi::settings_add_str('nicklist', 'nicklist_screen_split_windows', '');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
604 Irssi::settings_add_str('nicklist', 'nicklist_automode', '');
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
605
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
606 read_settings();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
607 if (uc(Irssi::settings_get_str('nicklist_automode')) eq 'SCREEN') {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
608 cmd_screen_start();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
609 } elsif (uc(Irssi::settings_get_str('nicklist_automode')) eq 'FIFO') {
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
610 cmd_fifo_start();
4e92ca6c779a add irssi conf
zegervdv <zegervdv@me.com>
parents:
diff changeset
611 }