Merge pull request #305 from lykoss/return_village

Fix return_to_village for disconnected users
This commit is contained in:
Em Barry 2017-12-07 12:08:34 -05:00 committed by GitHub
commit 1408ab9c4a
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 23 additions and 9 deletions

View File

@ -158,6 +158,7 @@
"account_reidentify": "Please reidentify to the account \u0002{0}\u0002",
"account_midgame_change": "Please do not change accounts midgame",
"player_return": "\u0002{0}\u0002 has returned to the village.",
"player_return_nickchange": "\u0002{0}\u0002 has returned to the village (was \u0002{1}\u0002).",
"command_ratelimited": "This command is rate-limited. Please wait a while before using it again.",
"stats": "{0}It is currently {4}. There {3} {1}, and {2}.",
"daylight_warning": "\u0002As the sun sinks inexorably toward the horizon, turning the lanky pine trees into fire-edged silhouettes, the villagers are reminded that very little 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.\u0002",

View File

@ -583,7 +583,6 @@ def replace(var, wrapper, message):
evt.dispatch(var, target, wrapper.source)
rename_player(var, wrapper.source, target.nick)
if var.PHASE in var.GAME_PHASES:
# FIXME: This doesn't actually do anything right now because rename_player calls return_to_village with show_message=True
return_to_village(var, target, show_message=False)
if not var.DEVOICE_DURING_NIGHT or var.PHASE != "night":
@ -2898,7 +2897,7 @@ def fgoat(var, wrapper, message):
wrapper.send(messages["goat_success"].format(wrapper.source, goatact, togoat))
@handle_error
def return_to_village(var, target, *, show_message):
def return_to_village(var, target, *, show_message, new_user=None):
# Note: we do not manipulate or check target.disconnected, as that property
# is used to determine if they are entirely dc'ed rather than just maybe using
# a different account or /parting the channel. If they were dced for real and
@ -2906,6 +2905,9 @@ def return_to_village(var, target, *, show_message):
with var.GRAVEYARD_LOCK:
if target in var.DISCONNECTED:
del var.DISCONNECTED[target]
if new_user is None:
new_user = target
var.LAST_SAID_TIME[target.nick] = datetime.now()
for roleset in var.ORIGINAL_ROLES.values():
if "(dced)" + target.nick in roleset:
@ -2915,9 +2917,22 @@ def return_to_village(var, target, *, show_message):
if target.nick in var.DCED_PLAYERS:
var.PLAYERS[target.nick] = var.DCED_PLAYERS.pop(target.nick)
if new_user is not target:
# different users, perform a swap. This will clean up disconnected users.
evt = Event("swap_player", {})
evt.dispatch(var, target, new_user)
if target.nick != new_user.nick:
# have a nickchange, update tracking vars
rename_player(var, new_user, target.nick)
if show_message:
channels.Main.mode(("+" + hooks.Features["PREFIX"]["+"], target))
channels.Main.send(messages["player_return"].format(target))
if not var.DEVOICE_DURING_NIGHT or var.PHASE != "night":
channels.Main.mode(("+" + hooks.Features["PREFIX"]["+"], new_user))
if target.nick == new_user.nick:
channels.Main.send(messages["player_return"].format(new_user))
else:
channels.Main.send(messages["player_return_nickchange"].format(new_user, target))
else:
# this particular user doesn't exist in var.DISCONNECTED, but that doesn't
# mean that they aren't dced. They may have rejoined as a different nick,
@ -2929,7 +2944,7 @@ def return_to_village(var, target, *, show_message):
userlist = users._get(host=target.host, allow_multiple=True)
userlist = [u for u in userlist if u in var.DISCONNECTED]
if len(userlist) == 1:
return_to_village(var, userlist[0], show_message=show_message)
return_to_village(var, userlist[0], show_message=show_message, new_user=target)
def rename_player(var, user, prefix):
nick = user.nick
@ -3050,10 +3065,6 @@ def rename_player(var, user, prefix):
var.START_VOTES.discard(prefix)
var.START_VOTES.add(nick)
# Check if player was disconnected
if var.PHASE in var.GAME_PHASES:
return_to_village(var, user, show_message=True)
if prefix in var.NO_LYNCH:
var.NO_LYNCH.remove(prefix)
var.NO_LYNCH.add(nick)
@ -3091,6 +3102,8 @@ def nick_change(evt, var, user, old_rawnick):
return
rename_player(var, user, nick)
# perhaps mark them as back
return_to_village(var, user, show_message=True)
@event_listener("cleanup_user")
def cleanup_user(evt, var, user):