feat: react to /group confirmdisband and recheck live membership on link confirm
This commit is contained in:
@@ -326,6 +326,13 @@ public static class ClaimLinkChatCommand
|
||||
$"{claimDesc} will be linked into '{groupName}'.",
|
||||
() =>
|
||||
{
|
||||
bool stillMember =
|
||||
ClaimLinkModSystem
|
||||
.PlayerData.GetPlayerDataByUid(playerUid)
|
||||
?.PlayerGroupMemberships.ContainsKey(groupId) == true;
|
||||
if (!stillMember)
|
||||
return TextCommandResult.Error($"You are no longer a member of '{groupName}'.");
|
||||
|
||||
bool success = ClaimLinkModSystem.Registry.AddEntry(playerUid, groupId, claimIndex);
|
||||
return success
|
||||
? TextCommandResult.Success($"Linked {claimDesc} to '{groupName}'.")
|
||||
|
||||
@@ -9,11 +9,12 @@ public class ClaimLinkCommandListener : ICommandHookListener
|
||||
{
|
||||
public string ModId => "claimlink";
|
||||
|
||||
public IReadOnlyList<string> Commands => new[] { "land" };
|
||||
public IReadOnlyList<string> Commands => new[] { "land", "group" };
|
||||
|
||||
public CommandRegistration Registration => new(Before, After);
|
||||
|
||||
internal static Dictionary<string, int> PendingLoads = new Dictionary<string, int>();
|
||||
internal static Dictionary<string, int> PendingDisbands = new Dictionary<string, int>();
|
||||
|
||||
private delegate void SubHandler(Caller caller, CmdArgs args);
|
||||
|
||||
@@ -32,15 +33,23 @@ public class ClaimLinkCommandListener : ICommandHookListener
|
||||
["cancel"] = ClaimCancel,
|
||||
};
|
||||
|
||||
private static readonly Dictionary<string, SubHandler> groupTopLevel = new()
|
||||
{
|
||||
["confirmdisband"] = GroupConfirmDisband,
|
||||
};
|
||||
|
||||
private static void Dispatch(TextCommandCallingArgs args)
|
||||
{
|
||||
Dictionary<string, SubHandler> table =
|
||||
args.Command?.Name == "group" ? groupTopLevel : topLevel;
|
||||
|
||||
CmdArgs rawArgs = args.RawArgs.Clone();
|
||||
|
||||
while (rawArgs.Length > 0)
|
||||
{
|
||||
string word = rawArgs.PeekWord();
|
||||
|
||||
if (topLevel.TryGetValue(word, out SubHandler? handler))
|
||||
if (table.TryGetValue(word, out SubHandler? handler))
|
||||
{
|
||||
rawArgs.PopWord();
|
||||
handler(args.Caller, rawArgs);
|
||||
@@ -58,7 +67,45 @@ public class ClaimLinkCommandListener : ICommandHookListener
|
||||
return null;
|
||||
}
|
||||
|
||||
private void After(TextCommandCallingArgs args, TextCommandResult result) { }
|
||||
private void After(TextCommandCallingArgs args, TextCommandResult result)
|
||||
{
|
||||
if (args.Caller.Player == null)
|
||||
return;
|
||||
|
||||
string uid = args.Caller.Player.PlayerUID;
|
||||
if (!PendingDisbands.TryGetValue(uid, out int groupId))
|
||||
return;
|
||||
|
||||
PendingDisbands.Remove(uid);
|
||||
|
||||
if (ClaimLinkModSystem.Groups.PlayerGroupsById.ContainsKey(groupId))
|
||||
return;
|
||||
|
||||
if (!ClaimLinkModSystem.Registry.Exists(groupId))
|
||||
return;
|
||||
|
||||
foreach (string memberUid in ClaimLinkModSystem.Registry.MemberUidsForGroup(groupId))
|
||||
ClaimLinkChatCommand.PendingActions.Remove(memberUid);
|
||||
|
||||
ClaimLinkModSystem.Registry.Remove(groupId);
|
||||
}
|
||||
|
||||
private static void GroupConfirmDisband(Caller caller, CmdArgs args)
|
||||
{
|
||||
if (caller.Player == null)
|
||||
return;
|
||||
|
||||
string? name = args.PopWord();
|
||||
int? groupId =
|
||||
name != null
|
||||
? ClaimLinkModSystem.Groups.GetPlayerGroupByName(name)?.Uid
|
||||
: caller.FromChatGroupId;
|
||||
|
||||
if (groupId == null)
|
||||
return;
|
||||
|
||||
PendingDisbands[caller.Player.PlayerUID] = (int)groupId;
|
||||
}
|
||||
|
||||
private static void Claim(Caller caller, CmdArgs args)
|
||||
{
|
||||
Reference in New Issue
Block a user