1# uptime - irssi 0.7.98.CVS 2# 3# $Id: uptime.pl,v 1.6 2003/02/04 02:43:06 peder Exp $ 4# 5# Copyright (C) 2002, 2003 by Peder Stray <peder@ninja.no> 6# 7 8use strict; 9use Irssi; 10use Irssi::Irc; 11use Irssi::TextUI; 12 13# ======[ Script Header ]=============================================== 14 15use vars qw{$VERSION %IRSSI}; 16($VERSION) = '$Revision: 1.6 $' =~ / (\d+\.\d+) /; 17%IRSSI = ( 18 name => 'uptime', 19 authors => 'Peder Stray', 20 contact => 'peder@ninja.no', 21 url => 'http://ninja.no/irssi/uptime.pl', 22 license => 'GPL', 23 description => 'Try a little harder to figure out client uptime', 24 sbitems => 'uptime', 25 ); 26 27# ======[ Variables ]=================================================== 28 29my($timer) = 0; # ID of current timer 30 31# ======[ Helper functions ]============================================ 32 33# --------[ uptime_linux ]---------------------------------------------- 34 35sub uptime_linux { 36 my($sys_uptime); 37 my($irssi_start); 38 local(*FILE); 39 40 open FILE, "<", "/proc/uptime"; 41 $sys_uptime = (split " ", <FILE>)[0]; 42 close FILE; 43 44 open FILE, "<", "/proc/$$/stat"; 45 $irssi_start = (split " ", <FILE>)[21]; 46 close FILE; 47 48 return $sys_uptime - $irssi_start/100; 49} 50 51# --------[ uptime_solaris ]-------------------------------------------- 52 53sub uptime_solaris { 54 my($irssi_start); 55 56 $irssi_start = time - (stat("/proc/$$"))[9]; 57 58 return $irssi_start; 59} 60 61# --------[ uptime ]---------------------------------------------------- 62 63sub uptime { 64 my($sysname) = @_; 65 my($time); 66 67 if ($sysname eq 'Linux') { 68 $time = uptime_linux; 69 } elsif ($sysname eq 'SunOS') { 70 $time = uptime_solaris; 71 } else { 72 $time = time - $^T; 73 } 74 75 return $time; 76} 77 78# --------[ format_interval ]------------------------------------------- 79 80sub format_interval { 81 my($interval) = @_; 82 83 my(@interval,$str); 84 for (60, 60, 24, 365) { 85 push @interval, $interval%$_; 86 $interval = int($interval/$_); 87 } 88 $str = sprintf "%dy %dd %dh %dm %ds", $interval, @interval[3,2,1,0]; 89 $str =~ s/^(0. )+//; 90 91 return $str; 92} 93 94# ======[ Commands ]==================================================== 95 96# --------[ cmd_uptime ]------------------------------------------------ 97 98sub cmd_uptime { 99 my($data,$server,$witem) = @_; 100 my($sysname) = Irssi::parse_special('$sysname'); 101 my($uptime) = uptime($sysname); 102 my($str) = format_interval($uptime); 103 104 if ($data && $server) { 105 $server->command("MSG $data uptime: $str"); 106 } elsif ($witem && ($witem->{type} eq "CHANNEL" || 107 $witem->{type} eq "QUERY")) { 108 $witem->command("MSG ".$witem->{name}." uptime: $str"); 109 } else { 110 Irssi::printformat(MSGLEVEL_CLIENTCRAP, 'uptime', 111 $str, $sysname); 112 } 113} 114 115# ======[ Signal Hooks ]================================================ 116 117# --------[ sig_setup_changed ]----------------------------------------- 118 119sub sig_setup_changed { 120 my($interval) = Irssi::settings_get_int('uptime_refresh_interval'); 121 122 Irssi::timeout_remove($timer); 123 124 if ($interval < 1) { 125 $interval = 0; 126 } 127 128 return unless $interval; 129 130 $interval *= 1000; 131 $timer = Irssi::timeout_add($interval, 'uptime_refresh' , undef); 132} 133 134# ======[ Statusbar Hooks ]============================================= 135 136# --------[ sb_uptime ]------------------------------------------------- 137 138sub sb_uptime { 139 my($item, $get_size_only) = @_; 140 my $format = ""; 141 my($uptime) = uptime(Irssi::parse_special('$sysname')); 142 my($time) = format_interval($uptime); 143 144 $format = "{sb %g$time%n}"; 145 146 $item->default_handler($get_size_only, $format, undef, 1); 147} 148 149# ======[ Timers ]====================================================== 150 151# --------[ uptime_refresh ]-------------------------------------------- 152 153sub uptime_refresh { 154 Irssi::statusbar_items_redraw('uptime'); 155} 156 157# ======[ Setup ]======================================================= 158 159# --------[ Register commands ]----------------------------------------- 160 161Irssi::command_bind('uptime', 'cmd_uptime'); 162 163# --------[ Register formats ]------------------------------------------ 164 165Irssi::theme_register( 166[ 167 'uptime', 168 '{line_start}{hilight Uptime:} $0 ($1)', 169]); 170 171# --------[ Register settings ]----------------------------------------- 172 173Irssi::settings_add_int('upgrade', 'uptime_refresh_interval', 12); 174 175# --------[ Register signals ]------------------------------------------ 176 177Irssi::signal_add('setup changed', 'sig_setup_changed'); 178 179# --------[ Register statusbar items ]---------------------------------- 180 181Irssi::statusbar_item_register('uptime', undef, 'sb_uptime'); 182 183# --------[ Other setup ]----------------------------------------------- 184 185sig_setup_changed; 186 187# ======[ END ]========================================================= 188 189# Local Variables: 190# header-initial-hide: t 191# mode: header-minor 192# end: 193