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
19use strict;
20use vars qw($VERSION %IRSSI);
21use 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
36my $peakfile = "$ENV{HOME}/.irssi/peak.data";
37# automatically save peak data file on every new peak
38my $peak_autosave = 1;
39# just for debugging purposes
40my $peak_DEBUG = 0;
41
42#################################################
43
44my %chanpeak;
45
46
47###
48# Remove channel ID for !-channels
49sub sub_chan {
50    my $chan = @_[0];
51    $chan =~ s/^\!\w{5}?/\!/;
52    return $chan;
53}
54
55###
56# Print some help
57sub 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
71sub 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
102sub 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
121sub 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
142sub 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
172init_chanpeak();
173
174Irssi::signal_add('channel sync', 'update_peakrec');
175Irssi::signal_add_last('massjoin', 'update_peakrec');
176
177Irssi::command_bind('chanpeak', 'cmd_chanpeak', 'chanpeak commands');
178Irssi::command_bind('savepeak', 'cmd_savepeak', 'chanpeak commands');
179Irssi::command_bind('quit', 'cmd_savepeak');
180Irssi::command_bind('save', 'cmd_savepeak');
181
182Irssi::print("chanpeak.pl loaded...");
183