diff --git a/ClaimLink/ClaimLinkChatCommand.cs b/ClaimLink/ClaimLinkChatCommand.cs index d6a09bf..90ce34f 100644 --- a/ClaimLink/ClaimLinkChatCommand.cs +++ b/ClaimLink/ClaimLinkChatCommand.cs @@ -329,6 +329,7 @@ public static class ClaimLinkChatCommand string groupName = (string)args[0]; IPlayer target = (IPlayer)args[1]; IPlayer player = args.Caller.Player; + string playerUid = player.PlayerUID; TextCommandResult? err = TryResolveGroup(groupName, out PlayerGroup group); if (err != null) return err; @@ -342,36 +343,39 @@ public static class ClaimLinkChatCommand err = RequireMember(target, group); if (err != null) return err; - if (target.PlayerUID == player.PlayerUID) - return TextCommandResult.Error($"You already own '{groupName}'."); + err = RequireNotAlreadyOwner(group, target); + if (err != null) return err; - string playerUid = player.PlayerUID; - string targetName = target.PlayerName; + return Stage(playerUid, $"Ownership of '{groupName}' will be transferred to {target.PlayerName}.", + () => ExecuteTransferOwnership(group, target)); + } + + private static TextCommandResult? RequireNotAlreadyOwner(PlayerGroup group, IPlayer target) + { + return target.PlayerUID == group.OwnerUID + ? TextCommandResult.Error($"{target.PlayerName} already owns '{group.Name}'.") + : null; + } + + private static TextCommandResult ExecuteTransferOwnership(PlayerGroup group, IPlayer target) + { + string oldOwnerUid = group.OwnerUID; string targetUid = target.PlayerUID; - - EnumPlayerGroupMemberShip oldOwnerLevel = player.GetGroup(group.Uid)!.Level; + IPlayer? oldOwner = ClaimLinkModSystem.World.PlayerByUid(oldOwnerUid); + EnumPlayerGroupMemberShip? oldOwnerLevel = oldOwner?.GetGroup(group.Uid)?.Level; EnumPlayerGroupMemberShip targetLevel = target.GetGroup(group.Uid)!.Level; - return Stage(playerUid, $"Ownership of '{groupName}' will be transferred to {targetName}.", () => - { - string beforeOwnerUid = group.OwnerUID; + // TODO remove debug logging once transfer ownership persistence is confirmed tested + ClaimLinkModSystem.Logger.Notification( + $"claimlink: transferownership '{group.Name}' (uid {group.Uid}) BEFORE OwnerUID={oldOwnerUid} " + + $"(old owner {oldOwner?.PlayerName ?? oldOwnerUid} level={oldOwnerLevel}, new owner {target.PlayerName}/{targetUid} level={targetLevel})"); - // TODO remove debug logging once transfer ownership persistence is confirmed tested - ClaimLinkModSystem.Logger.Notification( - $"claimlink: transferownership '{groupName}' (uid {group.Uid}) BEFORE OwnerUID={beforeOwnerUid} " + - $"(old owner {player.PlayerName}/{playerUid} level={oldOwnerLevel}, new owner {targetName}/{targetUid} level={targetLevel})"); + group.OwnerUID = targetUid; - group.OwnerUID = targetUid; + ClaimLinkModSystem.Logger.Notification( + $"claimlink: transferownership '{group.Name}' (uid {group.Uid}) AFTER OwnerUID={group.OwnerUID}"); - EnumPlayerGroupMemberShip afterOldOwnerLevel = player.GetGroup(group.Uid)!.Level; - EnumPlayerGroupMemberShip afterTargetLevel = target.GetGroup(group.Uid)!.Level; - - ClaimLinkModSystem.Logger.Notification( - $"claimlink: transferownership '{groupName}' (uid {group.Uid}) AFTER OwnerUID={group.OwnerUID} " + - $"(old owner {player.PlayerName}/{playerUid} level={afterOldOwnerLevel}, new owner {targetName}/{targetUid} level={afterTargetLevel})"); - - return TextCommandResult.Success($"'{groupName}' is now owned by {targetName}."); - }); + return TextCommandResult.Success($"'{group.Name}' is now owned by {target.PlayerName}."); } public static TextCommandResult Info(TextCommandCallingArgs args) @@ -434,6 +438,24 @@ public static class ClaimLinkChatCommand public static TextCommandResult AdminDelete(TextCommandCallingArgs args) => TextCommandResult.Success("stub: claimlink admin delete"); public static TextCommandResult AdminUnlink(TextCommandCallingArgs args) => TextCommandResult.Success("stub: claimlink admin unlink"); public static TextCommandResult AdminKick(TextCommandCallingArgs args) => TextCommandResult.Success("stub: claimlink admin kick"); - public static TextCommandResult AdminTransferOwnership(TextCommandCallingArgs args) => TextCommandResult.Success("stub: claimlink admin transferownership"); + public static TextCommandResult AdminTransferOwnership(TextCommandCallingArgs args) + { + string groupName = (string)args[0]; + IPlayer target = (IPlayer)args[1]; + + TextCommandResult? err = TryResolveGroup(groupName, out PlayerGroup group); + if (err != null) return err; + + err = TryResolveClaimLink(group, out _); + if (err != null) return err; + + err = RequireMember(target, group); + if (err != null) return err; + + err = RequireNotAlreadyOwner(group, target); + if (err != null) return err; + + return ExecuteTransferOwnership(group, target); + } public static TextCommandResult AdminInfo(TextCommandCallingArgs args) => TextCommandResult.Success("stub: claimlink admin info"); }