summaryrefslogtreecommitdiff
path: root/scripts
diff options
context:
space:
mode:
authorSebastien Helleu <flashcode@flashtux.org>2007-03-29 12:55:28 +0000
committerSebastien Helleu <flashcode@flashtux.org>2007-03-29 12:55:28 +0000
commit29e879326ddc276693b355996dcc58deca418dca (patch)
tree8c0044a5dbd2e8466299390cd23991605ac9101b /scripts
parente995453b9ab3d3a4774dbb0c7c932a17e9bb91c8 (diff)
downloadweechat-29e879326ddc276693b355996dcc58deca418dca.zip
Added oldtopic.pl script
Diffstat (limited to 'scripts')
-rw-r--r--scripts/perl/oldtopic.pl241
1 files changed, 241 insertions, 0 deletions
diff --git a/scripts/perl/oldtopic.pl b/scripts/perl/oldtopic.pl
new file mode 100644
index 000000000..24d7af0f6
--- /dev/null
+++ b/scripts/perl/oldtopic.pl
@@ -0,0 +1,241 @@
+#
+# Copyright (c) 2007 by FlashCode <flashcode@flashtux.org>
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 2 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
+#
+
+#
+# Display old topics for a channel.
+#
+# History:
+# 2007-03-29, FlashCode <flashcode@flashtux.org>:
+# initial release
+#
+
+use strict;
+
+my $version = "0.1";
+
+my $plugin_help_options = "Plugins options (set with /setp):\n"
+ ." - perl.oldtopic.log_server: if on, displays all topic changes on server buffer\n"
+ ." - perl.oldtopic.max_topics: number of topics to keep for each channel "
+ ."(0 = do not keep any topics)";
+
+# default values in setup file (~/.weechat/plugins.rc)
+my $default_log_server = "off";
+my $default_max_topics = "10";
+
+# init script
+weechat::register("oldtopic", $version, "", "Display old topics for a channel");
+weechat::set_plugin_config("log_server", $default_log_server) if (weechat::get_plugin_config("log_server") eq "");
+weechat::set_plugin_config("max_topics", $default_max_topics) if (weechat::get_plugin_config("max_topics") eq "");
+
+# message and command handlers
+weechat::add_message_handler("topic", "topic_msg");
+weechat::add_message_handler("332", "topic_332_msg");
+weechat::add_message_handler("333", "topic_333_msg");
+weechat::add_command_handler ("lasttopic", "lasttopic_cmd",
+ "Display last topic for a channel (topic before current one)",
+ "[channel]",
+ "channel: channel name (default: current channel)\n\n"
+ .$plugin_help_options,
+ "%C");
+weechat::add_command_handler ("oldtopic", "oldtopic_cmd",
+ "Display old topics for a channel",
+ "[channel]",
+ "channel: channel name (default: current channel)\n\n"
+ .$plugin_help_options,
+ "%C");
+
+my %oldtopic;
+undef %oldtopic;
+
+my %msg_332_topic;
+undef %msg_332_topic;
+
+sub get_config
+{
+ my $conf_log_server = weechat::get_plugin_config("log_server");
+ $conf_log_server = $default_log_server if ($conf_log_server eq "");
+
+ my $conf_max = weechat::get_plugin_config("max_topics");
+ $conf_max = $default_max_topics if ($conf_max eq "");
+ $conf_max = 0 if ($conf_max < 0);
+
+ return ($conf_log_server, $conf_max);
+}
+
+sub add_topic
+{
+ my ($server, $channel, $nick, $topic, $topicdate, $conf_max) =
+ ($_[0], $_[1], $_[2], $_[3], $_[4], $_[5]);
+
+ my $time = $topicdate;
+ $time = time() if ($time eq "");
+
+ $oldtopic{$server}{$channel}{$time}{"nick"} = $nick;
+ $oldtopic{$server}{$channel}{$time}{"topic"} = $topic;
+ my $numchan = scalar(keys(%{$oldtopic{$server}{$channel}}));
+ if ($numchan > $conf_max)
+ {
+ my $diff = $numchan - $conf_max;
+ my $count = 0;
+ foreach my $date (sort keys %{$oldtopic{$server}{$channel}})
+ {
+ delete($oldtopic{$server}{$channel}{$date});
+ $count++;
+ last if ($count >= $diff);
+ }
+ }
+}
+
+# received when someone changes topic on a channel
+sub topic_msg
+{
+ my $server = $_[0];
+ my ($conf_log_server, $conf_max) = get_config();
+
+ if ($_[1] =~ /(.*) TOPIC (.*)/)
+ {
+ my $nick = $1;
+ my $args = $2;
+ my $nick = $1 if ($nick =~ /:?([^!]+)(!?.*)/);
+ if ($args =~ /([\#\&\+\!][^ ]*) (.*)/)
+ {
+ my $channel = $1;
+ my $topic = $2;
+ $topic = $1 if ($topic =~ /:(.*)/);
+
+ if ($conf_log_server eq "on")
+ {
+ weechat::print("Topic on $channel changed by ${nick} to: \"${topic}\x0F\"",
+ "", $server);
+ }
+
+ if ($conf_max > 0)
+ {
+ add_topic($server, $channel, $nick, $topic, "", $conf_max);
+ }
+ else
+ {
+ delete($oldtopic{$server}{$channel});
+ }
+ }
+ }
+ return weechat::PLUGIN_RC_OK;
+}
+
+# topic for a channel (when joining channel)
+sub topic_332_msg
+{
+ my $server = $_[0];
+
+ if ($_[1] =~ /(.*) 332 (.*)/)
+ {
+ my $args = $2;
+ if ($args =~ /([\#\&\+\!][^ ]*) (.*)/)
+ {
+ my $channel = $1;
+ my $topic = $2;
+ $topic = $1 if ($topic =~ /:(.*)/);
+ $msg_332_topic{$server}{$channel} = $topic;
+ }
+ }
+ return weechat::PLUGIN_RC_OK;
+}
+
+# nick/date for topic (when joining channel, received after 332)
+sub topic_333_msg
+{
+ my $server = $_[0];
+
+ if ($_[1] =~ /.* 333 .* ([\#\&\+\!][^ ]*) (.*) ([0-9]+)/)
+ {
+ my $channel = $1;
+ my $nick = $2;
+ my $date = $3;
+ my ($conf_log_server, $conf_max) = get_config();
+ add_topic($server, $channel, $nick,
+ $msg_332_topic{$server}{$channel},
+ $date, $conf_max);
+ }
+ return weechat::PLUGIN_RC_OK;
+}
+
+sub lasttopic_cmd
+{
+ my $server = weechat::get_info("server");
+ my $channel = weechat::get_info("channel");
+ $channel = $_[1] if ($_[1] ne "");
+
+ if ($channel ne "")
+ {
+ my ($conf_log_server, $conf_max) = get_config();
+
+ delete($oldtopic{$server}{$channel}) if ($conf_max == 0);
+
+ my $count = 0;
+ my $found = 0;
+ foreach my $date (sort { $b <=> $a } keys %{$oldtopic{$server}{$channel}})
+ {
+ $count++;
+ if ($count > 1)
+ {
+ $found = 1;
+ weechat::print("Last topic for ${server}/${channel}: on ".localtime($date)." by ".
+ $oldtopic{$server}{$channel}{$date}{"nick"}.": \"".
+ $oldtopic{$server}{$channel}{$date}{"topic"}."\x0F\"");
+ last;
+ }
+ }
+ weechat::print("Last topic not found for channel ${server}/${channel}.") if ($found == 0);
+ }
+ else
+ {
+ weechat::print("Error: this buffer is not a channel.");
+ }
+
+ return weechat::PLUGIN_RC_OK;
+}
+
+sub oldtopic_cmd
+{
+ my $server = weechat::get_info("server");
+ my $channel = weechat::get_info("channel");
+ $channel = $_[1] if ($_[1] ne "");
+
+ if ($channel ne "")
+ {
+ my ($conf_log_server, $conf_max) = get_config();
+
+ delete($oldtopic{$server}{$channel}) if ($conf_max == 0);
+
+ my $found = 0;
+ foreach my $date (sort keys %{$oldtopic{$server}{$channel}})
+ {
+ $found = 1;
+ weechat::print("Topic for ${server}/${channel} on ".localtime($date)." by ".
+ $oldtopic{$server}{$channel}{$date}{"nick"}.": \"".
+ $oldtopic{$server}{$channel}{$date}{"topic"}."\x0F\"");
+ }
+ weechat::print("No old topic for channel ${server}/${channel}.") if ($found == 0);
+ }
+ else
+ {
+ weechat::print("Error: this buffer is not a channel.");
+ }
+
+ return weechat::PLUGIN_RC_OK;
+}