using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using Data.Models; using Data.Models.Client; using SharedLibraryCore; using SharedLibraryCore.Commands; using SharedLibraryCore.Configuration; using SharedLibraryCore.Dtos; using SharedLibraryCore.Interfaces; namespace ClanTagRankCommands.Commands { public class SetDonatorCommand : Command { private readonly IMetaServiceV2 _metaService; public SetDonatorCommand(CommandConfiguration config, ITranslationLookup layout, IMetaServiceV2 metaService) : base(config, layout) { Name = "SetDonator"; Description = "Sets a player to Donator rank"; Alias = "Donator"; Permission = EFClient.Permission.Moderator; RequiresTarget = true; Arguments = new[] { new CommandArgument { Name = "Player", Required = true } }; _metaService = metaService; } public override async Task ExecuteAsync(GameEvent gameEvent) { var token = gameEvent.Owner.Manager.CancellationToken; 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) { 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 { 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(); } } } }