/usr/share/irssi/scripts/topics.pl is in irssi-scripts 20120326.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 | # 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 ".scalar(localtime($_->{topic_time}))." ".$_->{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';
|