diff options
| author | Alexander Færøy | 2014-05-31 13:10:46 +0200 | 
|---|---|---|
| committer | Alexander Færøy | 2014-05-31 13:10:46 +0200 | 
| commit | 2d0759e6ca5767b48bcc85bf38c2c43d5f0b63b1 (patch) | |
| tree | 1c5e6d817c88e67b46e216a50e0aef5428bf63df /scripts/chanpeak.pl | |
| parent | 2d080422d79d1fd49d6c5528593ccaaff9bfc583 (diff) | |
| download | scripts.irssi.org-2d0759e6ca5767b48bcc85bf38c2c43d5f0b63b1.tar.bz2 | |
Import scripts from scripts.irssi.org
Diffstat (limited to 'scripts/chanpeak.pl')
| -rw-r--r-- | scripts/chanpeak.pl | 182 | 
1 files changed, 182 insertions, 0 deletions
| diff --git a/scripts/chanpeak.pl b/scripts/chanpeak.pl new file mode 100644 index 0000000..7cc90a9 --- /dev/null +++ b/scripts/chanpeak.pl @@ -0,0 +1,182 @@ +##### +# chanpeak.pl (last update 05/09/2001) +# +#      by Bjoern 'fuchs' Krombholz +#     for irssi v0.7.99 +# +# History: +#   * 0.2.1  remove spaces from /chanpeak arg's end +#   * 0.2.0  !-channel support +#   * 0.1.3  bug fix args evaluation +#   * 0.1.2  bad bug with delimiters in file +#   * 0.1.1  automatically choose active channel; use strict +#   * 0.1.0  initial release +# +# TODO: +#   * delete records +##### + +use strict; +use vars qw($VERSION %IRSSI); +use Irssi; + +$VERSION = "0.2.2"; +%IRSSI = ( +		  authors     => "Bjoern \'fuchs\' Krombholz", +		  contact     => "bjkro\@gmx.de", +		  name        => "chanpeak", +		  license     => "Public Domain", +		  description => "Log maximum number of people ever been in a channel", +		  changed     => "Wed Jun  2 17:00:00 CET 2002", +		  changes     => "added header, removed debugging outputs" +		 ); + + +# path to peak data file +my $peakfile = "$ENV{HOME}/.irssi/peak.data"; +# automatically save peak data file on every new peak +my $peak_autosave = 1; +# just for debugging purposes +my $peak_DEBUG = 0; + +################################################# + +my %chanpeak; + + +### +# Remove channel ID for !-channels +sub sub_chan { +    my $chan = @_[0]; +    $chan =~ s/^\!\w{5}?/\!/; +    return $chan; +} + +### +# Print some help +sub help_chanpeak { +    Irssi::print("No peak record found"); +    Irssi::print("\nCHANPEAK [<channel>[@<chatnet>]]\n", MSGLEVEL_CLIENTCRAP); +    Irssi::print("Shows user peak for <channel>.\n", MSGLEVEL_CLIENTCRAP); +    Irssi::print("If your current window is a channel window,\n". +				 "print this channel's peak if <channel>\nomitted.", +				 MSGLEVEL_CLIENTCRAP); +    Irssi::print("Prints matching <channel> peaks of all\n". +				 "ChatNets if <chatnet> omitted.\n", MSGLEVEL_CLIENTCRAP); +} + + +### +# Output requested peak +sub cmd_chanpeak { +    my ($data, $server, $channel) = @_; +    my ($chan, $tag) = split(/@/, lc($data)); +    $chan =~ s/ *$//; +    my $key; + +    $chan = sub_chan($chan); +    if ($chan eq "" && Irssi::active_win()->{active}->{type} eq "CHANNEL") { +		$chan = sub_chan( lc(Irssi::active_win()->{active}->{name}) ); +		$tag = lc(Irssi::active_win()->{active}->{server}->{tag}); +		Irssi::active_win()->{active}->print("Peak for ".$chan."@".$tag.": ". +											 $chanpeak{$chan}{$tag}{peak}." (". +											 localtime($chanpeak{$chan}{$tag}{date}).")"); +		return 0; +    } elsif (exists $chanpeak{$chan}) { +		foreach $key (keys %{$chanpeak{$chan}}) { +			if ($key eq $tag || $tag eq "") { +				Irssi::print("Peak for ".$chan."@".$key.": ". +							 $chanpeak{$chan}{$key}{peak}." (". +							 localtime($chanpeak{$chan}{$key}{date}).")"); +			} +		} +		return 0; +    } else { +		help_chanpeak(); +		return 0; +    } +} + +### +# Save peak records to file +sub cmd_savepeak { +    my ($chan, $key, $tag); + +    if ( !open(PEAKDATA, '>', $peakfile) ) { +		Irssi::print("Chanpeak: Could not create datafile ".$peakfile); +		return 1; +    } +    foreach $chan (keys %chanpeak) { +		foreach $tag (keys %{$chanpeak{$chan}}) { +			print (PEAKDATA $chan." ".$tag." ".$chanpeak{$chan}{$tag}{peak}." ". +				   $chanpeak{$chan}{$tag}{date}."\n"); +		} +    } +    Irssi::print("Chanpeak: Saved peak data to ".$peakfile) if ( $peak_DEBUG ); +    close PEAKDATA; +} + +### +# Update peak record +sub update_peakrec { +    my $channel = @_[0]; +    my $chan = lc($channel->{name}); +    my $tag = lc($channel->{server}->{tag}); +    my @nicks = $channel->nicks(); +    my $peak = @nicks; + +    $chan = sub_chan($chan); +    if (!exists $chanpeak{$chan}{$tag}{peak} +		|| $peak > $chanpeak{$chan}{$tag}{peak}) { +		$chanpeak{$chan}{$tag}{peak} = $peak; +		$chanpeak{$chan}{$tag}{date} = time(); +		Irssi::print("New peak in ".$chan."@".$tag." : ".$peak); +		if ($peak_autosave) { +			cmd_savepeak(); +		} +    } +} + +### +# Read data file and initialize already joined channels +sub init_chanpeak { +    my ($chan, $channel, $date, $line, $peak, $tag); + +    if ( !open(PEAKDATA, '<', $peakfile) ) { +		Irssi::print('Chanpeak: datafile not found, creating...'); +		if ( !open(PEAKDATA, '>', $peakfile) ) { +			Irssi::print('Chanpeak: Couldn\'t create datafile `'.$peakfile.'\'!'); +			return 1; +		} +		close PEAKDATA; +    } else { +		my @lines = <PEAKDATA>; +		foreach $line (@lines) { +			if ($line eq "\n") { +				next; +			} +			$line =~ s/\n//; +			($chan, $tag, $peak, $date) = split(/ /, $line, 4); +			$chanpeak{$chan}{$tag}{peak} = $peak; +			$chanpeak{$chan}{$tag}{date} = $date; +		} +		close PEAKDATA; +    } + +    foreach $channel (Irssi::channels()) { +		$chan = lc($channel->{name}); +		update_peakrec($channel); +    } +} + +init_chanpeak(); + +Irssi::signal_add('channel sync', 'update_peakrec'); +Irssi::signal_add_last('massjoin', 'update_peakrec'); + +Irssi::command_bind('chanpeak', 'cmd_chanpeak', 'chanpeak commands'); +Irssi::command_bind('savepeak', 'cmd_savepeak', 'chanpeak commands'); +Irssi::command_bind('quit', 'cmd_savepeak'); +Irssi::command_bind('save', 'cmd_savepeak'); + +Irssi::print("chanpeak.pl loaded..."); | 
