//[Command(Name = "mybadges")] //public async Task MyBadgesAsync(EventContext e) //{ // int page = 0; // using (var context = new MikiContext()) // { // User u = await context.Users.FindAsync(e.Author.Id.ToDbLong()); // string output = string.Join<long>(" ", u.BadgesOwned.Select(x => x.Id).ToList()); // await e.Channel.SendMessage(output.DefaultIfEmpty("none, yet!")); // } //} public async Task ShowLeaderboardsAsync(IDiscordMessage mContext, LeaderboardsOptions leaderboardOptions) { using (var context = new MikiContext()) { Locale locale = Locale.GetEntity(mContext.Channel.Id.ToDbLong()); int p = Math.Max(leaderboardOptions.pageNumber - 1, 0); IDiscordEmbed embed = Utils.Embed .SetColor(1.0f, 0.6f, 0.4f); switch (leaderboardOptions.type) { case LeaderboardsType.COMMANDS: { embed.Title = locale.GetString("miki_module_accounts_leaderboards_commands_header"); if (leaderboardOptions.mentionedUserId != 0) { long mentionedId = leaderboardOptions.mentionedUserId.ToDbLong(); var mentionedUser = await context.Users.FindAsync(mentionedId); p = (int)Math.Ceiling((double)(((await mentionedUser.GetGlobalCommandsRankAsync()) - 1) / 12)); } List <User> output = await context.Users .OrderByDescending(x => x.Total_Commands) .Skip(12 * p) .Take(12) .ToListAsync(); for (int i = 0; i < output.Count; i++) { string nameToOutput = leaderboardOptions.mentionedUserId != 0 ? string.Join("", output[i].Name.Take(16)) : "~" + string.Join("", output[i].Name.Take(16)) + "~"; embed.AddInlineField($"#{i + (12 * p) + 1}: {nameToOutput}", $"{output[i].Total_Commands} commands used!"); } } break; case LeaderboardsType.CURRENCY: { embed.Title = locale.GetString("miki_module_accounts_leaderboards_mekos_header"); if (leaderboardOptions.mentionedUserId != 0) { long mentionedId = leaderboardOptions.mentionedUserId.ToDbLong(); var mentionedUser = await context.Users.FindAsync(mentionedId); p = (int)Math.Ceiling((double)(((await mentionedUser.GetGlobalMekosRankAsync()) - 1) / 12)); } List <User> output = await context.Users .OrderByDescending(x => x.Currency) .Skip(12 * p) .Take(12) .ToListAsync(); for (int i = 0; i < output.Count; i++) { embed.AddInlineField($"#{i + (12 * p) + 1}: {string.Join("", output[i].Name.Take(16))}", $"{output[i].Currency} mekos!"); } } break; case LeaderboardsType.EXP: { embed.Title = locale.GetString("miki_module_accounts_leaderboards_header"); if (leaderboardOptions.mentionedUserId != 0) { long mentionedId = leaderboardOptions.mentionedUserId.ToDbLong(); var mentionedUser = await context.Users.FindAsync(mentionedId); p = (int)Math.Ceiling((double)(((await mentionedUser.GetGlobalRankAsync()) - 1) / 12)); } List <User> output = await context.Users .OrderByDescending(x => x.Total_Experience) .Skip(12 * p) .Take(12) .ToListAsync(); for (int i = 0; i < output.Count; i++) { embed.AddInlineField($"#{i + (12 * p) + 1}: {string.Join("", output[i].Name.Take(16))}", $"{output[i].Total_Experience} experience!"); } } break; case LeaderboardsType.REPUTATION: { embed.Title = locale.GetString("miki_module_accounts_leaderboards_reputation_header"); if (leaderboardOptions.mentionedUserId != 0) { long mentionedId = leaderboardOptions.mentionedUserId.ToDbLong(); var mentionedUser = await context.Users.FindAsync(mentionedId); p = (int)Math.Ceiling((double)(((await mentionedUser.GetGlobalReputationRankAsync()) - 1) / 12)); } List <User> output = await context.Users .OrderByDescending(x => x.Reputation) .Skip(12 * p) .Take(12) .ToListAsync(); for (int i = 0; i < output.Count; i++) { embed.AddInlineField($"#{i + (12 * p) + 1}: {string.Join("", output[i].Name.Take(16))}", $"{output[i].Reputation} reputation!"); } } break; case LeaderboardsType.PASTA: { List <GlobalPasta> leaderboards = await context.Pastas .OrderByDescending(x => x.Score) .Skip(12 * p) .Take(12) .ToListAsync(); embed.SetTitle(locale.GetString("toppasta_title")); foreach (GlobalPasta t in leaderboards) { int amount = t.Score; embed.AddInlineField(t.Id, (t == leaderboards.First() ? "💖 " + amount : (amount < 0 ? "💔 " : "� ") + amount)); } } break; } await embed .SetFooter(locale.GetString("page_index", p + 1, Math.Ceiling(context.Users.Count() / 12f)), "") .QueueToChannel(mContext.Channel); } }
public async Task RedeemKeyAsync(EventContext e) { using (var context = new MikiContext()) { long id = (long)e.Author.Id; Guid guid = Guid.Parse(e.Arguments.Join().Argument); DonatorKey key = await context.DonatorKey.FindAsync(guid); IsDonator donatorStatus = await context.IsDonator.FindAsync(id); if (key != null) { if (donatorStatus == null) { donatorStatus = (await context.IsDonator.AddAsync(new IsDonator() { UserId = id })).Entity; } donatorStatus.KeysRedeemed++; if (donatorStatus.ValidUntil > DateTime.Now) { donatorStatus.ValidUntil += key.StatusTime; } else { donatorStatus.ValidUntil = DateTime.Now + key.StatusTime; } new EmbedBuilder() { Title = ($"🎉 Congratulations, {e.Author.Username}"), Color = new Color(226, 46, 68), Description = ($"You have successfully redeemed a donator key, I've given you **{key.StatusTime.TotalDays}** days of donator status."), ThumbnailUrl = ("https://i.imgur.com/OwwA5fV.png") }.AddInlineField("When does my status expire?", donatorStatus.ValidUntil.ToLongDateString()) .ToEmbed().QueueToChannel(e.Channel); context.DonatorKey.Remove(key); await context.SaveChangesAsync(); // cheap hack. var achievements = AchievementManager.Instance.GetContainerById("donator"); if (donatorStatus.KeysRedeemed == 1) { await achievements.Achievements[0].UnlockAsync(e.Channel, e.Author, 0); } else if (donatorStatus.KeysRedeemed == 5) { await achievements.Achievements[1].UnlockAsync(e.Channel, e.Author, 1); } else if (donatorStatus.KeysRedeemed == 25) { await achievements.Achievements[2].UnlockAsync(e.Channel, e.Author, 2); } } else { e.ErrorEmbed("Your donation key is invalid!"); } } }
public GamblingModule() { if (!Global.Config.IsMainBot) { lotteryId = taskScheduler.AddTask(0, (s) => { long size = Global.RedisClient.Database.ListLength(lotteryKey); if (size == 0) { return; } string value = Global.RedisClient.Database.ListGetByIndex(lotteryKey, MikiRandom.Next(size)); ulong winnerId = ulong.Parse(value); int wonAmount = (int)Math.Round(size * 100 * 0.75); IDiscordUser user = null; //Bot.Instance.Client.GetUser(winnerId); using (var context = new MikiContext()) { long id = winnerId.ToDbLong(); User profileUser = context.Users.Find(id); if (user != null) { IDiscordChannel channel = user.GetDMChannel().Result; EmbedBuilder embed = new EmbedBuilder() { Author = new EmbedAuthor() { Name = "Winner winner chicken dinner", IconUrl = user.GetAvatarUrl() }, Description = $"Wow! You won the lottery and gained {wonAmount} mekos!" }; profileUser.AddCurrencyAsync(wonAmount, channel); embed.ToEmbed().QueueToChannel(channel); context.SaveChanges(); Global.RedisClient.Database.KeyDelete(lotteryKey); Global.RedisClient.Database.StringSet("lottery:winner", profileUser.Name ?? "unknown"); lotteryDict.ClearAsync(); var lotteryAchievement = AchievementManager.Instance.GetContainerById("lottery"); if (wonAmount > 100000) { lotteryAchievement.Achievements[0].UnlockAsync(channel, user, 0); } if (wonAmount > 10000000) { lotteryAchievement.Achievements[1].UnlockAsync(channel, user, 1); } if (wonAmount > 250000000) { lotteryAchievement.Achievements[2].UnlockAsync(channel, user, 1); } } } }, "", new TimeSpan(0, 1, 0, 0), true); } }
public async Task IAmAsync(EventContext e) { using (var context = new MikiContext()) { string roleName = e.Arguments.ToString(); List <IDiscordRole> roles = await GetRolesByName(e.Guild, roleName); IDiscordRole role = null; // checking if the role has a duplicate name. if (roles.Count > 1) { List <LevelRole> levelRoles = await context.LevelRoles.Where(x => x.GuildId == (long)e.Guild.Id).ToListAsync(); if (levelRoles.Where(x => x.GetRoleAsync().Result.Name.ToLower() == roleName.ToLower()).Count() > 1) { e.ErrorEmbed("two roles configured have the same name.") .ToEmbed().QueueToChannel(e.Channel); return; } else { role = levelRoles.Where(x => x.GetRoleAsync().Result.Name.ToLower() == roleName.ToLower()).FirstOrDefault().GetRoleAsync().Result; } } else { role = roles.FirstOrDefault(); } // checking if the role is null if (role == null) { e.ErrorEmbedResource("error_role_null") .ToEmbed().QueueToChannel(e.Channel); return; } IDiscordGuildUser author = await e.Guild.GetMemberAsync(e.Author.Id); if (author.RoleIds.Contains(role.Id)) { e.ErrorEmbed(e.Locale.GetString("error_role_already_given")) .ToEmbed().QueueToChannel(e.Channel); return; } LevelRole newRole = await context.LevelRoles.FindAsync(e.Guild.Id.ToDbLong(), role.Id.ToDbLong()); IDiscordRole discordRole = await newRole.GetRoleAsync(); User user = (await context.Users.FindAsync(e.Author.Id.ToDbLong())); IDiscordGuildUser discordUser = await e.Guild.GetMemberAsync(user.Id.FromDbLong()); LocalExperience localUser = await LocalExperience.GetAsync(context, e.Guild.Id.ToDbLong(), discordUser.Id.ToDbLong(), discordUser.Username); if (!newRole?.Optable ?? false) { await e.ErrorEmbed(e.Locale.GetString("error_role_forbidden")) .ToEmbed().SendToChannel(e.Channel); return; } int level = User.CalculateLevel(localUser.Experience); if (newRole.RequiredLevel > level) { await e.ErrorEmbed(e.Locale.GetString("error_role_level_low", newRole.RequiredLevel - level)) .ToEmbed().SendToChannel(e.Channel); return; } if (newRole.RequiredRole != 0 && !discordUser.RoleIds.Contains(newRole.RequiredRole.FromDbLong())) { var requiredRole = await e.Guild.GetRoleAsync(newRole.RequiredRole.FromDbLong()); e.ErrorEmbed( e.Locale.GetString( "error_role_required", $"**{requiredRole.Name}**" ) ).ToEmbed().QueueToChannel(e.Channel); return; } if (newRole.Price > 0) { if (user.Currency >= newRole.Price) { user.RemoveCurrency(newRole.Price); await context.SaveChangesAsync(); } else { await e.ErrorEmbed(e.Locale.GetString("user_error_insufficient_mekos")) .ToEmbed().SendToChannel(e.Channel); return; } } var me = await e.Guild.GetSelfAsync(); if (!await me.HasPermissionsAsync(GuildPermission.ManageRoles)) { e.ErrorEmbed(e.Locale.GetString("permission_error_low", "give roles")).ToEmbed() .QueueToChannel(e.Channel); return; } if (discordRole.Position >= await me.GetHierarchyAsync()) { e.ErrorEmbed(e.Locale.GetString("permission_error_low", "give roles")).ToEmbed() .QueueToChannel(e.Channel); return; } await author.AddRoleAsync(discordRole); new EmbedBuilder() .SetTitle("I AM") .SetColor(128, 255, 128) .SetDescription($"You're a(n) {role.Name} now!") .ToEmbed().QueueToChannel(e.Channel); } }
public async Task <List <EventMessageObject> > GetMessage(IDiscordGuild guild, EventMessageType type, IDiscordUser user) { long guildId = guild.Id.ToDbLong(); var channels = await guild.GetTextChannelsAsync(); var channelIds = channels.Select(x => x.Id.ToDbLong()); var guildCount = (await guild.GetUsersAsync()).Count; IDiscordGuildUser owner = await guild.GetOwnerAsync(); var ownerMention = owner.Mention; var ownerName = owner.Username; List <EventMessageObject> output = new List <EventMessageObject>(); using (var context = new MikiContext()) { var messageObjects = await context.EventMessages .Where(x => channelIds.Contains(x.ChannelId) && (short)type == x.EventType) .ToListAsync(); var allUsers = await guild.GetUsersAsync(); foreach (var c in messageObjects) { if (c == null) { continue; } if (string.IsNullOrEmpty(c.Message)) { continue; } IDiscordGuild g = await(user as IDiscordGuildUser).GetGuildAsync(); string modifiedMessage = c.Message; modifiedMessage = modifiedMessage.Replace("-um", user.Mention); modifiedMessage = modifiedMessage.Replace("-uc", (await g.GetUsersAsync()).Count().ToString()); modifiedMessage = modifiedMessage.Replace("-u", user.Username); modifiedMessage = modifiedMessage.Replace("-ru", allUsers.ElementAt(MikiRandom.Next(0, allUsers.Count())).Username); modifiedMessage = modifiedMessage.Replace("-now", DateTime.Now.ToShortDateString()); modifiedMessage = modifiedMessage.Replace("-sc", guildCount.ToString()); modifiedMessage = modifiedMessage.Replace("-s", g.Name); modifiedMessage = modifiedMessage.Replace("-om", ownerMention); modifiedMessage = modifiedMessage.Replace("-o", ownerName); modifiedMessage = modifiedMessage.Replace("-cc", (await g.GetChannelsAsync()).Count.ToString()); modifiedMessage = modifiedMessage.Replace("-vc", (await g.GetVoiceChannelsAsync()).Count().ToString()); output.Add(new EventMessageObject() { message = modifiedMessage, destinationChannel = channels.FirstOrDefault(x => x.Id.ToDbLong() == c.ChannelId) }); } return(output); } }
public async Task StartSlots(EventContext e, int bet) { using (var context = new MikiContext()) { User u = await context.Users.FindAsync(e.Author.Id.ToDbLong()); Locale locale = Locale.GetEntity(e.Channel.Id.ToDbLong()); int moneyReturned = 0; string[] objects = { "🍒", "🍒", "🍒", "🍒", "🍊", "🍊", "🍊", "🍓", "🍓", "🍍", "🍍", "🍇", "🍇", "🍉", "🍉", "⭐", "⭐", "🍉", "🍍", "🍍", "🍓", "🍓", "🍊", "🍊", "🍊", "🍒", "🍒", "🍒", "🍒", }; IDiscordEmbed embed = Utils.Embed .SetAuthor(locale.GetString(Locale.SlotsHeader) + " | " + e.Author.Username, e.Author.AvatarUrl, "https://patreon.com/mikibot"); string[] objectsChosen = { objects[MikiRandom.Next(objects.Length)], objects[MikiRandom.Next(objects.Length)], objects[MikiRandom.Next(objects.Length)] }; Dictionary <string, int> score = new Dictionary <string, int>(); foreach (string o in objectsChosen) { if (score.ContainsKey(o)) { score[o]++; continue; } score.Add(o, 1); } if (score.ContainsKey("🍒")) { if (score["🍒"] == 2) { moneyReturned = (int)Math.Ceiling(bet * 0.5f); } else if (score["🍒"] == 3) { moneyReturned = (int)Math.Ceiling(bet * 1f); } } if (score.ContainsKey("🍊")) { if (score["🍊"] == 2) { moneyReturned = (int)Math.Ceiling(bet * 0.8f); } else if (score["🍊"] == 3) { moneyReturned = (int)Math.Ceiling(bet * 1.5f); } } if (score.ContainsKey("🍓")) { if (score["🍓"] == 2) { moneyReturned = (int)Math.Ceiling(bet * 1f); } else if (score["🍓"] == 3) { moneyReturned = (int)Math.Ceiling(bet * 2f); } } if (score.ContainsKey("🍍")) { if (score["🍍"] == 2) { moneyReturned = (int)Math.Ceiling(bet * 1f); } if (score["🍍"] == 3) { moneyReturned = (int)Math.Ceiling(bet * 4f); } } if (score.ContainsKey("🍇")) { if (score["🍇"] == 2) { moneyReturned = (int)Math.Ceiling(bet * 1.2f); } if (score["🍇"] == 3) { moneyReturned = (int)Math.Ceiling(bet * 6f); } } if (score.ContainsKey("🍉")) { if (score["🍉"] == 2) { moneyReturned = (int)Math.Ceiling(bet * 1.5f); } if (score["🍉"] == 3) { moneyReturned = (int)Math.Ceiling(bet * 10f); } } if (score.ContainsKey("⭐")) { if (score["⭐"] == 2) { moneyReturned = (int)Math.Ceiling(bet * 2f); } if (score["⭐"] == 3) { moneyReturned = (int)Math.Ceiling(bet * 12f); } } if (moneyReturned == 0) { moneyReturned = -bet; embed.AddField(locale.GetString("miki_module_fun_slots_lose_header"), locale.GetString("miki_module_fun_slots_lose_amount", bet, u.Currency - bet)); } else { embed.AddField(locale.GetString(Locale.SlotsWinHeader), locale.GetString(Locale.SlotsWinMessage, moneyReturned, u.Currency + moneyReturned)); } embed.Description = string.Join(" ", objectsChosen); await u.AddCurrencyAsync(moneyReturned, e.Channel); await context.SaveChangesAsync(); await embed.SendToChannel(e.Channel); } }
public async Task IAmNotAsync(EventContext e) { string roleName = e.Arguments.ToString(); using (var context = new MikiContext()) { List <IDiscordRole> roles = await GetRolesByName(e.Guild, roleName); IDiscordRole role = null; if (roles.Count > 1) { List <LevelRole> levelRoles = await context.LevelRoles.Where(x => x.GuildId == (long)e.Guild.Id).ToListAsync(); if (levelRoles.Where(x => x.GetRoleAsync().Result.Name.ToLower() == roleName.ToLower()).Count() > 1) { e.ErrorEmbed("two roles configured have the same name.") .ToEmbed().QueueToChannel(e.Channel); return; } else { role = levelRoles.Where(x => x.GetRoleAsync().Result.Name.ToLower() == roleName.ToLower()).FirstOrDefault().GetRoleAsync().Result; } } else { role = roles.FirstOrDefault(); } if (role == null) { await e.ErrorEmbed(e.Locale.GetString("error_role_null")) .ToEmbed().SendToChannel(e.Channel); return; } IDiscordGuildUser author = await e.Guild.GetMemberAsync(e.Author.Id); IDiscordGuildUser me = await e.Guild.GetSelfAsync(); if (!author.RoleIds.Contains(role.Id)) { await e.ErrorEmbed(e.Locale.GetString("error_role_forbidden")) .ToEmbed().SendToChannel(e.Channel); return; } LevelRole newRole = await context.LevelRoles.FindAsync(e.Guild.Id.ToDbLong(), role.Id.ToDbLong()); User user = await context.Users.FindAsync(e.Author.Id.ToDbLong()); if (!await me.HasPermissionsAsync(GuildPermission.ManageRoles)) { e.ErrorEmbed(e.Locale.GetString("permission_error_low", "give roles")).ToEmbed() .QueueToChannel(e.Channel); return; } if (role.Position >= await me.GetHierarchyAsync()) { e.ErrorEmbed(e.Locale.GetString("permission_error_low", "give roles")).ToEmbed() .QueueToChannel(e.Channel); return; } await author.RemoveRoleAsync(role); new EmbedBuilder() .SetTitle("I AM NOT") .SetColor(255, 128, 128) .SetDescription($"You're no longer a(n) {role.Name}!") .ToEmbed().QueueToChannel(e.Channel); } }
public async Task FavouritePastaList(EventContext e, bool lovedPastas = true) { IUser targetUser = e.Author; float totalPerPage = 25f; int page = 0; ArgObject arg = e.Arguments.FirstOrDefault(); if (arg == null) { // TODO: error no user found return; } IUser user = await arg.GetUserAsync(e.Guild); if (user != null) { arg = arg.Next(); } else { user = e.Author; } page = arg.AsInt() ?? 0; using (MikiContext context = new MikiContext()) { long authorId = targetUser.Id.ToDbLong(); IEnumerable <PastaVote> pastaVotes = context.Votes.Where(x => x.UserId == authorId && x.PositiveVote == lovedPastas); int maxPage = (int)Math.Floor(pastaVotes.Count() / totalPerPage); page = page > maxPage ? maxPage : page; page = page < 0 ? 0 : page; if (pastaVotes.Count() <= 0) { string loveString = (lovedPastas ? e.GetResource("miki_module_pasta_loved") : e.GetResource("miki_module_pasta_hated")); string errorString = e.GetResource("miki_module_pasta_favlist_self_none", loveString); if (e.message.MentionedUserIds.Count() >= 1) { errorString = e.GetResource("miki_module_pasta_favlist_mention_none", loveString); } Utils.ErrorEmbed(e, errorString).Build().QueueToChannel(e.Channel); return; } EmbedBuilder embed = Utils.Embed; List <PastaVote> neededPastas = pastaVotes.Skip((int)totalPerPage * page).Take((int)totalPerPage).ToList(); string resultString = string.Join(" ", neededPastas.Select(x => $"`{x.Id}`")); string useName = string.IsNullOrEmpty(targetUser.Username) ? targetUser.Username : targetUser.Username; embed.WithTitle($"{(lovedPastas ? e.GetResource("miki_module_pasta_loved_header") : e.GetResource("miki_module_pasta_hated_header"))} - {useName}"); embed.WithDescription(resultString); embed.WithFooter(e.GetResource("page_index", page + 1, Math.Ceiling(pastaVotes.Count() / totalPerPage)), ""); embed.Build().QueueToChannel(e.Channel); } }
public async Task StartSlots(EventContext e, int bet) { using (var context = new MikiContext()) { User u = await context.Users.FindAsync(e.Author.Id.ToDbLong()); int moneyReturned = 0; string[] objects = { "🍒", "🍒", "🍒", "🍒", "🍊", "🍊", "🍊", "🍓", "🍓", "🍍", "🍍", "🍇", "🍇", "🍉", "🍉", "⭐", "⭐", "🍉", "🍍", "🍍", "🍓", "🍓", "🍊", "🍊", "🍊", "🍒", "🍒", "🍒", "🍒", }; EmbedBuilder embed = new EmbedBuilder() .SetAuthor(e.Locale.GetString(LocaleTags.SlotsHeader) + " | " + e.Author.Username, e.Author.GetAvatarUrl(), "https://patreon.com/mikibot"); string[] objectsChosen = { objects[MikiRandom.Next(objects.Length)], objects[MikiRandom.Next(objects.Length)], objects[MikiRandom.Next(objects.Length)] }; Dictionary <string, int> score = new Dictionary <string, int>(); foreach (string o in objectsChosen) { if (score.ContainsKey(o)) { score[o]++; continue; } score.Add(o, 1); } if (score.ContainsKey("🍒")) { if (score["🍒"] == 2) { moneyReturned = (int)Math.Ceiling(bet * 0.5f); } else if (score["🍒"] == 3) { moneyReturned = (int)Math.Ceiling(bet * 1f); } } if (score.ContainsKey("🍊")) { if (score["🍊"] == 2) { moneyReturned = (int)Math.Ceiling(bet * 0.8f); } else if (score["🍊"] == 3) { moneyReturned = (int)Math.Ceiling(bet * 1.5f); } } if (score.ContainsKey("🍓")) { if (score["🍓"] == 2) { moneyReturned = (int)Math.Ceiling(bet * 1f); } else if (score["🍓"] == 3) { moneyReturned = (int)Math.Ceiling(bet * 2f); } } if (score.ContainsKey("🍍")) { if (score["🍍"] == 2) { moneyReturned = (int)Math.Ceiling(bet * 1f); } if (score["🍍"] == 3) { moneyReturned = (int)Math.Ceiling(bet * 4f); } } if (score.ContainsKey("🍇")) { if (score["🍇"] == 2) { moneyReturned = (int)Math.Ceiling(bet * 1.2f); } if (score["🍇"] == 3) { moneyReturned = (int)Math.Ceiling(bet * 6f); } } if (score.ContainsKey("🍉")) { if (score["🍉"] == 2) { moneyReturned = (int)Math.Ceiling(bet * 1.5f); } if (score["🍉"] == 3) { moneyReturned = (int)Math.Ceiling(bet * 10f); } } if (score.ContainsKey("⭐")) { if (score["⭐"] == 2) { moneyReturned = (int)Math.Ceiling(bet * 2f); } if (score["⭐"] == 3) { moneyReturned = (int)Math.Ceiling(bet * 12f); await AchievementManager.Instance.GetContainerById("slots").CheckAsync(new BasePacket() { discordChannel = e.Channel, discordUser = e.Author }); } } if (moneyReturned == 0) { moneyReturned = -bet; embed.AddField(e.Locale.GetString("miki_module_fun_slots_lose_header"), e.Locale.GetString("miki_module_fun_slots_lose_amount", bet, u.Currency - bet)); } else { embed.AddField(e.Locale.GetString(LocaleTags.SlotsWinHeader), e.Locale.GetString(LocaleTags.SlotsWinMessage, moneyReturned, u.Currency + moneyReturned)); } embed.Description = string.Join(" ", objectsChosen); await u.AddCurrencyAsync(moneyReturned, e.Channel); await context.SaveChangesAsync(); embed.ToEmbed().QueueToChannel(e.Channel); } }
public async Task CheckAsync(IDiscordMessage e) { if (e.Author.IsBot) { return; } if (!lastTimeExpGranted.ContainsKey(e.Author.Id)) { lastTimeExpGranted.Add(e.Author.Id, DateTime.MinValue); } if (lastTimeExpGranted[e.Author.Id].AddMinutes(1) < DateTime.Now) { using (var context = new MikiContext()) { User a = await context.Users.FindAsync(e.Author.Id.ToDbLong()); if (a == null) { a = User.Create(context, e); } try { LocalExperience experience = await context.Experience.FindAsync(e.Guild.Id.ToDbLong(), a.Id); if (experience == null) { experience = context.Experience.Add(new LocalExperience() { server_id = e.Guild.Id.ToDbLong(), user_id = a.Id, Experience = 0, LastExperienceTime = DateTime.Now - new TimeSpan(1) }); } GuildUser guildUser = await context.GuildUsers.FindAsync(e.Guild.Id.ToDbLong()); if (guildUser == null) { int value = await context.Database.SqlQuery <int> ("select Sum(Experience) as value from LocalExperience where ServerId = @p0;", e.Guild.Id.ToDbLong()) .FirstAsync(); guildUser = context.GuildUsers.Add(new GuildUser() { Name = e.Guild.Name, Id = e.Guild.Id.ToDbLong(), Experience = value, UserCount = Bot.instance.Client.GetGuild(e.Guild.Id).Users.Count, LastRivalRenewed = DateTime.Now.AddYears(-1), LastRewardClaimed = DateTime.Now.AddYears(-1) }); await context.SaveChangesAsync(); } if (experience.LastExperienceTime == null) { experience.LastExperienceTime = DateTime.Now; } int currentLocalLevel = a.CalculateLevel(experience.Experience); int currentGlobalLevel = a.CalculateLevel(a.Total_Experience); int addedExperience = Global.random.Next(1, 10); experience.Experience += addedExperience; a.Total_Experience += addedExperience; guildUser.Experience += addedExperience; if (currentLocalLevel != a.CalculateLevel(experience.Experience)) { await LevelUpLocalAsync(e, a, currentLocalLevel + 1); } if (currentGlobalLevel != a.CalculateLevel(a.Total_Experience)) { await LevelUpGlobalAsync(e, a, currentGlobalLevel + 1); } experience.LastExperienceTime = DateTime.Now; lastTimeExpGranted[e.Author.Id] = DateTime.Now; } catch (Exception ex) { Log.ErrorAt("Accounts.Check", ex.Message + ex.StackTrace + ex.Source); } await context.SaveChangesAsync(); } } }
public async Task MyPasta(EventContext e) { int page = 0; if (!string.IsNullOrWhiteSpace(e.Arguments.ToString())) { if (int.TryParse(e.Arguments.FirstOrDefault().Argument, out page)) { page -= 1; } } long userId; string userName; if (e.message.MentionedUserIds.Count() > 0) { userId = e.message.MentionedUserIds.First().ToDbLong(); userName = (await e.Guild.GetUserAsync(userId.FromDbLong())).Username; } else { userId = e.Author.Id.ToDbLong(); userName = e.Author.Username; } using (var context = new MikiContext()) { var pastasFound = context.Pastas.Where(x => x.CreatorId == userId) .OrderByDescending(x => x.Id) .Skip(page * 25) .Take(25) .ToList(); var totalCount = context.Pastas.Where(x => x.CreatorId == userId) .Count(); if (page * 25 > totalCount) { e.ErrorEmbed(e.GetResource("pasta_error_out_of_index")) .Build().QueueToChannel(e.Channel); return; } if (pastasFound?.Count > 0) { string resultString = ""; pastasFound.ForEach(x => { resultString += "`" + x.Id + "` "; }); Utils.Embed .WithTitle(e.GetResource("mypasta_title", userName)) .WithDescription(resultString) .WithFooter(e.GetResource("page_index", page + 1, (Math.Ceiling((double)totalCount / 25)).ToString()), null) .Build().QueueToChannel(e.Channel); return; } e.ErrorEmbed(e.GetResource("mypasta_error_no_pastas")) .Build().QueueToChannel(e.Channel); } }
public override async Task <bool> CheckAsync(MikiContext context, BasePacket packet) { return(await CheckCommand(packet as CommandPacket)); }
public async Task GuildWeekly(EventContext context) { using (MikiContext database = new MikiContext()) { Locale locale = Locale.GetEntity(context.Channel.Id); LocalExperience thisUser = await database.Experience.FindAsync(context.Guild.Id.ToDbLong(), context.Author.Id.ToDbLong()); GuildUser thisGuild = await database.GuildUsers.FindAsync(context.Guild.Id.ToDbLong()); Timer timer = await database.Timers.FindAsync(context.Guild.Id.ToDbLong(), context.Author.Id.ToDbLong()); if (thisUser == null) { Log.ErrorAt("Guildweekly", "User is null"); return; } if (thisGuild == null) { Log.ErrorAt("Guildweekly", "Guild is null"); return; } if (thisUser.Experience > thisGuild.MinimalExperienceToGetRewards) { if (timer == null) { timer = database.Timers.Add(new Timer() { GuildId = context.Guild.Id.ToDbLong(), UserId = context.Author.Id.ToDbLong(), Value = DateTime.Now.AddDays(-30) }); await database.SaveChangesAsync(); } if (timer.Value.AddDays(7) <= DateTime.Now) { SocketGuild guild = Bot.instance.Client.GetGuild(thisGuild.Id.FromDbLong()); GuildUser rival = await thisGuild.GetRival(); if (rival == null) { await Utils.Embed .SetTitle(locale.GetString("miki_terms_weekly")) .SetDescription(context.GetResource("guildweekly_error_no_rival")) .SendToChannel(context.Channel); return; } if (rival.Experience > thisGuild.Experience) { await Utils.Embed .SetTitle(locale.GetString("miki_terms_weekly")) .SetDescription(context.GetResource("guildweekly_error_low_level")) .SendToChannel(context.Channel); return; } int mekosGained = (int)Math.Round((((Global.random.NextDouble() + 1.25) * 0.5) * 10) * thisGuild.CalculateLevel(thisGuild.Experience)); User user = await database.Users.FindAsync(context.Author.Id.ToDbLong()); if (user == null) { // TODO: Add response return; } await user.AddCurrencyAsync(mekosGained, context.Channel); await Utils.Embed .SetTitle(locale.GetString("miki_terms_weekly")) .AddInlineField("Mekos", mekosGained.ToString()) .SendToChannel(context.Channel); timer.Value = DateTime.Now; await database.SaveChangesAsync(); } else { await Utils.Embed .SetTitle(locale.GetString("miki_terms_weekly")) .SetDescription(context.GetResource("guildweekly_error_timer_running", (timer.Value.AddDays(7) - DateTime.Now).ToTimeString(locale))) .SendToChannel(context.Channel); } } else { await Utils.Embed .SetTitle(locale.GetString("miki_terms_weekly")) .SetDescription(locale.GetString("miki_guildweekly_insufficient_exp", thisGuild.MinimalExperienceToGetRewards)) .SendToChannel(context.Channel); } } }
public static async Task <User> GetUserAsync(MikiContext context, IDiscordUser discordUser) => await User.GetAsync(context, (long)discordUser.Id, discordUser.Username);
public AccountManager(DiscordBot bot) { OnGlobalLevelUp += (a, e, l) => { DogStatsd.Counter("levels.global", l); return(Task.CompletedTask); }; OnLocalLevelUp += async(a, e, l) => { DogStatsd.Counter("levels.local", l); var guild = await(e as IDiscordGuildChannel).GetGuildAsync(); long guildId = guild.Id.ToDbLong(); List <LevelRole> rolesObtained = new List <LevelRole>(); using (var context = new MikiContext()) { rolesObtained = await context.LevelRoles .Where(p => p.GuildId == guildId && p.RequiredLevel == l && p.Automatic) .ToListAsync(); var setting = (LevelNotificationsSetting) await Setting.GetAsync(context, e.Id, DatabaseSettingId.LEVEL_NOTIFICATIONS); if (setting == LevelNotificationsSetting.NONE) { return; } if (setting == LevelNotificationsSetting.REWARDS_ONLY && rolesObtained.Count == 0) { return; } LocaleInstance instance = await Locale.GetLanguageInstanceAsync(e.Id); EmbedBuilder embed = new EmbedBuilder() { Title = instance.GetString("miki_accounts_level_up_header"), Description = instance.GetString("miki_accounts_level_up_content", $"{a.Username}#{a.Discriminator}", l), Color = new Color(1, 0.7f, 0.2f) }; if (rolesObtained.Count > 0) { var roles = await guild.GetRolesAsync(); var guildUser = await guild.GetMemberAsync(a.Id); if (guildUser != null) { foreach (var role in rolesObtained) { var r = roles.FirstOrDefault(x => x.Id == (ulong)role.RoleId); if (r != null) { await guildUser.AddRoleAsync(r); } } } embed.AddInlineField("Rewards", string.Join("\n", rolesObtained.Select(x => $"New Role: **{roles.FirstOrDefault(z => z.Id.ToDbLong() == x.RoleId).Name}**"))); } embed.ToEmbed().QueueToChannel(e); } }; //bot.Discord.Guild += Client_GuildUpdated; bot.Discord.GuildMemberCreate += Client_UserJoined; bot.Discord.MessageCreate += CheckAsync; }
public async Task LotteryAsync(EventContext e) { ArgObject arg = e.Arguments.FirstOrDefault(); if (arg == null) { long totalTickets = await(Global.RedisClient as StackExchangeCacheClient).Client.GetDatabase(0).ListLengthAsync(lotteryKey); long yourTickets = 0; string latestWinner = (Global.RedisClient as StackExchangeCacheClient).Client.GetDatabase(0).StringGet("lottery:winner"); if (await lotteryDict.ContainsAsync(e.Author.Id)) { yourTickets = long.Parse(await lotteryDict.GetAsync(e.Author.Id)); } string timeLeft = taskScheduler?.GetInstance(0, lotteryId).TimeLeft.ToTimeString(e.Locale, true) ?? "1h?m?s - will be fixed soon!"; new EmbedBuilder() { Title = "🍀 Lottery", Description = "Make the biggest gamble, and get paid off massively if legit.", Color = new Color(119, 178, 85) }.AddInlineField("Tickets Owned", yourTickets.ToString()) .AddInlineField("Drawing In", timeLeft) .AddInlineField("Total Tickets", totalTickets.ToString()) .AddInlineField("Ticket price", $"{100} mekos") .AddInlineField("Latest Winner", latestWinner ?? "no name") .AddInlineField("How to buy?", ">lottery buy [amount]") .ToEmbed().QueueToChannel(e.Channel); return; } switch (arg.Argument.ToLower()) { case "buy": { arg = arg.Next(); int amount = arg?.AsInt() ?? 1; if (amount < 1) { amount = 1; } using (var context = new MikiContext()) { User u = await User.GetAsync(context, e.Author); if (amount * 100 > u.Currency) { e.ErrorEmbedResource("miki_mekos_insufficient") .ToEmbed().QueueToChannel(e.Channel); return; } await u.AddCurrencyAsync(-amount * 100, e.Channel); RedisValue[] tickets = new RedisValue[amount]; for (int i = 0; i < amount; i++) { tickets[i] = e.Author.Id.ToString(); } await(Global.RedisClient as StackExchangeCacheClient).Client.GetDatabase(0).ListRightPushAsync(lotteryKey, tickets); int totalTickets = 0; if (await lotteryDict.ContainsAsync(e.Author.Id.ToString())) { totalTickets = int.Parse(await lotteryDict.GetAsync(e.Author.Id.ToString())); } await lotteryDict.AddAsync(e.Author.Id, amount + totalTickets); await context.SaveChangesAsync(); e.SuccessEmbed($"Successfully bought {amount} tickets!") .QueueToChannel(e.Channel); } } break; } }
private async Task StartFlip(EventContext e, int bet) { string[] arguments = e.arguments.Split(' '); if (bet <= 0) { return; } if (arguments.Length < 2) { return; } int pickedSide = -1; if (arguments[1].ToLower() == "heads" || arguments[1].ToLower() == "h") { pickedSide = 1; } else if (arguments[1].ToLower() == "tails" || arguments[1].ToLower() == "t") { pickedSide = 0; } if (pickedSide == -1) { return; } string headsUrl = "https://miki.ai/assets/img/miki-default-heads.png"; string tailsUrl = "https://miki.ai/assets/img/miki-default-tails.png"; if (e.arguments.Contains("-bonus")) { headsUrl = "https://miki.ai/assets/img/miki-secret-heads.png"; tailsUrl = "https://miki.ai/assets/img/miki-secret-tails.png"; } int side = MikiRandom.Next(2); string imageUrl = side == 1 ? headsUrl : tailsUrl; bool win = (side == pickedSide); int currencyNow = 0; using (MikiContext context = new MikiContext()) { User u = await context.Users.FindAsync(e.Author.Id.ToDbLong()); if (!win) { bet = -bet; } u.Currency += bet; currencyNow = u.Currency; await context.SaveChangesAsync(); } string output = ""; if (win) { output = e.GetResource("flip_description_win", $"`{bet}`"); } else { output = e.GetResource("flip_description_lose"); } output += "\n" + e.GetResource("miki_blackjack_new_balance", currencyNow); IDiscordEmbed embed = Utils.Embed .SetAuthor(e.GetResource("flip_header") + " | " + e.Author.Username, e.Author.AvatarUrl, "https://patreon.com/mikibot") .SetDescription(output) .SetThumbnailUrl(imageUrl); await embed.SendToChannel(e.Channel); }
public async Task <int?> ValidateBetAsync(EventContext e, ArgObject arg, int maxBet = 1000000) { if (arg != null) { const int noAskLimit = 10000; using (MikiContext context = new MikiContext()) { User user = await context.Users.FindAsync(e.Author.Id.ToDbLong()); if (user == null) { // TODO: add user null error return(null); } string checkArg = arg?.Argument; if (int.TryParse(checkArg, out int bet)) { } else if (checkArg.ToLower() == "all" || checkArg == "*") { bet = user.Currency > maxBet ? maxBet : user.Currency; } else { e.ErrorEmbed(e.Locale.GetString("miki_error_gambling_parse_error")) .ToEmbed().QueueToChannel(e.Channel); return(null); } if (bet < 1) { e.ErrorEmbed(e.Locale.GetString("miki_error_gambling_zero_or_less")) .ToEmbed().QueueToChannel(e.Channel); return(null); } else if (bet > user.Currency) { e.ErrorEmbed(e.Locale.GetString("miki_mekos_insufficient")) .ToEmbed().QueueToChannel(e.Channel); return(null); } else if (bet > maxBet) { e.ErrorEmbed($"you cannot bet more than {maxBet} mekos!") .ToEmbed().QueueToChannel(e.Channel); return(null); } else if (bet > noAskLimit) { arg = arg?.Next(); if (arg?.Argument.ToLower() == "ok") { return(bet); } else { EmbedBuilder embed = Utils.Embed; embed.Description = $"Are you sure you want to bet **{bet}**? You currently have `{user.Currency}` mekos.\n\nAppend your command with `>my_command ... <bet> ok` to confirm."; embed.Color = new Color(0.4f, 0.6f, 1f); embed.ToEmbed().QueueToChannel(e.Channel); return(null); } } else { return(bet); } } } else { e.ErrorEmbed(e.Locale.GetString("miki_error_gambling_no_arg")) .ToEmbed().QueueToChannel(e.Channel); return(null); } }
public async Task ValidateBet(EventContext e, Func <EventContext, int, Task> callback = null, int maxBet = 1000000) { if (!string.IsNullOrEmpty(e.arguments)) { int bet; const int noAskLimit = 10000; using (MikiContext context = new MikiContext()) { User user = await context.Users.FindAsync(e.Author.Id.ToDbLong()); if (user == null) { // TODO: add user null error return; } string checkArg = e.arguments.Split(' ')[0]; if (int.TryParse(checkArg, out bet)) { } else if (checkArg.ToLower() == "all" || e.arguments == "*") { bet = user.Currency; } else { await e.ErrorEmbed(e.GetResource("miki_error_gambling_parse_error")) .SendToChannel(e.Channel); return; } if (bet < 1) { await e.ErrorEmbed(e.GetResource("miki_error_gambling_zero_or_less")) .SendToChannel(e.Channel); } else if (bet > user.Currency) { await e.ErrorEmbed(e.GetResource("miki_mekos_insufficient")) .SendToChannel(e.Channel); } else if (bet > maxBet) { await e.ErrorEmbed($"you cannot bet more than {maxBet} mekos!") .SendToChannel(e.Channel); return; } else if (bet > noAskLimit) { IDiscordEmbed embed = Utils.Embed; embed.Description = $"Are you sure you want to bet **{bet}**? You currently have `{user.Currency}` mekos.\n\nType `yes` to confirm."; embed.Color = new IA.SDK.Color(0.4f, 0.6f, 1f); await embed.SendToChannel(e.Channel); CommandHandler confirmCommand = new CommandHandlerBuilder(Bot.instance.Events) .AddPrefix("") .DisposeInSeconds(20) .SetOwner(e.message) .AddCommand( new RuntimeCommandEvent("yes") .Default(async(ec) => { await ec.commandHandler.RequestDisposeAsync(); await ec.message.DeleteAsync(); if (callback != null) { if (bet > user.Currency) { await e.ErrorEmbed(e.GetResource("miki_mekos_insufficient")) .SendToChannel(e.Channel); return; } await callback(e, bet); } })).Build(); Bot.instance.Events.AddPrivateCommandHandler(e.message, confirmCommand); } else { if (callback != null) { await callback(e, bet); } } } } else { await Utils.ErrorEmbed(e.Channel.GetLocale(), e.GetResource("miki_error_gambling_no_arg")) .SendToChannel(e.Channel); } }
public async Task AcceptMarriageAsync(EventContext e) { IDiscordUser user = await e.Arguments.Join().GetUserAsync(e.Guild); if (user == null) { e.ErrorEmbed("I couldn't find this user!") .ToEmbed().QueueToChannel(e.Channel); } if (user.Id == e.Author.Id) { e.ErrorEmbed("Please mention someone else than yourself.") .ToEmbed().QueueToChannel(e.Channel); return; } using (var context = new MikiContext()) { MarriageRepository repository = new MarriageRepository(context); User accepter = await DatabaseHelpers.GetUserAsync(context, e.Author); User asker = await DatabaseHelpers.GetUserAsync(context, user); UserMarriedTo marriage = await repository.GetEntryAsync(accepter.Id, asker.Id); if (marriage != null) { if (accepter.MarriageSlots < (await repository.GetMarriagesAsync(accepter.Id)).Count) { throw new InsufficientMarriageSlotsException(accepter); } if (asker.MarriageSlots < (await repository.GetMarriagesAsync(asker.Id)).Count) { throw new InsufficientMarriageSlotsException(asker); } if (marriage.ReceiverId != e.Author.Id.ToDbLong()) { e.Channel.QueueMessageAsync($"You can not accept your own responses!"); return; } if (marriage.Marriage.IsProposing) { marriage.Marriage.AcceptProposal(); await context.SaveChangesAsync(); new EmbedBuilder() { Title = ("❤️ Happily married"), Color = new Color(190, 25, 49), Description = ($"Much love to { e.Author.Username } and { user.Username } in their future adventures together!") }.ToEmbed().QueueToChannel(e.Channel); } else { e.ErrorEmbed("You're already married to this person ya doofus!") .ToEmbed().QueueToChannel(e.Channel); } } else { e.Channel.QueueMessageAsync("This user hasn't proposed to you!"); return; } } }
public async Task IAmListAsync(EventContext e) { using (var context = new MikiContext()) { int page = Math.Max((e.Arguments.Join()?.TakeInt() ?? 0) - 1, 0); long guildId = e.Guild.Id.ToDbLong(); List <LevelRole> roles = await context.LevelRoles .Where(x => x.GuildId == guildId) .OrderBy(x => x.RoleId) .Skip(page * 25) .Take(25) .ToListAsync(); StringBuilder stringBuilder = new StringBuilder(); var guildRoles = await e.Guild.GetRolesAsync(); List <Tuple <IDiscordRole, LevelRole> > availableRoles = roles .Where(x => guildRoles.Any(y => x.RoleId == (long)y.Id)) .Select(x => new Tuple <IDiscordRole, LevelRole>(guildRoles .Single(y => x.RoleId == (long)y.Id), x) ).ToList(); foreach (var role in availableRoles) { if (role.Item2.Optable) { if (role.Item1 == null) { context.LevelRoles.Remove(role.Item2); continue; } stringBuilder.Append($"`{role.Item1.Name.PadRight(20)}|`"); if (role.Item2.RequiredLevel > 0) { stringBuilder.Append($"⭐{role.Item2.RequiredLevel} "); } if (role.Item2.Automatic) { stringBuilder.Append($"⚙️"); } if (role.Item2.RequiredRole != 0) { var roleRequired = await e.Guild.GetRoleAsync(role.Item2.RequiredRole.FromDbLong()); stringBuilder.Append($"🔨`{roleRequired?.Name ?? "non-existing role"}`"); } if (role.Item2.Price != 0) { stringBuilder.Append($"🔸{role.Item2.Price} "); } stringBuilder.AppendLine(); } } if (stringBuilder.Length == 0) { stringBuilder.Append(e.Locale.GetString("miki_placeholder_null")); } await context.SaveChangesAsync(); new EmbedBuilder().SetTitle("📄 Available Roles") .SetDescription(stringBuilder.ToString()) .SetColor(204, 214, 221) .SetFooter("page " + (page + 1)) .ToEmbed().QueueToChannel(e.Channel); } }
public async Task MarryAsync(EventContext e) { long askerId = 0; long receiverId = 0; ArgObject args = e.Arguments.FirstOrDefault(); if (args == null) { return; } IDiscordGuildUser user = await args.GetUserAsync(e.Guild); if (user == null) { e.Channel.QueueMessageAsync("Couldn't find this person.."); return; } if (user.Id == (await e.Guild.GetSelfAsync()).Id) { e.Channel.QueueMessageAsync("(´・ω・`)"); return; } using (MikiContext context = new MikiContext()) { MarriageRepository repository = new MarriageRepository(context); User mentionedPerson = await User.GetAsync(context, user.Id.ToDbLong(), user.Username); User currentUser = await DatabaseHelpers.GetUserAsync(context, e.Author); askerId = currentUser.Id; receiverId = mentionedPerson.Id; if (currentUser == null || mentionedPerson == null) { e.ErrorEmbed(e.Locale.GetString("miki_module_accounts_marry_error_null")).ToEmbed().QueueToChannel(e.Channel); return; } if (mentionedPerson.Banned) { e.ErrorEmbed("This person has been banned from Miki.").ToEmbed().QueueToChannel(e.Channel); return; } if (mentionedPerson.Id == currentUser.Id) { e.ErrorEmbed(e.Locale.GetString("miki_module_accounts_marry_error_null")).ToEmbed().QueueToChannel(e.Channel); return; } if (await repository.ExistsAsync(mentionedPerson.Id, currentUser.Id)) { e.ErrorEmbed(e.Locale.GetString("miki_module_accounts_marry_error_exists")).ToEmbed().QueueToChannel(e.Channel); return; } await repository.ProposeAsync(askerId, receiverId); await context.SaveChangesAsync(); } new EmbedBuilder() .SetTitle("💍" + e.Locale.GetString("miki_module_accounts_marry_text", $"**{e.Author.Username}**", $"**{user.Username}**")) .SetDescription(e.Locale.GetString("miki_module_accounts_marry_text2", user.Username, e.Author.Username)) .SetColor(0.4f, 0.4f, 0.8f) .SetThumbnail("https://i.imgur.com/TKZSKIp.png") .AddInlineField("✅ To accept", $">acceptmarriage @user") .AddInlineField("❌ To decline", $">declinemarriage @user") .SetFooter("Take your time though! This proposal won't disappear", "") .ToEmbed().QueueToChannel(e.Channel); }
/*public async Task ConfigRoleInteractiveAsync(EventContext e) * { * using (var context = new MikiContext()) * { * EmbedBuilder sourceEmbed = Utils.Embed.SetTitle("⚙ Interactive Mode") * .SetDescription("Type out the role name you want to config") * .SetColor(138, 182, 239); * IDiscordMessage sourceMessage = await sourceEmbed.ToEmbed().SendToChannel(e.Channel); * IDiscordMessage msg = null; * * while (true) * { * msg = await e.EventSystem.GetCommandHandler<MessageListener>().WaitForNextMessage(e.CreateSession()); * * if (msg.Content.Length < 20) * { * break; * } * else * { * await sourceMessage.EditAsync(new EditMessageArgs * { * embed = e.ErrorEmbed("That role name is way too long! Try again.") * .ToEmbed() * }); * } * } * * string roleName = msg.Content; * * List<IDiscordRole> rolesFound = await GetRolesByName(e.Guild, roleName.ToLower()); * IDiscordRole role = null; * * if(rolesFound.Count == 0) * { * // Hey, I couldn't find this role, Can I make a new one? * await sourceMessage.EditAsync(new EditMessageArgs * { * embed = e.ErrorEmbed($"There's no role that is named `{roleName}`, Shall I create it? Y/N").ToEmbed() * }); * * msg = await e.EventSystem.GetCommandHandler<MessageListener>().WaitForNextMessage(e.CreateSession()); * * if (msg.Content.ToLower()[0] != 'y') * { * throw new RoleNullException(); * } * * role = await e.Guild.CreateRoleAsync(new CreateRoleArgs * { * Name = roleName, * }); * } * else if (rolesFound.Count > 1) * { * string roleIds = string.Join("\n", rolesFound.Select(x => $"`{x.Name}`: {x.Id}")); * * if (roleIds.Length > 1024) * { * roleIds = roleIds.Substring(0, 1024); * } * * sourceEmbed = Utils.Embed.SetTitle("⚙ Interactive Mode") * .SetDescription("I found multiple roles with that name, which one would you like? please enter the ID") * .AddInlineField("Roles - Ids", roleIds) * .SetColor(138, 182, 239); * * sourceMessage = await sourceEmbed.ToEmbed().SendToChannel(e.Channel); * while(true) * { * msg = await e.EventSystem.GetCommandHandler<MessageListener>().WaitForNextMessage(e.CreateSession()); * if (ulong.TryParse(msg.Content, out ulong id)) * { * role = rolesFound.Where(x => x.Id == id) * .FirstOrDefault(); * * if (role != null) * { * break; * } * else * { * await sourceMessage.EditAsync(new EditMessageArgs { * embed = e.ErrorEmbed("I couldn't find that role id in the list. Try again!") * .AddInlineField("Roles - Ids", string.Join("\n", roleIds)).ToEmbed() * }); * } * } * else * { * await sourceMessage.EditAsync(new EditMessageArgs * { * embed = e.ErrorEmbed("I couldn't find that role. Try again!") * .AddInlineField("Roles - Ids", string.Join("\n", roleIds)).ToEmbed() * }); * } * } * } * else * { * role = rolesFound.FirstOrDefault(); * } * * LevelRole newRole = await context.LevelRoles.FindAsync(e.Guild.Id.ToDbLong(), role.Id.ToDbLong()); * if(newRole == null) * { * newRole = (await context.LevelRoles.AddAsync(new LevelRole() * { * RoleId = role.Id.ToDbLong(), * GuildId = e.Guild.Id.ToDbLong() * })).Entity; * } * * sourceEmbed = Utils.Embed.SetTitle("⚙ Interactive Mode") * .SetDescription("Is there a role that is needed to get this role? Type out the role name, or `-` to skip") * .SetColor(138, 182, 239); * * sourceMessage = await sourceEmbed.ToEmbed().SendToChannel(e.Channel); * * while (true) * { * msg = await e.EventSystem.GetCommandHandler<MessageListener>().WaitForNextMessage(e.CreateSession()); * * rolesFound = (await GetRolesByName(e.Guild, msg.Content.ToLower())); * IDiscordRole parentRole = null; * * if (rolesFound.Count > 1) * { * string roleIds = string.Join("\n", rolesFound.Select(x => $"`{x.Name}`: {x.Id}")); * * if (roleIds.Length > 1024) * { * roleIds = roleIds.Substring(0, 1024); * } * * sourceEmbed = Utils.Embed.SetTitle("⚙ Interactive Mode") * .SetDescription("I found multiple roles with that name, which one would you like? please enter the ID") * .AddInlineField("Roles - Ids", roleIds) * .SetColor(138, 182, 239); * * sourceMessage = await sourceEmbed.ToEmbed().SendToChannel(e.Channel); * while (true) * { * msg = await e.EventSystem.GetCommandHandler<MessageListener>().WaitForNextMessage(e.CreateSession()); * if (ulong.TryParse(msg.Content, out ulong id)) * { * parentRole = rolesFound.Where(x => x.Id == id) * .FirstOrDefault(); * * if (parentRole != null) * { * break; * } * else * { * await sourceMessage.EditAsync(new EditMessageArgs { * embed = e.ErrorEmbed("I couldn't find that role id in the list. Try again!") * .AddInlineField("Roles - Ids", string.Join("\n", roleIds)).ToEmbed() * }) ; * } * } * else * { * await sourceMessage.EditAsync(new EditMessageArgs * { * embed = e.ErrorEmbed("I couldn't find that role. Try again!") * .AddInlineField("Roles - Ids", string.Join("\n", roleIds)).ToEmbed() * }); * } * } * } * else * { * parentRole = rolesFound.FirstOrDefault(); * } * * if (parentRole != null || msg.Content == "-") * { * newRole.RequiredRole = (long?)parentRole?.Id ?? 0; * break; * } * * await sourceMessage.EditAsync(new EditMessageArgs * { * embed = e.ErrorEmbed("I couldn't find that role. Try again!").ToEmbed() * }); * } * * sourceEmbed = Utils.Embed.SetTitle("⚙ Interactive Mode") * .SetDescription($"Is there a level requirement? type a number, if there is no requirement type 0") * .SetColor(138, 182, 239); * * sourceMessage = await sourceEmbed.ToEmbed().SendToChannel(e.Channel); * * while (true) * { * msg = await e.EventSystem.GetCommandHandler<MessageListener>().WaitForNextMessage(e.CreateSession()); * * if (int.TryParse(msg.Content, out int r)) * { * if (r >= 0) * { * newRole.RequiredLevel = r; * break; * } * else * { * await sourceMessage.EditAsync(new EditMessageArgs * { * embed = sourceEmbed.SetDescription($"Please pick a number above 0. Try again") * .ToEmbed() * }); * } * } * else * { * await sourceMessage.EditAsync(new EditMessageArgs * { * embed = sourceEmbed.SetDescription($"Are you sure `{msg.Content}` is a number? Try again").ToEmbed() * }); * } * } * * sourceEmbed = Utils.Embed.SetTitle("⚙ Interactive Mode") * .SetDescription($"Should I give them when the user level ups? type `yes`, otherwise it will be considered as no") * .SetColor(138, 182, 239); * * sourceMessage = await sourceEmbed.ToEmbed().SendToChannel(e.Channel); * * msg = await e.EventSystem.GetCommandHandler<MessageListener>().WaitForNextMessage(e.CreateSession()); * if (msg == null) * { * return; * } * * newRole.Automatic = msg.Content.ToLower()[0] == 'y'; * * sourceEmbed = Utils.Embed.SetTitle("⚙ Interactive Mode") * .SetDescription($"Should users be able to opt in? type `yes`, otherwise it will be considered as no") * .SetColor(138, 182, 239); * * sourceMessage = await sourceEmbed.ToEmbed().SendToChannel(e.Channel); * * msg = await e.EventSystem.GetCommandHandler<MessageListener>().WaitForNextMessage(e.CreateSession()); * * newRole.Optable = msg.Content.ToLower()[0] == 'y'; * * if (newRole.Optable) * { * sourceEmbed = Utils.Embed.SetTitle("⚙ Interactive Mode") * .SetDescription($"Do you want the user to pay mekos for the role? Enter any amount. Enter 0 to keep the role free.") * .SetColor(138, 182, 239); * * sourceMessage = await sourceEmbed.ToEmbed().SendToChannel(e.Channel); * * while (true) * { * msg = await e.EventSystem.GetCommandHandler<MessageListener>().WaitForNextMessage(e.CreateSession()); * * if (msg == null) * { * return; * } * * if (int.TryParse(msg.Content, out int r)) * { * if (r >= 0) * { * newRole.Price = r; * break; * } * else * { * await sourceMessage.EditAsync(new EditMessageArgs * { * embed = e.ErrorEmbed($"Please pick a number above 0. Try again").ToEmbed() * }); * } * } * else * { * await sourceMessage.EditAsync(new EditMessageArgs * { * embed = e.ErrorEmbed($"Not quite sure if this is a number 🤔").ToEmbed() * }); * } * } * } * * await context.SaveChangesAsync(); * Utils.Embed.SetTitle("⚙ Role Config") * .SetColor(102, 117, 127) * .SetDescription($"Updated {role.Name}!") * .ToEmbed().QueueToChannel(e.Channel); * } * }*/ public async Task ConfigRoleQuickAsync(EventContext e) { using (var context = new MikiContext()) { string roleName = e.Arguments.ToString().Split('"')[1]; IDiscordRole role = null; if (ulong.TryParse(roleName, out ulong s)) { role = await e.Guild.GetRoleAsync(s); } else { role = (await GetRolesByName(e.Guild, roleName)).FirstOrDefault(); } LevelRole newRole = await context.LevelRoles.FindAsync(e.Guild.Id.ToDbLong(), role.Id.ToDbLong()); MSLResponse arguments = new MMLParser(e.Arguments.ToString().Substring(roleName.Length + 3)) .Parse(); if (role.Name.Length > 20) { await e.ErrorEmbed("Please keep role names below 20 letters.") .ToEmbed().SendToChannel(e.Channel); return; } if (newRole == null) { newRole = context.LevelRoles.Add(new LevelRole() { GuildId = (e.Guild.Id.ToDbLong()), RoleId = (role.Id.ToDbLong()), }).Entity; } if (arguments.HasKey("automatic")) { newRole.Automatic = arguments.GetBool("automatic"); } if (arguments.HasKey("optable")) { newRole.Optable = arguments.GetBool("optable"); } if (arguments.HasKey("level-required")) { newRole.RequiredLevel = arguments.GetInt("level-required"); } if (arguments.HasKey("price")) { newRole.Price = arguments.GetInt("price"); if (newRole.Price < 0) { throw new ArgumentLessThanZeroException(); } } if (arguments.HasKey("role-required")) { long id = 0; if (arguments.TryGet("role-required", out long l)) { id = l; } else { var r = (await e.Guild.GetRolesAsync()) .Where(x => x.Name.ToLower() == arguments.GetString("role-required").ToLower()) .FirstOrDefault(); if (r != null) { id = r.Id.ToDbLong(); } } if (id != 0) { newRole.RequiredRole = id; } } await context.SaveChangesAsync(); new EmbedBuilder() .SetTitle("⚙ Role Config") .SetColor(102, 117, 127) .SetDescription($"Updated {role.Name}!") .ToEmbed().QueueToChannel(e.Channel); } }
public async Task ShowProposalsAsync(EventContext e) { int page = e.Arguments.FirstOrDefault()?.TakeInt() - 1 ?? 0; using (var context = new MikiContext()) { MarriageRepository repository = new MarriageRepository(context); List <UserMarriedTo> proposals = await repository.GetProposalsReceived(e.Author.Id.ToDbLong()); List <string> proposalNames = new List <string>(); foreach (UserMarriedTo p in proposals) { long id = p.GetOther(e.Author.Id.ToDbLong()); string u = (await Global.Client.Discord.GetUserAsync(id.FromDbLong())).Username; proposalNames.Add($"{u} [{id}]"); } int pageCount = (int)Math.Ceiling((float)proposalNames.Count / 35); proposalNames = proposalNames.Skip(page * 35) .Take(35) .ToList(); EmbedBuilder embed = new EmbedBuilder() .SetTitle(e.Author.Username) .SetDescription("Here it shows both the people who you've proposed to and who have proposed to you."); string output = string.Join("\n", proposalNames); embed.AddField("Proposals Recieved", string.IsNullOrEmpty(output) ? "none (yet!)" : output); proposals = await repository.GetProposalsSent(e.Author.Id.ToDbLong()); proposalNames = new List <string>(); foreach (UserMarriedTo p in proposals) { long id = p.GetOther(e.Author.Id.ToDbLong()); string u = (await Global.Client.Discord.GetUserAsync(id.FromDbLong())).Username; proposalNames.Add($"{u} [{id}]"); } pageCount = Math.Max(pageCount, (int)Math.Ceiling((float)proposalNames.Count / 35)); proposalNames = proposalNames.Skip(page * 35) .Take(35) .ToList(); output = string.Join("\n", proposalNames); embed.AddField("Proposals Sent", string.IsNullOrEmpty(output) ? "none (yet!)" : output); embed.Color = new Color(1, 0.5f, 0); embed.ThumbnailUrl = (await e.Guild.GetMemberAsync(e.Author.Id)).GetAvatarUrl(); if (pageCount > 1) { embed.SetFooter(e.Locale.GetString("page_footer", page + 1, pageCount)); } embed.ToEmbed().QueueToChannel(e.Channel); } }
public async Task CheckAsync(IDiscordMessage e) { if (e.Author.IsBot) { return; } if (isSyncing) { return; } try { if (await e.GetChannelAsync() is IDiscordGuildChannel channel) { string key = GetContextKey(channel.GuildId, e.Author.Id); if (lastTimeExpGranted.GetOrAdd(e.Author.Id, DateTime.Now).AddMinutes(1) < DateTime.Now) { int currentExp = 0; if (!await Global.RedisClient.ExistsAsync(key)) { using (var context = new MikiContext()) { LocalExperience user = await LocalExperience.GetAsync( context, channel.GuildId, e.Author.Id, e.Author.Username ); await Global.RedisClient.UpsertAsync(key, user.Experience); currentExp = user.Experience; } } else { currentExp = await Global.RedisClient.GetAsync <int>(key); } var bonusExp = MikiRandom.Next(1, 4); currentExp += bonusExp; if (!experienceQueue.ContainsKey(e.Author.Id)) { var expObject = new ExperienceAdded() { UserId = e.Author.Id.ToDbLong(), GuildId = channel.GuildId.ToDbLong(), Experience = bonusExp, Name = e.Author.Username, }; experienceQueue.AddOrUpdate(e.Author.Id, expObject, (u, eo) => { eo.Experience += expObject.Experience; return(eo); }); } else { experienceQueue[e.Author.Id].Experience += bonusExp; } int level = User.CalculateLevel(currentExp); if (User.CalculateLevel(currentExp - bonusExp) != level) { await LevelUpLocalAsync(e, level); } lastTimeExpGranted.AddOrUpdate(e.Author.Id, DateTime.Now, (x, d) => DateTime.Now); await Global.RedisClient.UpsertAsync(key, currentExp); } } if (DateTime.Now >= lastDbSync + new TimeSpan(0, 1, 0)) { isSyncing = true; Log.Message($"Applying Experience for {experienceQueue.Count} users"); lastDbSync = DateTime.Now; try { await UpdateGlobalDatabase(); await UpdateLocalDatabase(); await UpdateGuildDatabase(); } catch (Exception ex) { Log.Error(ex.Message + "\n" + ex.StackTrace); } finally { experienceQueue.Clear(); isSyncing = false; } Log.Message($"Done Applying!"); } } catch (Exception ex) { Log.Error(ex.ToString()); } }
private async Task <EmbedBuilder> BuildMarriageEmbedAsync(EmbedBuilder embed, long userId, MikiContext context, List <UserMarriedTo> marriages) { StringBuilder builder = new StringBuilder(); for (int i = 0; i < marriages.Count; i++) { builder.AppendLine($"`{(i + 1).ToString().PadLeft(2)}:` {(await Global.Client.Discord.GetUserAsync(marriages[i].GetOther(userId).FromDbLong())).Username}"); } embed.Description += "\n\n" + builder.ToString(); return(embed); }
public async Task StartRPS(EventContext e, int bet) { float rewardMultiplier = 1f; if (e.Arguments.Count < 2) { e.ErrorEmbed("You need to choose a weapon!") .ToEmbed().QueueToChannel(e.Channel); } else { User user; RPSManager rps = RPSManager.Instance; EmbedBuilder resultMessage = Utils.Embed .SetTitle("Rock, Paper, Scissors!"); if (rps.TryParse(e.Arguments.Get(1).Argument, out RPSWeapon playerWeapon)) { RPSWeapon botWeapon = rps.GetRandomWeapon(); resultMessage.SetDescription($"{playerWeapon.Name.ToUpper()} {playerWeapon.Emoji} vs. {botWeapon.Emoji} {botWeapon.Name.ToUpper()}"); switch (rps.CalculateVictory(playerWeapon, botWeapon)) { case RPSManager.VictoryStatus.WIN: { using (var context = new MikiContext()) { user = await context.Users.FindAsync(e.Author.Id.ToDbLong()); if (user != null) { await user.AddCurrencyAsync((int)(bet *rewardMultiplier), e.Channel); await context.SaveChangesAsync(); } } resultMessage.Description += $"\n\nYou won `{(int)(bet * rewardMultiplier)}` mekos! Your new balance is `{user.Currency}`."; } break; case RPSManager.VictoryStatus.LOSE: { using (var context = new MikiContext()) { user = await context.Users.FindAsync(e.Author.Id.ToDbLong()); if (user != null) { await user.AddCurrencyAsync(-bet, e.Channel, null); await context.SaveChangesAsync(); } } resultMessage.Description += $"\n\nYou lost `{bet}` mekos ! Your new balance is `{user.Currency}`."; } break; case RPSManager.VictoryStatus.DRAW: { resultMessage.Description += $"\n\nIt's a draw! no mekos were lost!."; } break; } } else { resultMessage.SetDescription("Invalid weapon!").ToEmbed() .QueueToChannel(e.Channel); return; } resultMessage.ToEmbed().QueueToChannel(e.Channel); } }
public static async Task <ProfileVisuals> GetAsync(ulong userId, MikiContext context) => await GetAsync(userId.ToDbLong(), context);
private async Task StartFlip(EventContext e, int bet) { if (e.Arguments.Count < 2) { e.ErrorEmbed("Please pick either `heads` or `tails`!") .ToEmbed().QueueToChannel(e.Channel); return; } string sideParam = e.Arguments.Get(1).Argument.ToLower(); if (bet <= 0) { // TODO: add a error message return; } int pickedSide = -1; if (sideParam[0] == 'h') { pickedSide = 1; } else if (sideParam[0] == 't') { pickedSide = 0; } if (pickedSide == -1) { e.ErrorEmbed("This is not a valid option!") .ToEmbed().QueueToChannel(e.Channel); return; } string headsUrl = "https://miki-cdn.nyc3.digitaloceanspaces.com/commands/miki-default-heads.png"; string tailsUrl = "https://miki-cdn.nyc3.digitaloceanspaces.com/commands/miki-default-tails.png"; if (e.Arguments.Contains("-bonus")) { headsUrl = "https://miki-cdn.nyc3.digitaloceanspaces.com/commands/miki-secret-heads.png"; tailsUrl = "https://miki-cdn.nyc3.digitaloceanspaces.com/commands/miki-secret-tails.png"; } int side = MikiRandom.Next(2); string imageUrl = side == 1 ? headsUrl : tailsUrl; bool win = (side == pickedSide); int currencyNow = 0; using (MikiContext context = new MikiContext()) { User u = await context.Users.FindAsync(e.Author.Id.ToDbLong()); if (!win) { bet = -bet; } u.Currency += bet; currencyNow = u.Currency; await context.SaveChangesAsync(); } string output = ""; if (win) { output = e.GetResource("flip_description_win", $"`{bet}`"); } else { output = e.GetResource("flip_description_lose"); } output += "\n" + e.GetResource("miki_blackjack_new_balance", currencyNow); DiscordEmbed embed = Utils.Embed .SetAuthor(e.GetResource("flip_header") + " | " + e.Author.Username, e.Author.GetAvatarUrl(), "https://patreon.com/mikibot") .SetDescription(output) .SetThumbnail(imageUrl) .ToEmbed(); embed.QueueToChannel(e.Channel); }
public async Task SetRoleLevelAsync(EventContext e) { using (var context = new MikiContext()) { Locale locale = Locale.GetEntity(e.Channel.Id.ToDbLong()); List <string> allArgs = new List <string>(); allArgs.AddRange(e.arguments.Split(' ')); if (allArgs.Count >= 2) { int levelrequirement = int.Parse(allArgs[allArgs.Count - 1]); allArgs.RemoveAt(allArgs.Count - 1); IDiscordRole role = e.Guild.Roles .Find(r => r.Name.ToLower() == string.Join(" ", allArgs).TrimEnd(' ').TrimStart(' ').ToLower()); if (role == null) { await e.ErrorEmbed(e.GetResource("error_role_not_found")) .QueueToChannel(e.Channel); return; } LevelRole lr = await context.LevelRoles.FindAsync(e.Guild.Id.ToDbLong(), role.Id.ToDbLong()); if (lr == null) { lr = context.LevelRoles.Add(new LevelRole() { GuildId = e.Guild.Id.ToDbLong(), RoleId = role.Id.ToDbLong(), RequiredLevel = levelrequirement }).Entity; IDiscordEmbed embed = Utils.Embed; embed.Title = "Added Role!"; embed.Description = $"I'll give someone the role {role.Name} when he/she reaches level {levelrequirement}!"; IDiscordUser currentUser = await e.GetCurrentUserAsync(); if (!currentUser.HasPermissions(e.Channel, DiscordGuildPermission.ManageRoles)) { embed.AddInlineField(e.GetResource("miki_warning"), e.GetResource("setrolelevel_error_no_permissions", $"`{e.GetResource("permission_manage_roles")}`")); } await embed.QueueToChannel(e.Channel); } else { lr.RequiredLevel = levelrequirement; IDiscordEmbed embed = Utils.Embed; embed.Title = "Updated Role!"; embed.Description = $"I'll give someone the role {role.Name} when he/she reaches level {levelrequirement}!"; await embed.QueueToChannel(e.Channel); } await context.SaveChangesAsync(); } else { await Utils.ErrorEmbed(locale, "Make sure to fill out both the role and the level when creating this!") .QueueToChannel(e.Channel); } } }