All pastes #451728 Raw Edit

Anonymous

public text v1 · immutable
·published 2007-04-21 19:55 UTC
rendered paste body
##
## script to handle URLs found in IRC
##

use strict;
use Irssi;
use vars qw($VERSION %IRSSI);

my $VERSION = "0.1";
my %IRSSI = (
	authors     => 'ardnew',
	contact     => 'fuck@you.biz',
	name        => 'url.pl',
	description => 'handles URLs found in IRC',
	license     => 'DWTFYWWI LICENSE Version 1 ' .
		       'http://tools.wikimedia.de/~avar/COPYING',
);

Irssi::settings_add_str('url.pl', 'webbrowser_cmd', '/usr/bin/firefox');
Irssi::settings_add_str('url.pl', 'mediaplayer_cmd', '/usr/bin/mplayer');
Irssi::settings_add_str('url.pl', 'saved_urls_path', '/home/andrew/.url.pl.dat');
Irssi::settings_add_int('url.pl', 'stored_urls_limit', 100);

my @url;

# read all public messages, and strip everything but the URL from 'em
sub pub_msg_grab_url ($$$$) {
	my ($server, $msg, $nick, $mask, $targ) = @_;
	my $url = $1 if ($msg =~ /.*(https?\:\/\/\S*).*/i);
	if (defined $url) {
		my $lim = Irssi::settings_get_int("stored_urls_limit");
		if (@url < $lim) {
			\&url_add_to_array($url, $nick, $targ);
			\&url_add_to_file($url, $nick, $targ);
		} else {
			Irssi::print("You have reached the maximum allowed number of stored URLs. Please use /url_clear to clear the list.\n".
					"If you would like to increase this limit, please use /set stored_urls_limit [newlimit].\n".
					"This URL ($url) will still be added to the save file.");
			\&url_add_to_file($url, $nick, $targ);
		}
	}
}

# add URL to @url array
sub url_add_to_array ($$$) { # argument is the $url itself
	my ($url, $nick, $targ) = @_;
	push(@url, $url);
	Irssi::print("Added URL: <$nick/$targ> $url");
}

# add URL to file
sub url_add_to_file ($$$) { # argument is the $url itself
	my ($url, $nick, $targ) = @_;
	my $file = Irssi::settings_get_str("saved_urls_path");
	die($!) unless open FILE, '>>', $file;
	print FILE "<$nick/$targ> $url\n";
	close(FILE);
}

# reinitialize the @url array
sub url_clear_array () {
	@url = ();
	Irssi::print("Contents of the \@url array have been cleared.");
}

# print the contents of @url to irssi
sub url_list_array () {
	if (@url == 0) {
		Irssi::print("The \@url array is currently empty.");
	} else {
		for (my $i = 0; $i < @url; $i++) {
			Irssi::print("[$i] $url[$i]");
		}
	}
}

# open the URL per webbrowser_cmd by @url array index
sub url_open_by_index ($) {
	my ($idx) = @_;
	my $cmd = Irssi::settings_get_str("webbrowser_cmd");
	if (defined $url[$idx]) {
		system($cmd." ".$url[$idx]);
	} else {
		Irssi::print("$url[$idx] is not a valid index. Please see /url_list for available indices.");
	}
}

# open the URL per webbrowser_cmd by provided URL
sub url_open_by_url ($) {
	my ($url) = @_;
	my $cmd = Irssi::settings_get_str("webbrowser_cmd");
	system($cmd." ".$url);
}

# open the last URL provided per webbrowser_cmd 
sub url_open_last () {
	my $url = $url[$#url];
	my $cmd = Irssi::settings_get_str("webbrowser_cmd");
	my $pid = fork;
	if ($pid) {
		Irssi::pidwait_add($pid);
	} elsif (defined $pid) {
		system($cmd." ".$url);
		exit;
	} else {
		die "Error: couldn't fork: $!\n";
	}
}

Irssi::signal_add_last("message public", "pub_msg_grab_url");
Irssi::command_bind("url_clear", \&url_clear_array);
Irssi::command_bind("url_list", \&url_list_array);
Irssi::command_bind("open_url", \&url_open_by_url);
Irssi::command_bind("open_index", \&url_open_by_index);
Irssi::command_bind("open_last", \&url_open_last);