Esempio n. 1
0
        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);
        }
Esempio n. 2
0
        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);
        }
Esempio n. 3
0
        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));
        }
Esempio n. 5
0
        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);
        }
Esempio n. 6
0
        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());
        }
Esempio n. 7
0
        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);
        }
Esempio n. 8
0
 public static async Task <SocketGuildUser> ConvertToGuildUserAsync(this IUser user, SocketGuild guild)
 {
     return(user is SocketGuildUser usr ? usr : (await guild.GetUserFromGuildAsync(user.Id)));
 }
Esempio n. 9
0
        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);
        }
Esempio n. 10
0
        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));
            }
        }