Mercurial > dotfiles
comparison .irssi/scripts/revolve.pl @ 390:4276071d7cf3
irssi: add irssi-revolving-door
author | Augie Fackler <raf@durin42.com> |
---|---|
date | Fri, 18 Mar 2016 21:32:01 -0400 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
389:2dd040318107 | 390:4276071d7cf3 |
---|---|
1 use Irssi; | |
2 use strict; | |
3 use Irssi::TextUI; | |
4 use vars qw($VERSION %IRSSI); | |
5 | |
6 $VERSION = "0.0.2"; | |
7 %IRSSI = ( | |
8 authors => 'Ryan Freebern', | |
9 contact => 'ryan@freebern.org', | |
10 name => 'revolve', | |
11 description => 'Summarizes multiple sequential joins/parts/quits.', | |
12 license => 'GPL v2 or later', | |
13 url => 'http://github.com/rfreebern/irssi-revolving-door', | |
14 ); | |
15 | |
16 # Based on compact.pl by Wouter Coekaerts <wouter@coekaerts.be> | |
17 # http://wouter.coekaerts.be/irssi/scripts/compact.pl.html | |
18 | |
19 my %summary_lines; | |
20 | |
21 sub summarize { | |
22 my ($server, $channel, $nick, $new_nick, $type) = @_; | |
23 | |
24 my $window = $server->window_find_item($channel); | |
25 return if (!$window); | |
26 my $view = $window->view(); | |
27 my $check = $server->{tag} . ':' . $channel; | |
28 | |
29 $view->set_bookmark_bottom('bottom'); | |
30 my $last = $view->get_bookmark('bottom'); | |
31 my $secondlast = $last->prev(); | |
32 | |
33 # Remove the last line, which should have the join/part/quit message. | |
34 $view->remove_line($last); | |
35 | |
36 # If the second-to-last line is a summary line, parse it. | |
37 my %door = ('Joins' => [], 'Parts' => [], 'Quits' => [], 'Nicks' => []); | |
38 my @summarized = (); | |
39 if ($secondlast and %summary_lines and $secondlast->{'_irssi'} == $summary_lines{$check}) { | |
40 my $summary = Irssi::strip_codes($secondlast->get_text(1)); | |
41 @summarized = split(/ -- /, $summary); | |
42 foreach my $part (@summarized) { | |
43 my ($type, $nicks) = split(/: /, $part); | |
44 $door{$type} = [ split(/, /, $nicks) ]; | |
45 } | |
46 $view->remove_line($secondlast); | |
47 } | |
48 | |
49 if ($type eq '__revolving_door_join') { # Join | |
50 push(@{$door{'Joins'}}, $nick); | |
51 @{$door{'Parts'}} = grep { $_ ne $nick } @{$door{'Parts'}} if (scalar @{$door{'Parts'}}); | |
52 @{$door{'Quits'}} = grep { $_ ne $nick } @{$door{'Quits'}} if (scalar @{$door{'Quits'}}); | |
53 } elsif ($type eq '__revolving_door_quit') { # Quit | |
54 push(@{$door{'Quits'}}, $nick) if (!grep(/^\Q$nick\E$/, @{$door{'Joins'}})); | |
55 @{$door{'Joins'}} = grep { $_ ne $nick } @{$door{'Joins'}} if (scalar @{$door{'Joins'}}); | |
56 } elsif ($type eq '__revolving_door_part') { # Part | |
57 push(@{$door{'Parts'}}, $nick) if (!grep(/^\Q$nick\E$/, @{$door{'Joins'}}));; | |
58 @{$door{'Joins'}} = grep { $_ ne $nick } @{$door{'Joins'}} if (scalar @{$door{'Joins'}});; | |
59 } else { # Nick | |
60 my $nick_found = 0; | |
61 foreach my $known_nick (@{$door{'Nicks'}}) { | |
62 my ($orig_nick, $current_nick) = split(/ -> /, $known_nick); | |
63 if ($new_nick eq $orig_nick) { # Changed nickname back to original. | |
64 @{$door{'Nicks'}} = grep { $_ ne "$orig_nick -> $current_nick" } @{$door{'Nicks'}}; | |
65 $nick_found = 1; | |
66 last; | |
67 } elsif ($current_nick eq $nick) { | |
68 $_ =~ s/\b\Q$current_nick\E\b/$new_nick/ foreach @{$door{'Nicks'}}; | |
69 $nick_found = 1; | |
70 last; | |
71 } | |
72 } | |
73 if (!$nick_found) { | |
74 push(@{$door{'Nicks'}}, "$nick -> $new_nick"); | |
75 } | |
76 # Update nicks in join/part/quit lists. | |
77 foreach my $part (qw/Joins Parts Quits/) { | |
78 $_ =~ s/\b\Q$nick\E\b/$new_nick/ foreach @{$door{$part}}; | |
79 } | |
80 } | |
81 | |
82 @summarized = (); | |
83 foreach my $part (qw/Joins Parts Quits Nicks/) { | |
84 if (scalar @{$door{$part}}) { | |
85 push @summarized, "\%W$part:\%n " . join(', ', @{$door{$part}}); | |
86 } | |
87 } | |
88 | |
89 my $summary = join(' -- ', @summarized); | |
90 $window->print($summary, MSGLEVEL_NEVER); | |
91 | |
92 # Get the line we just printed so we can log its ID. | |
93 $view->set_bookmark_bottom('bottom'); | |
94 $last = $view->get_bookmark('bottom'); | |
95 $summary_lines{$check} = $last->{'_irssi'}; | |
96 | |
97 $view->redraw(); | |
98 } | |
99 | |
100 sub summarize_join { | |
101 my ($server, $channel, $nick, $address, $reason) = @_; | |
102 &summarize($server, $channel, $nick, 0, '__revolving_door_join'); | |
103 } | |
104 | |
105 sub summarize_quit { | |
106 my ($server, $nick, $address, $reason) = @_; | |
107 my @channels = $server->channels(); | |
108 foreach my $channel (@channels) { | |
109 my $window = $server->window_find_item($channel->{name}); | |
110 next if (!$window); | |
111 my $view = $window->view(); | |
112 $view->set_bookmark_bottom('bottom'); | |
113 my $last = $view->get_bookmark('bottom'); | |
114 my $last_text = $last->get_text(1); | |
115 if ($last_text =~ m/\Q$nick\E.*?has quit/) { | |
116 &summarize($server, $channel->{name}, $nick, 0, '__revolving_door_quit'); | |
117 } | |
118 } | |
119 } | |
120 | |
121 sub summarize_part { | |
122 my ($server, $channel, $nick, $address, $reason) = @_; | |
123 &summarize($server, $channel, $nick, 0, '__revolving_door_part'); | |
124 } | |
125 | |
126 sub summarize_nick { | |
127 my ($server, $new_nick, $old_nick, $address) = @_; | |
128 my @channels = $server->channels(); | |
129 foreach my $channel (@channels) { | |
130 my $channel_nick = $channel->nick_find($new_nick); | |
131 if (defined $channel_nick) { | |
132 &summarize($server, $channel->{name}, $old_nick, $new_nick, '__revolving_door_nick'); | |
133 } | |
134 } | |
135 } | |
136 | |
137 Irssi::signal_add_priority('message join', \&summarize_join, Irssi::SIGNAL_PRIORITY_LOW + 1); | |
138 Irssi::signal_add_priority('message part', \&summarize_part, Irssi::SIGNAL_PRIORITY_LOW + 1); | |
139 Irssi::signal_add_priority('message quit', \&summarize_quit, Irssi::SIGNAL_PRIORITY_LOW + 1); | |
140 Irssi::signal_add_priority('message nick', \&summarize_nick, Irssi::SIGNAL_PRIORITY_LOW + 1); |