/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...");