diff options
Diffstat (limited to 'scripts/topics.pl')
| -rw-r--r-- | scripts/topics.pl | 126 | 
1 files changed, 126 insertions, 0 deletions
| diff --git a/scripts/topics.pl b/scripts/topics.pl new file mode 100644 index 0000000..61a672b --- /dev/null +++ b/scripts/topics.pl @@ -0,0 +1,126 @@ + +# by Stefan 'tommie' Tomanek +use strict; + +use vars qw($VERSION %IRSSI); +$VERSION = '2003020801'; +%IRSSI = ( +    authors     => 'Stefan \'tommie\' Tomanek', +    contact     => 'stefan@pico.ruhr.de', +    name        => 'topics', +    description => 'records a topic history and locks the channel topic', +    license     => 'GPLv2', +    url         => 'http://irssi.org/scripts/', +    changed     => $VERSION, +    commands     => 'topics' +); + +use Irssi 20020324; +use vars qw(%topics); + +sub show_help() { +    my $help = "$IRSSI{name} $VERSION +/topics +    List all topics that have been set in the current channel +/topics <num> +    Restore topic <num> +/topics lock +    Lock the current topic +/topics unlock +    Unlock the channeltopic +"; +    my $text=''; +    foreach (split(/\n/, $help)) { +        $_ =~ s/^\/(.*)$/%9\/$1%9/; +        $text .= $_."\n"; +    } +    print CLIENTCRAP &draw_box("Topics", $text, "topics help", 1); +} + + +sub draw_box ($$$$) { +    my ($title, $text, $footer, $colour) = @_; +    my $box = ''; +    $box .= '%R,--[%n%9%U'.$title.'%U%9%R]%n'."\n"; +    foreach (split(/\n/, $text)) { +        $box .= '%R|%n '.$_."\n"; +    } +    $box .= '%R`--<%n'.$footer.'%R>->%n'; +    $box =~ s/%.//g unless $colour; +    return $box; +} + +sub sig_channel_topic_changed ($) { +    my ($channel) = @_; +    my $ircnet = $channel->{server}->{tag}; +    my $name = $channel->{name}; +    my $data = {'topic'      => $channel->{topic},  +                'topic_by'   => $channel->{topic_by}, +		'topic_time' => $channel->{topic_time} +    }; +    push @{$topics{$ircnet}{$name}{list}}, $data; +    if ($topics{$ircnet}{$name}{lock}) { +	my $topic = $topics{$ircnet}{$name}{lock}{topic}; +	return if ($topic eq $channel->{topic}); +	$channel->print("%B>>%n Restoring locked topic...", MSGLEVEL_CLIENTCRAP); +	$channel->command("TOPIC -- ".$topic); +    } +} + +sub cmd_topics ($$$) { +    my ($args, $server, $witem) = @_; +    my @args = split / /, $args; +    if ($args[0] =~ /^\d+$/) { +	return unless (ref $witem && $witem->{type} eq 'CHANNEL'); +	my $ircnet = $server->{tag}; +	my $name = $witem->{name}; +	if (defined $topics{$ircnet}{$name}{list}->[$args]) { +	    $witem->print("%B>>%n Restoring Topic ".$args, MSGLEVEL_CLIENTCRAP); +	    my $topic = $topics{$ircnet}{$name}{list}->[$args]->{topic}; +	    $witem->command("TOPIC -- ".$topic); +	} +    } elsif ($args[0] eq 'lock') { +	return unless (ref $witem && $witem->{type} eq 'CHANNEL'); +	my $ircnet = $server->{tag}; +	my $name = $witem->{name}; +	my $data = {'topic'      => $witem->{topic}, +		    'topic_by'   => $witem->{topic_by}, +		    'topic_time' => $witem->{topic_time} +	}; +	$topics{$ircnet}{$name}{lock} = $data; +	$witem->print("%B>>%n %ro-m%n Topic locked", MSGLEVEL_CLIENTCRAP); +    } elsif ($args[0] eq 'unlock') { +	return unless (ref $witem && $witem->{type} eq 'CHANNEL'); +	my $ircnet = $server->{tag}; +	my $name = $witem->{name}; +	delete $topics{$ircnet}{$name}{lock}; +	$witem->print("%B>>%n %gų-m%n Topic unlocked", MSGLEVEL_CLIENTCRAP); +    } elsif ($args[0] eq 'help') { +	show_help(); +    } else { +        return unless (ref $witem && $witem->{type} eq 'CHANNEL'); +        my $ircnet = $server->{tag}; +        my $name = $witem->{name}; +	my $i = 0; +	my $text; +	foreach (@{$topics{$ircnet}{$name}{list}}) { +	    $text .= "%r[".$i."]%n ".$_->{topic_time}." (by ".$_->{topic_by}.")\n"; +	    my $topic = $_->{topic}; +	    $topic =~ s/%/%%/g; +	    $text .= '     "'.$topic.'"'."\n"; +	    $i++; +	} +	$witem->print($_, MSGLEVEL_CLIENTCRAP) foreach (split(/\n/, draw_box('Topics', $text, $name, 1))); +    } +} + +Irssi::signal_add('channel topic changed', \&sig_channel_topic_changed); +sig_channel_topic_changed($_) foreach (Irssi::channels()); + +Irssi::command_bind('topics', \&cmd_topics); +foreach my $cmd ('lock', 'unlock', 'help') { +    Irssi::command_bind('topics '.$cmd => sub { +			cmd_topics("$cmd ".$_[0], $_[1], $_[2]); }); +} + +print CLIENTCRAP '%B>>%n '.$IRSSI{name}.' '.$VERSION.' loaded: /topics help for help'; | 
