public async Task UndoPunishment(ModCase modCase) { using var scope = _serviceProvider.CreateScope(); Database database = scope.ServiceProvider.GetRequiredService <Database>(); List <ModCase> parallelCases = await database.SelectAllModCasesThatHaveParallelPunishment(modCase); if (parallelCases.Count != 0) { _logger.LogInformation("Cannot undo punishment. There exists a parallel punishment for this case"); return; } GuildConfig guildConfig; try { guildConfig = await GuildConfigRepository.CreateDefault(scope.ServiceProvider).GetGuildConfig(modCase.GuildId); } catch (ResourceNotFoundException) { _logger.LogError($"Cannot execute punishment in guild {modCase.GuildId} - guildconfig not found."); return; } string reason = null; try { Translator translator = scope.ServiceProvider.GetRequiredService <Translator>(); reason = translator.T(guildConfig).NotificationDiscordAuditLogPunishmentsUndone(modCase.CaseId, modCase.Title.Truncate(400)); } catch (Exception ex) { _logger.LogError(ex, $"Failed to resolve audit log reason string for case {modCase.GuildId}/{modCase.CaseId}"); } switch (modCase.PunishmentType) { case PunishmentType.Mute: if (guildConfig.MutedRoles.Length != 0) { _logger.LogInformation($"Unmute User {modCase.UserId} in guild {modCase.GuildId} with roles " + string.Join(',', guildConfig.MutedRoles.Select(x => x.ToString()))); foreach (ulong role in guildConfig.MutedRoles) { await _discord.RemoveGuildUserRole(modCase.GuildId, modCase.UserId, role, reason); } } else { _logger.LogInformation($"Cannot Unmute User {modCase.UserId} in guild {modCase.GuildId} - mute role undefined."); } break; case PunishmentType.Ban: _logger.LogInformation($"Unban User {modCase.UserId} in guild {modCase.GuildId}."); await _discord.UnBanUser(modCase.GuildId, modCase.UserId, reason); _discord.RemoveFromCache(CacheKey.GuildBan(modCase.GuildId, modCase.UserId)); // refresh ban cache break; } }
private Task GuildBanRemoved(SocketUser user, SocketGuild guild) { using var scope = _serviceProvider.CreateScope(); // Refresh ban cache DiscordAPIInterface discordAPI = scope.ServiceProvider.GetRequiredService <DiscordAPIInterface>(); discordAPI.RemoveFromCache(CacheKey.GuildBan(guild.Id, user.Id)); return(Task.CompletedTask); }
private async Task GuildBanAdded(SocketUser user, SocketGuild guild) { using var scope = _serviceProvider.CreateScope(); // Refresh ban cache DiscordAPIInterface discordAPI = scope.ServiceProvider.GetRequiredService <DiscordAPIInterface>(); await discordAPI.GetGuildUserBan(guild.Id, user.Id, CacheBehavior.IgnoreCache); discordAPI.RemoveFromCache(CacheKey.GuildMember(guild.Id, user.Id)); // Refresh identity memberships IdentityManager identityManager = scope.ServiceProvider.GetRequiredService <IdentityManager>(); foreach (Identity identity in identityManager.GetCurrentIdentities()) { if (identity.GetCurrentUser().Id == user.Id) { identity.RemoveGuildMembership(guild.Id); } } }