- make sure the watchdog is not called repeatedly in a short time frame
authorAndreas Scherbaum <[email protected]>
Sun, 29 Jan 2012 14:18:19 +0000 (15:18 +0100)
committerAndreas Scherbaum <[email protected]>
Sun, 29 Jan 2012 14:18:19 +0000 (15:18 +0100)
docbot.pl

index 602c5158aa74362b4811ca87b3097b1c7d97e8d8..c6c56afc96917f016548440befc967732ec95f8c 100755 (executable)
--- a/docbot.pl
+++ b/docbot.pl
@@ -746,34 +746,45 @@ sub find_irc_session {
 #  none
 # return:
 #  none
-sub watchdog {
+BEGIN {
+    # last time the watchdog was called
+    # initialize to now()
+    my $watchdog_last_call = time();
 
-    foreach my $session (keys(%main::sessions)) {
-        if (defined(read_session_activity($session))) {
-            if (read_session_activity($session) < (time() - 180) and read_session_activity($session) < (time() - 240)) {
-                print_msg("Session $session timed out", INFO);
-                # FIXME: what to do?
-                # automatic reconnects should be done by a plugin
-            } else {
-                my $irc = $main::sessions{$session}{'session'};
-
-                # validate nickname
-                my $logged_in = $irc->logged_in();
-                my $nick_name = $irc->nick_name();
-                if ($logged_in and $main::sessions{$session}{'past_motd'} == 1) {
-                    if ($nick_name ne $main::sessions{$session}{'nickname'}) {
-                        if ($main::sessions{$session}{'last_nick_change_attempt'} < (time() - 35)) {
-                            # the bot is not using the desired nickname, try changing this
-                            print_msg("nickname is: $nick_name, desired nickname is: " . $main::sessions{$session}{'nickname'} . ", issuing nick change", INFO);
-                            $irc->yield( nick => $main::sessions{$session}{'nickname'} );
-                            $main::sessions{$session}{'last_nick_change_attempt'} = time();
+    sub watchdog {
+
+        if ((time() - $watchdog_last_call) < 5) {
+            # repeated call
+            return;
+        }
+        $watchdog_last_call = time();
+
+        foreach my $session (keys(%main::sessions)) {
+            if (defined(read_session_activity($session))) {
+                if (read_session_activity($session) < (time() - 180) and read_session_activity($session) < (time() - 240)) {
+                    print_msg("Session $session timed out", INFO);
+                    # automatic reconnects should be done by a plugin
+                } else {
+                    my $irc = $main::sessions{$session}{'session'};
+
+                    # validate nickname
+                    my $logged_in = $irc->logged_in();
+                    my $nick_name = $irc->nick_name();
+                    if ($logged_in and $main::sessions{$session}{'past_motd'} == 1) {
+                        if ($nick_name ne $main::sessions{$session}{'nickname'}) {
+                            if ($main::sessions{$session}{'last_nick_change_attempt'} < (time() - 35)) {
+                                # the bot is not using the desired nickname, try changing this
+                                print_msg("nickname is: $nick_name, desired nickname is: " . $main::sessions{$session}{'nickname'} . ", issuing nick change", INFO);
+                                $irc->yield( nick => $main::sessions{$session}{'nickname'} );
+                                $main::sessions{$session}{'last_nick_change_attempt'} = time();
+                            }
                         }
                     }
                 }
             }
         }
-    }
 
+    }
 }