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(); } }
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(); } }
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(); } }