html/uptime.pl
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
8 use strict;
9 use Irssi;
10 use Irssi::Irc;
11 use Irssi::TextUI;
12
13 # ======[ Script Header ]===============================================
14
15 use 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
29 my($timer) = 0; # ID of current timer
30
31 # ======[ Helper functions ]============================================
32
33 # --------[ uptime_linux ]----------------------------------------------
34
35 sub 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
53 sub uptime_solaris {
54 my($irssi_start);
55
56 $irssi_start = time - (stat("/proc/$$"))[9];
57
58 return $irssi_start;
59 }
60
61 # --------[ uptime ]----------------------------------------------------
62
63 sub 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
80 sub 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
98 sub 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
119 sub 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
138 sub 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
153 sub uptime_refresh {
154 Irssi::statusbar_items_redraw('uptime');
155 }
156
157 # ======[ Setup ]=======================================================
158
159 # --------[ Register commands ]-----------------------------------------
160
161 Irssi::command_bind('uptime', 'cmd_uptime');
162
163 # --------[ Register formats ]------------------------------------------
164
165 Irssi::theme_register(
166 [
167 'uptime',
168 '{line_start}{hilight Uptime:} $0 ($1)',
169 ]);
170
171 # --------[ Register settings ]-----------------------------------------
172
173 Irssi::settings_add_int('upgrade', 'uptime_refresh_interval', 12);
174
175 # --------[ Register signals ]------------------------------------------
176
177 Irssi::signal_add('setup changed', 'sig_setup_changed');
178
179 # --------[ Register statusbar items ]----------------------------------
180
181 Irssi::statusbar_item_register('uptime', undef, 'sb_uptime');
182
183 # --------[ Other setup ]-----------------------------------------------
184
185 sig_setup_changed;
186
187 # ======[ END ]=========================================================
188
189 # Local Variables:
190 # header-initial-hide: t
191 # mode: header-minor
192 # end: