Пример #1
0
 public static async Task LogEvent <T>(AtomicLogger log, EventId id, T e, DateTime?time = null) where T : struct
 {
     var payloadData = GetEventBytes(time ?? DateTime.UtcNow, id, e);
     await log.WriteDataAsync(payloadData, CancellationToken.None);
 }
Пример #2
0
        public static void AttachEventLogger(AtomicLogger log, DiscordClient discord, ulong guildId)
        {
            discord.GuildMemberAdded += async(_, args) =>
            {
                if (args.Guild.Id == guildId && !args.Member.IsBot)
                {
                    await LogEvent(log, EventId.MemberAdded, new MemberEvent(args.Member.Id));
                }
            };

            discord.GuildMemberRemoved += async(_, args) =>
            {
                if (args.Guild.Id == guildId && !args.Member.IsBot)
                {
                    await LogEvent(log, EventId.MemberRemoved, new MemberEvent(args.Member.Id));
                }
            };

            discord.GuildMemberUpdated += async(_, args) =>
            {
                if (args.Guild.Id != guildId || args.Member.IsBot)
                {
                    return;
                }

                var time = DateTime.UtcNow;

                var srcRoles  = args.RolesBefore.Select(role => role.Id).ToHashSet();
                var destRoles = args.RolesAfter.Select(role => role.Id).ToHashSet();

                var gainedRoles = new HashSet <ulong>(destRoles.Except(srcRoles));
                var lostRoles   = new HashSet <ulong>(srcRoles.Except(destRoles));

                foreach (var gainedRole in gainedRoles)
                {
                    await LogEvent(log, EventId.MemberAddRole, new MemberRoleEvent(args.Member.Id, gainedRole), time);
                }

                foreach (var lostRole in lostRoles)
                {
                    await LogEvent(log, EventId.MemberRemoveRole, new MemberRoleEvent(args.Member.Id, lostRole), time);
                }
            };

            discord.MessageCreated += async(_, args) =>
            {
                if (args.Guild.Id == guildId && !args.Author.IsBot)
                {
                    var time = DateTime.UtcNow;

                    switch (args.Message.MessageType)
                    {
                    case MessageType.Default:
                    case MessageType.Reply:
                        await LogEvent(log, EventId.MemberSpoke, new MemberChannelEvent(args.Author.Id, args.Channel.Id), time);

                        break;

                    case MessageType.ChannelPinnedMessage:
                        await LogEvent(log, EventId.MessagePinned, new MemberChannelEvent(args.Author.Id, args.Channel.Id), time);

                        break;

                    case MessageType.UserPremiumGuildSubscription:
                        await LogEvent(log, EventId.NitroBoost, new MemberEvent(args.Author.Id), time);

                        break;

                    case MessageType.TierOneUserPremiumGuildSubscription:
                        await LogEvent(log, EventId.NitroBoostObtainTier1, new MemberEvent(args.Author.Id), time);

                        break;

                    case MessageType.TierTwoUserPremiumGuildSubscription:
                        await LogEvent(log, EventId.NitroBoostObtainTier2, new MemberEvent(args.Author.Id), time);

                        break;

                    case MessageType.TierThreeUserPremiumGuildSubscription:
                        await LogEvent(log, EventId.NitroBoostObtainTier3, new MemberEvent(args.Author.Id), time);

                        break;

                    case MessageType.ApplicationCommand:
                        await LogEvent(log, EventId.MemberUsedCommand, new MemberChannelEvent(args.Author.Id, args.Channel.Id), time);

                        break;
                    }

                    foreach (var mention in args.Message.MentionedUsers)
                    {
                        await LogEvent(log, EventId.MemberMentioned, new MemberChannelMessageMentionEvent(args.Author.Id, args.Channel.Id, args.Message.Id, MentionEventType.Member, mention.Id), time);
                    }

                    foreach (var mention in args.Message.MentionedRoles)
                    {
                        await LogEvent(log, EventId.RoleMentioned, new MemberChannelMessageMentionEvent(args.Author.Id, args.Channel.Id, args.Message.Id, MentionEventType.Role, mention.Id), time);
                    }

                    foreach (var mention in args.Message.MentionedChannels)
                    {
                        await LogEvent(log, EventId.ChannelMentioned, new MemberChannelMessageMentionEvent(args.Author.Id, args.Channel.Id, args.Message.Id, MentionEventType.Channel, mention.Id), time);
                    }
                }
            };

            discord.MessageReactionAdded += async(_, args) =>
            {
                if (args.Guild.Id == guildId && !args.User.IsBot)
                {
                    await LogEvent(log, EventId.ReactionAdded, new MemberChannelMessageEmojiEvent(args.User.Id, args.Channel.Id, args.Message.Id, EventEmojiUtil.GetEmojiId(args.Emoji)));
                }
            };

            discord.MessageReactionRemoved += async(_, args) =>
            {
                if (args.Guild.Id == guildId && !args.User.IsBot)
                {
                    await LogEvent(log, EventId.ReactionRemoved, new MemberChannelMessageEmojiEvent(args.User.Id, args.Channel.Id, args.Message.Id, EventEmojiUtil.GetEmojiId(args.Emoji)));
                }
            };

            discord.VoiceStateUpdated += async(_, args) =>
            {
                if (args.Guild.Id != guildId || args.User.IsBot)
                {
                    return;
                }

                var time = DateTime.UtcNow;

                if (args.Before?.Channel == null && args.After?.Channel != null)
                {
                    await LogEvent(log, EventId.MemberJoinVoice, new MemberChannelEvent(args.User.Id, args.After.Channel.Id), time);
                }
                else if (args.Before?.Channel != null && args.After?.Channel == null)
                {
                    await LogEvent(log, EventId.MemberLeaveVoice, new MemberChannelEvent(args.User.Id, args.Before.Channel.Id), time);
                }
                else if (args.Before?.Channel != null && args.After?.Channel != null && args.Before.Channel.Id != args.After.Channel.Id)
                {
                    await LogEvent(log, EventId.MemberLeaveVoice, new MemberChannelEvent(args.User.Id, args.Before.Channel.Id), time);
                    await LogEvent(log, EventId.MemberJoinVoice, new MemberChannelEvent(args.User.Id, args.After.Channel.Id), time);
                }
            };

            discord.GuildBanAdded += async(_, args) =>
            {
                if (args.Guild.Id == guildId && !args.Member.IsBot)
                {
                    await LogEvent(log, EventId.MemberBanned, new MemberEvent(args.Member.Id));
                }
            };

            discord.InviteCreated += async(_, args) =>
            {
                if (args.Guild.Id == guildId && !args.Invite.Inviter.IsBot)
                {
                    await LogEvent(log, EventId.InviteCreated, new MemberChannelEvent(args.Invite.Inviter.Id, args.Invite.Channel.Id));
                }
            };

            discord.InviteDeleted += async(_, args) =>
            {
                if (args.Guild.Id == guildId && !args.Invite.Inviter.IsBot)
                {
                    await LogEvent(log, EventId.InviteDeleted, new MemberChannelEvent(args.Invite.Inviter.Id, args.Invite.Channel.Id));
                }
            };
        }