diff options
| author | Ailin Nemui | 2016-05-16 23:30:35 +0200 |
|---|---|---|
| committer | Ailin Nemui | 2016-05-16 23:30:35 +0200 |
| commit | e8a7fff647283eac8af19880427c59a43c88e20b (patch) | |
| tree | f004adf8bf17e545d16fb6ebc7cf62dfb4a290e2 /scripts/dim_nicks.pl | |
| parent | 4c4a5a53c73466080fae6ddfbcc21aa860fbe440 (diff) | |
| download | scripts.irssi.org-e8a7fff647283eac8af19880427c59a43c88e20b.tar.bz2 | |
dim_nicks 0.4.7
update dim_nicks to v0.4.7
- fix useless re-reading of settings colour
Diffstat (limited to 'scripts/dim_nicks.pl')
| -rw-r--r-- | scripts/dim_nicks.pl | 133 |
1 files changed, 81 insertions, 52 deletions
diff --git a/scripts/dim_nicks.pl b/scripts/dim_nicks.pl index 5c19633..05fa4b7 100644 --- a/scripts/dim_nicks.pl +++ b/scripts/dim_nicks.pl @@ -1,7 +1,7 @@ use strict; use warnings; -our $VERSION = '0.4.6'; # 373036720cc131b +our $VERSION = '0.4.7'; # 1cc0249a11b3fc9 our %IRSSI = ( authors => 'Nei', contact => 'Nei @ anti@conference.jabber.teamidiot.de', @@ -66,24 +66,17 @@ my $skip_forms = 1; my $search_forms_max = 5; my $color_letter = 'K'; -my (%nick_reg, %chan_reg, %history, %history_st, %lost_nicks, %lost_nicks_backup); +# nick object cache, chan object cache, line id cache, line id -> window map, -> channel, -> nick, -> nickname, channel -> line ids, channel->nickname->departure time, channel->nickname->{parts of line} +my (%nick_reg, %chan_reg, %history_w, %history_c, %history_n, %history_nn, %history_st, %lost_nicks, %lost_nicks_fs, %lost_nicks_fc, %lost_nicks_bc, %lost_nicks_bs); -my ($dest, $chanref, $nickref); +our ($dest, $chanref, $nickref); -sub clear_ref { - $dest = undef; - $chanref = undef; - $nickref = undef; -} sub msg_line_tag { my ($srv, $msg, $nick, $addr, $targ) = @_; - $chanref = $srv->channel_find($targ); - $nickref = ref $chanref ? $chanref->nick_find($nick) : undef; -} - -sub msg_line_clear { - clear_ref(); + local $chanref = $srv->channel_find($targ); + local $nickref = ref $chanref ? $chanref->nick_find($nick) : undef; + &Irssi::signal_continue; } my @color_code; @@ -91,10 +84,11 @@ my @color_code; sub color_to_code { my $win = Irssi::active_win; my $view = $win->view; - if (-1 == index $color_letter, '$*') { - $color_letter = "%$color_letter\$*"; + my $cl = $color_letter; + if (-1 == index $cl, '$*') { + $cl = "%$cl\$*"; } - $win->print_after(undef, MSGLEVEL_NEVER, "$color_letter "); + $win->print_after(undef, MSGLEVEL_NEVER, "$cl "); my $lp = $win->last_line_insert; my $color_code = $lp->get_text(1); $color_code =~ s/ $//; @@ -118,47 +112,63 @@ sub init_dim_nicks { } sub prt_text_issue { - ($dest) = @_; - clear_ref() unless defined $dest->{target}; - clear_ref() unless $dest->{level} & MSGLEVEL_PUBLIC; + my ($ld) = @_; + local $dest = $ld; + &Irssi::signal_continue; } sub expire_hist { for my $ch (keys %history_st) { if (@{$history_st{$ch}} > 2 * $history_lines) { my @del = splice @{$history_st{$ch}}, 0, $history_lines; - delete @history{ @del }; + delete @history_w{ @del }; + delete @history_c{ @del }; + delete @history_n{ @del }; + delete @history_nn{ @del }; } } } sub prt_text_ref { return unless $nickref; + return unless $dest && defined $dest->{target}; + return unless $dest->{level} & MSGLEVEL_PUBLIC; + my ($win) = @_; my $view = $win->view; my $line_id = $view->{buffer}{_irssi} .','. $view->{buffer}{cur_line}{_irssi}; $chan_reg{ $chanref->{_irssi} } = $chanref; $nick_reg{ $nickref->{_irssi} } = $nickref; - if (exists $history{ $line_id }) { + if (exists $history_w{ $line_id }) { } - $history{ $line_id } = [ $win->{_irssi}, $chanref->{_irssi}, $nickref->{_irssi}, $nickref->{nick} ]; + $history_w{ $line_id } = $win->{_irssi}; + $history_c{ $line_id } = $chanref->{_irssi}; + $history_n{ $line_id } = $nickref->{_irssi}; + $history_nn{ $line_id } = $nickref->{nick}; push @{$history_st{ $chanref->{_irssi} }}, $line_id; expire_hist(); my @lost_forever = grep { $view->{buffer}{first_line}{info}{time} > $lost_nicks{ $chanref->{_irssi} }{ $_ } } keys %{$lost_nicks{ $chanref->{_irssi} }}; delete @{$lost_nicks{ $chanref->{_irssi} }}{ @lost_forever }; - delete @{$lost_nicks_backup{ $chanref->{_irssi} }}{ @lost_forever }; - clear_ref(); + delete @{$lost_nicks_fs{ $chanref->{_irssi} }}{ @lost_forever }; + delete @{$lost_nicks_fc{ $chanref->{_irssi} }}{ @lost_forever }; + delete @{$lost_nicks_bc{ $chanref->{_irssi} }}{ @lost_forever }; + delete @{$lost_nicks_bs{ $chanref->{_irssi} }}{ @lost_forever }; + return; } sub win_del { my ($win) = @_; for my $ch (keys %history_st) { - @{$history_st{$ch}} = grep { exists $history{ $_ } && - $history{ $_ }[0] != $win->{_irssi} } @{$history_st{$ch}}; + @{$history_st{$ch}} = grep { exists $history_w{ $_ } && + $history_w{ $_ } != $win->{_irssi} } @{$history_st{$ch}}; } - my @del = grep { $history{ $_ }[0] == $win->{_irssi} } keys %history; - delete @history{ @del }; + my @del = grep { $history_w{ $_ } == $win->{_irssi} } keys %history_w; + delete @history_w{ @del }; + delete @history_c{ @del }; + delete @history_n{ @del }; + delete @history_nn{ @del }; + return; } sub _alter_lines { @@ -203,9 +213,8 @@ sub debug_forms { my $buffer_id = $view->{buffer}{_irssi} .','; while ($lp && $count) { my $line_id = $buffer_id . $lp->{_irssi}; - # $history{ $line_id } = [ $win->{_irssi}, $chanref->{_irssi}, $nickref->{_irssi}, $nickref->{nick} ]; - if (exists $history{ $line_id }) { - my $line_nick = $history{ $line_id }[3]; + if (exists $history_w{ $line_id }) { + my $line_nick = $history_nn{ $line_id }; my $text = $lp->get_text(1); pos $text = 0; my $from = 0; @@ -250,7 +259,7 @@ sub debug_forms { sub _alter_line { my ($buffer_id, $lrp, $win, $view, $lp, $cid, $ad) = @_; - my $line_nick = $history{ $lrp }[3]; + my $line_nick = $history_nn{ $lrp }; my $text = $lp->get_text(1); pos $text = 0; my $from = 0; @@ -270,8 +279,8 @@ sub _alter_line { unshift @nick_reg, quotemeta substr $line_nick, 0, $_ for 1 .. length $line_nick; { no warnings 'uninitialized'; if ($ad) { - if (exists $lost_nicks_backup{ $cid }{ $line_nick }) { - my ($fs, $fc, $bc, $bs) = @{$lost_nicks_backup{ $cid }{ $line_nick }}; + if (exists $lost_nicks_fs{ $cid }{ $line_nick }) { + my ($fs, $fc, $bc, $bs) = ($lost_nicks_fs{ $cid }{ $line_nick }, $lost_nicks_fc{ $cid }{ $line_nick }, $lost_nicks_bc{ $cid }{ $line_nick }, $lost_nicks_bs{ $cid }{ $line_nick }); my $sen = length $bs ? $color_code[0] : ''; for my $nick_reg (@nick_reg) { last if @@ -285,7 +294,10 @@ sub _alter_line { if ( (substr $text, $from, $to-$from) =~ s/(\Q$color_code[0]\E\s*)?((?:$irssi_mumbo)+)?$irssi_mumbo_no_partial($nick_reg)((?:$irssi_mumbo)+)?(\s*\Q$color_code[0]\E)?/$1$2$color_code[0]$3$color_code[1]$4$5/) { - $lost_nicks_backup{ $cid }{ $line_nick } = [ $1, $2, $4, $5 ]; + $lost_nicks_fs{ $cid }{ $line_nick } = $1; + $lost_nicks_fc{ $cid }{ $line_nick } = $2; + $lost_nicks_bc{ $cid }{ $line_nick } = $4; + $lost_nicks_bs{ $cid }{ $line_nick } = $5; last; } } @@ -293,10 +305,13 @@ sub _alter_line { $win->gui_printtext_after($lp->prev, $lp->{info}{level} | MSGLEVEL_NEVER, "$text\n", $lp->{info}{time}); my $ll = $win->last_line_insert; my $line_id = $buffer_id . $ll->{_irssi}; - if (exists $history{ $line_id }) { + if (exists $history_w{ $line_id }) { } grep { $_ eq $lrp and $_ = $line_id } @{$history_st{ $cid }}; - $history{ $line_id } = delete $history{ $lrp }; + $history_w{ $line_id } = delete $history_w{ $lrp }; + $history_c{ $line_id } = delete $history_c{ $lrp }; + $history_n{ $line_id } = delete $history_n{ $lrp }; + $history_nn{ $line_id } = delete $history_nn{ $lrp }; $view->remove_line($lp); $ll; } @@ -304,30 +319,35 @@ sub _alter_line { sub nick_add { my ($chan, $nick) = @_; if (delete $lost_nicks{ $chan->{_irssi} }{ $nick->{nick} }) { - my @check_lr = grep { $history{ $_ }[1] == $chan->{_irssi} && - $history{ $_ }[2] eq $nick->{nick} } keys %history; + my @check_lr = grep { $history_c{ $_ } == $chan->{_irssi} && + $history_n{ $_ } eq $nick->{nick} } keys %history_w; if (@check_lr) { $nick_reg{ $nick->{_irssi} } = $nick; for my $li (@check_lr) { - $history{ $li }[2] = $nick->{_irssi}; + $history_n{ $li } = $nick->{_irssi}; } _alter_lines($chan, \@check_lr, 1); } } - delete $lost_nicks_backup{ $chan->{_irssi} }{ $nick->{nick} }; + delete $lost_nicks_fs{ $chan->{_irssi} }{ $nick->{nick} }; + delete $lost_nicks_fc{ $chan->{_irssi} }{ $nick->{nick} }; + delete $lost_nicks_bc{ $chan->{_irssi} }{ $nick->{nick} }; + delete $lost_nicks_bs{ $chan->{_irssi} }{ $nick->{nick} }; + return; } sub nick_del { my ($chan, $nick) = @_; - my @check_lr = grep { $history{ $_ }[2] eq $nick->{_irssi} } keys %history; + my @check_lr = grep { $history_n{ $_ } eq $nick->{_irssi} } keys %history_w; for my $li (@check_lr) { - $history{ $li }[2] = $nick->{nick}; + $history_n{ $li } = $nick->{nick}; } if (@check_lr) { $lost_nicks{ $chan->{_irssi} }{ $nick->{nick} } = time; _alter_lines($chan, \@check_lr, 0); } delete $nick_reg{ $nick->{_irssi} }; + return; } sub nick_change { @@ -338,11 +358,18 @@ sub nick_change { sub chan_del { my ($chan) = @_; if (my $del = delete $history_st{ $chan->{_irssi} }) { - delete @history{ @$del }; + delete @history_w{ @$del }; + delete @history_c{ @$del }; + delete @history_n{ @$del }; + delete @history_nn{ @$del }; } delete $chan_reg{ $chan->{_irssi} }; delete $lost_nicks{$chan->{_irssi}}; - delete $lost_nicks_backup{$chan->{_irssi}}; + delete $lost_nicks_fs{$chan->{_irssi}}; + delete $lost_nicks_fc{$chan->{_irssi}}; + delete $lost_nicks_bc{$chan->{_irssi}}; + delete $lost_nicks_bs{$chan->{_irssi}}; + return; } Irssi::settings_add_int( setc, set 'history_lines', $history_lines); @@ -357,7 +384,6 @@ Irssi::signal_add({ 'nicklist remove' => 'nick_del', 'window destroyed' => 'win_del', 'message public' => 'msg_line_tag', - 'message own_public' => 'msg_line_clear', 'channel destroyed' => 'chan_del', }); @@ -367,13 +393,14 @@ sub dumphist { my $buffer_id = $view->{buffer}{_irssi} .','; for (my $lp = $view->{buffer}{first_line}; $lp; $lp = $lp->next) { my $line_id = $buffer_id . $lp->{_irssi}; - if (exists $history{ $line_id }) { - my $k = $history{ $line_id }; - if (exists $chan_reg{ $k->[1] }) { + if (exists $history_w{ $line_id }) { + my $k = $history_c{ $line_id }; + my $kn = $history_n{ $line_id }; + if (exists $chan_reg{ $k }) { } - if (exists $nick_reg{ $k->[2] }) { + if (exists $nick_reg{ $kn }) { } - if (exists $lost_nicks{ $k->[1] } && exists $lost_nicks{ $k->[1] }{ $k->[2] }) { + if (exists $lost_nicks{ $k } && exists $lost_nicks{ $k }{ $kn }) { } } } @@ -388,5 +415,7 @@ init_dim_nicks(); # Changelog # ========= +# 0.4.7 +# - fix useless re-reading of settings colour # 0.4.6 # - fix crash on some lines reported by pierrot |
