Properly fix automatic toggling of modes

This commit is contained in:
Vgr E. Barry 2017-03-23 11:56:52 -04:00
parent 0aea09f066
commit 0df627fcca
2 changed files with 40 additions and 45 deletions

View File

@ -209,6 +209,8 @@ class Channel(IRCContext):
user = users._get(targets[i], allow_bot=True) # FIXME
self.modes[c].add(user)
user.channels[self].add(c)
if user in var.OLD_MODES:
var.OLD_MODES[user].discard(c)
i += 1
elif c in list_modes: # stuff like bans, quiets, and ban and invite exempts

View File

@ -77,6 +77,7 @@ var.ADMIN_TO_PING = None
var.AFTER_FLASTGAME = None
var.PINGING_IFS = False
var.TIMERS = {}
var.OLD_MODES = defaultdict(set)
var.ORIGINAL_SETTINGS = {}
var.CURRENT_GAMEMODE = var.GAME_MODES["default"][0]()
@ -271,7 +272,7 @@ def reset_settings():
setattr(var, attr, var.ORIGINAL_SETTINGS[attr])
var.ORIGINAL_SETTINGS.clear()
def reset_modes_timers(cli):
def reset_modes_timers(var):
# Reset game timers
with var.WARNING_LOCK: # make sure it isn't being used by the ping join handler
for x, timr in var.TIMERS.items():
@ -281,20 +282,16 @@ def reset_modes_timers(cli):
# Reset modes
cmodes = []
for plr in list_players():
cmodes.append(("-v", plr))
if var.AUTO_TOGGLE_MODES:
for plr in var.USERS:
if not "moded" in var.USERS[plr]:
continue
for mode in var.USERS[plr]["moded"]:
cmodes.append(("+"+mode, plr))
users.get(plr).modes.update(users.get(plr).moded)
users.get(plr).moded = set()
cmodes.append(("-" + hooks.Features["PREFIX"]["+"], plr))
for user, modes in var.OLD_MODES.items():
for mode in modes:
cmodes.append(("+" + mode, user))
var.OLD_MODES.clear()
if var.QUIET_DEAD_PLAYERS:
for deadguy in var.DEAD:
if not is_fake_nick(deadguy):
cmodes.append(("-{0}".format(var.QUIET_MODE), var.QUIET_PREFIX+deadguy+"!*@*"))
mass_mode(cli, cmodes, ["-m"])
channels.Main.mode("-m", *cmodes)
def reset():
var.PHASE = "none" # "join", "day", or "night"
@ -387,7 +384,7 @@ def forced_exit(var, wrapper, message):
what="stop", cmd="fdie", prefix=botconfig.CMD_CHAR))
return
reset_modes_timers(wrapper.client)
reset_modes_timers(var)
reset()
msg = "{0} quit from {1}"
@ -432,7 +429,7 @@ def restart_program(var, wrapper, message):
what="restart", cmd="frestart", prefix=botconfig.CMD_CHAR))
return
reset_modes_timers(wrapper.client)
reset_modes_timers(var)
db.set_pre_restart_state(list_players())
reset()
@ -850,14 +847,12 @@ def join_player(var, wrapper, who=None, forced=False, *, sanity=True):
wrapper.pm(messages["warn_unacked"])
return False
cmodes = [("+v", wrapper.source.nick)]
cmodes = [("+" + hooks.Features["PREFIX"]["+"], wrapper.source)]
if var.PHASE == "none":
if not wrapper.source.is_fake or not botconfig.DEBUG_MODE:
if var.AUTO_TOGGLE_MODES and users.get(player).modes: # FIXME: Need to properly handle mode changes (whole block)
for mode in users.get(wrapper.source.nick).modes:
cmodes.append(("-"+mode, wrapper.source.nick))
users.get(wrapper.source.nick).moded.update(users.get(wrapper.source.nick).modes)
users.get(wrapper.source.nick).modes.clear()
for mode in var.AUTO_TOGGLE_MODES & wrapper.source.channels[channels.Main]:
cmodes.append(("-" + mode, wrapper.source))
var.OLD_MODES[wrapper.source].add(mode)
var.ROLES["person"].add(wrapper.source.nick) # FIXME: Need to store Users, not nicks
var.ALL_PLAYERS.append(wrapper.source)
var.PHASE = "join"
@ -906,12 +901,10 @@ def join_player(var, wrapper, who=None, forced=False, *, sanity=True):
var.ALL_PLAYERS.append(wrapper.source)
if not wrapper.source.is_fake or not botconfig.DEBUG_MODE:
if var.AUTO_TOGGLE_MODES and users.get(wrapper.source.nick).modes:
for mode in users.get(wrapper.source.nick).modes:
cmodes.append(("-"+mode, wrapper.source.nick))
users.get(wrapper.source.nick).moded.update(users.get(wrapper.source.nick).modes)
users.get(wrapper.source.nick).modes.clear()
wrapper.send(messages["player_joined"].format(wrapper.source.nick, len(pl) + 1))
for mode in var.AUTO_TOGGLE_MODES & wrapper.source.channels[channels.Main]:
cmodes.append(("-" + mode, wrapper.source))
var.OLD_MODES[wrapper.source].add(mode)
wrapper.send(messages["player_joined"].format(wrapper.source, len(pl) + 1))
if not sanity:
# Abandon Hope All Ye Who Enter Here
leave_deadchat(var, wrapper.source)
@ -961,7 +954,7 @@ def kill_join(var, wrapper):
pl = list_players()
pl.sort(key=lambda x: x.lower())
msg = "PING! " + break_long_message(pl).replace("\n", "\nPING! ")
reset_modes_timers(wrapper.client)
reset_modes_timers(var)
reset()
wrapper.send(*pl, first="PING! ")
wrapper.send(messages["game_idle_cancel"])
@ -1105,15 +1098,17 @@ def fstart(cli, nick, chan, rest):
cli.msg(botconfig.CHANNEL, messages["fstart_success"].format(nick))
start(cli, nick, botconfig.CHANNEL, forced = True)
@hook("kick")
def on_kicked(cli, nick, chan, victim, reason):
if victim == botconfig.NICK:
cli.join(chan)
if chan == botconfig.CHANNEL and var.CHANSERV_OP_COMMAND:
cli.msg(var.CHANSERV, var.CHANSERV_OP_COMMAND.format(channel=botconfig.CHANNEL))
if var.AUTO_TOGGLE_MODES and users.exists(victim):
users.get(victim).modes = set()
users.get(victim).moded = set()
@event_listener("chan_kick")
def kicked_modes(evt, var, chan, actor, target, reason):
if target is users.Bot and chan is channels.Main:
chan.join()
var.OLD_MODES.pop(target, None)
@event_listener("chan_part")
def parted_modes(evt, var, chan, user, reason):
if user is users.Bot and chan is channels.Main:
chan.join()
var.OLD_MODES.pop(user, None)
@cmd("stats", "players", pm=True, phases=("join", "day", "night"))
def stats(cli, nick, chan, rest):
@ -2225,7 +2220,7 @@ def stop_game(cli, winner="", abort=False, additional_winners=None, log=True):
user.send_messages()
reset_modes_timers(cli)
reset_modes_timers(var)
reset()
expire_tempbans()
@ -2247,7 +2242,7 @@ def chk_win(cli, end_game=True, winner=None):
if var.PHASE == "join":
if lpl == 0:
reset_modes_timers(cli)
reset_modes_timers(var)
reset()
@ -2705,11 +2700,9 @@ def del_player(cli, nick, forced_death=False, devoice=True, end_game=True, death
del var.TIMERS["start_votes"]
# Died during the joining process as a person
if var.AUTO_TOGGLE_MODES and users.exists(nick) and users.get(nick).moded:
for newmode in var.USERS[nick]["moded"]:
cmode.append(("+"+newmode, nick))
users.get(nick).modes.update(users.get(nick).moded)
users.get(nick).moded = set()
for mode in var.OLD_MODES[users._get(nick)]: # FIXME
cmode.append(("+" + mode, nick))
del var.OLD_MODES[users._get(nick)]
var.ALL_PLAYERS.remove(users._get(nick)) # FIXME
ret = not chk_win(cli)
else:
@ -5063,9 +5056,9 @@ def getfeatures(cli, nick, *rest):
var.MODES_PREFIXES = {}
for combo in allp:
var.MODES_PREFIXES[combo[1]] = combo[0] # For some reason this needs to be backwards
if var.AUTO_TOGGLE_MODES:
var.AUTO_TOGGLE_MODES = set(var.AUTO_TOGGLE_MODES)
if var.AUTO_TOGGLE_MODES: # this is ugly, but I'm too lazy to fix it. it works, so that's fine
tocheck = set(var.AUTO_TOGGLE_MODES)
var.AUTO_TOGGLE_MODES = set(var.AUTO_TOGGLE_MODES)
for mode in tocheck:
if not mode in var.MODES_PREFIXES.keys() and not mode in var.MODES_PREFIXES.values():
var.AUTO_TOGGLE_MODES.remove(mode)
@ -6157,7 +6150,7 @@ def reset_game(cli, nick, chan, rest):
stop_game(cli, log=False)
else:
pl = [p for p in list_players() if not is_fake_nick(p)]
reset_modes_timers(cli)
reset_modes_timers(var)
reset()
cli.msg(botconfig.CHANNEL, "PING! {0}".format(" ".join(pl)))