summaryrefslogtreecommitdiffstats
path: root/weechat/perl/autoload/chatters.pl
diff options
context:
space:
mode:
Diffstat (limited to 'weechat/perl/autoload/chatters.pl')
-rw-r--r--weechat/perl/autoload/chatters.pl266
1 files changed, 266 insertions, 0 deletions
diff --git a/weechat/perl/autoload/chatters.pl b/weechat/perl/autoload/chatters.pl
new file mode 100644
index 0000000..7478f9b
--- /dev/null
+++ b/weechat/perl/autoload/chatters.pl
@@ -0,0 +1,266 @@
+# -*- coding: utf-8 -*-
+#
+# Copyright (C) 2012 Arvydas Sidorenko <asido4@gmail.com>
+#
+# 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 3 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, see <http://www.gnu.org/licenses/>.
+#
+#
+# Usage:
+# To show the bar item:
+# /set weechat.bar.nicklist.items "chatters,buffer_nicklist"
+# Config options:
+# /set plugins.var.perl.chatters.frame_color "red"
+# /set plugins.var.perl.chatters.nick_color "yellow"
+# /set plugins.var.perl.chatters.nick_timeout "600"
+#
+#
+# History:
+#
+# 2012-05-01, Arvydas Sidorenko <asido4@gmail.com>
+# Version 0.1: initial release
+# 2012-05-11, Arvydas Sidorenko <asido4@gmail.com>
+# Version 0.2: rewritten script using bar_item to store the chatters
+# instead of nicklist_group
+# 2012-05-16, Arvydas Sidorenko <asido4@gmail.com>
+# Version 0.2.1: Bug fix: same channels under different servers share a
+# common chatter list.
+# 2012-05-18, Nils G <weechatter@arcor.de>
+# Version 0.3: missing return value for callbacks fixed
+# version check added
+# improved option handling
+#
+
+use strict;
+use warnings;
+
+my $version = "0.3";
+my $script_name = "chatters";
+my $weechat_version = "";
+
+# A hash with groups where the chatters are going to be added
+#
+# Structure:
+# "#channel1" -- "nick1" -- last msg timestamp
+# `- "nick2" -- last msg timestamp
+# `- "nick3" -- last msg timestamp
+# "#channel2" -- "nick1" -- last msg timestamp
+# `- ...
+my %chatter_groups = ();
+my $chatters_bar_item_name = "chatters";
+
+weechat::register($script_name, "Arvydas Sidorenko <asido4\@gmail.com>", $version, "GPL3", "Groups people into chatters and idlers", "", "");
+$weechat_version = weechat::info_get("version_number", "");
+if (($weechat_version eq "") or ($weechat_version < 0x00030600)) # minimum v0.3.6
+{
+ weechat::print("",weechat::prefix("error")."$script_name: needs at least WeeChat v0.3.6");
+ weechat::command("","/wait 1ms /perl unload $script_name");
+}
+
+# Check configs
+my %default_settings = (frame_color => "red",
+ nick_color => "yellow",
+ nick_timeout => 600);
+for (keys %default_settings)
+{
+ weechat::config_set_plugin($_ => $default_settings{$_}) unless weechat::config_is_set_plugin($_);
+}
+
+
+# Close a channel
+weechat::hook_signal("buffer_closing", "buffer_close_cb", "");
+# Callback whenever someone leaves the channel
+weechat::hook_signal("nicklist_nick_removed", "on_leave_cb", "");
+# Callback whenever someone writes something in the channel
+weechat::hook_signal("*,irc_in_PRIVMSG", "msg_cb", "");
+# Chatter observer callback
+weechat::hook_timer(60000, 0, 0, "cleanup_chatters", 0);
+# On config change
+weechat::hook_config("plugins.var.perl.${script_name}.*", "config_change_cb", "");
+
+weechat::bar_item_new($chatters_bar_item_name, "chatters_bar_cb", "");
+
+###############################################################################
+# Buffer update callback
+sub chatters_bar_cb
+{
+ # $_[0] - data
+ # $_[1] - bar item
+ # $_[2] - window
+ my $str = "";
+ my $buffer = weechat::window_get_pointer($_[2], "buffer");
+ my $channel = buf_to_channel_key($buffer);
+ my $frame_color = weechat::color(weechat::config_get_plugin("frame_color"));
+ my $nick_color = weechat::color(weechat::config_get_plugin("nick_color"));
+
+ $str = $frame_color . "-- Chatters -----\n";
+
+ if ($channel and $chatter_groups{$channel})
+ {
+ foreach my $nick (sort {uc($a) cmp uc($b)} keys %{ $chatter_groups{$channel} })
+ {
+ $str .= $nick_color . $nick . "\n";
+ }
+ }
+
+ $str .= $frame_color . "-----------------\n";
+
+ return $str;
+}
+
+###############################################################################
+# Buffer close callback
+sub buffer_close_cb
+{
+ # $_[0] - callback data (3rd hook arg)
+ # $_[1] - signal (buffer_closing)
+ # $_[2] - buffer pointer
+ my $channel = buf_to_channel_key($_[2]);
+
+ if ($chatter_groups{$channel})
+ {
+ delete $chatter_groups{$channel};
+ }
+return weechat::WEECHAT_RC_OK;
+}
+
+###############################################################################
+# Gets called when someones writes in a channel
+sub msg_cb
+{
+ # $_[0] - callback data (3rd hook arg)
+ # $_[1] - event name
+ # $_[2] - the message:
+ # :Asido!~asido@2b600000.rev.myisp.com PRIVMSG #linux :yoo
+ my $msg = weechat::info_get_hashtable("irc_message_parse" => + { "message" => $_[2] });
+ my $channel = "";
+ my ($server) = split ",", $_[1];
+ my $key = "";
+
+ # Ignore private messages
+ unless ($msg->{channel} =~ /^#/)
+ {
+ return weechat::WEECHAT_RC_OK;
+ }
+
+ $key = format_key($server, $msg->{channel});
+
+ $chatter_groups{$key}{$msg->{nick}} = time();
+ weechat::bar_item_update($chatters_bar_item_name);
+
+ return weechat::WEECHAT_RC_OK;
+}
+
+###############################################################################
+# Gets called when someones leaves a channel
+sub on_leave_cb
+{
+ # $_[0] - data
+ # $_[1] - event name (nicklist_nick_removed)
+ # $_[2] - 0x1ffda70,spoty (<buffer_pointer>,<nick>)
+ my ($buf, $nick) = split ",", $_[2];
+ my $channel = buf_to_channel_key($buf);
+
+ if ($chatter_groups{$channel} and $chatter_groups{$channel}{$nick})
+ {
+ delete $chatter_groups{$channel}{$nick};
+ weechat::bar_item_update($chatters_bar_item_name);
+ }
+
+ return weechat::WEECHAT_RC_OK;
+}
+
+###############################################################################
+# Script config edit callback
+sub config_change_cb
+{
+ # $_[0] - data
+ # $_[1] - option name
+ # $_[2] - new value
+# my $opt = $_[1];
+ my ( $pointer, $name, $value ) = @_;
+ $name = substr($name,length("plugins.var.perl.".$script_name."."),length($name)); # don't forget the "."
+# $default_settings{$name} = $value; # store new value, if needed!
+
+# if ($opt =~ /frame_color$/ or $opt =~ /nick_color$/)
+ if ($name eq "frame_color" or $name eq "nick_color")
+ {
+ weechat::bar_item_update($chatters_bar_item_name);
+ }
+# elsif ($opt =~ /nick_timeout$/)
+ elsif ($name eq "nick_timeout")
+ {
+ cleanup_chatters();
+ }
+return weechat::WEECHAT_RC_OK;
+}
+
+###############################################################################
+# Removes nicks from chatter list who idle for too long
+sub cleanup_chatters
+{
+ my $changed = 0;
+ my $nick_timeout = weechat::config_get_plugin("nick_timeout");
+
+ foreach my $channel (keys %chatter_groups)
+ {
+ foreach my $nick (keys %{ $chatter_groups{$channel} })
+ {
+ if (time() - $chatter_groups{$channel}{$nick} >= $nick_timeout)
+ {
+ delete $chatter_groups{$channel}{$nick};
+ $changed = 1;
+ }
+ }
+ }
+
+ if ($changed)
+ {
+ weechat::bar_item_update($chatters_bar_item_name);
+ }
+}
+
+###############################################################################
+# Returns a key for use in chatter_groups
+sub buf_to_channel_key
+{
+ my $buf = shift;
+ my $server = weechat::buffer_get_string($buf, "localvar_server");
+ my $channel = weechat::buffer_get_string($buf, "localvar_channel");
+
+ return format_key($server, $channel);
+}
+
+###############################################################################
+# Formats a key out of server and channel to use in chatter_groups
+sub format_key
+{
+ my $server = shift;
+ my $channel = shift;
+
+ # For unknown reason to me some channels have prepended #, some prepended ##
+ # so the best to get rid of them to keep consistency
+ $channel =~ /#*(.*)/;
+ $channel = $1;
+
+ return $server . "|" . $channel;
+}
+
+###############################################################################
+#
+sub _log
+{
+ my $msg = shift;
+
+ weechat::print("", "${script_name}: ${msg}\n");
+}