try to fix calculations without introducing bugs
authorThomas Viehmann <tv@beamnet.de>
Tue, 30 Dec 2008 19:37:49 +0000 (20:37 +0100)
committerThomas Viehmann <tv@beamnet.de>
Tue, 30 Dec 2008 19:37:49 +0000 (20:37 +0100)
Signed-off-by: Thomas Viehmann <tv@beamnet.de>
Dak/plugin.py

index 1d6465b..76384ac 100644 (file)
@@ -1,9 +1,11 @@
 ###
 # Copyright (c) 2008, Joerg Jaspert <joerg@debian.org>
+# Copyright (c) 2008, Thomas Viehmann
 # GPL v2 (not later)
 ###
 
 import time
+import datetime
 import config
 import re
 
@@ -27,23 +29,36 @@ class Dak(callbacks.Plugin):
         self.__parent.__init__(irc)
         self.irc = irc
         self.fname = "dinstallcheck"
-        self.dinstallhour = [1, 7, 13, 19]
+        self.dinstallhour = [1, 7, 13, 18, 19, 19]
         self.dinstallmin = self.registryValue('dinstallminute')
-        warntime=10
-        self.warnframe = [i%60 for i in range(self.dinstallmin-warntime, self.dinstallmin+warntime+1, 1)]
-        self.dinstallframe = [i%60 for i in range(self.dinstallmin, self.dinstallmin+5, 1)]
+        self.warntime=10
+        self.dinstallduration=4
         self.channel = self.registryValue('channel')
         self.locks = {}
 
         def checktime():
-            (undef, undef, undef, hour, minute, undef, undef, undef, undef) = time.gmtime()
             log.debug("DAK: Regular dinstall time check")
-            if hour in self.dinstallhour:
-                log.debug("DAK: It is DINSTALL hour")
-                if minute in self.warnframe:
-                    log.debug("DAK: In Dinstall Warnframe")
-                    msgMaker = ircmsgs.privmsg
-                    if minute in self.dinstallframe:
+
+            now = datetime.datetime.utcnow()
+            # figure out time (in minutes) to next and from last dinstall
+            nextdinstall = None
+            lastdinstall = None
+            for h in self.dinstallhour:
+                ndt = now.replace(hour=h, minute=self.dinstallmin)
+                ldt = ndt
+                if ndt < now:
+                    ndt += datetime.timedelta(1)
+                if ldt > now:
+                    ldt -= datetime.timedelta(1)
+                ndt = int((ndt-now).seconds/60)
+                ldt = int((now-ldt).seconds/60)
+                if nextdinstall == None or ndt < nextdinstall:
+                    nextdinstall = ndt
+                if lastdinstall == None or ldt < lastdinstall:
+                    lastdinstall = ldt
+
+            if lastdinstall <= self.dinstallduration:
+                        msgMaker = ircmsgs.privmsg
                         log.debug("DAK: In Dinstall timeframe")
                         # No longer time to warn only, now is time to act, if we haven't already
                         if self.registryValue('dinstall') == True:
@@ -58,12 +73,13 @@ class Dak(callbacks.Plugin):
                                 irc.queueMsg(msgMaker(self.channel, "%s: DINSTALL time, stop working, unlocking %s" % (self.locks[key], key)))
                             self.locks={}
                         return
-                    else:  # if minute in self.dinstallframe
+            elif nextdinstall <= self.warntime:
                         # Not dinstall as far as we know, but we want to warn people if they have locks, dinstall is soon.
                         # We only want to warn once about locks people have, or we would do it every 30 seconds, which wouldnt be nice.
                         # Also, with warnframe larger than dinstallframe, this might warn in case the bot somehow misses dinstallframe.
                         # Like if it comes up late, or so. Or?
-                        log.debug("DAK: Not in Dinstall timeframe")
+                        msgMaker = ircmsgs.privmsg
+                        log.debug("DAK: In Dinstall Warnframe")
                         if self.registryValue('warned') == True:
                             log.debug("DAK: We already warned once, warn flag %s" % (self.registryValue('warned')))
                             return
@@ -76,15 +92,9 @@ class Dak(callbacks.Plugin):
                                 irc.queueMsg(msgMaker(self.channel, "%s: DINSTALL soon, hurry up" % (self.locks[key]) ))
                                 if key == "ALL":
                                     irc.queueMsg(msgMaker(self.channel, "%s: ALL locked. If you want to keep that, remember turning off cron" % (self.locks[key]) ))
-                else: # if minute in self.warnframe
-                    # Outside our warnframe.
-                    log.debug("DAK: Not in warnframe")
-                    conf.supybot.plugins.Dak.get('dinstall').setValue(False)
-                    conf.supybot.plugins.Dak.get('warned').setValue(False)
-
             else: # if hour in self.dinstallhour
                 # We are far outside a dinstall start
-                log.debug("DAK: Not even dinstall hour")
+                log.debug("DAK: no dinstall close")
                 conf.supybot.plugins.Dak.get('dinstall').setValue(False)
                 conf.supybot.plugins.Dak.get('warned').setValue(False)
 
@@ -145,7 +155,7 @@ class Dak(callbacks.Plugin):
         log.debug("I found that next dinstall will be at %s:%s" % (newhour, self.dinstallmin))
 
         start="%s:%s:%s" % (hour, minute, second)
-        stop="%s:%s:00" % (newhour, 52)
+        stop="%s:%s:00" % (newhour, self.dinstallmin)
         difference=deltatime(start, stop)
         irc.reply("I guess the next dinstall will be in %s" % (difference))
     dinstall = wrap(dinstall)
@@ -175,8 +185,8 @@ class Dak(callbacks.Plugin):
         text.append("Dinstall hour: %s, minute: %s" % (self.dinstallhour, self.dinstallmin))
         if len(self.locks) > 1:
             text.append("Current locks: %d (%s)" % (len(self.locks), self.locks))
-        text.append("Warnframe: %s" % (self.warnframe))
-        text.append("Dinstallframe: %s" % (self.dinstallframe))
+        text.append("Warns %d minutes before dinstall" % (self.warntime,))
+        text.append("Dinstall unlocking grace interval: dinstall to dinstall+%d" % (self.dinstallduration,))
         text.append("Dinstall flag: %s, Warnflag: %s" % (conf.supybot.plugins.Dak.get('dinstall'), conf.supybot.plugins.Dak.get('warned')))
         for key in text:
             irc.reply(key)