Rework timers to track when they started and how long they last so \!time can be more accurate. Closes #42

This commit is contained in:
skizzerz 2014-07-26 13:28:24 -05:00
parent a73b891b8d
commit b2d5d15606
2 changed files with 63 additions and 70 deletions

View File

@ -97,10 +97,10 @@ var.OPPED = False # Keeps track of whether the bot is opped
if botconfig.DEBUG_MODE:
var.NIGHT_TIME_LIMIT = 0 # 120
var.NIGHT_TIME_WARN = 0 # 90
var.DAY_TIME_LIMIT_WARN = 0 # 600
var.DAY_TIME_LIMIT_CHANGE = 0 # 120
var.SHORT_DAY_LIMIT_WARN = 0 # 400
var.SHORT_DAY_LIMIT_CHANGE = 0 # 120
var.DAY_TIME_LIMIT = 0 # 720
var.DAY_TIME_WARN = 0 # 600
var.SHORT_DAY_LIMIT = 0 # 520
var.SHORT_DAY_WARN = 0 # 400
var.KILL_IDLE_TIME = 0 # 300
var.WARN_IDLE_TIME = 0 # 180
var.JOIN_TIME_LIMIT = 0
@ -187,7 +187,7 @@ def reset_settings():
def reset_modes_timers(cli):
# Reset game timers
for x, timr in var.TIMERS.items():
timr.cancel()
timr[0].cancel()
var.TIMERS = {}
# Reset modes
@ -451,7 +451,7 @@ def join(cli, nick, chann_, rest):
# Set join timer
if var.JOIN_TIME_LIMIT:
t = threading.Timer(var.JOIN_TIME_LIMIT, kill_join, [cli, chan])
var.TIMERS['join'] = t
var.TIMERS['join'] = (t, time.time(), var.JOIN_TIME_LIMIT)
t.daemon = True
t.start()
@ -713,15 +713,6 @@ def hurry_up(cli, gameid, change):
"time remains for them to reach a decision; if darkness falls before they have done " +
"so, the majority will win the vote. No one will be lynched if there " +
"are no votes or an even split.\02"))
if not var.DAY_TIME_LIMIT_CHANGE:
return
if (len(var.list_players()) <= var.SHORT_DAY_PLAYERS):
tmr = threading.Timer(var.SHORT_DAY_LIMIT_CHANGE, hurry_up, [cli, var.DAY_ID, True])
else:
tmr = threading.Timer(var.DAY_TIME_LIMIT_CHANGE, hurry_up, [cli, var.DAY_ID, True])
tmr.daemon = True
var.TIMERS["day"] = tmr
tmr.start()
return
@ -1389,27 +1380,27 @@ def del_player(cli, nick, forced_death = False, devoice = True, end_game = True,
del var.CLONED[nick]
if nickrole == "time lord":
if "DAY_TIME_LIMIT_WARN" not in var.ORIGINAL_SETTINGS:
var.ORIGINAL_SETTINGS["DAY_TIME_LIMIT_WARN"] = var.DAY_TIME_LIMIT_WARN
if "DAY_TIME_LIMIT_CHANGE" not in var.ORIGINAL_SETTINGS:
var.ORIGINAL_SETTINGS["DAY_TIME_LIMIT_CHANGE"] = var.DAY_TIME_LIMIT_CHANGE
if "SHORT_DAY_LIMIT_WARN" not in var.ORIGINAL_SETTINGS:
var.ORIGINAL_SETTINGS["SHORT_DAY_LIMIT_WARN"] = var.SHORT_DAY_LIMIT_WARN
if "SHORT_DAY_LIMIT_CHANGE" not in var.ORIGINAL_SETTINGS:
var.ORIGINAL_SETTINGS["SHORT_DAY_LIMIT_CHANGE"] = var.SHORT_DAY_LIMIT_CHANGE
if "DAY_TIME_LIMIT" not in var.ORIGINAL_SETTINGS:
var.ORIGINAL_SETTINGS["DAY_TIME_LIMIT"] = var.DAY_TIME_LIMIT
if "DAY_TIME_WARN" not in var.ORIGINAL_SETTINGS:
var.ORIGINAL_SETTINGS["DAY_TIME_WARN"] = var.DAY_TIME_WARN
if "SHORT_DAY_LIMIT" not in var.ORIGINAL_SETTINGS:
var.ORIGINAL_SETTINGS["SHORT_DAY_LIMIT"] = var.SHORT_DAY_LIMIT
if "SHORT_DAY_WARN" not in var.ORIGINAL_SETTINGS:
var.ORIGINAL_SETTINGS["SHORT_DAY_WARN"] = var.SHORT_DAY_WARN
if "NIGHT_TIME_LIMIT" not in var.ORIGINAL_SETTINGS:
var.ORIGINAL_SETTINGS["NIGHT_TIME_LIMIT"] = var.NIGHT_TIME_LIMIT
if "NIGHT_TIME_WARN" not in var.ORIGINAL_SETTINGS:
var.ORIGINAL_SETTINGS["NIGHT_TIME_WARN"] = var.NIGHT_TIME_WARN
var.DAY_TIME_LIMIT_WARN = var.TIME_LORD_DAY_WARN
var.DAY_TIME_LIMIT_CHANGE = var.TIME_LORD_DAY_CHANGE
var.SHORT_DAY_LIMIT_WARN = var.TIME_LORD_DAY_WARN
var.SHORT_DAY_LIMIT_CHANGE = var.TIME_LORD_DAY_CHANGE
var.DAY_TIME_LIMIT = var.TIME_LORD_DAY_LIMIT
var.DAY_TIME_WARN = var.TIME_LORD_DAY_WARN
var.SHORT_DAY_LIMIT = var.TIME_LORD_DAY_LIMIT
var.SHORT_DAY_WARN = var.TIME_LORD_DAY_WARN
var.NIGHT_TIME_LIMIT = var.TIME_LORD_NIGHT_LIMIT
var.NIGHT_TIME_WARN = var.TIME_LORD_NIGHT_WARN
cli.msg(botconfig.CHANNEL, ("Tick tock! Since the time lord has died, " +
"day will now only last {0} seconds and night will now only " +
"last {1} seconds!").format(var.TIME_LORD_DAY_WARN + var.TIME_LORD_DAY_CHANGE, var.TIME_LORD_NIGHT_LIMIT))
"last {1} seconds!").format(var.TIME_LORD_DAY_LIMIT, var.TIME_LORD_NIGHT_LIMIT))
if nickrole == "vengeful ghost":
if var.GHOSTPHASE == "night":
var.VENGEFUL_GHOSTS[nick] = "wolves"
@ -1895,15 +1886,28 @@ def begin_day(cli):
var.LOGGER.logMessage(msg)
var.LOGGER.logBare("DAY", "BEGIN")
if var.DAY_TIME_LIMIT_WARN > 0: # Time limit enabled
var.DAY_ID = time.time()
if var.DAY_TIME_WARN > 0:
if var.STARTED_DAY_PLAYERS <= var.SHORT_DAY_PLAYERS:
t = threading.Timer(var.SHORT_DAY_LIMIT_WARN, hurry_up, [cli, var.DAY_ID, False])
t1 = threading.Timer(var.SHORT_DAY_WARN, hurry_up, [cli, var.DAY_ID, False])
l = var.SHORT_DAY_WARN
else:
t = threading.Timer(var.DAY_TIME_LIMIT_WARN, hurry_up, [cli, var.DAY_ID, False])
var.TIMERS["day_warn"] = t
t.daemon = True
t.start()
t1 = threading.Timer(var.DAY_TIME_WARN, hurry_up, [cli, var.DAY_ID, False])
l = var.DAY_TIME_WARN
var.TIMERS["day_warn"] = (t1, var.DAY_ID, l)
t1.daemon = True
t1.start()
if var.DAY_TIME_LIMIT > 0: # Time limit enabled
if var.STARTED_DAY_PLAYERS <= var.SHORT_DAY_PLAYERS:
t2 = threading.Timer(var.SHORT_DAY_LIMIT, hurry_up, [cli, var.DAY_ID, True])
l = var.SHORT_DAY_LIMIT
else:
t2 = threading.Timer(var.DAY_TIME_LIMIT, hurry_up, [cli, var.DAY_ID, True])
l = var.DAY_TIME_LIMIT
var.TIMERS["day"] = (t2, var.DAY_ID, l)
t2.daemon = True
t2.start()
def night_warn(cli, gameid):
if gameid != var.NIGHT_ID:
@ -2263,7 +2267,7 @@ def chk_nightdone(cli):
return
for x, t in var.TIMERS.items():
t.cancel()
t[0].cancel()
var.TIMERS = {}
if var.PHASE == "night": # Double check
@ -3425,7 +3429,7 @@ def transition_night(cli):
var.GHOSTPHASE = "night"
for x, tmr in var.TIMERS.items(): # cancel daytime timer
tmr.cancel()
tmr[0].cancel()
var.TIMERS = {}
# Reset nighttime variables
@ -3464,14 +3468,14 @@ def transition_night(cli):
if var.NIGHT_TIME_LIMIT > 0:
var.NIGHT_ID = time.time()
t = threading.Timer(var.NIGHT_TIME_LIMIT, transition_day, [cli, var.NIGHT_ID])
var.TIMERS["night"] = t
var.TIMERS["night"].daemon = True
var.TIMERS["night"] = (t, var.NIGHT_ID, var.NIGHT_TIME_LIMIT)
t.daemon = True
t.start()
if var.NIGHT_TIME_WARN > 0:
t2 = threading.Timer(var.NIGHT_TIME_WARN, night_warn, [cli, var.NIGHT_ID])
var.TIMERS["night_warn"] = t2
var.TIMERS["night_warn"].daemon = True
var.TIMERS["night_warn"] = (t2, var.NIGHT_ID, var.NIGHT_TIME_WARN)
t2.daemon = True
t2.start()
# convert amnesiac and kill village elder if necessary
@ -3948,7 +3952,7 @@ def start(cli, nick, chann_, rest):
# Cancel join timer
if 'join' in var.TIMERS:
var.TIMERS['join'].cancel()
var.TIMERS['join'][0].cancel()
del var.TIMERS['join']
if var.ORIGINAL_SETTINGS: # Custom settings
@ -4469,29 +4473,18 @@ def timeleft(cli, nick, chan, rest):
if chan != nick:
var.LAST_TIME = datetime.now()
if var.PHASE in var.TIMERS:
t = var.TIMERS[var.PHASE]
remaining = int((t[1] + t[2]) - time.time())
if var.PHASE == "day":
if var.STARTED_DAY_PLAYERS <= var.SHORT_DAY_PLAYERS:
remaining = int((var.SHORT_DAY_LIMIT_WARN +
var.SHORT_DAY_LIMIT_CHANGE) - (datetime.now() -
var.DAY_START_TIME).total_seconds())
what = "sunset"
elif var.PHASE == "night":
what = "sunrise"
elif var.PHASE == "join":
what = "game is canceled"
msg = "There is \u0002{0[0]:0>2}:{0[1]:0>2}\u0002 remaining until {1}.".format(divmod(remaining, 60), what)
else:
remaining = int((var.DAY_TIME_LIMIT_WARN +
var.DAY_TIME_LIMIT_CHANGE) - (datetime.now() -
var.DAY_START_TIME).total_seconds())
else:
remaining = int(var.NIGHT_TIME_LIMIT - (datetime.now() -
var.NIGHT_START_TIME).total_seconds())
#Check if timers are actually enabled
if (var.PHASE == "day") and ((var.STARTED_DAY_PLAYERS <= var.SHORT_DAY_PLAYERS and
var.SHORT_DAY_LIMIT_WARN == 0) or (var.DAY_TIME_LIMIT_WARN == 0 and
var.STARTED_DAY_PLAYERS > var.SHORT_DAY_PLAYERS)):
msg = "Day timers are currently disabled."
elif var.PHASE == "night" and var.NIGHT_TIME_LIMIT == 0:
msg = "Night timers are currently disabled."
else:
msg = "There is \x02{0[0]:0>2}:{0[1]:0>2}\x02 remaining until {1}.".format(
divmod(remaining, 60), "sunrise" if var.PHASE == "night" else "sunset")
msg = "{0} timers are currently disabled.".format(var.PHASE.capitalize())
if nick == chan:
pm(cli, nick, msg)

View File

@ -18,16 +18,16 @@ MAX_PLAYERS = 21
DRUNK_SHOTS_MULTIPLIER = 3
NIGHT_TIME_LIMIT = 120
NIGHT_TIME_WARN = 90 # should be less than NIGHT_TIME_LIMIT
DAY_TIME_LIMIT_WARN = 600
DAY_TIME_LIMIT_CHANGE = 120 # seconds after DAY_TIME_LIMIT_WARN has passed
DAY_TIME_LIMIT = 720
DAY_TIME_WARN = 600 # should be less than DAY_TIME_LIMIT
JOIN_TIME_LIMIT = 3600
# May only be set if the above are also set
SHORT_DAY_PLAYERS = 6 # Number of players left to have a short day
SHORT_DAY_LIMIT_WARN = 400
SHORT_DAY_LIMIT_CHANGE = 120
# If time lord is lynched, the timers get set to this instead (60s day, 30s night)
SHORT_DAY_LIMIT = 520
SHORT_DAY_WARN = 400
# If time lord dies, the timers get set to this instead (60s day, 30s night)
TIME_LORD_DAY_LIMIT = 60
TIME_LORD_DAY_WARN = 45
TIME_LORD_DAY_CHANGE = 15
TIME_LORD_NIGHT_LIMIT = 30
TIME_LORD_NIGHT_WARN = 20
KILL_IDLE_TIME = 300