public static async Task CheckRuleAgreement(Guild guild, SocketGuildUser socketGuildUser, SocketReaction reaction) { try { if (socketGuildUser is null || socketGuildUser.IsBot || reaction?.MessageId != guild.Admin.Rulebox.MessageId) { return; } var user = await GuildUsers.GetAsync(socketGuildUser); if (reaction.Emote.Name == guild.Admin.Rulebox.AgreeEmote) { var role = socketGuildUser.Guild.Roles.First(r => r.Id == guild.Admin.Rulebox.Role); await socketGuildUser.AddRoleAsync(role); } else if (reaction.Emote.Name == guild.Admin.Rulebox.DisagreeEmote) { var roles = socketGuildUser.Roles.ToList(); roles.RemoveAt(0); var bot = socketGuildUser.Guild.GetUser(Global.Client.CurrentUser.Id); if (guild.Admin.Rulebox.RemoveRolesOnDisagree && socketGuildUser.Hierarchy <= bot.Hierarchy) { await socketGuildUser.RemoveRolesAsync(roles); } if (guild.Admin.Rulebox.KickOnDisagree && socketGuildUser.Hierarchy <= bot.Hierarchy) { await user.KickAsync($"Please agree to the rules to use `{socketGuildUser.Guild.Name}`.", Global.Client.CurrentUser); } } await GuildUsers.Save(user); } catch (Exception ex) { await Debug.LogErrorAsync("rulebox", ex.StackTrace); } }
public static async Task ValidateForEXPAsync(IUserMessage message, Guild guild) { var guildUser = await ValidateCanEarnEXP(message, guild); var user = await Users.GetAsync(message.Author as SocketUser); guildUser.Status.LastMessage = message.Content; guildUser.XP.LastXPMsg = DateTime.Now; int oldLevel = guildUser.XP.Level; guildUser.XP.EXP += guild.XP.EXPPerMessage; int newLevel = guildUser.XP.Level; guildUser.Status.MessageCount++; user.MessageCount++; await GuildUsers.Save(guildUser); await Users.Save(user); if (oldLevel != newLevel) { await SendLevelUpMessageAsync(message, guild, guildUser, oldLevel, newLevel); } }
public static async Task OnReactionRemoved(Cacheable <IUserMessage, ulong> before, ISocketMessageChannel channel, SocketReaction reaction) { try { var socketGuildUser = reaction.User.Value as SocketGuildUser; var user = await GuildUsers.GetAsync(socketGuildUser); var guild = await Guilds.GetAsync(socketGuildUser.Guild); if (!socketGuildUser.IsBot && reaction.MessageId == guild.Admin.Rulebox.MessageId && reaction.Emote.Name == guild.Admin.Rulebox.AgreeEmote) { var roles = socketGuildUser.Roles.ToList(); roles.RemoveAt(0); await socketGuildUser.RemoveRolesAsync(roles); } await GuildUsers.Save(user); } catch (Exception ex) { await Debug.LogErrorAsync("rulebox", ex.StackTrace); } }
public static async Task ValidateMessage(SocketMessage message) { try { if (message is null || !(message.Author is SocketGuildUser guildAuthor) || guildAuthor.IsBot) { return; } var user = await GuildUsers.GetAsync(guildAuthor); var guild = await Guilds.GetAsync(guildAuthor.Guild); var autoMod = guild.Moderation.Auto; ValidateUserNotExempt(guildAuthor, guild); if (autoMod.SpamNotification) { await SendSpamNotification(message, guildAuthor, guild); } var messageValidation = GetContentValidation(guild, message.Content, user); if (messageValidation != null) { ValidateChannelNotExempt((FilterType)messageValidation, guildAuthor.Guild, guild); ValidateRoleNotExempt((FilterType)messageValidation, guildAuthor, guild); var filter = guild.Moderation.Auto.Filters.FirstOrDefault(f => f.Filter == messageValidation); await PunishUser(filter.Punishment, user, messageValidation.ToString().ToSentenceCase()); try { await message.DeleteAsync(); } // 404 - there may be other auto mod bots -> message already deleted catch {} finally { await user.XP.ExtendXPCooldown(); } } user.Status.LastMessage = message.Content; await GuildUsers.Save(user); } catch (InvalidOperationException) {} catch (Exception) {}//{ await Debug.LogAsync("auto", LogSeverity.Error, ex); } }