1 2# by Stefan 'tommie' Tomanek 3use strict; 4 5use vars qw($VERSION %IRSSI); 6$VERSION = '2003020801'; 7%IRSSI = ( 8 authors => 'Stefan \'tommie\' Tomanek', 9 contact => 'stefan@pico.ruhr.de', 10 name => 'topics', 11 description => 'records a topic history and locks the channel topic', 12 license => 'GPLv2', 13 url => 'http://irssi.org/scripts/', 14 changed => $VERSION, 15 commands => 'topics' 16); 17 18use Irssi 20020324; 19use vars qw(%topics); 20 21sub show_help() { 22 my $help = "$IRSSI{name} $VERSION 23/topics 24 List all topics that have been set in the current channel 25/topics <num> 26 Restore topic <num> 27/topics lock 28 Lock the current topic 29/topics unlock 30 Unlock the channeltopic 31"; 32 my $text=''; 33 foreach (split(/\n/, $help)) { 34 $_ =~ s/^\/(.*)$/%9\/$1%9/; 35 $text .= $_."\n"; 36 } 37 print CLIENTCRAP &draw_box("Topics", $text, "topics help", 1); 38} 39 40 41sub draw_box ($$$$) { 42 my ($title, $text, $footer, $colour) = @_; 43 my $box = ''; 44 $box .= '%R,--[%n%9%U'.$title.'%U%9%R]%n'."\n"; 45 foreach (split(/\n/, $text)) { 46 $box .= '%R|%n '.$_."\n"; 47 } 48 $box .= '%R`--<%n'.$footer.'%R>->%n'; 49 $box =~ s/%.//g unless $colour; 50 return $box; 51} 52 53sub sig_channel_topic_changed ($) { 54 my ($channel) = @_; 55 my $ircnet = $channel->{server}->{tag}; 56 my $name = $channel->{name}; 57 my $data = {'topic' => $channel->{topic}, 58 'topic_by' => $channel->{topic_by}, 59 'topic_time' => $channel->{topic_time} 60 }; 61 push @{$topics{$ircnet}{$name}{list}}, $data; 62 if ($topics{$ircnet}{$name}{lock}) { 63 my $topic = $topics{$ircnet}{$name}{lock}{topic}; 64 return if ($topic eq $channel->{topic}); 65 $channel->print("%B>>%n Restoring locked topic...", MSGLEVEL_CLIENTCRAP); 66 $channel->command("TOPIC -- ".$topic); 67 } 68} 69 70sub cmd_topics ($$$) { 71 my ($args, $server, $witem) = @_; 72 my @args = split / /, $args; 73 if ($args[0] =~ /^\d+$/) { 74 return unless (ref $witem && $witem->{type} eq 'CHANNEL'); 75 my $ircnet = $server->{tag}; 76 my $name = $witem->{name}; 77 if (defined $topics{$ircnet}{$name}{list}->[$args]) { 78 $witem->print("%B>>%n Restoring Topic ".$args, MSGLEVEL_CLIENTCRAP); 79 my $topic = $topics{$ircnet}{$name}{list}->[$args]->{topic}; 80 $witem->command("TOPIC -- ".$topic); 81 } 82 } elsif ($args[0] eq 'lock') { 83 return unless (ref $witem && $witem->{type} eq 'CHANNEL'); 84 my $ircnet = $server->{tag}; 85 my $name = $witem->{name}; 86 my $data = {'topic' => $witem->{topic}, 87 'topic_by' => $witem->{topic_by}, 88 'topic_time' => $witem->{topic_time} 89 }; 90 $topics{$ircnet}{$name}{lock} = $data; 91 $witem->print("%B>>%n %ro-m%n Topic locked", MSGLEVEL_CLIENTCRAP); 92 } elsif ($args[0] eq 'unlock') { 93 return unless (ref $witem && $witem->{type} eq 'CHANNEL'); 94 my $ircnet = $server->{tag}; 95 my $name = $witem->{name}; 96 delete $topics{$ircnet}{$name}{lock}; 97 $witem->print("%B>>%n %g�-m%n Topic unlocked", MSGLEVEL_CLIENTCRAP); 98 } elsif ($args[0] eq 'help') { 99 show_help(); 100 } else { 101 return unless (ref $witem && $witem->{type} eq 'CHANNEL'); 102 my $ircnet = $server->{tag}; 103 my $name = $witem->{name}; 104 my $i = 0; 105 my $text; 106 foreach (@{$topics{$ircnet}{$name}{list}}) { 107 $text .= "%r[".$i."]%n ".$_->{topic_time}." (by ".$_->{topic_by}.")\n"; 108 my $topic = $_->{topic}; 109 $topic =~ s/%/%%/g; 110 $text .= ' "'.$topic.'"'."\n"; 111 $i++; 112 } 113 $witem->print($_, MSGLEVEL_CLIENTCRAP) foreach (split(/\n/, draw_box('Topics', $text, $name, 1))); 114 } 115} 116 117Irssi::signal_add('channel topic changed', \&sig_channel_topic_changed); 118sig_channel_topic_changed($_) foreach (Irssi::channels()); 119 120Irssi::command_bind('topics', \&cmd_topics); 121foreach my $cmd ('lock', 'unlock', 'help') { 122 Irssi::command_bind('topics '.$cmd => sub { 123 cmd_topics("$cmd ".$_[0], $_[1], $_[2]); }); 124} 125 126print CLIENTCRAP '%B>>%n '.$IRSSI{name}.' '.$VERSION.' loaded: /topics help for help'; 127