/var/www/www.irssi.org-old/scripts/html/chanpeak.pl
1 #####
2 # chanpeak.pl (last update 05/09/2001)
3 #
4 # by Bjoern 'fuchs' Krombholz
5 # for irssi v0.7.99
6 #
7 # History:
8 # * 0.2.1 remove spaces from /chanpeak arg's end
9 # * 0.2.0 !-channel support
10 # * 0.1.3 bug fix args evaluation
11 # * 0.1.2 bad bug with delimiters in file
12 # * 0.1.1 automatically choose active channel; use strict
13 # * 0.1.0 initial release
14 #
15 # TODO:
16 # * delete records
17 #####
18
19 use strict;
20 use vars qw($VERSION %IRSSI);
21 use Irssi;
22
23 $VERSION = "0.2.2";
24 %IRSSI = (
25 authors => "Bjoern \'fuchs\' Krombholz",
26 contact => "bjkro\@gmx.de",
27 name => "chanpeak",
28 license => "Public Domain",
29 description => "Log maximum number of people ever been in a channel",
30 changed => "Wed Jun 2 17:00:00 CET 2002",
31 changes => "added header, removed debugging outputs"
32 );
33
34
35 # path to peak data file
36 my $peakfile = "$ENV{HOME}/.irssi/peak.data";
37 # automatically save peak data file on every new peak
38 my $peak_autosave = 1;
39 # just for debugging purposes
40 my $peak_DEBUG = 0;
41
42 #################################################
43
44 my %chanpeak;
45
46
47 ###
48 # Remove channel ID for !-channels
49 sub sub_chan {
50 my $chan = @_[0];
51 $chan =~ s/^\!\w{5}?/\!/;
52 return $chan;
53 }
54
55 ###
56 # Print some help
57 sub help_chanpeak {
58 Irssi::print("No peak record found");
59 Irssi::print("\nCHANPEAK [<channel>[@<chatnet>]]\n", MSGLEVEL_CLIENTCRAP);
60 Irssi::print("Shows user peak for <channel>.\n", MSGLEVEL_CLIENTCRAP);
61 Irssi::print("If your current window is a channel window,\n".
62 "print this channel's peak if <channel>\nomitted.",
63 MSGLEVEL_CLIENTCRAP);
64 Irssi::print("Prints matching <channel> peaks of all\n".
65 "ChatNets if <chatnet> omitted.\n", MSGLEVEL_CLIENTCRAP);
66 }
67
68
69 ###
70 # Output requested peak
71 sub cmd_chanpeak {
72 my ($data, $server, $channel) = @_;
73 my ($chan, $tag) = split(/@/, lc($data));
74 $chan =~ s/ *$//;
75 my $key;
76
77 $chan = sub_chan($chan);
78 if ($chan eq "" && Irssi::active_win()->{active}->{type} eq "CHANNEL") {
79 $chan = sub_chan( lc(Irssi::active_win()->{active}->{name}) );
80 $tag = lc(Irssi::active_win()->{active}->{server}->{tag});
81 Irssi::active_win()->{active}->print("Peak for ".$chan."@".$tag.": ".
82 $chanpeak{$chan}{$tag}{peak}." (".
83 localtime($chanpeak{$chan}{$tag}{date}).")");
84 return 0;
85 } elsif (exists $chanpeak{$chan}) {
86 foreach $key (keys %{$chanpeak{$chan}}) {
87 if ($key eq $tag || $tag eq "") {
88 Irssi::print("Peak for ".$chan."@".$key.": ".
89 $chanpeak{$chan}{$key}{peak}." (".
90 localtime($chanpeak{$chan}{$key}{date}).")");
91 }
92 }
93 return 0;
94 } else {
95 help_chanpeak();
96 return 0;
97 }
98 }
99
100 ###
101 # Save peak records to file
102 sub cmd_savepeak {
103 my ($chan, $key, $tag);
104
105 if ( !open(PEAKDATA, '>', $peakfile) ) {
106 Irssi::print("Chanpeak: Could not create datafile ".$peakfile);
107 return 1;
108 }
109 foreach $chan (keys %chanpeak) {
110 foreach $tag (keys %{$chanpeak{$chan}}) {
111 print (PEAKDATA $chan." ".$tag." ".$chanpeak{$chan}{$tag}{peak}." ".
112 $chanpeak{$chan}{$tag}{date}."\n");
113 }
114 }
115 Irssi::print("Chanpeak: Saved peak data to ".$peakfile) if ( $peak_DEBUG );
116 close PEAKDATA;
117 }
118
119 ###
120 # Update peak record
121 sub update_peakrec {
122 my $channel = @_[0];
123 my $chan = lc($channel->{name});
124 my $tag = lc($channel->{server}->{tag});
125 my @nicks = $channel->nicks();
126 my $peak = @nicks;
127
128 $chan = sub_chan($chan);
129 if (!exists $chanpeak{$chan}{$tag}{peak}
130 || $peak > $chanpeak{$chan}{$tag}{peak}) {
131 $chanpeak{$chan}{$tag}{peak} = $peak;
132 $chanpeak{$chan}{$tag}{date} = time();
133 Irssi::print("New peak in ".$chan."@".$tag." : ".$peak);
134 if ($peak_autosave) {
135 cmd_savepeak();
136 }
137 }
138 }
139
140 ###
141 # Read data file and initialize already joined channels
142 sub init_chanpeak {
143 my ($chan, $channel, $date, $line, $peak, $tag);
144
145 if ( !open(PEAKDATA, '<', $peakfile) ) {
146 Irssi::print('Chanpeak: datafile not found, creating...');
147 if ( !open(PEAKDATA, '>', $peakfile) ) {
148 Irssi::print('Chanpeak: Couldn\'t create datafile `'.$peakfile.'\'!');
149 return 1;
150 }
151 close PEAKDATA;
152 } else {
153 my @lines = <PEAKDATA>;
154 foreach $line (@lines) {
155 if ($line eq "\n") {
156 next;
157 }
158 $line =~ s/\n//;
159 ($chan, $tag, $peak, $date) = split(/ /, $line, 4);
160 $chanpeak{$chan}{$tag}{peak} = $peak;
161 $chanpeak{$chan}{$tag}{date} = $date;
162 }
163 close PEAKDATA;
164 }
165
166 foreach $channel (Irssi::channels()) {
167 $chan = lc($channel->{name});
168 update_peakrec($channel);
169 }
170 }
171
172 init_chanpeak();
173
174 Irssi::signal_add('channel sync', 'update_peakrec');
175 Irssi::signal_add_last('massjoin', 'update_peakrec');
176
177 Irssi::command_bind('chanpeak', 'cmd_chanpeak', 'chanpeak commands');
178 Irssi::command_bind('savepeak', 'cmd_savepeak', 'chanpeak commands');
179 Irssi::command_bind('quit', 'cmd_savepeak');
180 Irssi::command_bind('save', 'cmd_savepeak');
181
182 Irssi::print("chanpeak.pl loaded...");