feat: implement claimlink admin transferownership
This commit is contained in:
@@ -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");
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user