예제 #1
0
        public async Task LogMessageDeletedAsync(Cacheable <IMessage, ulong> message, ISocketMessageChannel channel, SocketGuild guild)
        {
            var deletedMessage = message.HasValue ? message.Value : MessageCache.TryRemove(message.Id);

            var entity = new AuditLogItem()
            {
                Type             = AuditLogType.MessageDeleted,
                CreatedAt        = DateTime.Now,
                GuildIdSnowflake = guild.Id,
            };

            if (deletedMessage == null)
            {
                entity.SetData(MessageDeletedAuditData.Create(channel));
            }
            else
            {
                await ProcessMessageDeletedWithCacheAsync(entity, channel, deletedMessage, guild);
            }

            if (MessageCache.Exists(message.Id))
            {
                MessageCache.TryRemove(message.Id);
            }

            await MessageCache.AppendAroundAsync(channel, message.Id, 100);

            await GrillBotRepository.AddAsync(entity);

            await GrillBotRepository.CommitAsync();
        }
예제 #2
0
        public async Task LogMessageEditedAsync(Cacheable <IMessage, ulong> before, SocketMessage after, ISocketMessageChannel channel, SocketGuild guild)
        {
            var oldMessage = before.HasValue ? before.Value : MessageCache.Get(before.Id);

            if (!IsMessageEdited(oldMessage, after))
            {
                return;
            }

            var userId = await UserSearchService.GetUserIDFromDiscordUserAsync(guild, after.Author);

            var entity = new AuditLogItem()
            {
                Type             = AuditLogType.MessageEdited,
                CreatedAt        = DateTime.Now,
                GuildIdSnowflake = guild.Id,
                UserId           = userId
            };

            entity.SetData(MessageEditedAuditData.Create(channel, oldMessage, after));
            await GrillBotRepository.AddAsync(entity);

            await GrillBotRepository.CommitAsync();

            MessageCache.Update(after);
        }
예제 #3
0
        public async Task AddReplyAsync(SocketGuild guild, string mustContains, string reply, string compareType, bool disabled, bool caseSensitive, string channel)
        {
            if (BotState.AutoReplyItems.Any(o => o.MustContains == mustContains))
            {
                throw new ArgumentException($"Automatická odpověď **{mustContains}** již existuje.");
            }

            var item = new AutoReplyItem()
            {
                MustContains       = mustContains,
                IsDisabled         = disabled,
                ReplyMessage       = reply,
                CaseSensitive      = caseSensitive,
                GuildIDSnowflake   = guild.Id,
                ChannelIDSnowflake = channel == "*" ? (ulong?)null : Convert.ToUInt64(channel)
            };

            item.SetCompareType(compareType);

            await GrillBotRepository.AddAsync(item);

            await GrillBotRepository.CommitAsync();

            BotState.AutoReplyItems.Add(item);
        }
예제 #4
0
        public async Task LogUserLeftAsync(SocketGuildUser user)
        {
            if (user == null)
            {
                return;
            }

            var ban = await user.Guild.FindBanAsync(user);

            RestAuditLogEntry dcAuditLogItem;

            if (ban != null)
            {
                dcAuditLogItem = (await user.Guild.GetAuditLogDataAsync(actionType: ActionType.Ban))?
                                 .FirstOrDefault(o => (o.Data as BanAuditLogData)?.Target.Id == user.Id);
            }
            else
            {
                dcAuditLogItem = (await user.Guild.GetAuditLogDataAsync(actionType: ActionType.Kick))?
                                 .FirstOrDefault(o => (o.Data as KickAuditLogData)?.Target.Id == user.Id);
            }

            long?executor = null;

            if (dcAuditLogItem != null)
            {
                executor = await UserSearchService.GetUserIDFromDiscordUserAsync(user.Guild, dcAuditLogItem.User);
            }

            var entity = new AuditLogItem()
            {
                Type             = AuditLogType.UserLeft,
                CreatedAt        = DateTime.Now,
                GuildIdSnowflake = user.Guild.Id,
                UserId           = executor
            };

            entity.SetData(UserLeftAuditData.Create(user.Guild, user, ban != null, ban?.Reason));
            await GrillBotRepository.AddAsync(entity);

            await GrillBotRepository.CommitAsync();
        }
예제 #5
0
        public async Task LogCommandAsync(Optional <CommandInfo> command, ICommandContext context)
        {
            if (context.Guild == null || !command.IsSpecified)
            {
                return;
            }

            var userId = await UserSearchService.GetUserIDFromDiscordUserAsync(context.Guild, context.User);

            var entity = new AuditLogItem()
            {
                Type             = AuditLogType.Command,
                CreatedAt        = DateTime.Now,
                GuildIdSnowflake = context.Guild.Id,
                UserId           = userId
            };

            entity.SetData(CommandAuditData.CreateDbItem(context, command.Value));
            await GrillBotRepository.AddAsync(entity);

            await GrillBotRepository.CommitAsync();
        }
예제 #6
0
        public async Task LogUserJoinAsync(SocketGuildUser user)
        {
            if (user == null || !user.IsUser())
            {
                return;
            }

            var userEntity = await GrillBotRepository.UsersRepository.GetOrCreateUserAsync(user.Guild.Id, user.Id, UsersIncludes.None);

            await GrillBotRepository.CommitAsync();

            var entity = new AuditLogItem()
            {
                Type             = AuditLogType.UserJoined,
                CreatedAt        = DateTime.Now,
                GuildIdSnowflake = user.Guild.Id,
                UserId           = userEntity.ID
            };

            entity.SetData(UserJoinedAuditData.Create(user.Guild));
            await GrillBotRepository.AddAsync(entity);

            await GrillBotRepository.CommitAsync();
        }
예제 #7
0
        public async Task TriggerBackgroundTaskAsync(object data)
        {
            if (data is not DownloadAuditLogBackgroundTask task)
            {
                return;
            }

            var guild = Client.GetGuild(task.GuildId);

            if (guild == null)
            {
                return;
            }

            if (!AuditServiceHelper.IsTypeDefined(task.ActionType))
            {
                return;
            }

            var logs = await guild.GetAuditLogDataAsync(100, task.ActionType);

            if (logs.Count == 0)
            {
                return;
            }

            var auditLogType = AuditServiceHelper.AuditLogTypeMap[task.ActionType];
            var logIds       = (await GrillBotRepository.AuditLogs.GetLastAuditLogIdsQuery(guild.Id, auditLogType).ToListAsync())
                               .ConvertAll(o => Convert.ToUInt64(o));

            foreach (var log in logs)
            {
                if (logIds.Contains(log.Id))
                {
                    continue;
                }

                var userId = await GetOrCreateUserId(guild, log.User);

                var item = new AuditLogItem()
                {
                    CreatedAt             = log.CreatedAt.LocalDateTime,
                    DcAuditLogIdSnowflake = log.Id,
                    UserId           = userId,
                    GuildIdSnowflake = guild.Id,
                    Type             = auditLogType
                };

                var logMappingMethod = AuditServiceHelper.AuditLogDataMap[task.ActionType];

                if (logMappingMethod != null)
                {
                    var mappedItem = logMappingMethod(log.Data);

                    if (mappedItem != null)
                    {
                        item.SetData(mappedItem);
                    }
                }

                await GrillBotRepository.AddAsync(item);
            }

            await GrillBotRepository.CommitAsync();
        }