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