private async Task <TempUnverifyItem> RemoveAccessAsync(SocketGuildUser user, int unverifyTime, string reason, SocketUser fromUser, SocketGuild guild, bool ignoreHigherRoles, string[] subjects) { using var scope = Provider.CreateScope(); var rolesToRemove = user.Roles .Where(o => !o.IsEveryone && !o.IsManaged && !o.IsMutedRole()) .ToList(); // Ignore Muted roles. if (ignoreHigherRoles) { var botUser = await guild.GetUserFromGuildAsync(Client.CurrentUser.Id); var botMaxRolePosition = botUser.Roles.Max(o => o.Position); rolesToRemove = rolesToRemove.Where(o => o.Position < botMaxRolePosition).ToList(); } if (subjects != null && subjects.Length > 0) { rolesToRemove = rolesToRemove.Where(role => !subjects.Contains(role.Name.ToLower())).ToList(); } var rolesToRemoveIDs = rolesToRemove.Select(o => o.Id).ToList(); var overrides = GetChannelOverrides(user); using var logService = scope.ServiceProvider.GetService <TempUnverifyLogService>(); logService.LogSet(overrides, rolesToRemoveIDs, unverifyTime, reason, user, fromUser, guild, ignoreHigherRoles, subjects); if (subjects == null || subjects.Length == 0) { await FindAndToggleMutedRoleAsync(user, guild, true); } await PreRemoveAccessToPublicChannels(user, guild); // Set SendMessage: Deny for extra channels. await user.RemoveRolesAsync(rolesToRemove); // Remove all roles for user. // Remove all extra channel permissions. foreach (var channelOverride in overrides) { var channel = user.Guild.GetChannel(channelOverride.ChannelIdSnowflake); // Where had access, now not have. channel?.AddPermissionOverwriteAsync(user, new OverwritePermissions(viewChannel: PermValue.Deny)); } using var repository = scope.ServiceProvider.GetService <TempUnverifyRepository>(); var unverify = await repository .AddItemAsync(rolesToRemoveIDs, user.Id, user.Guild.Id, unverifyTime, overrides, reason); var formatedPrivateMessage = GetFormatedPrivateMessage(user, unverify, reason, false); await user.SendPrivateMessageAsync(formatedPrivateMessage).ConfigureAwait(false); return(unverify); }
public AuditOverwriteUpdated GetFilledModel(SocketGuild guild) { Channel = guild.GetChannel(ChannelId); if (TargetType == PermissionTarget.Role) { TargetRole = guild.GetRole(TargetId); } else if (TargetType == PermissionTarget.User) { TargetUser = guild.GetUserFromGuildAsync(TargetId).Result; } return(this); }
public GuildUpdated GetFilledModel(SocketGuild guild) { if (AfkChannelId != null) { var oldChannel = guild.GetChannel(AfkChannelId.Before ?? 0); var newChannel = guild.GetChannel(AfkChannelId.After ?? 0); AfkChannel = new DiffData <IChannel>(oldChannel, newChannel); } if (OwnerId != null) { var oldOwner = guild.GetUserFromGuildAsync(OwnerId.Before); var newOwner = guild.GetUserFromGuildAsync(OwnerId.After); Owner = new DiffData <IUser>(oldOwner.Result, newOwner.Result); } if (SystemChannelId != null) { var oldSystemChannel = guild.GetChannel(SystemChannelId.Before ?? 0); var newSystemChannel = guild.GetChannel(SystemChannelId.After ?? 0); SystemChannel = new DiffData <IChannel>(oldSystemChannel, newSystemChannel); } if (EmbedChannelId != null) { var oldEmbedChannel = guild.GetChannel(EmbedChannelId.Before ?? 0); var newEmbedChannel = guild.GetChannel(EmbedChannelId.After ?? 0); EmbedChannel = new DiffData <IChannel>(oldEmbedChannel, newEmbedChannel); } return(this); }
private async Task FilterHigherRolesIfSelfunverifyAsync(UnverifyUserProfile profile, bool isSelfunverify, SocketGuild guild) { if (!isSelfunverify) { return; } var botUser = await guild.GetUserFromGuildAsync(Discord.CurrentUser.Id); var botRolePosition = botUser.Roles.Max(o => o.Position); var rolesToKeep = profile.RolesToRemove.Where(o => o.Position >= botRolePosition).ToList(); profile.RolesToKeep.AddRange(rolesToKeep); profile.RolesToRemove.RemoveAll(o => rolesToKeep.Any(x => x.Id == o.Id)); }
public AuditOverwriteInfo GetFilledModel(SocketGuild guild) { Channel = guild.GetChannel(ChannelId); switch (PermissionTarget) { case PermissionTarget.Role: TargetRole = guild.GetRole(TargetId); break; case PermissionTarget.User: TargetUser = guild.GetUserFromGuildAsync(TargetId).Result; break; } return(this); }
public async Task <List <string> > GetUnverifyGroupUsersAsync(SocketGuild guild, string groupName) { var users = await GrillBotRepository.UsersRepository.GetUsersWithUnverifyImunity(guild.Id) .Where(o => o.UnverifyImunityGroup == groupName) .Select(o => o.UserID) .ToListAsync(); var usernames = new List <string>(); foreach (var userID in users.Select(o => Convert.ToUInt64(o))) { var user = await guild.GetUserFromGuildAsync(userID); if (user != null) { usernames.Add($"> {user.GetFullName()}"); } } return(usernames.OrderByDescending(o => o).ToList()); }
public async Task <List <UnverifyInfo> > GetCurrentUnverifies(SocketGuild guild) { var usersWithUnverify = GrillBotRepository.UsersRepository.GetUsersWithUnverify(guild.Id); var result = new List <UnverifyInfo>(); foreach (var userEntity in usersWithUnverify) { var user = await guild.GetUserFromGuildAsync(userEntity.UserIDSnowflake); var logData = userEntity.Unverify.SetLogOperation.Json.ToObject <UnverifyLogSet>(); var profile = new UnverifyUserProfile() { Reason = userEntity.Unverify.Reason, EndDateTime = userEntity.Unverify.EndDateTime, StartDateTime = userEntity.Unverify.StartDateTime, DestinationUser = user, RolesToKeep = logData.RolesToKeep.Select(o => guild.GetRole(o)).Where(o => o != null).ToList(), RolesToRemove = logData.RolesToRemove.Select(o => guild.GetRole(o)).Where(o => o != null).ToList(), IsSelfUnverify = userEntity.Unverify.SetLogOperation.Operation == UnverifyLogOperation.Selfunverify }; profile.ChannelsToKeep = logData.ChannelsToKeep.Select(o => new ChannelOverwrite(guild.GetChannel(o.ChannelID), new OverwritePermissions(o.AllowValue, o.DenyValue))) .Where(o => o.Channel != null).ToList(); profile.ChannelsToRemove = logData.ChannelsToRemove.Select(o => new ChannelOverwrite(guild.GetChannel(o.ChannelID), new OverwritePermissions(o.AllowValue, o.DenyValue))) .Where(o => o.Channel != null).ToList(); result.Add(new UnverifyInfo() { ID = userEntity.ID, Profile = profile }); } return(result); }
public static async Task <SocketGuildUser> ConvertToGuildUserAsync(this IUser user, SocketGuild guild) { return(user is SocketGuildUser usr ? usr : (await guild.GetUserFromGuildAsync(user.Id))); }
public static async Task <DiscordUser> CreateAsync(SocketGuild guild, SocketGuildUser user, DBDiscordUser dbUser, DiscordSocketClient discordClient, RestApplication botAppInfo) { var result = new DiscordUser() { ApiAccess = !string.IsNullOrEmpty(dbUser.ApiToken), Guild = guild, User = user, ID = dbUser.ID, Points = dbUser.Points, GivenReactionsCount = dbUser.GivenReactionsCount, ObtainedReactionsCount = dbUser.ObtainedReactionsCount, WebAdminAccess = !string.IsNullOrEmpty(dbUser.WebAdminPassword), Birthday = dbUser.Birthday, ApiAccessCount = dbUser.ApiAccessCount, WebAdminLoginCount = dbUser.WebAdminLoginCount, Flags = dbUser.Flags, UnverifyEndsAt = dbUser.Unverify?.EndDateTime, UnverifyImunityGroup = dbUser.UnverifyImunityGroup }; if (botAppInfo.Owner.Id == user.Id) { result.Flags |= (long)UserFlags.BotAdmin; } result.Channels = dbUser.Channels .Select(o => new ChannelStatItem(guild.GetChannel(o.ChannelIDSnowflake), o)) .Where(o => o.Channel != null) .OrderByDescending(o => o.Count) .ThenByDescending(o => o.LastMessageAt) .ToList(); if (dbUser.UsedInvite != null) { SocketGuildUser inviteCreator = null; if (dbUser.UsedInvite.Creator != null) { inviteCreator = await guild.GetUserFromGuildAsync(dbUser.UsedInvite.Creator.UserIDSnowflake); } result.UsedInvite = new InviteModel(dbUser.UsedInvite, inviteCreator); } else if (!string.IsNullOrEmpty(dbUser.UsedInviteCode)) { result.UsedInvite = new InviteModel(dbUser.UsedInviteCode); } result.UnverifyHistory = dbUser.IncomingUnverifyOperations .Select(o => new UnverifyLogItem(o, discordClient)) .OrderByDescending(o => o.DateTime) .ToList(); result.GivenUnverifyHistory = dbUser.OutgoingUnverifyOperations .Select(o => new UnverifyLogItem(o, discordClient)) .OrderByDescending(o => o.DateTime) .ToList(); result.Reminders = new List <RemindItem>(); foreach (var remind in dbUser.Reminders) { var fromUser = remind.FromUser != null ? await guild.GetUserFromGuildAsync(remind.FromUser.UserIDSnowflake) : null; result.Reminders.Add(new RemindItem(remind, fromUser)); } result.CreatedInvites = dbUser.CreatedInvites.Select(o => new InviteModel(o, user, o.UsedUsers.Count)).ToList(); return(result); }
private async Task <string> SetUnverifyAsync(SocketUser socketUser, string time, string data, SocketGuild guild, SocketUser fromUser, bool selfUnverify, List <string> toKeep, SocketRole mutedRole) { var user = await guild.GetUserFromGuildAsync(socketUser.Id); await Checker.ValidateAsync(user, guild, selfUnverify); var profile = await UnverifyProfileGenerator.CreateProfileAsync(user, guild, time, data, selfUnverify, toKeep, mutedRole); UnverifyLog unverifyLogEntity; if (selfUnverify) { unverifyLogEntity = await UnverifyLogger.LogSelfUnverifyAsync(profile, guild); } else { unverifyLogEntity = await UnverifyLogger.LogUnverifyAsync(profile, guild, fromUser); } try { if (mutedRole != null) { await user.SetRoleAsync(mutedRole); } await user.RemoveRolesAsync(profile.RolesToRemove); foreach (var channelOverride in profile.ChannelsToRemove) { var channel = guild.GetChannel(channelOverride.ChannelID); await channel?.AddPermissionOverwriteAsync(user, new OverwritePermissions(viewChannel : PermValue.Deny)); } var userEntity = await GrillBotRepository.UsersRepository.GetOrCreateUserAsync(guild.Id, user.Id, UsersIncludes.Unverify); userEntity.Unverify = new Database.Entity.Unverify.Unverify() { DeserializedChannels = profile.ChannelsToRemove.ConvertAll(o => new ChannelOverride(o.ChannelID, o.Perms)), DeserializedRoles = profile.RolesToRemove.ConvertAll(o => o.Id), EndDateTime = profile.EndDateTime, Reason = profile.Reason, StartDateTime = profile.StartDateTime, SetLogOperation = unverifyLogEntity }; await GrillBotRepository.CommitAsync(); Queue.Add(new UnverifyBackgroundTask(guild.Id, user.Id, profile.EndDateTime)); var pmMessage = MessageGenerator.CreateUnverifyPMMessage(profile, guild); await user.SendPrivateMessageAsync(pmMessage); return(MessageGenerator.CreateUnverifyMessageToChannel(profile)); } catch (Exception ex) { if (mutedRole != null) { await user.RemoveRoleAsync(mutedRole); } await user.AddRolesAsync(profile.RolesToRemove); foreach (var channelOverride in profile.ChannelsToRemove) { var channel = guild.GetChannel(channelOverride.ChannelID); if (channel != null) { await channel.AddPermissionOverwriteAsync(user, channelOverride.Perms); } } var errorMessage = new LogMessage(LogSeverity.Warning, nameof(UnverifyService), "An error occured when unverify removing access.", ex); await Logger.OnLogAsync(errorMessage); return(MessageGenerator.CreateUnverifyFailedToChannel(user)); } }