summaryrefslogtreecommitdiffstats
path: root/scripts/bitlbee_typing_notice-pre-3.0.pl
diff options
context:
space:
mode:
Diffstat (limited to 'scripts/bitlbee_typing_notice-pre-3.0.pl')
-rw-r--r--scripts/bitlbee_typing_notice-pre-3.0.pl321
1 files changed, 321 insertions, 0 deletions
diff --git a/scripts/bitlbee_typing_notice-pre-3.0.pl b/scripts/bitlbee_typing_notice-pre-3.0.pl
new file mode 100644
index 0000000..0b21657
--- /dev/null
+++ b/scripts/bitlbee_typing_notice-pre-3.0.pl
@@ -0,0 +1,321 @@
+# INSTALLATION
+# [&bitlbee] set typing_notice true
+# <@root> typing_notice = `true'
+# AND
+# /statusbar window add typing_notice
+#
+# SETTINGS
+# [bitlbee]
+# bitlbee_send_typing = ON
+# -> send typing messages to buddies
+# bitlbee_typing_allwin = OFF
+# -> show typing notifications in all windows
+#
+#
+# Changelog:
+#
+# 2006-11-02 (version 1.6.1_
+# * Sending typing works again.
+#
+# 2006-10-27 (version 1.6)
+# * 'channel sync' re-implemented.
+# * bitlbee_send_typing was a string setting, It's a boolean now, like it should.
+#
+# 2006-10-24 (version 1.5)
+#
+# * Sending notices to online users only.
+# * Using the new get_channel function;
+#
+# 2005-12-15 (version 1.42):
+# * Fixed small bug with typing notices disappearing under certain circumstances
+# in channels
+# * Fixed bug that caused outgoing notifications not to work
+# * root cares not about our typing status.
+#
+# 2005-12-04 (version 1.41):
+# * Implemented stale states in statusbar (shows "(stale)" for OSCAR connections)
+# * Introduced bitlbee_typing_allwin (default OFF). Set this to ON to make
+# typing notifications visible in all windows.
+#
+# 2005-12-03 (version 1.4):
+# * Major code cleanups and rewrites for bitlbee 1.0 with the updated typing
+# scheme. TYPING 0, TYPING 1, and TYPING 2 are now supported from the server.
+# * Stale states (where user has typed in text but has stopped typing) are now
+# recognized.
+# * Bug where user thinks you are still typing if you close the window after
+# typing something and then erasing it quickly.. fixed.
+# * If a user signs off while they are still typing, the notification is removed
+# This update by Matt "f0rked" Sparks
+#
+# 2005-08-26:
+# Some fixes for AIM, Thanks to Dracula.
+#
+# 2005-08-16:
+# AIM supported, for sending notices, using CTCP TYPING 0. (Use the AIM patch from Hanji http://get.bitlbee.org/patches/)
+#
+# 2004-10-31:
+# Sends typing notice to the bitlbee server when typing a message in irssi. bitlbee > 0.92
+#
+# 2004-06-11:
+# shows [typing: ] in &bitlbee with multiple users.
+#
+use strict;
+use Irssi::TextUI;
+
+use vars qw($VERSION %IRSSI);
+
+$VERSION = '1.6.1';
+%IRSSI = (
+ authors => 'Tijmen "timing" Ruizendaal, Matt "f0rked" Sparks',
+ contact => 'tijmen.ruizendaal@gmail.com, root@f0rked.com',
+ name => 'Bitlbee_typing_notice-pre-3.0',
+ description => '1. Adds an item to the status bar wich shows [typing] when someone is typing a message on the supported IM-networks
+ 2. Sending typing notices to the supported IM networks (the other way arround)
+ (For bitlbee 1.2.x)',
+ license => 'GPLv2',
+ url => 'http://the-timing.nl/stuff/irssi-bitlbee,
+ http://f0rked.com',
+ changed => '2006-11-02',
+);
+
+my $bitlbee_channel = "&bitlbee";
+my $bitlbee_server_tag = "localhost";
+
+my $KEEP_TYPING_TIMEOUT = 1;
+my $STOP_TYPING_TIMEOUT = 7; # How often to check if we are typing, or on msn,
+ # how long to keep the typing notice up, or check
+ # if the other user is still typing...
+
+my %timer_tag;
+
+my %typing;
+my %tag;
+my $line;
+my %out_typing;
+my $lastkey;
+my $keylog_active = 1;
+my $command_char = Irssi::settings_get_str('cmdchars');
+my $to_char = Irssi::settings_get_str("completion_char");
+
+get_channel();
+
+Irssi::signal_add_last 'channel sync' => sub {
+ my( $channel ) = @_;
+ if( $channel->{topic} eq "Welcome to the control channel. Type \x02help\x02 for help information." ){
+ $bitlbee_server_tag = $channel->{server}->{tag};
+ $bitlbee_channel = $channel->{name};
+ }
+};
+
+sub get_channel {
+ my @channels = Irssi::channels();
+ foreach my $channel(@channels) {
+ if ($channel->{topic} eq "Welcome to the control channel. Type \x02help\x02 for help information.") {
+ $bitlbee_channel = $channel->{name};
+ $bitlbee_server_tag = $channel->{server}->{tag};
+ return 1;
+ }
+ }
+ return 0;
+}
+
+sub event_ctcp_msg {
+ my ($server, $msg, $from, $address) = @_;
+ #print "CTCP: $msg $from $address";
+ return if $server->{tag} ne $bitlbee_server_tag;
+ if (my($type) = $msg =~ "TYPING ([0-9])") {
+ Irssi::signal_stop();
+ if ($type == 0) {
+ unset_typing($from);
+ }
+ elsif ($type == 1) {
+ $typing{$from}=1;
+ if ($address !~ /\@login\.oscar\.aol\.com/
+ and $address !~ /\@YAHOO/
+ and $address !~ /\@login\.icq\.com/) {
+ Irssi::timeout_remove($tag{$from});
+ $tag{$from}=Irssi::timeout_add_once($STOP_TYPING_TIMEOUT*1000,"unset_typing",$from);
+ }
+ redraw($from);
+ }
+ elsif ($type == 2) {
+ stale_typing($from);
+ }
+ }
+}
+
+sub unset_typing {
+ my($from,$no_redraw)=@_;
+ delete $typing{$from} if $typing{$from};
+ Irssi::timeout_remove($tag{$from});
+ redraw($from) if !$no_redraw;
+}
+
+sub stale_typing {
+ my($from)=@_;
+ $typing{$from}=2;
+ redraw($from);
+}
+
+sub redraw {
+ my($from)=@_;
+ my $window = Irssi::active_win();
+ my $channel = $window->get_active_name();
+ if ($from eq $channel || $channel eq $bitlbee_channel
+ || $channel =~ /&chat_0/
+ || Irssi::settings_get_bool("bitlbee_typing_allwin")) {
+ Irssi::statusbar_items_redraw('typing_notice');
+ }
+}
+
+sub event_msg {
+ my ($server,$data,$from,$address,$target) = @_;
+ return if $server->{tag} ne $bitlbee_server_tag;
+ my $channel=Irssi::active_win()->get_active_name();
+ unset_typing $from, "no redraw";
+ unset_typing $channel;
+}
+
+sub event_quit {
+ my($server,$nick,$address,$reason)=@_;
+ return if $server->{tag} ne $bitlbee_server_tag;
+ unset_typing $nick;
+}
+
+sub typing_notice {
+ my ($item, $get_size_only) = @_;
+ my $window = Irssi::active_win();
+ my $channel = $window->get_active_name();
+
+ if (exists($typing{$channel})) {
+ my $append=$typing{$channel}==2 ? " (stale)" : "";
+ $item->default_handler($get_size_only, "{sb typing$append}", 0, 1);
+ }
+ else {
+ $item->default_handler($get_size_only, "", 0, 1);
+ Irssi::timeout_remove($tag{$channel});
+ }
+ if ($channel eq $bitlbee_channel || $channel =~ /&chat_0/
+ || Irssi::settings_get_bool("bitlbee_typing_allwin")) {
+ foreach my $key (keys(%typing)) {
+ $line .= " ".$key;
+ if ($typing{$key}==2) { $line .= " (stale)"; }
+ }
+ if ($line ne "") {
+ $item->default_handler($get_size_only, "{sb typing:$line}", 0, 1);
+ $line = "";
+ }
+ }
+}
+
+sub empty {
+ my $from = shift;
+ delete($typing{$from});
+ Irssi::statusbar_items_redraw('typing_notice');
+}
+
+sub window_change {
+ Irssi::statusbar_items_redraw('typing_notice');
+ my $win = !Irssi::active_win() ? undef : Irssi::active_win()->{active};
+ if (ref $win && ($win->{server}->{tag} eq $bitlbee_server_tag)) {
+ if (!$keylog_active) {
+ $keylog_active = 1;
+ Irssi::signal_add_last('gui key pressed', 'key_pressed');
+ #print "Keylog started";
+ }
+ }
+ else {
+ if ($keylog_active) {
+ $keylog_active = 0;
+ Irssi::signal_remove('gui key pressed', 'key_pressed');
+ #print "Keylog stopped";
+ }
+ }
+}
+
+sub key_pressed {
+ return if !Irssi::settings_get_bool("bitlbee_send_typing");
+ my $key = shift;
+ if ($key != 9 && $key != 10 && $lastkey != 27 && $key != 27
+ && $lastkey != 91 && $key != 126 && $key != 127)
+ {
+ my $server = Irssi::active_server();
+ my $window = Irssi::active_win();
+ my $nick = $window->get_active_name();
+ if ($server->{tag} eq $bitlbee_server_tag &&
+ $nick ne "(status)" &&
+ $nick ne "root")
+ {
+ if ($nick eq $bitlbee_channel) {
+ my $input = Irssi::parse_special("\$L");
+ my ($first_word) = split(/ /,$input);
+ if ($input !~ /^$command_char.*/ && $first_word =~ s/$to_char$//){
+ send_typing($first_word);
+ }
+ }
+ else {
+ my $input = Irssi::parse_special("\$L");
+ if ($input !~ /^$command_char.*/ && length($input) > 0){
+ send_typing($nick);
+ }
+ }
+ }
+ }
+ $lastkey = $key;
+}
+
+sub out_empty {
+ my ($a) = @_;
+ my($nick,$tag)=@{$a};
+ delete($out_typing{$nick});
+ #print $winnum."|".$nick;
+ if (my $server=Irssi::server_find_tag($tag)) {
+ $server->command("^CTCP $nick TYPING 0");
+ }
+}
+
+sub send_typing {
+ my $nick = shift;
+ if (!exists($out_typing{$nick}) || time - $out_typing{$nick} > $KEEP_TYPING_TIMEOUT) {
+
+ my @nicks = Irssi::server_find_tag($bitlbee_server_tag)->channel_find($bitlbee_channel)->nicks();
+ my $exists=0;
+ foreach my $nick1(@nicks) { #check if the nickname is in the BitlBee channel
+ if($nick1->{'nick'} eq $nick) {
+ # print "Exists!";
+ $exists=1;
+ }
+ }
+ if (!$exists) {
+ #print "Does not exist";
+ return;
+ }
+
+ #print "Send typing";
+ my $server = Irssi::active_server();
+ $server->command("^CTCP $nick TYPING 1");
+
+ $out_typing{$nick} = time;
+
+ ### Reset 'stop-typing' timer
+ if ($timer_tag{$nick}) {
+ Irssi::timeout_remove($timer_tag{$nick});
+ delete($timer_tag{$nick});
+ }
+ $timer_tag{$nick} = Irssi::timeout_add_once($STOP_TYPING_TIMEOUT*1000, 'out_empty', ["$nick", $server->{tag}]);
+ }
+}
+
+ #README: Delete the old bitlbee_send_typing string from ~/.irssi/config. A boolean is better.
+
+Irssi::settings_add_bool("bitlbee","bitlbee_send_typing",1);
+Irssi::settings_add_bool("bitlbee","bitlbee_typing_allwin",0);
+
+Irssi::signal_add("ctcp msg", "event_ctcp_msg");
+Irssi::signal_add("message private", "event_msg");
+Irssi::signal_add("message public", "event_msg");
+Irssi::signal_add("message quit", "event_quit");
+Irssi::signal_add_last('window changed', 'window_change');
+Irssi::signal_add_last('gui key pressed', 'key_pressed');
+Irssi::statusbar_item_register('typing_notice', undef, 'typing_notice');
+Irssi::statusbars_recreate_items();