public async Task UnmuteTargetUser(RabbotContext db, IUser user, SocketCommandContext context) { var mute = db.MutedUsers.AsQueryable().Where(p => p.GuildId == context.Guild.Id && p.UserId == user.Id); if (!mute.Any()) { await SendError($"{user.Mention} ist nicht gemuted.", context); return; } else { var dcGuild = db.Guilds.FirstOrDefault(p => p.GuildId == context.Guild.Id); var dcTargetUser = user as SocketGuildUser; var mutedRole = dcTargetUser.Roles.FirstOrDefault(p => p.Name == "Muted"); if (mutedRole != null) { db.MutedUsers.Remove(mute.FirstOrDefault()); await dcTargetUser.RemoveRoleAsync(mutedRole); var oldRoles = mute.FirstOrDefault().Roles.Split('|'); await db.SaveChangesAsync(); foreach (var oldRole in oldRoles) { var role = context.Guild.Roles.FirstOrDefault(p => p.Name == oldRole); if (role != null) { await dcTargetUser.AddRoleAsync(role); } } } await Logging.Unmuted(context, user); } }
private async Task NewVideo(RabbotContext db, YouTubeVideoDto video) { foreach (var dbGuild in db.Guilds.AsQueryable().Where(p => p.GuildId == 432908323042623508)) { try { if (dbGuild.StreamChannelId == null) { continue; } var guild = _client.Guilds.FirstOrDefault(p => p.Id == dbGuild.GuildId); if (guild == null) { continue; } if (!(guild.Channels.FirstOrDefault(p => p.Id == dbGuild.StreamChannelId) is SocketTextChannel channel)) { continue; } var youTubeUrl = $"https://www.youtube.com/watch?v={video.Id}"; await channel.SendMessageAsync($"**{video.ChannelName}** hat ein neues Video hochgeladen! {guild.EveryoneRole.Mention}\n{youTubeUrl}"); } catch (Exception ex) { _logger.Error(ex, $"Error while sending YouTube notification"); } } }
public async Task AutoWarn(RabbotContext db, SocketMessage msg) { var myUser = msg.Author as SocketGuildUser; if (db.MutedUsers.AsQueryable().Where(p => p.UserId == msg.Author.Id && p.GuildId == myUser.Guild.Id).Any()) { return; } if (myUser.Roles.Where(p => p.Name == "Muted").Any()) { return; } var warn = db.Warnings.FirstOrDefault(p => p.UserId == msg.Author.Id && p.GuildId == myUser.Guild.Id) ?? db.Warnings.AddAsync(new WarningEntity { GuildId = myUser.Guild.Id, UserId = msg.Author.Id, Until = DateTime.Now.AddHours(1), Counter = 0 }).Result.Entity; warn.Counter++; if (warn.Counter > 3) { return; } await msg.Channel.SendMessageAsync($"**{msg.Author.Mention} du wurdest für schlechtes Benehmen verwarnt. Warnung {warn.Counter}/3**"); var badword = db.BadWords.FirstOrDefault(p => Helper.ReplaceCharacter(msg.Content).Contains(p.BadWord, StringComparison.OrdinalIgnoreCase) && p.GuildId == myUser.Guild.Id).BadWord; await Logging.Warning(myUser, msg, badword); }
public async Task MuteWarnedUser(RabbotContext db, SocketGuildUser user, SocketGuild guild) { var mutedRole = guild.Roles.FirstOrDefault(p => p.Name == "Muted"); if (mutedRole == null) { return; } var targetPosition = GetTargetRolePosition(user); var botPosition = GetBotRolePosition(guild.CurrentUser); if (!(mutedRole.Position > targetPosition && guild.CurrentUser.GuildPermissions.ManageRoles)) { return; } if (targetPosition > botPosition) { return; } DateTime date = DateTime.Now; DateTime banUntil = date.AddHours(1); if (!db.MutedUsers.AsQueryable().Where(p => p.GuildId == guild.Id && p.UserId == user.Id).Any()) { string userRoles = ""; foreach (var role in user.Roles) { if (!role.IsEveryone && !role.IsManaged) { userRoles += role.Name + "|"; } } userRoles = userRoles.TrimEnd('|'); await db.MutedUsers.AddAsync(new MutedUserEntity { GuildId = guild.Id, UserId = user.Id, Duration = banUntil, Roles = userRoles }); } else { var ban = db.MutedUsers.FirstOrDefault(p => p.GuildId == guild.Id && p.UserId == user.Id); ban.Duration = banUntil; } await SendPrivate(guild, banUntil, "1 Stunde", user); await Logging.WarningMute((SocketGuildUser)user); await db.SaveChangesAsync(); }
private async Task HandleCommandAsync(SocketMessage s) { if (!(s is SocketUserMessage msg)) { return; } var context = new ShardedCommandContext(_client, msg); if (context.User.IsBot || (context.IsPrivate && !msg.Content.Contains(Config.Bot.CmdPrefix + "hdf") && !msg.Content.Contains(Config.Bot.CmdPrefix + "add") && !msg.Content.Contains(Config.Bot.CmdPrefix + "remove"))) { return; } int argPos = 0; IResult result = null; if (msg.HasStringPrefix(Config.Bot.CmdPrefix, ref argPos)) { if (!msg.Content.Contains(Config.Bot.CmdPrefix + "hdf") && !msg.Content.Contains(Config.Bot.CmdPrefix + "add") && !msg.Content.Contains(Config.Bot.CmdPrefix + "remove")) { using RabbotContext db = Database.Open(); if (db.Rule.Any(p => p.GuildId == context.Guild.Id)) { if (context.Channel.Id == db.Rule.First(p => p.GuildId == context.Guild.Id).ChannelId) { return; } } } result = await _commands.ExecuteAsync(context, argPos, _provider); LogCommandUsage(context, result); if (!result.IsSuccess && result.Error != CommandError.UnknownCommand) { _logger.Information(result.ErrorReason); } } else { await SendAnswerIfTagged(msg.Content, context); } if (result != null && result.Error == CommandError.UnknownCommand) { await SendAnswerIfTagged(msg.Content, context); } }
public async Task Warn(RabbotContext db, IUser user, SocketCommandContext Context) { var warn = db.Warnings.FirstOrDefault(p => p.UserId == user.Id && p.GuildId == Context.Guild.Id) ?? db.Warnings.AddAsync(new WarningEntity { GuildId = Context.Guild.Id, UserId = user.Id, Until = DateTime.Now.AddHours(1), Counter = 0 }).Result.Entity; warn.Counter++; if (warn.Counter > 3) { return; } await Context.Message.Channel.SendMessageAsync($"**{user.Mention} du wurdest für schlechtes Benehmen verwarnt. Warnung {warn.Counter}/3**"); await Logging.Warn(user, Context); await db.SaveChangesAsync(); }
private async Task MessageReceived(SocketMessage message) { if (!(message is SocketUserMessage msg)) { return; } var context = new ShardedCommandContext(_client, msg); if (!(context.User is SocketGuildUser user)) { return; } using RabbotContext db = _db.Open(); if (!db.Rule.Any(p => p.GuildId == context.Guild.Id)) { return; } var ruleEntity = db.Rule.First(p => p.GuildId == context.Guild.Id); if (message.Channel.Id != ruleEntity.ChannelId) { return; } await message.DeleteAsync(); if (!ruleEntity.AcceptWord.Equals(context.Message.Content, StringComparison.OrdinalIgnoreCase)) { return; } var role = context.Guild.Roles.FirstOrDefault(p => p.Id == ruleEntity.RoleId); if (role == null) { return; } await user.AddRoleAsync(role); }
public async Task CheckWarnings(RabbotContext db) { if (!db.Warnings.Any()) { return; } var warnings = db.Warnings.ToList(); foreach (var warn in warnings) { if (warn.Until < DateTime.Now) { db.Warnings.Remove(warn); await db.SaveChangesAsync(); continue; } if (warn.Counter >= 3) { var dcGuild = _client.Guilds.FirstOrDefault(p => p.Id == warn.GuildId); var dcTargetUser = dcGuild.Users.FirstOrDefault(p => p.Id == warn.UserId); var dbUser = db.Features.FirstOrDefault(p => p.GuildId == warn.GuildId && p.UserId == warn.UserId); await _muteService.MuteWarnedUser(db, dcTargetUser, dcGuild); if (dbUser != null) { if (dbUser.Goats >= 100) { dbUser.Goats -= 100; } else { dbUser.Goats = 0; } } db.Warnings.Remove(warn); await db.SaveChangesAsync(); continue; } } }
public async Task CheckAttacks(RabbotContext db) { if (!db.Attacks.Any()) { return; } var attacks = db.Attacks.ToList(); foreach (var attack in attacks) { if (attack.EndTime < DateTime.Now) { await AttackResult(attack, db); db.Attacks.Remove(attack); await db.SaveChangesAsync(); continue; } } }
public async Task CheckMutes(RabbotContext db) { if (!db.MutedUsers.Any() || !_client.Guilds.Any()) { return; } var muteUsers = db.MutedUsers.ToList(); foreach (var mute in muteUsers) { var dcGuild = _client.Guilds.FirstOrDefault(p => p.Id == mute.GuildId); if (dcGuild == null) { db.MutedUsers.Remove(mute); await db.SaveChangesAsync(); continue; } var mutedRole = dcGuild.Roles.FirstOrDefault(p => p.Name == "Muted"); if (mutedRole == null) { continue; } if (dcGuild.CurrentUser == null) { continue; } int position = GetBotRolePosition(dcGuild.CurrentUser); var dcTargetUser = dcGuild.Users.FirstOrDefault(p => p.Id == mute.UserId); if (dcTargetUser == null) { if (mute.Duration < DateTime.Now) { db.MutedUsers.Remove(mute); await db.SaveChangesAsync(); } continue; } if (dcGuild.CurrentUser.GuildPermissions.ManageRoles == true && position > mutedRole.Position) { if (mute.Duration < DateTime.Now) { db.MutedUsers.Remove(mute); try { await dcTargetUser.RemoveRoleAsync(mutedRole); var oldRoles = mute.Roles.Split('|'); foreach (var oldRole in oldRoles) { var role = dcGuild.Roles.FirstOrDefault(p => p.Name == oldRole); if (role != null) { await dcTargetUser.AddRoleAsync(role); } } await Logging.Unmuted(dcTargetUser); } catch (Exception e) { _logger.Error(e, $"Error while adding roles"); } } else { if (!dcTargetUser.Roles.Where(p => p.Id == mutedRole.Id).Any()) { try { var oldRoles = mute.Roles.Split('|'); foreach (var oldRole in oldRoles) { if (!oldRole.Contains("everyone")) { var role = dcGuild.Roles.FirstOrDefault(p => p.Name == oldRole); if (role != null) { await dcTargetUser.RemoveRoleAsync(role); } } } await dcTargetUser.AddRoleAsync(mutedRole); } catch (Exception e) { _logger.Error(e, $"Error while removing roles"); } } } } } await db.SaveChangesAsync(); }
public async Task MuteTargetUser(RabbotContext db, IUser user, string duration, SocketCommandContext context) { var mutedRole = context.Guild.Roles.FirstOrDefault(p => p.Name == "Muted"); if (mutedRole == null) { await SendError($"Es existiert keine Muted Rolle!", context); return; } var dcTargetUser = user as SocketGuildUser; var dcGuild = context.Guild; var targetPosition = GetTargetRolePosition(dcTargetUser); var botPosition = GetBotRolePosition(dcGuild.CurrentUser); if (!(mutedRole.Position > targetPosition && dcGuild.CurrentUser.GuildPermissions.ManageRoles)) { await SendError($"Mindestens eine meiner Rollen muss in der Reihenfolge über der Muted Rolle stehen!", context); return; } if (targetPosition > botPosition) { await SendError($"Es fehlen die Berechtigungen um {dcTargetUser.Mention} zu muten!", context); return; } if (context.User.Id == user.Id) { await SendError($"{user.Mention} du Trottel kannst dich nicht selber muten!", context); return; } DateTime date = DateTime.Now; DateTime banUntil; if (duration.Contains('s')) { banUntil = date.AddSeconds(Convert.ToDouble(duration.Trim('s'))); } else if (duration.Contains('m')) { banUntil = date.AddMinutes(Convert.ToDouble(duration.Trim('m'))); } else if (duration.Contains('h')) { banUntil = date.AddHours(Convert.ToDouble(duration.Trim('h'))); } else if (duration.Contains('d')) { banUntil = date.AddDays(Convert.ToDouble(duration.Trim('d'))); } else { return; } if (!db.MutedUsers.AsQueryable().Where(p => p.GuildId == context.Guild.Id && p.UserId == user.Id).Any()) { string userRoles = ""; foreach (var role in dcTargetUser.Roles) { if (!role.IsEveryone && !role.IsManaged) { userRoles += role.Name + "|"; } } userRoles = userRoles.TrimEnd('|'); await db.MutedUsers.AddAsync(new MutedUserEntity { GuildId = context.Guild.Id, UserId = user.Id, Duration = banUntil, Roles = userRoles }); } else { var ban = db.MutedUsers.FirstOrDefault(p => p.GuildId == context.Guild.Id && p.UserId == user.Id); ban.Duration = banUntil; } await SendPrivate(dcGuild, banUntil, duration, dcTargetUser); await Logging.Mute(context, user, duration); await db.SaveChangesAsync(); }
public (string bonusInfo, double bonusPercent) GetBonusEXP(RabbotContext db, SocketGuildUser user) { var feature = db.Features.Include(p => p.Inventory).FirstOrDefault(p => p.UserId == user.Id && p.GuildId == user.Guild.Id); if (feature == null) { return("Kein Bonus :(", 0); } double bonusPercent = 0; string bonusInfo = string.Empty; if (user.Roles.Where(p => p.Name == "Nitro Booster" || p.Name == "Twitch Sub" || p.Name == "YouTube Mitglied").Any()) { bonusPercent += 50; bonusInfo += $"**+50% EXP** (Supporter Bonus)\n"; } if (feature.Inventory.FirstOrDefault(p => p.ItemId == 3 && p.ExpiryDate > DateTime.Now) != null) { bonusPercent += 50; bonusInfo += $"**+50% EXP** (EXP +50% Item)\n"; } var ranks = db.Musicranks.AsQueryable().Where(p => p.GuildId == user.Guild.Id && p.Date.DayOfYear == DateTime.Now.DayOfYear && p.Date.Year == DateTime.Now.Year).OrderByDescending(p => p.Seconds); int rank = 0; foreach (var Rank in ranks) { rank++; if (Rank.UserId == user.Id) { break; } } if (rank == 1) { bonusPercent += 50; bonusInfo += $"**+50% EXP** (Musicrank 1. Platz)\n"; } if (rank == 2) { bonusPercent += 30; bonusInfo += $"**+30% EXP** (Musicrank 2. Platz)\n"; } if (rank == 3) { bonusPercent += 10; bonusInfo += $"**+10% EXP** (Musicrank 3. Platz)\n"; } if (db.Events.AsQueryable().Where(p => p.Status == true).Any()) { var myEvent = db.Events.FirstOrDefault(p => p.Status == true); bonusPercent += myEvent.BonusPercent; bonusInfo += $"**+{myEvent.BonusPercent}% EXP** ({myEvent.Name} Event)\n"; } if (_streakService.GetStreakLevel(feature) > 0) { double streakBonus = Math.Round(_streakService.GetStreakLevel(feature) * Constants.ExpBoostPerLevel, 2); bonusPercent += streakBonus; bonusInfo += $"**+{streakBonus}% EXP** ({ Constants.ExpBoostPerLevel}% × { Constants.Fire} { _streakService.GetStreakLevel(feature).ToFormattedString()})\n"; } if (bonusPercent > 0) { bonusInfo += $"**{bonusPercent}% EXP Bonus insgesamt**"; } if (string.IsNullOrWhiteSpace(bonusInfo)) { bonusInfo = "Kein Bonus :("; } return(bonusInfo, bonusPercent); }
private async Task AttackResult(AttackEntity attack, RabbotContext db) { var dcServer = _client.Guilds.FirstOrDefault(p => p.Id == attack.GuildId); if (dcServer == null) { return; } var dcTarget = dcServer.Users.FirstOrDefault(p => p.Id == attack.TargetId); var dcUser = dcServer.Users.FirstOrDefault(p => p.Id == attack.UserId); var dcChannel = dcServer.Channels.FirstOrDefault(p => p.Id == attack.ChannelId) as ISocketMessageChannel; var dbTarget = db.Features.FirstOrDefault(p => p.GuildId == attack.GuildId && p.UserId == attack.TargetId) ?? db.Features.AddAsync(new FeatureEntity { Guild = attack.Guild, UserId = attack.TargetId, Exp = 0, Goats = 0 }).Result.Entity; var dbUser = db.Features.FirstOrDefault(p => p.GuildId == attack.GuildId && p.UserId == attack.UserId) ?? db.Features.AddAsync(new FeatureEntity { GuildId = attack.GuildId, UserId = attack.UserId, Exp = 0, Goats = 0 }).Result.Entity; var targetStallBefore = Helper.GetStall(dbTarget.Wins); var userStallBefore = Helper.GetStall(dbUser.Wins); var inventoryUser = db.Inventorys.AsQueryable().Join(db.Items, id => id.ItemId, item => item.Id, (Inventory, Item) => new { Inventory, Item }).Where(p => p.Inventory.FeatureId == dbUser.Id); var inventoryTarget = db.Inventorys.AsQueryable().Join(db.Items, id => id.ItemId, item => item.Id, (Inventory, Item) => new { Inventory, Item }).Where(p => p.Inventory.FeatureId == dbTarget.Id); var atkUser = userStallBefore.Attack; var defTarget = targetStallBefore.Defense; bool hirtenstab = false; bool zaun = false; var dcMessage = dcChannel.CachedMessages.FirstOrDefault(p => p.Id == attack.MessageId) as SocketUserMessage; if (dcMessage != null) { foreach (var reaction in dcMessage.Reactions) { var emote = reaction.Key as Emote; if (emote.Id == Constants.Shield.Id) { if (reaction.Value.ReactionCount >= 2) { zaun = true; } } else if (emote.Id == Constants.Sword.Id) { if (reaction.Value.ReactionCount >= 2) { hirtenstab = true; } } } } if (hirtenstab) { if (inventoryUser.Count() != 0) { foreach (var item in inventoryUser) { atkUser += item.Item.Atk; if (item.Inventory.ItemId == 1) { item.Inventory.Durability--; if (item.Inventory.Durability <= 0) { db.Inventorys.Remove(item.Inventory); } } } } } if (zaun) { if (inventoryTarget.Count() != 0) { foreach (var item in inventoryTarget) { defTarget += item.Item.Def; if (item.Inventory.ItemId == 2) { item.Inventory.Durability--; if (item.Inventory.Durability <= 0) { db.Inventorys.Remove(item.Inventory); } } } } } Random rnd = new Random(); var sum = atkUser + defTarget; var winChance = ((double)atkUser / (double)sum) * 100; var chance = rnd.Next(1, 101); EmbedBuilder embed = new EmbedBuilder(); var rabbotUser = db.Features.FirstOrDefault(p => p.GuildId == dcServer.Id && p.UserId == _client.CurrentUser.Id) ?? db.AddAsync(new FeatureEntity { GuildId = dcServer.Id, UserId = _client.CurrentUser.Id, Goats = 0, Exp = 0 }).Result.Entity; if (chance <= winChance) { int amount = rnd.Next(40, targetStallBefore.MaxOutput + 1); if (amount >= dbTarget.Goats) { amount = dbTarget.Goats; } if (!(dcTarget == null || dcUser == null)) { if (dcChannel != null) { embed.Color = Color.Green; if (!Helper.IsFull(dbUser.Goats + amount, dbUser.Wins)) { embed.Description = $"{dcUser.Mention} du hast den **Angriff** gegen {dcTarget.Mention} **gewonnen** und **{amount} Ziegen** erbeutet!"; } else { embed.Description = $"{dcUser.Mention} du hast den **Angriff** gegen {dcTarget.Mention} **gewonnen** und **{amount} Ziegen** erbeutet!\nLeider ist **dein Stall voll**. Deswegen sind **{(dbUser.Goats + amount) - Helper.GetStall(dbUser.Wins).Capacity} Ziegen** zu Rabbot geflüchtet."; rabbotUser.Goats += (dbUser.Goats + amount) - Helper.GetStall(dbUser.Wins).Capacity; } await dcChannel.SendMessageAsync(null, false, embed.Build()); } } dbUser.Wins++; if (Helper.IsFull(dbUser.Goats + amount, dbUser.Wins)) { dbUser.Goats = Helper.GetStall(dbUser.Wins).Capacity; } else { dbUser.Goats += amount; } dbTarget.Goats -= amount; dbTarget.Loses++; } else { int amount = rnd.Next(40, userStallBefore.MaxOutput + 1); if (amount >= dbUser.Goats) { amount = dbUser.Goats; } if (!(dcTarget == null || dcUser == null)) { if (dcChannel != null) { embed.Color = Color.Red; if (!Helper.IsFull(dbTarget.Goats + amount, dbTarget.Wins)) { embed.Description = $"{dcUser.Mention} du hast den **Angriff** gegen {dcTarget.Mention} **verloren** und ihm/ihr **{amount} Ziegen** überlassen.."; } else { embed.Description = $"{dcUser.Mention} du hast den **Angriff** gegen {dcTarget.Mention} **verloren** und ihm/ihr **{amount} Ziegen** überlassen..\nLeider ist {dcTarget.Nickname ?? dcTarget.Username}'s **Stall voll**. Deswegen sind **{(dbTarget.Goats + amount) - Helper.GetStall(dbTarget.Wins).Capacity} Ziegen** zu Rabbot geflüchtet."; rabbotUser.Goats += (dbTarget.Goats + amount) - Helper.GetStall(dbTarget.Wins).Capacity; } await dcChannel.SendMessageAsync(null, false, embed.Build()); } } dbTarget.Wins++; if (Helper.IsFull(dbTarget.Goats + amount, dbTarget.Wins)) { dbTarget.Goats = Helper.GetStall(dbTarget.Wins).Capacity; } else { dbTarget.Goats += amount; } dbUser.Goats -= amount; dbUser.Loses++; } dbUser.Locked = false; dbTarget.Locked = false; await db.SaveChangesAsync(); var targetStallAfter = Helper.GetStall(dbTarget.Wins); var userStallAfter = Helper.GetStall(dbUser.Wins); if ((targetStallAfter != targetStallBefore) && dcChannel != null) { embed.Color = Color.Green; embed.Description = $"{dcTarget.Mention} durch deinen **Sieg** hat sich dein Stall vergrößert! (Neuer Stall: **{targetStallAfter.Name}**)"; await dcChannel.SendMessageAsync(null, false, embed.Build()); } if ((userStallAfter != userStallBefore) && dcChannel != null) { embed.Color = Color.Green; embed.Description = $"{dcUser.Mention} durch deinen **Sieg** hat sich dein Stall vergrößert! (Neuer Stall: **{userStallAfter.Name}**)"; await dcChannel.SendMessageAsync(null, false, embed.Build()); } }