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