]> git.donarmstrong.com Git - infobot.git/blob - src/Modules/Uptime.pl
- added support/hack for channel +o as "+o" in bot user file.
[infobot.git] / src / Modules / Uptime.pl
1 #
2 # Uptime.pl: Uptime daemon.
3 #    Author: dms
4 #   Version: v0.3 (19991008)
5 #   Created: 19990925.
6 #
7
8 use strict;
9
10 my $uptimerecords       = 3;
11
12 sub uptimeNow {
13   return time() - $^T;
14 }
15
16 sub uptimeStr {
17   my $uptimenow = &uptimeNow();
18
19   if (defined $_[0]) {
20     return "$uptimenow.$$ running $bot_version, ended ". localtime(time());
21   } else {
22     return "$uptimenow running $bot_version";
23   }
24 }
25
26 sub uptimeGetInfo {
27   my (%uptime,%done);
28   my ($uptime,$pid);
29   my @results;
30   my $file = $file{utm};
31
32   &::DEBUG("uGI: reading $file...");
33
34   if (!open(IN, $file)) {
35     &status("Writing uptime file for first time usage (nothing special).");
36     open(OUT,">$file");
37     close OUT;
38   } else {
39     while (<IN>) {
40       chop;
41
42       if (/^(\d+)\.(\d+) (.*)/) {
43           $uptime{$1}{$2} = $3;
44       }
45     }
46     close IN;
47   }
48
49   &uptimeStr(1)   =~ /^(\d+)\.(\d+) (.*)/;
50   $uptime{$1}{$2} = $3;
51
52   # fixed up bad implementation :)
53   # should be no problems, even if uptime or pid is duplicated.
54   ## WARN: run away forks may get through here, have to fix.
55   foreach $uptime (sort {$b <=> $a} keys %uptime) {
56     foreach $pid (keys %{ $uptime{$uptime} }) {
57         next if (exists $done{$pid});
58
59         push(@results,"$uptime.$pid $uptime{$uptime}{$pid}");
60         $done{$pid} = 1;
61         last if (scalar @results == $uptimerecords);
62     }
63     last if (scalar @results == $uptimerecords);
64   }
65
66   return @results;
67 }
68
69 sub uptimeWriteFile {
70   my @results = &uptimeGetInfo();
71   my $file = $file{utm};
72
73   if ($$ != $bot_pid) {
74     &FIXME("uptime: forked process doing weird things!");
75     exit 0;
76   }
77
78   if (!open(OUT,">$file")) {
79     &status("error: cannot write to $file.");
80     return;
81   }
82
83   foreach (@results) {
84     print OUT "$_\n";
85   }
86
87   close OUT;
88
89   $conn->schedule(&getRandomInt("1800-3600"), \&uptimeWriteFile, "");
90   return;
91 }
92
93 1;