diff --git a/ClanTagRankCommands.csproj b/ClanTagRankCommands.csproj index fbf8e4f..d8a827f 100644 --- a/ClanTagRankCommands.csproj +++ b/ClanTagRankCommands.csproj @@ -10,12 +10,13 @@ + - + diff --git a/Commands/InviteGuestCommand.cs b/Commands/InviteGuestCommand.cs index ab36f00..ed914bb 100644 --- a/Commands/InviteGuestCommand.cs +++ b/Commands/InviteGuestCommand.cs @@ -39,15 +39,32 @@ namespace ClanTagRankCommands.Commands public override async Task ExecuteAsync(GameEvent gameEvent) { - if(gameEvent.Target is not null && gameEvent.Target.IsIngame) + if (gameEvent.Target.Level >= gameEvent.Origin.Level && gameEvent.Origin.Level != EFClient.Permission.Creator) { - gameEvent.Origin.Tell($"Can't set {gameEvent.Target.Name} to Guest, while they are online."); + gameEvent.Origin.Tell("You can't invite someone with the same or higher permissions than you"); + return; } - if(gameEvent.Target is not null && gameEvent.Target.Tag is not null) + var token = gameEvent.Owner.Manager.CancellationToken; + var clienttag = await _metaService.GetPersistentMetaByLookup("ClientTagV2", "ClientTagNameV2", gameEvent.Target.ClientId, token); + if (gameEvent.Target is not null && gameEvent.Target.IsIngame && (gameEvent.Target.Tag is null)) { - if(gameEvent.Target.Tag.Contains("Guest" ) || gameEvent.Target.Tag.Contains("Donator") || gameEvent.Target.Tag.Contains("VIP")) + + gameEvent.Target.Tell($"you have been temporarily invited to join Donator servers by {gameEvent.Origin.Name}"); + } + if (gameEvent.Target is not null && clienttag is not null) + { + if ((clienttag?.Value.Contains("Guest") ?? false)) { - gameEvent.Origin.Tell($"Can't set {gameEvent.Target.Tag} {gameEvent.Target.Name} to Guest, they already have a rank."); + gameEvent.Target.Tag = null; + await _metaService.RemovePersistentMeta(EFMeta.ClientTagV2, gameEvent.Target.ClientId, gameEvent.Owner.Manager.CancellationToken); + gameEvent.Target.Tell($"Your guest invite has been revoked by {gameEvent.Origin.Name}"); + gameEvent.Origin.Tell($"Guest invite has been revoked for {gameEvent.Target.Name}"); + return; + + } + else if((clienttag?.Value.Contains("Donator") ?? false) || (clienttag?.Value.Contains("VIP") ?? false)) + { + gameEvent.Origin.Tell($"Can't set {clienttag?.Value} {gameEvent.Target.Name} to Guest, they already have a rank."); return; } } @@ -58,7 +75,7 @@ namespace ClanTagRankCommands.Commands } - var token = gameEvent.Owner.Manager.CancellationToken; + var availableTags = await _metaService.GetPersistentMetaValue>>(EFMeta.ClientTagNameV2, token); var matchingTag = availableTags.FirstOrDefault(tag => tag.Value == "Guest".Trim()); diff --git a/Commands/SetDonatorCommand.cs b/Commands/SetDonatorCommand.cs index 9891f62..5fdaaa3 100644 --- a/Commands/SetDonatorCommand.cs +++ b/Commands/SetDonatorCommand.cs @@ -1,5 +1,7 @@ using System.Collections.Generic; using System.Linq; +using System.Security.Policy; +using System.Threading; using System.Threading.Tasks; using Data.Models; using Data.Models.Client; @@ -15,9 +17,13 @@ namespace ClanTagRankCommands.Commands public class SetDonatorCommand : Command { private readonly IMetaServiceV2 _metaService; + private readonly IRemoteCommandService _remoteCommandService; - public SetDonatorCommand(CommandConfiguration config, ITranslationLookup layout, IMetaServiceV2 metaService) : + + + + public SetDonatorCommand(CommandConfiguration config, ITranslationLookup layout, IMetaServiceV2 metaService, IRemoteCommandService remoteCommandService) : base(config, layout) { Name = "SetDonator"; @@ -35,6 +41,7 @@ namespace ClanTagRankCommands.Commands }; _metaService = metaService; + _remoteCommandService = remoteCommandService; } public override async Task ExecuteAsync(GameEvent gameEvent) @@ -43,51 +50,166 @@ namespace ClanTagRankCommands.Commands var availableTags = await _metaService.GetPersistentMetaValue>>(EFMeta.ClientTagNameV2, token); var matchingTag = availableTags.FirstOrDefault(tag => tag.Value == "Donator".Trim()); - - gameEvent.Target.Tag = matchingTag.Value; - await _metaService.SetPersistentMetaForLookupKey(EFMeta.ClientTagV2, EFMeta.ClientTagNameV2, matchingTag.Id, - gameEvent.Target.ClientId, token); - if (gameEvent.Target.Level < EFClient.Permission.Moderator) + var clienttag = await _metaService.GetPersistentMetaByLookup("ClientTagV2", "ClientTagNameV2", gameEvent.Target.ClientId, token); + if (gameEvent.Target is not null && gameEvent.Target.IsIngame) { - gameEvent.Target.SetLevel(EFClient.Permission.Trusted, gameEvent.Origin); - } - - gameEvent.Origin.Tell($"Set {gameEvent.Target.Name} to Donator"); - if (gameEvent.Target.IsIngame) - { - gameEvent.Target.Tell($"Your rank has been set to Donator!"); - } - else - { - var cmd = $"{Utilities.CommandPrefix}om @{gameEvent.Target.ClientId} Your rank has been set to Donator!"; - var impersonatedCommandEvent = new GameEvent + if (gameEvent.Target.Tag is null || gameEvent.Target.Tag.Contains("Guest")) { - Type = GameEvent.EventType.Command, - Origin = gameEvent.Origin, - //ImpersonationOrigin = gameEvent.Origin, - Message = cmd, - Data = cmd, - Owner = gameEvent.Owner, - CorrelationId = gameEvent.CorrelationId - }; - gameEvent.Owner.Manager.AddEvent(impersonatedCommandEvent); + gameEvent.Origin.Tell($"set {gameEvent.Target.Name}'s rank"); + if (gameEvent.Target.IsIngame) + { + gameEvent.Target.Tell($"Your rank has been set to Donator"); + } - var result = await impersonatedCommandEvent.WaitAsync(Utilities.DefaultCommandTimeout, - gameEvent.Owner.Manager.CancellationToken); - await result.WaitAsync(Utilities.DefaultCommandTimeout, gameEvent.Owner.Manager.CancellationToken); + var args3 = new List(); + args3.Add(matchingTag.Value); + await _remoteCommandService.Execute(gameEvent.Origin.ClientId, gameEvent.Target.ClientId, "sct", + args3, gameEvent.Owner); + //var sct = $"{Utilities.CommandPrefix}sct @{gameEvent.Target.ClientId} {matchingTag.Value}"; + //await gameEvent.Owner.ExecuteCommandAsync(sct); + if (gameEvent.Target.Level < EFClient.Permission.Moderator && gameEvent.Target.Level != EFClient.Permission.Banned) + { + gameEvent.Target.SetLevel(EFClient.Permission.Trusted, gameEvent.Origin); + } + } + else if (gameEvent.Target.Tag.Contains("Donator")) + { + gameEvent.Origin.Tell($"Unset {gameEvent.Target.Name}'s rank"); + if (gameEvent.Target.IsIngame) + { + gameEvent.Target.Tell($"Your Donator rank has been removed"); + } - // remove the added command response - // todo: something weird happening making this change required - var responses = gameEvent.Owner.Manager.ProcessingEvents - .Where(ev => ev.Value.CorrelationId == impersonatedCommandEvent.CorrelationId) - .SelectMany(ev => ev.Value.Output) - .ToList(); + //var uct = $"{Utilities.CommandPrefix}uct @{gameEvent.Target.ClientId}"; + //await gameEvent.Owner.ExecuteCommandAsync(uct); + var args = new List(); + var commandResponse = + await _remoteCommandService.Execute(gameEvent.Origin.ClientId, gameEvent.Target.ClientId, "uct", + args, gameEvent.Owner); + //string.Join(".", commandResponse.Select(result => result.Response)); + if (gameEvent.Target.Level < EFClient.Permission.Moderator && gameEvent.Target.Level != EFClient.Permission.Banned) + { + gameEvent.Target.SetLevel(EFClient.Permission.User, gameEvent.Origin); + } - foreach (var output in responses) - await gameEvent.Origin.Tell(_translationLookup["COMMANDS_RUN_AS_SUCCESS"].FormatExt(output)) - .WaitAsync(); + + } + + else if(gameEvent.Target.Tag is not null && !gameEvent.Target.Tag.Contains("Guest")) + { + gameEvent.Origin.Tell($"Error! Can't set {gameEvent.Target.Name}'s tag, because a different tag is already set"); + } } + else if(gameEvent.Target is not null && !gameEvent.Target.IsIngame) + { + if (clienttag is null || (clienttag?.Value.Contains("Guest") ?? false)) + { + gameEvent.Origin.Tell($"set {gameEvent.Target.Name}'s rank"); + + var args4 = new List(); + args4.Add("Your rank has been set to Donator"); + await _remoteCommandService.Execute(gameEvent.Origin.ClientId, gameEvent.Target.ClientId, "om", + args4, gameEvent.Owner); + //var om = $"{Utilities.CommandPrefix}om @{gameEvent.Target.ClientId} Your rank has been set to Donator"; + //await gameEvent.Owner.ExecuteCommandAsync(om); + var args3 = new List(); + args3.Add(matchingTag.Value); + await _remoteCommandService.Execute(gameEvent.Origin.ClientId, gameEvent.Target.ClientId, "sct", + args3, gameEvent.Owner); + //var sct = $"{Utilities.CommandPrefix}sct @{gameEvent.Target.ClientId} {matchingTag.Value}"; + //await gameEvent.Owner.ExecuteCommandAsync(sct); + if (gameEvent.Target.Level < EFClient.Permission.Moderator && gameEvent.Target.Level != EFClient.Permission.Banned) + { + gameEvent.Target.SetLevel(EFClient.Permission.Trusted, gameEvent.Origin); + } + } + else if ((clienttag?.Value.Contains("Donator") ?? false)) + { + gameEvent.Origin.Tell($"Unset {gameEvent.Target.Name}'s rank"); + + + //var om = $"{Utilities.CommandPrefix}om @{gameEvent.Target.ClientId} Your Donator rank has been removed"; + //await gameEvent.Owner.ExecuteCommandAsync(om); + var args2 = new List(); + args2.Add("Your Donator rank has been removed"); + await _remoteCommandService.Execute(gameEvent.Origin.ClientId, gameEvent.Target.ClientId, "om", + args2, gameEvent.Owner); + + //var uct = $"{Utilities.CommandPrefix}uct @{gameEvent.Target.ClientId}"; + //await gameEvent.Owner.ExecuteCommandAsync(uct); + var args = new List(); + var commandResponse = + await _remoteCommandService.Execute(gameEvent.Origin.ClientId, gameEvent.Target.ClientId, "uct", + args, gameEvent.Owner); + //string.Join(".", commandResponse.Select(result => result.Response)); + if (gameEvent.Target.Level < EFClient.Permission.Moderator && gameEvent.Target.Level != EFClient.Permission.Banned) + { + gameEvent.Target.SetLevel(EFClient.Permission.User, gameEvent.Origin); + } + + + + } + + else if (gameEvent.Target.Tag is not null && clienttag is not null && !gameEvent.Target.Tag.Contains("Guest")) + { + gameEvent.Origin.Tell($"Error! Can't set {gameEvent.Target.Name}'s tag, because a different tag is already set"); + } + } + else if(gameEvent.Target is null) + { + gameEvent.Origin.Tell($"Error! target player is null"); + } + + //gameEvent.Target.Tag = matchingTag.Value; + + //await _metaService.SetPersistentMetaForLookupKey(EFMeta.ClientTagV2, EFMeta.ClientTagNameV2, matchingTag.Id, + // gameEvent.Target.ClientId, token); + //if (gameEvent.Target.Level < EFClient.Permission.Moderator) + //{ + // gameEvent.Target.SetLevel(EFClient.Permission.Trusted, gameEvent.Origin); + //} + + //gameEvent.Origin.Tell($"Set {gameEvent.Target.Name} to Donator"); + //if (gameEvent.Target.IsIngame) + //{ + // gameEvent.Target.Tell($"Your rank has been set to Donator!"); + //} + //else + //{ + // var cmd = $"{Utilities.CommandPrefix}om @{gameEvent.Target.ClientId} Your rank has been set to Donator!"; + // await gameEvent.Owner.ExecuteCommandAsync(cmd); + // //var impersonatedCommandEvent = new GameEvent + // //{ + // // Type = GameEvent.EventType.Command, + // // Origin = gameEvent.Origin, + // // //ImpersonationOrigin = gameEvent.Origin, + // // Message = cmd, + // // Data = cmd, + // // Owner = gameEvent.Owner, + // // CorrelationId = gameEvent.CorrelationId + // //}; + // //gameEvent.Owner.Manager.AddEvent(impersonatedCommandEvent); + + // //var result = await impersonatedCommandEvent.WaitAsync(Utilities.DefaultCommandTimeout, + // // gameEvent.Owner.Manager.CancellationToken); + // //await result.WaitAsync(Utilities.DefaultCommandTimeout, gameEvent.Owner.Manager.CancellationToken); + + // // remove the added command response + // // todo: something weird happening making this change required + // //var responses = gameEvent.Owner.Manager.ProcessingEvents + // // .Where(ev => ev.Value.CorrelationId == impersonatedCommandEvent.CorrelationId) + // // .SelectMany(ev => ev.Value.Output) + // // .ToList(); + + // //foreach (var output in responses) + // // await gameEvent.Origin.Tell(_translationLookup["COMMANDS_RUN_AS_SUCCESS"].FormatExt(output)) + // // .WaitAsync(); + + //} } } } + + diff --git a/DataManager.cs b/DataManager.cs new file mode 100644 index 0000000..373d852 --- /dev/null +++ b/DataManager.cs @@ -0,0 +1,155 @@ +using ClanTagRankCommands; +using System.Collections.Generic; +using System.Linq; +using Data.Models; +//using Data.Models.Client; +using SharedLibraryCore.Interfaces; +using SharedLibraryCore; +using SharedLibraryCore.Commands; +using SharedLibraryCore.Configuration; +using SharedLibraryCore.Dtos; +using System.Threading.Tasks; +using static System.Enum; +using Microsoft.Extensions.Logging; +using ILogger = Microsoft.Extensions.Logging.ILogger; +using System.Text.Json.Serialization; +using System.Threading; +using SharedLibraryCore.Database.Models; +using SharedLibraryCore.Helpers; + +using System; + + +using JsonSerializer = System.Text.Json.JsonSerializer; + +using Serilog.Core; +using Data.Models.Client; + +namespace ClanTagRankCommands; + +public class DataManager +{ + public DataManager(IMetaServiceV2 metaService, ILogger logger) + { + _logger = logger; + _metaService = metaService; + } + + private readonly IMetaServiceV2 _metaService; + private readonly ILogger _logger; + + public async Task ReadPersistentData(int? ClientId, IManager manager) + { + var token = manager.CancellationToken; + var availableTags = await _metaService.GetPersistentMetaValue>>(EFMeta.ClientTagNameV2, token); + var matchingTag = availableTags.FirstOrDefault(tag => tag.Value == "Donator".Trim()); + _logger.LogInformation("Reading persistent data for {0}", ClientId); + DonatorState clientDonatorState = DonatorState.User; + if(ClientId is not null) + { + + var existingtag = await _metaService.GetPersistentMetaByLookup("ClientTagV2", "ClientTagNameV2", (int)ClientId, + token);//GetAdditionalProperty(EFMeta.ClientTagNameV2); + + + if (existingtag is null || existingtag.Value.Contains("Guest")) + { + _logger.LogInformation("No existing tag found for {0}", ClientId); + return clientDonatorState; + } + else if (existingtag.Value.Contains("Donator")) + { + _logger.LogInformation("Existing tag: {0}", existingtag.Value); + clientDonatorState = DonatorState.Donator; + } + else if (existingtag is not null && !existingtag.Value.Contains("Guest")) + { + _logger.LogInformation("Existing tag: {0}", existingtag.Value); + clientDonatorState = DonatorState.Other; + } + + } + + + //var clientDonatorState = client.ToPartialClient().Tag ?? + //Parse(value: client.ToPartialClient().Tag ?? nameof(DonatorState.User)); + + return clientDonatorState; + } + //public async Task GetCurrentMuteState(EFClient client) + //{ + // try + // { + // //await _onMuteAction.WaitAsync(); + // var ClientDonatorMeta = await ReadPersistentDataV2(client); + // if (ClientDonatorMeta is not null) return ClientDonatorMeta; + + // // Return null if the client doesn't have old or new meta. + // var DonatorState = await ReadPersistentDataV1(client); + // ClientDonatorMeta = new DonatorStateMeta + // { + // //Reason = muteState is null ? string.Empty : _translationLookup["PLUGINS_MUTE_MIGRATED"], + // //Expiration = muteState switch + // //{ + // // null => DateTime.UtcNow, + // // MuteState.Muted => null, + // // _ => DateTime.UtcNow + // //}, + // DonatorState = muteState ?? DonatorState.User, + // CommandExecuted = true + // }; + + // // Migrate old mute meta, else, client has no state, so set a generic one, but don't write it to database. + // if (DonatorState is not null) + // { + // ClientDonatorMeta.CommandExecuted = false; + // await WritePersistentData(client, ClientDonatorMeta); + // //await CreatePenalty(muteState.Value, Utilities.IW4MAdminClient(), client, ClientDonatorMeta.Expiration, + // // ClientDonatorMeta.Reason); + // } + // else + // { + // client.SetAdditionalProperty(Plugin.MuteKey, ClientDonatorMeta); + // } + + // return ClientDonatorMeta; + // } + // finally + // { + // //if (_onMuteAction.CurrentCount == 0) _onMuteAction.Release(); + // } + //} + //private async Task ReadPersistentDataV2(EFClient client) + //{ + // // Get meta from client + // var clientDonatorMeta = client.GetAdditionalProperty(Plugin.DonatorKey); + // if (clientDonatorMeta is not null) return clientDonatorMeta; + + // // Get meta from database and store in client if exists + // clientDonatorMeta = await _metaService.GetPersistentMetaValue(Plugin.DonatorKey, client.ClientId); + // if (clientDonatorMeta is not null) client.SetAdditionalProperty(Plugin.DonatorKey, clientDonatorMeta); + + // return clientDonatorMeta; + //} + + + //public async Task WritePersistentData(EFClient client, DonatorState state) + //{ + // await _metaService.SetPersistentMeta(Plugin.DonatorKey, state.ToString(), client.ClientId); + // client.SetAdditionalProperty(Plugin.DonatorKey, state); + //} +} + +public class DonatorStateMeta +{ + //public string Reason { get; set; } = string.Empty; + //public DateTime? Expiration { get; set; } + public DonatorState DonatorState { get; set; } + [JsonIgnore] public bool CommandExecuted { get; set; } +} +public enum DonatorState +{ + User, + Donator, + Other +} \ No newline at end of file diff --git a/GscApiController.cs b/GscApiController.cs index 0d92692..38c63e6 100644 --- a/GscApiController.cs +++ b/GscApiController.cs @@ -17,10 +17,10 @@ namespace WebfrontCore.Controllers.API { string rankName; EFMeta customRankName; - private readonly IMetaService _metaService; + private readonly IMetaServiceV2 _metaService; private readonly IConfigurationHandler _configurationHandler; private Configuration Config; - public GscApiController(IManager manager, IMetaService metaService, IConfigurationHandlerFactory configurationHandlerFactory) : base(manager) + public GscApiController(IManager manager, IMetaServiceV2 metaService, IConfigurationHandlerFactory configurationHandlerFactory) : base(manager) { _metaService = metaService; _configurationHandler = configurationHandlerFactory.GetConfigurationHandler("ClanTagRankCommands"); diff --git a/Plugin.cs b/Plugin.cs index 98f0892..76e3bd2 100644 --- a/Plugin.cs +++ b/Plugin.cs @@ -3,12 +3,17 @@ using SharedLibraryCore.Interfaces; using System.Threading.Tasks; using System.Threading; using SharedLibraryCore.Database.Models; +using SharedLibraryCore.Helpers; + using System.Collections.Generic; using Microsoft.Extensions.Logging; using ILogger = Microsoft.Extensions.Logging.ILogger; using Data.Models; using System; - +using SharedLibraryCore.Commands; +using JsonSerializer = System.Text.Json.JsonSerializer; +using System.Linq; +using Serilog.Core; namespace ClanTagRankCommands { @@ -20,22 +25,33 @@ namespace ClanTagRankCommands private Configuration Config; //readonly string rank = "rank"; //string rankName = "none"; + private readonly IInteractionRegistration _interactionRegistration; + private static readonly string DonatorInteraction = "Webfront::Profile::Donator"; + private static readonly string GuestInteraction = "Webfront::Profile::Guest"; + private readonly IRemoteCommandService _remoteCommandService; public string Name => "ClanTagRankCommands"; - public float Version => 1.42f; + public float Version => 1.5f; public string Author => "INSANEMODE"; private readonly IMetaServiceV2 _metaService; - public Plugin(IMetaServiceV2 metaService, IConfigurationHandlerFactory configurationHandlerFactory, ILogger logger) + public static string DonatorKey = "IW4MDonator"; + + public static DataManager DataManager; + + public Plugin(IMetaServiceV2 metaService, IConfigurationHandlerFactory configurationHandlerFactory, ILogger logger, IInteractionRegistration interactionRegistration, IRemoteCommandService remoteCommandService) { + _remoteCommandService = remoteCommandService; _logger = logger; _metaService = metaService; _configurationHandler = (IConfigurationHandler)configurationHandlerFactory.GetConfigurationHandler("ClanTagRankCommands"); + _interactionRegistration = interactionRegistration; + DataManager = new DataManager(metaService, logger); } public Task OnLoadAsync(IManager manager)// => Task.CompletedTask; { @@ -47,13 +63,139 @@ namespace ClanTagRankCommands Config = _configurationHandler.Configuration(); string version = manager.Version; string str = string.Format("Loaded {0} ({1}) by {2} in {3} ({4})!", (object)((IPlugin)this).Name, (object)((IPlugin)this).Version, (object)((IPlugin)this).Author, (object)"IW4MAdmin", (object)version); - _logger.LogInformation(str); + _logger.LogDebug(str); + _interactionRegistration.RegisterInteraction(DonatorInteraction, async (clientId, game, token) => + { + await Task.Delay(1); + _logger.LogDebug($"Donator button interaction for {clientId.Value}"); + if (!clientId.HasValue) + { + _logger.LogDebug($"No client id provided"); + return null; + } + //var client = manager.GetClientService().Get(clientId.Value).Result; + var DonatorState = await DataManager.ReadPersistentData(clientId.Value, manager); + _logger.LogDebug($"DonatorState: {(int)DonatorState}"); + return DonatorState is DonatorState.User + ? new InteractionData + { + EntityId = clientId.Value, + Name = "Set Donator", + DisplayMeta = "oi-circle-check", + ActionPath = "DynamicAction", + ActionMeta = new() + { + { "InteractionId", "command" }, + { "Data", $"Donator" }, + { "ActionButtonLabel", "Confirm" }, + { "Name", "Set Donator rank" }, + { "ShouldRefresh", true.ToString() } + }, + MinimumPermission = Data.Models.Client.EFClient.Permission.Administrator, + Source = Name, + Enabled = true, + PermissionAccess = "read", + PermissionEntity = "Interaction", + Description = "Set Donator rank for client" + } + : new InteractionData + { + EntityId = clientId.Value, + Name = "UnSet Donator", + DisplayMeta = "oi-circle-x", + ActionPath = "DynamicAction", + ActionMeta = new() + { + { "InteractionId", "command" }, + { "Data", $"Donator" }, + { "ActionButtonLabel", "Confirm" }, + { "Name", "UnSet Donator rank" }, + { "ShouldRefresh", true.ToString() } + }, + MinimumPermission = Data.Models.Client.EFClient.Permission.Administrator, + Source = Name, + Enabled = true, + PermissionAccess = "read", + PermissionEntity = "Interaction", + Description = "UnSet Donator rank for client" + }; + }); + _logger.LogDebug("Registered Donator Interaction"); + _interactionRegistration.RegisterInteraction(GuestInteraction, async (clientId, game, token) => + { + await Task.Delay(1); + _logger.LogDebug($"guest button interaction for {clientId.Value}"); + if (!clientId.HasValue) + { + _logger.LogDebug($"No client id provided"); + return null; + } + bool guest; + var clienttag = await _metaService.GetPersistentMetaByLookup("ClientTagV2", "ClientTagNameV2", (int)clientId, + token); + if(clienttag is not null && clienttag.Value.Contains("Guest")) + { + guest = false; + } + else if(clienttag is not null && !clienttag.Value.Contains("Guest")) + { + return null; + } + else + { + guest = true; + } + return guest + ? new InteractionData + { + EntityId = clientId.Value, + Name = "Invite Guest", + DisplayMeta = "oi-people", + ActionPath = "DynamicAction", + ActionMeta = new() + { + { "InteractionId", "command" }, + { "Data", $"Guest" }, + { "ActionButtonLabel", "Confirm" }, + { "Name", "Temporarily invite guest to donator server" }, + { "ShouldRefresh", true.ToString() } + }, + MinimumPermission = Data.Models.Client.EFClient.Permission.Trusted, + Source = Name, + Enabled = true, + PermissionAccess = "read", + PermissionEntity = "Interaction", + Description = "Temporarily invite a guest, until they leave the server" + } + : new InteractionData + { + EntityId = clientId.Value, + Name = "Cancel Guest Invite", + DisplayMeta = "oi-circle-x", + ActionPath = "DynamicAction", + ActionMeta = new() + { + { "InteractionId", "command" }, + { "Data", $"Guest" }, + { "ActionButtonLabel", "Confirm" }, + { "Name", "Cancel guest invite" }, + { "ShouldRefresh", true.ToString() } + }, + MinimumPermission = Data.Models.Client.EFClient.Permission.Trusted, + Source = Name, + Enabled = true, + PermissionAccess = "read", + PermissionEntity = "Interaction", + Description = "Cancel a guest invite" + }; + + }); return Task.CompletedTask; } public async Task OnEventAsync(GameEvent E, Server S)// => Task.CompletedTask; { - if (E.Type == GameEvent.EventType.Disconnect && E.Origin.Tag == "Guest") + if (E.Type == GameEvent.EventType.Disconnect && (S.Hostname.Contains("Donator") || S.Hostname.Contains("Test")) && E.Origin.Tag == "Guest") { E.Origin.Tag = null; await _metaService.RemovePersistentMeta(EFMeta.ClientTagV2, E.Origin.ClientId, @@ -68,7 +210,13 @@ namespace ClanTagRankCommands } - public Task OnUnloadAsync() => Task.CompletedTask; + public Task OnUnloadAsync() //=> + { + + _interactionRegistration.UnregisterInteraction(DonatorInteraction); + _interactionRegistration.UnregisterInteraction(GuestInteraction); + return Task.CompletedTask; + } }