# Network status average statusbar item
# Works on systems that have /proc/net/dev

#  /STATUSBAR window ADD netload

#  /SET netload_refresh - How often the loadavg is refreshed
#  /SET netload_iface - What iface to monitor

use Irssi::TextUI;
use strict;
use 5.8.0;

use vars qw($VERSION %IRSSI $iface $refresh $last_refresh $refresh_tag @n_bytes);

$VERSION = '0.2';
%IRSSI = (
    authors     => 'Torbjörn "Azoff" Svensson',
    contact     => 'azoff at se.linux.org',
    name        => 'net',
    description => 'Netload statusbar item. Works on systems that have /proc/',
    license => 'Public Domain',
    url     => 'http://azoff.tty0.org/irssi/',
    changed => 'Tue Jul 29 23:10 CET 2003',
);

$iface = "eth0";
$refresh = 2;
my @o_bytes = (-1,-1);
my @n_bytes = (-1,-1);

sub get_netload {
	my $filename = '/proc/net/dev';
	open FOO, "<$filename" or Irssi::print("Failed to open <$filename: $!", MSGLEVEL_CLIENTERROR);
	while(<FOO>){ if (/$iface:(\d+)\s+(?:\d+\s+){7}(\d+)\s+/)  { close FOO; return($1, $2); } } # read and return RX and TX
} 


sub netload {
	my ($item, $get_size_only) = @_;

	(@n_bytes) = get_netload(); # get new data

	my @output = (
		((($n_bytes[0] - $o_bytes[0]) ) / $refresh), # incomming speed ($output[0])
		((($n_bytes[1] - $o_bytes[1]) ) / $refresh) # outgoing speed ($output[1])
	);

	if(($o_bytes[0] < 0) || ($o_bytes[1] < 0)){
		$item->default_handler($get_size_only, undef, sprintf("Initializing netload...", $output[0], $output[1]), 1); 
	}else{ 
		my($in, $out);

		# right prefix
		if( $output[0] > (1024*1024) ){
			$in = sprintf("In: %.2f MB/s", $output[0] / 1024 / 1024);
		} elsif( $output[0] > 1024 ){
			$in = sprintf("In: %.2f KB/s", $output[0] / 1024);
		} else {
			$in = sprintf("In: %.0f B/s", $output[0]);
		}

		# right prefix
		if( $output[1] > (1024*1024) ){
			$out = sprintf("Out: %.2f MB/s", $output[1] / 1024 / 1024);
		} elsif( $output[1] > 1024 ){
			$out = sprintf("Out: %.2f KB/s", $output[1] / 1024);
		} else {
			$out = sprintf("Out: %.0f B/s", $output[1]);
		}

		$item->default_handler($get_size_only, undef, sprintf("%s %s", $in, $out), 1); 
	}
}

sub refresh_netload {
	@o_bytes = ($n_bytes[0],$n_bytes[1]); # save the data to next run
	Irssi::statusbar_items_redraw('netload');
}

sub read_settings {
    $iface = Irssi::settings_get_str('netload_iface');
    $refresh = Irssi::settings_get_int('netload_refresh');
    $refresh = 1 if $refresh < 1;
    return if $refresh == $last_refresh;
    $last_refresh = $refresh;

    Irssi::timeout_remove($refresh_tag) if $refresh_tag;
    $refresh_tag = Irssi::timeout_add($refresh * 1000, 'refresh_netload', undef);
}

Irssi::settings_add_int('misc', 'netload_refresh', $refresh);
Irssi::settings_add_str('misc', 'netload_iface', $iface);

Irssi::statusbar_item_register('netload', '{sb $0-}', 'netload');
Irssi::statusbars_recreate_items();

read_settings();
Irssi::signal_add('setup changed', 'read_settings');

