diff --git a/perl/growl-net-notify.pl b/perl/growl-net-notify.pl
new file mode 100644
index 00000000..c525d637
--- /dev/null
+++ b/perl/growl-net-notify.pl
@@ -0,0 +1,256 @@
+#
+# Copyright (c) 2009 by kinabalu (andrew AT mysticcoders DOT 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 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
+#
+
+#
+# Growl Notification script over network using Net::Growl
+#
+# History:
+#
+# 2009-04-16, kinabalu <andrew AT mysticcoders DOT com>
+#	version 0.2, removed need for Parse::IRC
+#
+# 2009-04-10, kinabalu <andrew AT mysticcoders DOT com>
+#	version 0.1, initial version rewritten from growl-notify
+#   - original inspiration from growl-notify.pl author Zak Elep
+#
+# /growl on
+# /growl off
+# /growl setup [host] [password]
+# /growl inactive [time_in_seconds]
+# /growl status
+# /growl test [message]
+# /help growl
+#
+# The script can be laoded into WeeChat by executing:
+#
+# /perl load growl-net-notify.pl
+#
+# The script may also be auto-loaded by WeeChat.  See the
+# WeeChat manual for instructions about how to do this.
+#
+# This script was tested with WeeChat version 0.2.6.  An
+# updated version of this script will be available when
+# the new WeeChat API is officially released.
+#
+# For up-to-date information about this script, and new
+# version downloads, please go to:
+#
+# http://www.mysticcoders.com/apps/growl-notify/
+#
+# If you have any questions, please contact me on-line at:
+#
+# irc.freenode.net - kinabalu (op): ##java
+#
+# - kinabalu
+#
+
+use Net::Growl;
+use integer;
+
+my $growl_app = "growl-net-notify";				# name given to Growl for configuration
+my $growl_active = 1;
+my $weechat_version = "0.2.6";
+
+sub message_process_init {
+
+	weechat::add_message_handler("weechat_highlight", "highlight_public");
+	weechat::add_message_handler("weechat_pv", "highlight_privmsg");
+}
+
+#
+# support for private messages, have to parse the IRC message
+#
+sub highlight_privmsg {
+    my ( $nick, $message ) = ( $_[1] =~ /:([^!]+)[^:]+:(.*)/ );
+    
+	send_message($nick, $message);    
+	return weechat::PLUGIN_RC_OK;	
+}
+
+#
+# support for highlights of nicks in public, have to parse the IRC message
+#
+sub highlight_public {
+	my ( $nick, $channel, $message ) = ( $_[1] =~ /:([^!]+)[^#]+([^:]+):(.*)/ );
+		
+	send_message($nick, $message . " in " . $channel); 
+	return weechat::PLUGIN_RC_OK;	
+}
+
+sub send_message {
+	my ( $nick, $message ) = @_;
+	
+	my $inactivity = 0;
+	
+	$inactivity = weechat::get_info("inactivity");
+		
+	if((&getc('growl_net_inactivity') - $inactivity) <= 0 && $growl_active) {
+		growl_notify( &getc('growl_net_client'), &getc('growl_net_pass'), &getc('growl_net_port'), "$growl_app", "$nick", "$message" );
+	}			
+}
+
+#
+# smaller way to do weechat::get_plugin_config
+#
+sub getc {
+	return weechat::get_plugin_config($_[0]);
+}
+
+#
+# smaller way to do weechat::get_plugin_config
+#
+sub setc {
+	return weechat::set_plugin_config($_[0], $_[1]);
+}
+
+#
+# print function
+# 
+sub prt {
+	weechat::print($_[0]);
+}
+
+#
+# Send notification through growl
+#
+# args: $host, $pass, $port, $application_name, $title, $description
+#
+sub growl_notify {
+	Net::Growl::notify( host=> $_[0], 
+						password=> $_[1], 
+						port=> $_[2], 
+						application=> $_[3], 
+						title=> $_[4], 
+						description => $_[5], 
+						priority=> 0, 
+						sticky=> '1' );
+}
+
+#
+# Register your app with Growl system
+#
+# args: $host, $pass, $port, $app
+#
+sub growl_register {	
+	Net::Growl::register( host=> $_[0], 
+						  password=> $_[1], 
+						  port=> $_[2], 
+						  application=> $_[3] );	
+}
+
+#
+# Handler will process commands
+#
+# /growl on
+# /growl off
+# /growl setup [host] [password] [port]
+# /growl inactive [time_in_seconds]
+# /growl status
+# /growl test [message]
+# /help growl
+#
+sub handler {
+	no strict 'refs';	# access symbol table
+	
+	my $server = shift;
+	my $argList = shift;
+
+	my @args = split(/ /, $argList);
+	my $command = $args[0];	
+		
+	if(!$command) {
+		prt("Rawr!");
+		return weechat::PLUGIN_RC_OK;
+	}
+	
+	if($command eq "off") {
+		$growl_active = 0;
+		prt("Growl notifications: OFF");
+		return weechat::PLUGIN_RC_OK;
+	} elsif($command eq "on") {
+		$growl_active = 1;
+		prt("Growl notifications: ON");
+		return weechat::PLUGIN_RC_OK;
+	} elsif($command eq "inactive") {
+		if(exists $args[1] && $args[1] >= 0) {
+			setc("growl_net_inactivity", $args[1]);
+			prt("Growl notifications inactivity set to: " . $args[1] . "s");
+			return weechat::PLUGIN_RC_OK;
+		}
+		return weechat::PLUGIN_RC_KO;	
+	} elsif($command eq "setup") {
+		if(exists $args[1] && $args[1] ne "") {
+			setc("growl_net_client", $args[1]);			
+		} 
+		if(exists $args[2] && $args[2] ne "") {
+			setc("growl_net_pass", $args[2]);
+		}
+		if(exists $args[3] && $args[3] ne "") {
+			setc("growl_net_port", $args[3]);
+		}
+		growl_register( &getc('growl_net_client'), &getc('growl_net_pass'), &getc('growl_net_port'), "$growl_app" );				
+		prt("Growl setup re-registered with: [host: " . &getc('growl_net_client') . ":"  . &getc('growl_net_port') . ", pass: " . &getc('growl_net_pass') . "]"); 
+		return weechat::PLUGIN_RC_OK;
+	} elsif($command eq "status") {
+		prt("Growl notifications: " . ($growl_active ? "ON" : "OFF") . ", inactivity timeout: " . &getc("growl_net_inactivity"));
+		return weechat::PLUGIN_RC_OK;
+	} elsif($command eq "test") {
+		my $test_message = substr $argList, 5;
+		prt("Sending test message: " . $test_message);
+		growl_notify( &getc('growl_net_client'), &getc('growl_net_pass'), &getc('growl_net_port'), "$growl_app", "Test Message", $test_message );
+		return weechat::PLUGIN_RC_OK;
+	}
+
+    return weechat::PLUGIN_RC_KO;
+}
+
+
+#
+# setup
+#
+my $version = '0.2';
+
+weechat::register $growl_app, $version, '',	'Send Weechat notifications thru Net::Growl';
+		
+weechat::add_command_handler ("growl", "handler", "setup the growl notify script",
+							  "on|off|setup [host] [password] [port]|inactive [time_in_seconds]|status|help",
+							   " on: turn on growl notifications (default)\n"
+							  ."off: turn off growl notifications\n"
+							  ."setup [host] [password] [port]: change the parameters for registration/notification with Growl\n"
+							  ."inactive [time_in_seconds]: number of seconds of inactivity before we notify (default: 30)\n"
+							  ."status: gives info on notification and inactivity settings\n"
+							  ."test [message]: send a test message\n",
+							  "on|off|setup|inactive|status");
+
+my $default_growl_net_pass = "password";
+my $default_growl_net_client = "localhost";
+my $default_growl_net_inactivity = 30;
+my $default_growl_net_port = 9887;				# default UDP port used by Growl
+
+&setc("growl_net_pass", $default_growl_net_pass) if (&getc("growl_net_pass") eq "");
+&setc("growl_net_client", $default_growl_net_client) if (&getc("growl_net_client") eq "");
+&setc("growl_net_inactivity", $default_growl_net_inactivity) if (&getc("growl_net_inactivity") eq "");
+&setc("growl_net_port", $default_growl_net_port) if (&getc("growl_net_port") eq "");
+		
+# register our app with growl		
+growl_register( &getc('growl_net_client'), &getc('growl_net_pass'), &getc('growl_net_port'), "$growl_app" );
+
+# send up a we're here and notifying 
+growl_notify( &getc('growl_net_client'), &getc('growl_net_pass'), &getc('growl_net_port'), "$growl_app", "Starting Up", "Weechat notification through Growl = on" );
+
+message_process_init();
diff --git a/perl/oldtopic.pl b/perl/oldtopic.pl
index 013b5e95..b47cda5a 100644
--- a/perl/oldtopic.pl
+++ b/perl/oldtopic.pl
@@ -1,5 +1,5 @@
 #
-# Copyright (c) 2007 by FlashCode <flashcode@flashtux.org>
+# Copyright (c) 2007-2009 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
@@ -19,6 +19,8 @@
 # Display old topics for a channel.
 #
 # History:
+# 2009-01-05, Damian Viano <des@debian.org>:
+#     version 0.3: added the difftopic command
 # 2007-08-10, FlashCode <flashcode@flashtux.org>:
 #     version 0.2: upgraded licence to GPL 3
 # 2007-03-29, FlashCode <flashcode@flashtux.org>:
@@ -27,7 +29,7 @@
 
 use strict;
 
-my $version = "0.2";
+my $version = "0.3";
 
 my $plugin_help_options = "Plugins options (set with /setp):\n"
     ."  - perl.oldtopic.log_server: if on, displays all topic changes on server buffer\n"
@@ -59,6 +61,13 @@
                               "channel: channel name (default: current channel)\n\n"
                               .$plugin_help_options,
                               "%C");
+weechat::add_command_handler ("difftopic", "difftopic_cmd",
+                              "Display a diff for the last topic change for a channel",
+                              "[channel]",
+                              "channel: channel name (default: current channel)\n\n"
+                              .$plugin_help_options,
+                              "%C");
+
 
 my %oldtopic;
 undef %oldtopic;
@@ -240,3 +249,94 @@ sub oldtopic_cmd
     
     return weechat::PLUGIN_RC_OK;
 }
+
+sub difftopic_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;
+        my $tp1;
+        my $tp2;
+        
+        # get current and previous topics in tp1 and tp2
+        foreach my $date (sort { $b <=> $a } keys %{$oldtopic{$server}{$channel}})
+        {
+            $count++;
+            if ($count == 1)
+            {
+                $tp1 = $oldtopic{$server}{$channel}{$date}{"topic"};
+                $tp1 =~ s/^ +| +$//g;
+                
+            }
+            if ($count > 1)
+            {
+                $found = 1;
+                $tp2 = $oldtopic{$server}{$channel}{$date}{"topic"};
+                $tp2 =~ s/^ +| +$//g;
+                last;
+            }
+        }
+        
+        #if we have both topics, diff them
+        if ($found == 1)
+        {
+            my $diff;
+            my $i = 0;
+            my $j = 0;
+            my $k = 0;
+            
+            my @original = split /\s*\|\s*|\s+-\s+/, $tp2;
+            my @modified = split /\s*\|\s*|\s+-\s+/, $tp1;
+            
+            # this is a ripoff from irsii topic-diff.pl
+            outer: while( $i <= $#original)
+            {
+                if ($j <= $#modified && $original[$i] eq $modified[$j])
+                {
+                    $modified[$j] = '';
+                    $i += 1;
+                    $j += 1;
+                    next;
+                }
+                else
+                {
+                    # First two don't match, check the rest of the list
+                    for ($k = $j ; $k <= $#modified; $k++)
+                    {
+                        if ($modified[$k] eq $original[$i])
+                        {
+                            $modified[$k] = '';
+                            $i += 1;
+                            next outer;
+                        }
+                    }
+                    $diff = ($diff ? $diff." | " : "").$original[$i];
+                    $i += 1;
+                }
+            }
+            
+            if ($diff ne '') { weechat::print("Topic: -: ".$diff);}
+            $diff = join " | ", (grep {$_ ne ''} @modified);
+            if ($diff ne '') { weechat::print("Topic: +: ".$diff);}
+        }
+        else
+        {
+          weechat::print("No old topic for channel ${server}/${channel}.");
+        }
+    }
+    else
+    {
+        weechat::print("Error: this buffer is not a channel.");
+    }
+    
+    return weechat::PLUGIN_RC_OK;
+}
diff --git a/perl/remnotify.pl b/perl/remnotify.pl
new file mode 100644
index 00000000..60e33dfc
--- /dev/null
+++ b/perl/remnotify.pl
@@ -0,0 +1,59 @@
+#
+# Copyright (c) 2009 by Oleg Melnik <boten@blindage.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, see <http://www.gnu.org/licenses/>.
+#
+#
+# When you are got highlighted or private message, this script send a notification to remote address.
+# This script sends simple data via a socket (_HEADER_ (nick_of_slapper) slapped on (channel) _END_HEADER_ _TEXT_ (text_of_message) _END_TEXT_)
+# You can easily use your own program on remote machine to receive and show notifications. For example, download script which shows
+# these message this libnotify: http://boten.blindage.org/?attachment_id=433
+use IO::Socket;
+
+my $version = "0.1";
+
+#Default values of address of remote server
+my $defaddress = "localhost";
+my $defport = "10020";
+
+#Register script
+weechat::register("remnotify", $version, "", "Sends notification about highlighted and private msg to remote address");
+
+#Set default settings on first register
+weechat::set_plugin_config("remaddress", $defaddress) if (weechat::get_plugin_config("remaddress") eq "");
+weechat::set_plugin_config("remport", $defport) if (weechat::get_plugin_config("remport") eq "");
+
+#Bind events to our functions
+weechat::add_message_handler("weechat_highlight", "on_highlight");
+weechat::add_message_handler("weechat_pv", "on_pv");
+
+sub on_highlight {
+	my $message = $_[1];
+	my $nick = $+ if $message =~ /([^:]+)!/;
+	my $channel = $+ if $message =~ /PRIVMSG\s(#*\S+)\s.+/;
+	my $text = $+ if $message =~ /PRIVMSG\s#*.+\s:(.+)$/;
+	my $remaddress = weechat::get_plugin_config("remaddress");
+	my $remport = weechat::get_plugin_config("remport");
+	my $nsocket = IO::Socket::INET->new(Type=>SOCK_STREAM, Proto=>'tcp', PeerAddr => $remaddress, PeerPort => $remport)
+	or die "Couldn't connect to remove server: $@";
+	my $msg = "_HEADER_ $nick wrote to $channel _END_HEADER_ _TEXT_ $text _END_TEXT_";
+	print $nsocket "$msg\n";
+	close $nsocket;
+	return weechat::PLUGIN_RC_OK;
+}
+sub on_pv {
+	my $message = $_[1];
+	on_highlight(" ", $message);
+	return weechat::PLUGIN_RC_OK;
+}
\ No newline at end of file
diff --git a/perl/xmms.pl b/perl/xmms.pl
index a454b40b..42501712 100644
--- a/perl/xmms.pl
+++ b/perl/xmms.pl
@@ -2,7 +2,7 @@
 # xmms perl script for weechat                                      #
 #                                                                   #
 # Displays some useless xmms-infopipe values                        #
-# (c) 2006 by C�dric Chalier <ounaid AT gmail DOT com>              # 
+# (c) 2006 by linkz <ounaid AT gmail DOT com>                       #
 #                                                                   #
 # This program is free software; you can redistribute it and/or     #
 # modify it under the terms of the GNU General Public License       #
diff --git a/python/amarok2.py b/python/amarok2.py
new file mode 100644
index 00000000..8ad34d5d
--- /dev/null
+++ b/python/amarok2.py
@@ -0,0 +1,267 @@
+#
+# Copyright (c) 2009 by Eric Gach <eric.gach@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 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
+#
+
+import weechat
+import re
+import os
+import subprocess
+import traceback
+
+__desc__ = 'Amarok2 control and now playing script for Weechat.'
+__version__ = '1.0.0'
+__author__ = 'Eric Gach <eric.gach@gmail.com>'
+
+debug = {}
+infobar = {}
+output = {}
+ssh = {'enabled': False}
+
+STATUS_PLAYING = 0
+STATUS_PAUSED = 1
+STATUS_STOPPED = 2
+
+class amarok2_exception(Exception):
+	pass
+
+def amarok2_command(server, args):
+    try:
+        args = args.split(' ')
+        if args[0] == 'infobar':
+            if infobar['enabled']:
+                infobar['enabled'] = False
+                weechat.set_plugin_config('infobar_enabled', '0')
+                weechat.remove_timer_handler('amarok2_infobar_update')
+                weechat.remove_infobar(0)
+                weechat.prnt('Infobar disabled')
+            else:
+                infobar['enabled'] = True
+                weechat.set_plugin_config('infobar_enabled', '1')
+                amarok2_infobar_update()
+                weechat.add_timer_handler(infobar['update'], 'amarok2_infobar_update')
+                weechat.prnt('Amarok2 infobar enabled')
+            return weechat.PLUGIN_RC_OK
+        elif args[0] == 'next':
+			if _get_status() == STATUS_STOPPED:
+				weechat.prnt('Amarok2: Not playing, cannot go to next song.')
+				return weechat.PLUGIN_RC_KO
+			else:
+				_execute_command(_dbus_command('Next'))
+				weechat.prnt('Amarok2: Playing next song.')
+				return weechat.PLUGIN_RC_OK
+        elif args[0] == 'np':
+            return amarok2_now_playing(server)
+        elif args[0] == 'pause':
+			if _get_status() == STATUS_PAUSED:
+				weechat.prnt('Amarok2: Already paused')
+				return weechat.PLUGIN_RC_KO
+			else:
+				_execute_command(_dbus_command('Pause'))
+				weechat.prnt('Amarok2: Song paused.')
+				return weechat.PLUGIN_RC_OK
+        elif args[0] == 'play':
+			if _get_status() == STATUS_PLAYING:
+				weechat.prnt('Amarok2: Already playing')
+				return weechat.PLUGIN_RC_KO
+			else:
+				_execute_command(_dbus_command('Play'))
+				weechat.prnt('Amarok2: Started playing.')
+				return weechat.PLUGIN_RC_OK
+        elif args[0] == 'prev':
+			if _get_status() == STATUS_STOPPED:
+				weechat.prnt('Amarok2: Not playing, cannot go to previous song.')
+				return weechat.PLUGIN_RC_KO
+			else:
+				_execute_command(_dbus_command('Prev'))
+				weechat.prnt('Amarok2: Playing previous song.')
+				return weechat.PLUGIN_RC_OK
+        elif args[0] == 'stop':
+            _execute_command(_dbus_command('Stop'))
+            weechat.prnt('Amarok2: Stop playing.')
+            return weechat.PLUGIN_RC_OK
+        elif args[0] == '':
+            return amarok2_display_help(server)
+        else:
+            weechat.prnt('Amarok2: Unknown command %s' % (args[0]), '', server)
+            return weechat.PLUGIN_RC_OK
+    except amarok2_exception, ex:
+        return weechat.PLUGIN_RC_KO
+    except:
+        file = open(debug['file'], 'w')
+        traceback.print_exc(None, file)
+        weechat.prnt('Unknown Exception encountered. Stack dumped to %s' % (debug['file']), '', server)
+        return weechat.PLUGIN_RC_KO
+
+def amarok2_display_help(server):
+	weechat.prnt('%s - Version: %s' % (__desc__, __version__), '', server)
+	weechat.prnt('Author: %s' % (__author__), '', server)
+	weechat.prnt('', '', server)
+	weechat.prnt('Commands Available', '', server)
+	weechat.prnt('  /amarok2 next    - Move to the next song in the playlist.', '', server)
+	weechat.prnt('  /amarok2 np      - Display currently playing song.', '', server)
+	weechat.prnt('  /amarok2 play    - Start playing music.', '', server)
+	weechat.prnt('  /amarok2 pause   - Toggle between pause/playing.', '', server)
+	weechat.prnt('  /amarok2 prev    - Move to the previous song in the playlist.', '', server)
+	weechat.prnt('  /amarok2 stop    - Stop playing music.', '', server)
+	weechat.prnt('  /amarok2 infobar - Toggle the infobar display.', '', server)
+	weechat.prnt('', '', server)
+	weechat.prnt('Formatting', '', server)
+	weechat.prnt('  %artist%    - Replaced with the song artist.', '', server)
+	weechat.prnt('  %title%     - Replaced with the song title.', '', server)
+	weechat.prnt('  %album%     - Replaced with the song album.', '', server)
+	weechat.prnt('  %year%      - Replaced with the song year tag.', '', server)
+	weechat.prnt('  %cTime%     - Replaced with how long the song has been playing.', '', server)
+	weechat.prnt('  %tTime%     - Replaced with the length of the song.', '', server)
+	weechat.prnt('  %bitrate%   - Replaced with the bitrate of the song.', '', server)
+	weechat.prnt('  %C##        - Make ## the number code of the color you want to use. Use %C by itself to end the color.', '', server)
+	weechat.prnt('', '', server)
+	weechat.prnt('To see all available settings, please check /setp amarok2')
+	return weechat.PLUGIN_RC_OK
+
+def amarok2_infobar_update():
+	_load_settings()
+	if infobar['enabled'] == False:
+		return weechat.PLUGIN_RC_OK
+
+	if _get_status() == STATUS_STOPPED:
+		weechat.print_infobar(infobar['update'], 'Amarok is not currently playing')
+		return weechat.PLUGIN_RC_OK
+	else:
+		song = _get_song_info()
+		format = _format_np(infobar['format'], song)
+		weechat.print_infobar(infobar['update'], format)
+		return weechat.PLUGIN_RC_OK
+
+def amarok2_now_playing(server):
+	_load_settings()
+	if _get_status() == STATUS_STOPPED:
+		weechat.prnt('Amarok is not playing.', '', server)
+		return weechat.PLUGIN_RC_KO
+	else:
+		song = _get_song_info()
+		format = _format_np(output['format'], song)
+		weechat.command(format)
+		return weechat.PLUGIN_RC_OK
+
+def amarok2_unload():
+	"""Unload the plugin from weechat"""
+	if infobar['enabled']:
+		weechat.remove_infobar(0)
+		weechat.remove_timer_handler('amarokInfobarUpdate')
+	return weechat.PLUGIN_RC_OK
+
+def _dbus_command(command):
+	# we still have to use dbus-send because qdbus doesn't support complex types
+	# yet. the GetStatus is one that isn't supported by qdbus yet.
+	return 'DISPLAY=":0.0" dbus-send --type=method_call --print-reply --dest=org.kde.amarok /Player org.freedesktop.MediaPlayer.%s' % (command,)
+
+def _execute_command(cmd):
+	from subprocess import PIPE
+	if ssh['enabled']:
+		cmd = 'ssh -p %d %s@%s "%s"' % (ssh['port'], ssh['user'], ssh['host'], cmd)
+	proc = subprocess.Popen(cmd, shell = True, stderr = PIPE, stdout = PIPE, close_fds = True)
+	error = proc.stderr.read()
+	if error != '':
+		weechat.prnt(error)
+	output = proc.stdout.read()
+	proc.wait()
+	return output
+
+def _format_np(template, song):
+	np = template.replace('%artist%', song['artist'])
+	np = np.replace('%title%', song['title'])
+	np = np.replace('%album%', song['album'])
+	np = np.replace('%cTime%', song['cTime'])
+	np = np.replace('%tTime%', song['time'])
+	np = np.replace('%bitrate%', song['audio-bitrate'])
+	np = np.replace('%year%', song['year'])
+	np = np.replace('%C', chr(3))
+	if _get_status() == STATUS_PAUSED:
+		np = np + " - [PAUSED]"
+	return np
+
+def _format_seconds(s):
+	# seconds should include milliseconds
+	s = int(s) / 1000
+	temp = float()
+	temp = float(s) / (60*60*24)
+	d = int(temp)
+	temp = (temp - d) * 24
+	h = int(temp)
+	temp = (temp - h) * 60
+	m = int(temp)
+	temp = (temp - m) * 60
+	sec = temp
+	if d > 0:
+		return "%id %i:%02i:%02i" % (d, h, m, sec)
+	elif h > 0:
+		return "%i:%02i:%02i" % (h, m, sec)
+	else:
+		return "%i:%02i" % (m, sec)
+
+def _get_song_info():
+	"""Get the song information from amarok"""
+	song = {}
+	info = _execute_command(_dbus_command('GetMetadata'))
+	matches = re.findall('dict\s+entry\(\s+string\s+"([^"]+)"\s+variant\s+([a-z0-9]+)\s+([^\n]*)\s+\)', info)
+	for x in matches:
+		if x[1] == 'string':
+			# Remove the quotes from strings
+			song[x[0]] = x[2].strip('"')
+		else:
+			song[x[0]] = x[2]
+	song['time'] = _format_seconds(song['mtime'])
+	song['cTime'] = _format_seconds(re.findall('int32 ([0-9]+)', _execute_command(_dbus_command('PositionGet')))[0])
+	return song
+
+def _get_status():
+	status = _execute_command(_dbus_command('GetStatus'))
+	matches = re.findall('int32 ([0-9])', status)
+	# first one is our playing status - 0 = playing, 1 = paused, 2 = stopped
+	return int(matches[0])
+
+def _load_settings():
+    debug['file'] = os.path.expanduser(_load_setting('debug_file', '~/amarok2_debug.txt'))
+    infobar['enabled'] = _load_setting('infobar_enabled', '0', 'bool')
+    infobar['format'] = _load_setting('infobar_format', 'Now Playing: %title% by %artist%')
+    infobar['update'] = _load_setting('infobar_update', '10', 'int')
+    output['format'] = _load_setting('output_format', '/me is listening to %C04%title%%C by %C03%artist%%C from %C12%album%%C [%cTime% of %tTime% @ %bitrate%kbps]')
+    ssh['enabled'] = _load_setting('ssh_enabled', '0', 'bool')
+    ssh['host'] = _load_setting('ssh_host', 'localhost')
+    ssh['port'] = _load_setting('ssh_port', '22', 'int')
+    ssh['user'] = _load_setting('ssh_user', 'user')
+
+def _load_setting(setting, default=None, type=None):
+	value = weechat.get_plugin_config(setting)
+	if value == '' and default != None:
+		weechat.set_plugin_config(setting, default)
+		value = default
+
+	if type == 'int' or type == 'bool':
+		value = int(value)
+
+	if type == 'bool':
+		value = bool(value)
+
+	return value
+
+if weechat.register('amarok2', __version__, 'amarok2_unload', __desc__):
+	_load_settings()
+	if infobar['enabled']:
+		amarok2_infobar_update()
+		weechat.add_timer_handler(infobar['update'], 'amarok2_infobar_update')
+	weechat.add_command_handler('amarok2', 'amarok2_command', 'Control Amarok2 or display now playing information.', 'next|np|play|pause|prev|stop|infobar')
diff --git a/python/autoauth.py b/python/autoauth.py
index 6480cd73..3c9b4e67 100644
--- a/python/autoauth.py
+++ b/python/autoauth.py
@@ -1,7 +1,7 @@
 # -*- coding: iso-8859-1 -*-
 
 # =============================================================================
-#  autoauth.py (c) October 2005 by kolter <kolter+dev@openics.org>
+#  autoauth.py (c) October 2005 by kolter <kolter@openics.org>
 #  Python script for WeeChat.
 #
 #  Licence     : GPL v2
diff --git a/python/crypt.py b/python/crypt.py
index 59f75fc5..4404704c 100644
--- a/python/crypt.py
+++ b/python/crypt.py
@@ -1,11 +1,11 @@
 #!/usr/bin/python
 # ==============================================================
-# crypt.py written 08/2008 by blackpenguin <nlissne@linux01.org>
+# crypt.py written 2008 by blackpenguin <nlissne@linux01.org>
 # ==============================================================
-# License     : Public Domain
+# License     : GPL3
 # Description : encrypt/decrypt PRIVMSGs in WeeChat using openssl
 #
-# Version     : 0.02
+version="1.1-0.2.6"
 #
 # This plugin uses openssl to encrypt/decrypt messages you send
 # or receive with weechat. Due to the very simple method 
@@ -14,74 +14,89 @@
 #
 # The default encryption algorithm is blowfish, but you can
 # easily change it to any other cipher your openssl offers.
-# Read output of "openssl -h" to find out, which ciphers are
-# supported (also depends on your kernel)
+# Read output of "openssl -h" to find out which ciphers are
+# supported (also depends on your kernel!)
 CIPHER="blowfish"
 # 
-# To activate encryption for a given server.user just
-# put a file called "cryptkey.server.user" into 
+# To activate encryption for a given user just
+# put a file called "cryptkey.username" into 
 # your weechat-directory, containing the passphrase
 # to use for encryption/decryption 
+# 
+# You can activate encryption on irc-channels, too,
+# just use cryptkey.#channelname as keyfile then.
+#
 # example: if you have exchanged a secret key with me,
 # you would put it in a file called 
-# cryptkey.freenode.blackpenguin in your weechat_dir
+# cryptkey.blackpenguin in your weechat_dir
 #
 # Of course, you need to share this keyfile with the 
 # remote side in another secure way (i.e. sending
 # pgp-encrypted mail)
-#
-# I might implement a /crypt command to activate/deactivate
-# encryption later, but for now the method used works for me.
-#
-# HISTORY:
-# version 0.01 initial version
-#
-# version 0.02 switched from os.environ["HOME"] + "/.weechat" 
-#              to get_info("weechat_dir")
-
-import weechat, string, os
 
+import weechat, string, os, subprocess
 
 def decrypt(server, args):
-  pre, middle, message = string.split(args, ":", 2)
-  midstr=middle.split(" ")
-  username=midstr[-2]
-  if os.path.exists(weechat_dir + "/cryptkey." + server + "." + username):
-    cin, cout = os.popen2("openssl enc -d -a -" + CIPHER + " -pass file:" + weechat_dir + "/cryptkey." + server + "." + username + " 2>/dev/null")
-    cin.write(message.replace("|","\n"))
-    cin.close()
-    decrypted = cout.read()
-    sts = cout.close()
+  hostmask, chanmsg = string.split(args, "PRIVMSG ", 1)
+  channelname, message = string.split(chanmsg, " :", 1)
+  if channelname[0] == "#":
+    username=channelname
+  else:
+    username, rest = string.split(hostmask, "!", 1)
+    username = username[1:]
+
+  if os.path.exists(weechat_dir + "/cryptkey." + username):
+    p = subprocess.Popen(["openssl", "enc", "-d", "-a", "-" + CIPHER, "-pass" ,"file:" + weechat_dir + "/cryptkey." + username], bufsize=4096, stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)
+    p.stdin.write("U2FsdGVkX1" + message.replace("|","\n"))
+    p.stdin.close()
+    decrypted = p.stdout.read()
+    p.stdout.close()
     if decrypted == "":
-      return pre + ":" + middle + ":" + message
-    return pre + ":" + middle + ":" + chr(3) + "04* crypted * " + chr(15) + decrypted 
+      return args
+    return hostmask + "PRIVMSG " + channelname + " :" + chr(3) + "04* crypted * " + chr(15) + decrypted 
   else:
-    return pre + ":" + middle + ":" + message
+    return args
     
 def encrypt(server, args):
   pre, message = string.split(args, ":", 1)
   prestr=pre.split(" ")
   username=prestr[-2]
-  if os.path.exists(weechat_dir + "/cryptkey."  + server + "." + username):
-    cin, cout = os.popen2("openssl enc -a -" + CIPHER + " -pass file:" + weechat_dir + "/cryptkey." + server + "." + username + " 2>/dev/null")
-    cin.write(message)
-    cin.close()
-    encrypted = cout.read()
+  if os.path.exists(weechat_dir + "/cryptkey." + username):
+    p = subprocess.Popen(["openssl", "enc", "-a", "-" + CIPHER, "-pass" ,"file:" + weechat_dir + "/cryptkey." + username], bufsize=4096, stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)
+    p.stdin.write(message)
+    p.stdin.close()
+    encrypted = p.stdout.read()
+    p.stdout.close()
     encrypted = encrypted.replace("\n","|")
-    cout.close()
-    weechat.print_infobar(0,"* sent encrypted * ")
-    return pre + ":" + encrypted
+    if len(encrypted) > 400:
+      splitmsg=string.split(message," ")
+      cutpoint=len(splitmsg)/2
+      p = subprocess.Popen(["openssl", "enc", "-a", "-" + CIPHER, "-pass" ,"file:" + weechat_dir + "/cryptkey." + username], bufsize=4096, stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)
+      p.stdin.write(string.join(splitmsg[:cutpoint]," ") + "\n")
+      p.stdin.close()
+      encrypted = p.stdout.read()
+      p.stdout.close()
+      encrypted = encrypted.replace("\n","|")
+      p = subprocess.Popen(["openssl", "enc", "-a", "-" + CIPHER, "-pass" ,"file:" + weechat_dir + "/cryptkey." + username], bufsize=4096, stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)
+      p.stdin.write( string.join(splitmsg[cutpoint:]," ") )
+      p.stdin.close()
+      encrypted2 = p.stdout.read()
+      p.stdout.close()
+      encrypted2 = encrypted2.replace("\n","|")
+      encrypted = encrypted + "\n" + pre + ":" + encrypted2[10:]
+    weechat.print_infobar(0,"* sent encrypted to " + username + " * ")
+    return pre + ":" + encrypted[10:]
   else:
     weechat.remove_infobar(0)
-    return pre + ":" + message
-
+    return args
 
+# for subprocess.Popen call
+PIPE=-1
 
 # register the plugin
-weechat.register("crypt", "0.02", "", "encrypt/decrypt PRIVMSGs")
+weechat.register("crypt", version, "", "encrypt/decrypt PRIVMSGs")
 weechat_dir = weechat.get_info("weechat_dir")
 
 # register the modifiers
 weechat.add_modifier("irc_in", "privmsg", "decrypt")
 weechat.add_modifier("irc_out", "privmsg", "encrypt")
-
diff --git a/python/moc-control.py b/python/moc-control.py
new file mode 100644
index 00000000..90f3fefb
--- /dev/null
+++ b/python/moc-control.py
@@ -0,0 +1,271 @@
+#
+# Copyright (c) 2009 by Benjamin Neff <info@benjaminneff.ch>
+#
+# 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
+#
+
+import weechat
+import os
+import subprocess
+import traceback
+
+infobar = {}
+output = {}
+
+STATUS_PLAYING = 'PLAY'
+STATUS_PAUSED = 'PAUSE'
+STATUS_STOPPED = 'STOP'
+
+def moc_command(server, args):
+	args = args.split(' ')
+	if args[0] == '' or args[0] == 'i' or args[0] == 'o' or args[0] == 'ot':
+		return moc_now_playing(server, args[0])
+	elif args[0] == 'pause' or args[0] == 'pp':
+		if _get_status() == STATUS_STOPPED:
+			weechat.prnt('moc: Not playing')
+			return weechat.PLUGIN_RC_OK
+		else:
+			_execute_command('mocp -G')
+			weechat.prnt('moc: Song paused / Continue playing')
+			return weechat.PLUGIN_RC_OK
+	elif args[0] == 'play':
+		if _get_status() == STATUS_PLAYING:
+			weechat.prnt('moc: Already playing')
+			return weechat.PLUGIN_RC_OK
+		elif _get_status() == STATUS_PAUSED:
+			_execute_command('mocp -U')
+			weechat.prnt('moc: Continue playing.')
+			return weechat.PLUGIN_RC_OK
+		else:
+			_execute_command('mocp -p')
+			weechat.prnt('moc: Started playing.')
+			return weechat.PLUGIN_RC_OK
+	elif args[0] == 'stop':
+		_execute_command('mocp -s')
+		weechat.prnt('moc: Stop playing.')
+		return weechat.PLUGIN_RC_OK
+	elif args[0] == 'prev':
+		if _get_status() == STATUS_STOPPED:
+			weechat.prnt('moc: Not playing, cannot go to previous song.')
+			return weechat.PLUGIN_RC_OK
+		else:
+			_execute_command('mocp -r')
+			weechat.prnt('moc: Playing previous song.')
+			return weechat.PLUGIN_RC_OK
+	elif args[0] == 'next':
+		if _get_status() == STATUS_STOPPED:
+			weechat.prnt('moc: Not playing, cannot go to next song.')
+			return weechat.PLUGIN_RC_OK
+		else:
+			_execute_command('mocp -f')
+			weechat.prnt('moc: Playing next song.')
+			return weechat.PLUGIN_RC_OK
+	elif args[0] == 'infobar':
+		if infobar['enabled']:
+			infobar['enabled'] = False
+			weechat.set_plugin_config('infobar_enabled', '0')
+			weechat.remove_timer_handler('moc_infobar_update')
+			weechat.remove_infobar(0)
+			weechat.prnt('moc infobar disabled')
+		else:
+			infobar['enabled'] = True
+			weechat.set_plugin_config('infobar_enabled', '1')
+			moc_infobar_update()
+			weechat.add_timer_handler(infobar['update'], 'moc_infobar_update')
+			weechat.prnt('moc infobar enabled')
+		return weechat.PLUGIN_RC_OK
+	elif args[0] == 'help':
+		weechat.command('/help moc')
+		return weechat.PLUGIN_RC_OK
+	else:
+		weechat.prnt('moc: Unknown command %s' % (args[0]), '', server)
+		return weechat.PLUGIN_RC_OK
+
+def moc_infobar_update():
+	_load_settings()
+	if infobar['enabled'] == False:
+		return weechat.PLUGIN_RC_OK
+
+	if _get_status() == STATUS_STOPPED:
+		weechat.print_infobar(infobar['update']+1, 'moc is not currently playing')
+		return weechat.PLUGIN_RC_OK
+	else:
+		song = _get_song_info()
+		format = _format_np(infobar['format'], song, 'infobar')
+		weechat.print_infobar(infobar['update']+1, format)
+		return weechat.PLUGIN_RC_OK
+
+def moc_now_playing(server, formatType):
+	_load_settings()
+	format = ''
+	if formatType == '':
+		formatType = output['type']
+
+	if _get_status() == STATUS_STOPPED:
+		format = output['nothing']
+	else:
+		song = _get_song_info()
+		format = _format_np(output['format'], song, 'chat')
+
+	if formatType == 'i':
+		weechat.prnt(format)
+	elif formatType == 'o':
+		weechat.command(format)
+	elif formatType == 'ot':
+		weechat.command('/me %s' % format)
+
+	return weechat.PLUGIN_RC_OK
+
+def moc_unload():
+	"""Unload the plugin from weechat"""
+	if infobar['enabled']:
+		weechat.remove_infobar(0)
+		weechat.remove_timer_handler('moc_infobar_update')
+	return weechat.PLUGIN_RC_OK
+
+def _execute_command(cmd):
+	from subprocess import PIPE
+	proc = subprocess.Popen(cmd, shell = True, stderr = PIPE, stdout = PIPE, close_fds = True)
+	error = proc.stderr.read()
+	if error != '':
+		weechat.prnt(error)
+	output = proc.stdout.read()
+	proc.wait()
+	return output
+
+def _format_np(np, song, npType):
+	np = np.replace('%mocTitle%', song['Title'])
+	np = np.replace('%title%', song['SongTitle'])
+
+	if npType == 'chat':
+		if song['Artist'] != 'unknown':
+			np = np.replace('%artist%', output['artist'])
+			np = np.replace('%artist%', song['Artist'])
+		else:
+			np = np.replace('%artist%', '')
+
+		if song['Album'] != 'unknown':
+			np = np.replace('%album%', output['album'])
+			np = np.replace('%album%', song['Album'])
+		else:
+			np = np.replace('%album%', '')
+	else:
+		np = np.replace('%artist%', song['Artist'])
+		np = np.replace('%album%', song['Album'])
+
+	np = np.replace('%cTime%', song['CurrentTime'])
+	np = np.replace('%cSec%', song['CurrentSec'])
+	np = np.replace('%tTime%', song['TotalTime'])
+	np = np.replace('%tSec%', song['TotalSec'])
+	np = np.replace('%bitrate%', song['Bitrate'])
+	np = np.replace('%avgBitrate%', song['AvgBitrate'])
+	np = np.replace('%rate%', song['Rate'])
+	np = np.replace('%file%', song['File'])
+	np = np.replace('%C', chr(3))
+
+	if _get_status() == STATUS_PAUSED:
+		np = np + " - [PAUSED]"
+
+	return np
+
+def _get_song_info():
+	"""Get the song information from moc"""
+	song = {}
+	song['TotalTime'] = '?:??'
+	song['TotalSec'] = '??'
+
+	info = _execute_command('mocp -i')
+	for line in info.split('\n'):
+		if line != '':
+			index = line.find(': ')
+			name = line[:index]
+			value = line[index+2:]
+			if value == '':
+				value = 'unknown'
+			song[name] = value.strip()
+
+	if song['File'].find("://") < 0:
+		song['File'] = os.path.basename(song['File'])
+
+	return song
+
+def _get_status():
+	return _execute_command('mocp -i | grep "State:" | cut -d " " -f 2').strip()
+
+def _load_settings():
+    infobar['enabled'] = _load_setting('infobar_enabled', '0', 'bool')
+    infobar['format'] = _load_setting('infobar_format', 'Now Playing: %mocTitle%')
+    infobar['update'] = _load_setting('infobar_update', '10', 'int')
+    output['format'] = _load_setting('output_format', 'is listening to %C04%title%%C %artist%%album%::: %C07%file%%C ::: %cTime%/%tTime% @ %bitrate%')
+    output['artist'] = _load_setting('output_format_artist', '- %C03%artist%%C ')
+    output['album'] = _load_setting('output_format_album', '(%C12%album%%C) ')
+    output['type'] = _load_setting('output_type', 'ot')
+    output['nothing'] = _load_setting('output_nothing', 'is listening to nothing')
+
+def _load_setting(setting, default=None, type=None):
+	value = weechat.get_plugin_config(setting)
+	if value == '' and default != None:
+		weechat.set_plugin_config(setting, default)
+		value = default
+
+	if type == 'int' or type == 'bool':
+		value = int(value)
+
+	if type == 'bool':
+		value = bool(value)
+
+	return value
+
+if weechat.register('moc-control', '1.1.2', 'moc_unload', 'moc control and now playing script for Weechat'):
+	_load_settings()
+	if infobar['enabled']:
+		moc_infobar_update()
+		weechat.add_timer_handler(infobar['update'], 'moc_infobar_update')
+	weechat.add_command_handler(
+		'moc',
+		'moc_command',
+		'Control moc or display now playing information.',
+		'i|o|ot|play|pause|pp|stop|prev|next|infobar|help',
+		'Commands Available\n'
+		'  /moc         - Display currently playing song.\n'
+		'  /moc i       - Show info about current song\n'
+		'  /moc o       - Display currently playing song as /msg\n'
+		'  /moc ot      - Display currently playing song as /me\n'
+		'  /moc play    - Start playing music.\n'
+		'  /moc pause   - Toggle between pause/playing.\n'
+		'  /moc pp      - Toggle between pause/playing.\n'
+		'  /moc stop    - Stop playing music.\n'
+		'  /moc prev    - Move to the previous song in the playlist.\n'
+		'  /moc next    - Move to the next song in the playlist.\n'
+		'  /moc infobar - Toggle the infobar display.\n'
+		'\n'
+		'Formatting\n'
+		'  %mocTitle%   - Replaced with the title from moc.\n'
+		'  %artist%     - Replaced with the song artist.\n'
+		'  %title%      - Replaced with the song title.\n'
+		'  %album%      - Replaced with the song album.\n'
+		'  %file%       - Replaced with the filename/url of the song.\n'
+		'  %cTime%      - Replaced with how long the song has been playing.\n'
+		'  %cSec%       - Replaced with how long the song has been playing (seconcs).\n'
+		'  %tTime%      - Replaced with the length of the song.\n'
+		'  %tSec%       - Replaced with the length of the song (seconcs).\n'
+		'  %bitrate%    - Replaced with the bitrate of the song.\n'
+		'  %avgBitrate% - Replaced with the AvgBitrate of the song.\n'
+		'  %rate%       - Replaced with the rate of the song.\n'
+		'  %C##         - Make ## the number code of the color you want to use. Use %C by itself to end the color.\n'
+		'\n'
+		'To see all available settings, please check /setp moc\n',
+		'i|o|ot|play|pause|pp|stop|prev|next|infobar|help'
+	)
diff --git a/python/rainbow.py b/python/rainbow.py
new file mode 100644
index 00000000..fe435d2c
--- /dev/null
+++ b/python/rainbow.py
@@ -0,0 +1,26 @@
+#Author: Martin Pugh
+#Contact: mpugh89@gmail.com
+#Usage: /rainbow some text here
+#Displays text in rainbow colours
+#License: WTFPL v2
+
+import weechat
+weechat.register('rainbow', '0.5', '', """Print rainbow-colored text. Usage: /rainbow""")
+weechat.add_command_handler("rainbow", "rainbow", "print rainbow text")
+
+def rainbow(server, args):
+	colors=["9","11","12","13","4"]
+	out = ""
+	ci = 0
+	if args != "":
+		for i in range(0,len(args)):
+			out += '\x03' + colors[ci] + '\x02' + args[i]
+			if ci == len(colors)-1:
+				ci = 0
+			else:
+				ci += 1
+		outcommand = '/say ' + out
+		weechat.command(outcommand)
+	else:
+		weechat.prnt("rainbow: no text to output")
+	return weechat.PLUGIN_RC_OK
diff --git a/python/shell.py b/python/shell.py
index 1d14b3db..c4b170dc 100644
--- a/python/shell.py
+++ b/python/shell.py
@@ -1,6 +1,6 @@
 
 # =============================================================================
-#  shell.py (c) March 2006 by Kolter <kolter+dev@openics.org>
+#  shell.py (c) March 2006 by Kolter <kolter@openics.org>
 #
 #  Licence     : GPL v2
 #  Description : running shell commands in WeeChat
diff --git a/python/urlgrab.py b/python/urlgrab.py
index 85f49ec9..fbbe4804 100644
--- a/python/urlgrab.py
+++ b/python/urlgrab.py
@@ -1,8 +1,10 @@
 #
-# UrlGrab, version 1.2, for weechat version 0.2.4
+# UrlGrab, version 1.3 for weechat version 0.2.6
 #
 #   Listens to all channels for URLs, collects them in a list, and launches
 #   them in your favourite web server on the local host or a remote server.
+#   Copies url to X11 clipboard via xsel
+#      (http://www.vergenet.net/~conrad/software/xsel)
 #
 # Usage:
 #
@@ -82,6 +84,9 @@
 #           added parsing of scrollback buffers on load
 #    v1.2:  `historysize` was ignored
 #
+#  - With changes by ExclusivE (exclusive_tm at mail dot ru):
+#    v1.3: X11 clipboard support
+#
 # Copyright (C) 2005 Jim Ramsay <i.am@jimramsay.com>
 #
 # This program is free software; you can redistribute it and/or
@@ -106,7 +111,7 @@
 import subprocess
 
 UC_NAME="UrlGrab"
-UC_VERSION="1.2"
+UC_VERSION="1.3"
 
 def urlGrabPrint(message):
     weechat.prnt("-[%s]- %s" % ( UC_NAME, message ) )
@@ -332,6 +337,29 @@ def urlGrabCheckOnload():
             for line in reversed(lines):
                 urlGrabCheckMsgline(buf['server'], buf['channel'], line['data'])
 
+def urlGrabCopy(index):
+    global urlGrab
+
+    server = weechat.get_info("server")
+    channel = weechat.get_info("channel")
+    
+    if channel == "":
+        urlGrabPrint( "No current channel, you must activate one" )
+    elif not urlGrab.hasChannel( channel, server ):
+        urlGrabPrint("No URL found - Invalid channel")
+    else:
+        if index <= 0:
+            urlGrabPrint("No URL found - Invalid index")
+            return
+        url = urlGrab.getUrl(index, channel, server)
+        if url == "":
+            urlGrabPrint("No URL found - Invalid index")
+	else:
+	    weechat.prnt("Url: %s gone to clipboard." % url)
+	    pipe = os.popen("xsel -i","w")
+	    pipe.write(url)
+	    pipe.close()
+
 def urlGrabOpen(index, channel = None):
     global urlGrab, urlGrabSettings
 
@@ -407,6 +435,8 @@ def urlGrabHelp():
     weechat.prnt("    /url n [channel]")
     weechat.prnt("        -> launch the nth url in `/url list`")
     weechat.prnt("           or the nth url in the specified channel")
+    weechat.prnt("    /url copy [n]")
+    weechat.prnt("        -> copy nth or last url to X11 clipboard")
     weechat.prnt("")
 
 def urlGrabMain(server, args):
@@ -449,6 +479,12 @@ def urlGrabMain(server, args):
                     weechat.prnt( "  Failed: No value given" )
         except KeyError:
             weechat.prnt( "  Failed: Unrecognized parameter '%s'" % name )
+    elif largs[0] == 'copy':
+        if len(largs) > 1:
+            urlGrabCopy(int(largs[1]))
+        else:
+            urlGrabCopy(1)
+
     else:
         try:
             no = int(largs[0])
diff --git a/python/weebanshee.py b/python/weebanshee.py
new file mode 100644
index 00000000..9fee3500
--- /dev/null
+++ b/python/weebanshee.py
@@ -0,0 +1,29 @@
+# Weechat now-playing script for Banshee (tested for 1.4.3)
+# Author: Vitaly Dolgov [ ferhiord@gmail.com ]
+# Usage: /weebanshee
+# Released under GPLv2
+
+import os
+import weechat
+
+name = 'weebanshee'
+version = '0.1'
+banshee = 'banshee-1'
+
+weechat.register(name, version, '', 
+    'now-playing script for banshee (usage: /%s)' % name)
+weechat.add_command_handler(name, 'show')
+
+def show(server, args) :
+  if os.popen('ps -e | grep %s' % banshee).read() == '' :
+    return weechat.PLUGIN_RC_KO
+  if os.popen('%s --query-current-state' % banshee
+      ).read().strip().split(' ')[1] == 'idle' :
+    return weechat.PLUGIN_RC_KO
+  artist = os.popen('%s --query-artist' % banshee
+      ).read().strip().split(' ', 1)[1]
+  title  = os.popen('%s --query-title'  % banshee
+      ).read().strip().split(' ', 1)[1]
+  text = '/me : %s - %s' % (artist, title)
+  weechat.command(text)
+  return weechat.PLUGIN_RC_OK
diff --git a/python/weexaile.py b/python/weexaile.py
index bfab1f37..cb784e6b 100644
--- a/python/weexaile.py
+++ b/python/weexaile.py
@@ -1,53 +1,23 @@
-#Author: Pablo Escobar <pablo__escobar AT tlen DOT pl>
-#What it does: This script shows the currently played song in exaile 
-#Usage: /weexaile - Displays the songname
-#Released under GNU GPL v2 or newer
-
-#/usr/bin/python
-#coding: utf-8
+# Authors: Pablo Escobar <pablo__escobar AT tlen DOT pl>
+#          Vitaly Dolgov <ferhiord AT gmail DOT com>
+# What it does: this script shows the currently played song in exaile. 
+# Usage: /weexaile - displays the songname
+# Released under GPLv2 or newer
 
 import weechat
 import re
 import codecs
 from os import popen
 
-weechat.register ('exaile', '0.01', '', """exaile-weechat current song script (usage: /weexaile)""")
-weechat.add_command_handler ('weexaile', 'show_it_to_them')
-
-default = {
-  "msg_head": "is playing",
-  "msg_tail": "with exaile",
-  "spacer": "★",
-  "colour_artist": "C03",
-  "colour_title": "C02",
-  "colour_lenght": "C05",
-  "colour_spacer": "C08",
-}
-
-for k, v in default.items():
-  if not weechat.get_plugin_config(k):
-    weechat.set_plugin_config(k, v)
+weechat.register('exaile', '0.02', '', 'exaile-weechat current song script (usage: /weexaile)')
+weechat.add_command_handler('weexaile', 'show_it_to_them')
 
 def show_it_to_them(server, args):
-	spacer = weechat.get_plugin_config("spacer")
-	msg_tail = weechat.get_plugin_config("msg_tail")
-	msg_head = weechat.get_plugin_config("msg_head")
-	colour_artist = weechat.get_plugin_config("colour_artist")
-	colour_title = weechat.get_plugin_config("colour_title")
-	colour_lenght = weechat.get_plugin_config("colour_lenght")
-	colour_spacer = weechat.get_plugin_config("colour_spacer")
-	exaile_running = popen ('exaile --get-title')
-	exaile_running_text = exaile_running.readline().rstrip()
-	if exaile_running_text != "No running Exaile instance found.":
-		song_name = popen ('exaile --get-title')
-		song_name_text = song_name.readline().rstrip()
-		song_artist = popen ('exaile --get-artist')
-		song_artist_text = song_artist.readline().rstrip()
-		song_length = popen ('exaile --get-length')
-		song_length_text = song_length.readline().rstrip()
-		song_current = popen ('exaile --current-position')
-		song_current_text = str(round(float(song_current.readline().rstrip()),2))
-		all = '/me ' + msg_head + ' %' + colour_title + song_name_text + ' %' + colour_spacer + spacer + ' %' + colour_artist + song_artist_text + ' %' + colour_spacer + spacer + ' %' + colour_lenght + song_length_text + " (" + song_current_text + "%)" + " %C00" + msg_tail 
-		weechat.command(all)
-	return 0
-
+  to_devnull = ' 2> /dev/null'
+  exaile_running = popen('exaile --get-title' + to_devnull).readline().rstrip()
+  if exaile_running != "No running Exaile instance found." :
+    song_name = popen('exaile --get-title' + to_devnull).readline().rstrip()
+    song_artist = popen('exaile --get-artist' + to_devnull).readline().rstrip()
+    text = '/me : ' + song_artist + ' - ' + song_name
+    weechat.command(text)
+  return weechat.PLUGIN_RC_OK
diff --git a/python/wetwit.py b/python/wetwit.py
new file mode 100644
index 00000000..fbad15f4
--- /dev/null
+++ b/python/wetwit.py
@@ -0,0 +1,85 @@
+#!/usr/bin/env python
+#
+# Author: Stefano Zamprogno <mie.iscrizioni@gmail.com>
+# Licence: GPL3
+#
+# This plugin need:
+# python (tested only with v2.6.x)
+# python-twitter (tested only with v0.6)
+# weechat (tested only with v0.2.6.3)
+# on Archlinux distro simply:
+# yaourt -S python-twitter
+#
+# Put wetwit.py on ~/.weechat/python/autoload/
+# set below user and pwd
+#
+# HELP on Usage
+# /twit twits [N]
+#       request latest [N] messages or latest 5 if N not specified
+# /twit sendmsg text2send
+#       send 'text2send' to twitter
+
+import weechat
+import twitter
+
+weechat.register("wetwit.py", "0.1.0", "",
+                            "WeTwit v.0.1.0")
+
+
+# To be SET by you, VERIFY 3 TIMES !!! :)
+user = "john"
+pwd = "doe"
+
+# -----------------------------------------------------------
+# Do not modify below this line------------------------------
+# -----------------------------------------------------------
+
+api = twitter.Api(user, pwd)
+
+def hook_commands_cb(server, args):
+    cmd = args.split()
+    if len(cmd) > 1:
+        cmd,txt = args.split(" ", 1)
+        cmd = cmd.lower()
+        if cmd == "sendmsg":
+            weechat.prnt("Working...")
+            if len(txt) <= 140:
+                status = api.PostUpdate(txt.decode("utf-8"))
+                weechat.prnt("-"*30)
+                weechat.prnt(status.text.encode("utf-8"))
+                weechat.prnt("-"*30)
+                weechat.prnt("*** TWITTED ***")
+            else:
+                statuses = api.PostUpdates(txt.decode("utf-8"),
+                                        continuation="...")
+                for s in statuses:
+                    weechat.prnt("-"*30)
+                    weechat.prnt(s.text.encode('utf-8'))
+                    weechat.prnt("-"*30)
+                    weechat.prnt("*** TWITTED ***")
+        if cmd == "twits":
+            weechat.prnt("Working...")
+            statuses = api.GetFriendsTimeline(count=str(txt))
+            for s in statuses:
+                weechat.prnt("Data: %s" % s.created_at)
+                weechat.prnt("ID: %s, User: %s" % (s.id, s.user.name))
+                weechat.prnt("Text: %s" % (s.text.encode('utf-8')))
+                weechat.prnt("---")
+    elif len(cmd) == 1:
+        if cmd[0].lower() == "twits":
+            weechat.prnt("Working...")
+            statuses = api.GetFriendsTimeline(count=5)
+            for s in statuses:
+                weechat.prnt("Data: %s" % s.created_at)
+                weechat.prnt("ID: %s, User: %s" % (s.id, s.user.name))
+                weechat.prnt("Text: %s" % (s.text.encode('utf-8')))
+                weechat.prnt("---")
+
+    return weechat.PLUGIN_RC_OK
+
+weechat.add_command_handler("twit", "hook_commands_cb",
+                        "Send/Receive twitter messages",
+                        "")
+
+
+weechat.prnt("Plugin WeTwit loaded!")
diff --git a/python/wildcard.py b/python/wildcard.py
new file mode 100644
index 00000000..a8e06e1b
--- /dev/null
+++ b/python/wildcard.py
@@ -0,0 +1,55 @@
+# Copyright (c) 2008 Ben <dumbtech@gmail.com>
+# 
+# Permission is hereby granted, free of charge, to any person
+# obtaining a copy of this software and associated documentation
+# files (the "Software"), to deal in the Software without
+# restriction, including without limitation the rights to use,
+# copy, modify, merge, publish, distribute, sublicense, and/or sell
+# copies of the Software, and to permit persons to whom the
+# Software is furnished to do so, subject to the following
+# conditions:
+# 
+# The above copyright notice and this permission notice shall be
+# included in all copies or substantial portions of the Software.
+# 
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+# EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+# OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+# NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+# OTHER DEALINGS IN THE SOFTWARE.
+
+# TODO: Clean up code and add UTF-8 support.
+
+import weechat as wc
+import re
+
+wc.register("wildcard", "0.1", "", "Adds wildcard support to nick completions.")
+wc.add_keyboard_handler("wildcard")
+
+if wc.get_plugin_config("max") == "": wc.set_plugin_config("max", "9")
+max = wc.get_plugin_config("max")
+warned = False
+
+def wildcard(key, input, input_after):
+    global warned
+    if input != "":
+        pos = int(wc.get_info("input_pos"))
+        end = input.find(" ", pos)
+        if end == -1: end = None
+        word = input[input.rfind(" ", 0, pos) + 1 : end]
+        if key == "tab" and word.find("*") != -1:
+            all_nicks = wc.get_nick_info(wc.get_info("server"), wc.get_info("channel"))
+            regex = re.compile(re.escape(word).replace(r"\*", ".*"), re.I)
+            matching_nicks = filter(regex.match, all_nicks)
+            if len(matching_nicks) > int(max) and warned == False:
+                wc.prnt("Warning: you are about to expand over " + max + " nicks." \
+                        + " Press <tab> again if you're sure you want to continue.")
+                warned = True
+            else:
+                for i in range(0, len(word)): wc.command("/key call backspace")
+                wc.command("/key call insert " + ' '.join(matching_nicks))
+                warned = False
+    return wc.PLUGIN_RC_OK
diff --git a/ruby/eightball.rb b/ruby/eightball.rb
new file mode 100644
index 00000000..dc3fe735
--- /dev/null
+++ b/ruby/eightball.rb
@@ -0,0 +1,63 @@
+# implement a magic 8-Ball as a weechat plugin
+# this code is licensed under the GPL v2 yadda yadda
+# contact me at: ledgekindred@gmail.com
+# latest version is always at:
+# https://code.launchpad.net/~dglidden/+junk/weechat
+
+@helptext = "Usage: /8ball question"
+@responses = ['As I see it, yes', 'Ask again later','Better not tell you now','Cannot predict now','Concentrate and ask again',
+  "Don't count on it",'It is certain','It is decidedly so','Most likely','My reply is no','My sources say no','Outlook good',
+  'Outlook not so good','Reply hazy, try again','Signs point to yes','Very doubtful','Without a doubt','Yes',
+  'Yes - definitely','You may rely on it']
+
+def weechat_init
+    Weechat.register("8ball", "1.0", "deinit", @helptext)
+    Weechat.add_command_handler("8ball", "eightball_handler", @helptext)
+    Weechat.add_message_handler("privmsg", "eightball_msg")
+    return Weechat::PLUGIN_RC_OK
+end
+
+def deinit
+    return Weechat::PLUGIN_RC_OK
+end
+
+def output(txt)
+  # Weechat.print(txt)
+  Weechat.command(txt)
+end
+
+def eightball(nick)
+  result = @responses[rand(@responses.length)]
+  response = "Magic Eight Ball tells #{nick}: #{result}"
+  return response
+end
+
+def eightball_msg(server, args)
+  if (args.empty?)
+    output(@helptext)
+    return Weechat::PLUGIN_RC_OK
+  end
+
+  null,info,msg = args.split(":",3)
+  mask,type,chan = info.split(" ")
+  nick,login = mask.split("!")
+
+  cmd = msg.split(" ")
+  if (cmd[0] == "/8ball")
+    result = eightball(nick)
+    Weechat.command(result, chan, server)
+  end
+
+  return Weechat::PLUGIN_RC_OK
+end
+
+def eightball_handler(server, args)
+  if (args.empty?)
+    output(@helptext)
+    return Weechat::PLUGIN_RC_OK
+  end
+  
+  result = eightball(Weechat.get_info("nick", server))
+  output(" /8ball #{args}")
+  output(result)
+end
diff --git a/ruby/roll.rb b/ruby/roll.rb
new file mode 100644
index 00000000..12679bdf
--- /dev/null
+++ b/ruby/roll.rb
@@ -0,0 +1,142 @@
+# weechat ruby plugin to respond to /roll command and return a 
+# randomly-generated number within the specified range
+#
+# see http://weechat.flashtux.org/doc/en/ch04s04s03.html for plugin API info
+#
+# this code is licensed under the GPL v2 yadda yadda
+# contact me at: ledgekindred@gmail.com
+# the latest version is always at:
+# https://code.launchpad.net/~dglidden/+junk/weechat
+#
+# 2009.01.14
+#   added default 1..100 if no number value is present
+#   added support for "3d6 + 1" type number format
+#
+# example syntax:
+#
+# input:              result:
+#
+# /roll                display help text
+# /roll hello          "[1d100] hello"
+# /roll 10             "[1d10]"
+# /roll 10 subway      "[1d10] subway"
+# /roll 1d6            "[1d6]"
+# /roll 2d20 to save   "[2d20] to save"
+# /roll 10 + 2         "[1d10] + 2"
+# /roll 1d6 + 2        "[1d6+2]"
+# /roll 1d6+2 to hit   "[1d6+2] to hit"
+#
+# you can use a negative modifier to the dice roll (e.g. 1d6-4)
+# if you do so, the lowest it will return is 1
+
+@helptext = "Usage: /roll (dice to roll e.g. 50 (implied 1d50), 1d6, 3d8+4, no leading integer defaults to 1d100) [text]"
+
+# weechat_init is called to set up the callback handlers
+def weechat_init
+  Weechat.register("roll", "1.0", "deinit", @helptext)
+  Weechat.add_command_handler("roll", "roll_handler", @helptext)
+  Weechat.add_message_handler("privmsg", "roll_msg")
+  return Weechat::PLUGIN_RC_OK
+end
+
+def deinit
+    return Weechat::PLUGIN_RC_OK
+end
+
+def debug(txt)
+  Weechat.print(txt)
+end
+
+def output(txt)
+  Weechat.command(txt)
+end
+
+def d(dicecount, sides)
+  roll = 0
+  for i in 1..dicecount
+    roll += rand(sides) + 1
+  end
+  
+  return roll
+end
+
+# we rolls our dice and returns our reults
+def roll(args, nick)
+  if(!args || args.empty?)
+    return @helptext
+  end
+  
+  if args =~ /^(\d+)/
+    # starts with an integer we can use to roll
+    @count = $1.to_i
+    @text = $'.strip
+    if @text =~ /^d(\d+)/
+      # we also have a type of dice to roll
+      @sides = $1.to_i
+      @text = $'.strip
+      if @text =~ /^\s*([+-])\s*(\d+)/
+        # we also have a number to add to the result
+        @add = $2.to_i
+        @roll = "d(#{@count}, #{@sides})#{$1}#{@add}"
+        @src = "#{@count}d#{@sides}#{$1}#{@add}"
+        # the rest is our text
+        @text = $'.strip
+      else
+        # we don't have a plus to the roll
+        @roll = "d(#{@count}, #{@sides})"
+        @src = "#{@count}d#{@sides}"        
+      end
+    else
+      # We don't have a type, just a number, so we go 1..@count
+      @roll = "d(1, #{@count})"
+      @src = "1d#{@count}"
+    end
+  else
+    # we didn't even start with a number, so we roll 1..100
+    @roll = "d(1, 100)"
+    @src = "1d100"
+    @text = args
+  end
+  
+  # debug("#{@roll}")
+  @val = eval @roll
+  if(@val < 1)
+    @val = 1
+  end
+  return "#{nick} rolled #{@val} (#{@src}) #{@text}"
+end
+
+# respond to messages received from server
+def roll_msg(server, args)
+  if (args.empty?)
+    output(@helptext)
+    return Weechat::PLUGIN_RC_OK
+  end
+
+  null,info,msg = args.split(":",3)
+  mask,type,chan = info.split(" ")
+  nick,login = mask.split("!")
+
+  cmd = msg.split(" ")
+  
+  # only respond to '/roll'
+  if (cmd[0] == "/roll")
+    result = roll(cmd[1..-1].join(" "), nick)
+    Weechat.command(result, chan, server)
+  end
+
+  return Weechat::PLUGIN_RC_OK
+end
+
+# respond to commands entered locally
+def roll_handler(server, args)
+  if (args.empty?)
+    output(@helptext)
+    return Weechat::PLUGIN_RC_OK
+  end
+
+  cmd = " /roll #{args}"
+  result = roll(args, Weechat.get_info("nick", server))
+  output(result)
+  output(cmd)
+end
diff --git a/ruby/url_shorten.rb b/ruby/url_shorten.rb
new file mode 100644
index 00000000..2aedc844
--- /dev/null
+++ b/ruby/url_shorten.rb
@@ -0,0 +1,104 @@
+# Copyright (c) 2008, Daniel Bretoi <daniel@bretoi.com>
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions are met:
+#     * Redistributions of source code must retain the above copyright
+#       notice, this list of conditions and the following disclaimer.
+#     * Redistributions in binary form must reproduce the above copyright
+#       notice, this list of conditions and the following disclaimer in the
+#       documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY Daniel Bretoi ''AS IS'' AND ANY
+# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+# DISCLAIMED. IN NO EVENT SHALL <copyright holder> BE LIABLE FOR ANY
+# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+# SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+#
+# * Simpler, more robust version of tinyurl (doesn't rely on html output)
+# * Echo's urls from all channels that are over the plugin's maxlen value
+#     in a shortened format.
+# * allows for manual shortening of urls
+# * set the shortener function alias to point to favorite shortener (qurl,tinyurl)
+
+require 'net/http'
+require 'uri'
+
+def weechat_init
+  Weechat.register "url_shorten", "1.0", "", "Shorten url"
+  Weechat.add_command_handler "url_shorten", "url_shorten","/url_shorten <url>"
+  Weechat.add_message_handler "privmsg", "msg_shorten"
+  if ( maxlen = Weechat.get_plugin_config("maxlen") ).empty?
+    Weechat.set_plugin_config("maxlen","50")
+  end
+  return Weechat::PLUGIN_RC_OK
+end
+
+def fetch(uri_str, limit = 10)
+  raise ArgumentError, 'HTTP redirect too deep' if limit == 0
+
+  response = Net::HTTP.get_response(URI.parse(uri_str))
+  case response
+  when Net::HTTPSuccess     then response.body
+  when Net::HTTPRedirection then fetch(response['location'], limit - 1)
+  else
+    response.error!
+  end
+end
+
+def qurl_shorten(url)
+  fetch('http://www.qurl.com/automate.php?url='+url).gsub('www.','')
+end
+
+def tinyurl_shorten(url)
+  fetch('http://tinyurl.com/api-create.php?url='+url)
+end
+alias shortener qurl_shorten
+
+def regexp_url
+  @regexp_url ||= Regexp.new('https?://[^\s]*')
+  @regexp_url
+end
+
+def url_shorten(server,msg)
+  if (msg.empty?)
+    usage
+    return Weechat::PLUGIN_RC_OK
+  end
+  url = (msg.scan regexp_url).to_s
+  short = shortener(url)
+  Weechat::print("\x0305#{short}\x0F");
+  return Weechat::PLUGIN_RC_OK
+end
+
+def msg_shorten(server,args)
+  if (args.empty?)
+    usage
+    return Weechat::PLUGIN_RC_OK
+  end
+
+  null,info,msg = args.split(":",3)
+  mask,type,chan = info.split(" ")
+
+  return Weechat::PLUGIN_RC_OK unless msg.match regexp_url
+
+  url = (msg.scan regexp_url).to_s
+
+  maxlen = Weechat.get_plugin_config "maxlen"
+  return Weechat::PLUGIN_RC_OK if url.length < maxlen.to_i
+  short = shortener(url)
+
+  Weechat::print("\x0305#{short}\x0F",chan,server);
+  return Weechat::PLUGIN_RC_OK
+end
+
+def usage
+  Weechat.print %|
+    /url_shorten <url>
+  |
+end
