示例#1
0
        private async Task PollGuildAsync(SocketGuild guild)
        {
            using (var dctx = new SparkyContext())
            {
                var limits = dctx.RoleLimits.ToList();
                foreach (var member in guild.Users.Where(m => !m.IsBot))
                {
                    var user = await dctx.FindAsync <SparkyUser>(Convert.ToInt64(member.Id));

                    var isNew = user == null;
                    if (isNew)
                    {
                        user = new SparkyUser {
                            Id = Convert.ToInt64(member.Id)
                        }
                    }
                    ;

                    await DoRoleCheckAsync(member, user, limits);

                    var memberRoles = member.Roles.Select(r => r.Id).ToArray();
                    user.Roles = memberRoles;

                    if (isNew)
                    {
                        await dctx.AddAsync(user);
                    }
                }

                await dctx.SaveChangesAsync();
            }
        }
示例#2
0
        private async Task HandleMessageCreatedAsync(SocketMessage msg)
        {
            if (!(msg is SocketUserMessage message) || message.Author.IsBot)
            {
                return;
            }

            using (var dctx = new SparkyContext())
            {
                var user = dctx.GetOrCreateUser(msg.Author.Id);

                if (DateTime.UtcNow.Subtract(user.LastMessageAt ?? DateTime.UtcNow.AddMinutes(-2)).TotalMinutes >= 1)
                {
                    user.Points       += 1;
                    user.LastMessageAt = DateTime.UtcNow;
                }

                await dctx.SaveChangesAsync();
            }
            var argPos = 0;

            if (message.HasStringPrefix(Configuration.Get <string>("prefix"), ref argPos) || message.HasMentionPrefix(_client.CurrentUser, ref argPos))
            {
                var context = new SparkyCommandContext(_client, message, _services);

                await _commands.ExecuteAsync(context, argPos, _services, MultiMatchHandling.Best);
            }
        }
        private Task HandleReactionRemoved(Cacheable <IUserMessage, ulong> cacheable, ISocketMessageChannel channel, SocketReaction reaction)
        {
            if (!VerifyIsKarmaEmote(reaction))
            {
                return(Task.CompletedTask);
            }

            using (var dctx = new SparkyContext())
            {
                dctx.Remove(KarmaEvent.GetId(reaction.UserId, cacheable.Id));

                return(dctx.SaveChangesAsync());
            }
        }
        private async Task HandleReactionAdded(Cacheable <IUserMessage, ulong> cacheable, ISocketMessageChannel channel, SocketReaction reaction)
        {
            if (!VerifyIsKarmaEmote(reaction) || !VerifyIsKarmaChannel(reaction))
            {
                return;
            }
            var message = await cacheable.GetOrDownloadAsync();

            if (message.Author.IsBot || message.Author.Id == reaction.UserId)
            {
                return;
            }

            using (var dctx = new SparkyContext())
            {
                var relevantEvents = dctx.KarmaEvents
                                     .Where(k => k.RecipientId == Convert.ToInt64(message.Author.Id) || k.GiverId == Convert.ToInt64(reaction.UserId)).ToList();

                // Check if the giver has already given on this message
                var eventOnMessage = relevantEvents.FirstOrDefault(e => e.Id == KarmaEvent.GetId(reaction.UserId, message.Id));
                if (eventOnMessage != null)
                {
                    return;
                }

                // Check if the giver is allowed to give in general
                var lastGiverEvent = relevantEvents.Where(e => e.GiverId == Convert.ToInt64(reaction.UserId)).OrderByDescending(e => e.GivenAt).FirstOrDefault();
                if (DateTimeOffset.UtcNow.Subtract(lastGiverEvent?.GivenAt ?? DateTime.MinValue).TotalMinutes < Configuration.Get <int>("karma_limit_all"))
                {
                    return;
                }

                // Check if the giver has given to recipient witin limit
                var lastGiverToRecipient = relevantEvents.Where(e => e.GiverId == Convert.ToInt64(reaction.UserId) && e.RecipientId == Convert.ToInt64(message.Author.Id))
                                           .OrderByDescending(e => e.GivenAt).FirstOrDefault();
                if (DateTimeOffset.UtcNow.Subtract(lastGiverToRecipient?.GivenAt ?? DateTime.MinValue).TotalMinutes < Configuration.Get <int>("karma_limit_mutual"))
                {
                    return;
                }

                // Write new event to db
                dctx.Add(KarmaEvent.New(reaction.UserId, message, 1));

                await dctx.SaveChangesAsync();
            }
        }
示例#5
0
        private async Task HandleMemberJoinedAsync(SocketGuildUser member)
        {
            using (var dctx = new SparkyContext())
            {
                var user = dctx.GetOrCreateUser(member.Id);

                foreach (var roleId in user.Roles)
                {
                    var role = member.Guild.Roles.FirstOrDefault(r => r.Id == roleId);
                    if (role != null)
                    {
                        await member.AddRoleAsync(role);
                    }
                }

                await dctx.SaveChangesAsync();
            }
        }