public void Exception7() { string mml = "O8>"; MMLParser parser = new MMLParser(); IElement[] parsed = parser.Parse(mml); }
public void OctaveReverseTest1() { string mml = "Cあ>>Dい<<Eう"; MMLParser parser = new MMLParser(); IElement[] elements = new IElement[] { new Note { Octave = 4, Step = "C", Length = 4, Alter = 0, HasDot = false, Lyric = "あ", MML = "Cあ" }, new Octave { Value = 3, MML = ">" }, new Octave { Value = 2, MML = ">" }, new Note { Octave = 2, Step = "D", Length = 4, Alter = 0, HasDot = false, Lyric = "い", MML = "Dい" }, new Octave { Value = 3, MML = "<" }, new Octave { Value = 4, MML = "<" }, new Note { Octave = 4, Step = "E", Length = 4, Alter = 0, HasDot = false, Lyric = "う", MML = "Eう" } }; IElement[] parsed = parser.Parse(mml, true); CollectionAssert.AreEqual(elements, parsed); }
public void LengthException1() { string mml = "L"; MMLParser parser = new MMLParser(); IElement[] parsed = parser.Parse(mml); }
public void OctaveException1() { string mml = "O"; MMLParser parser = new MMLParser(); IElement[] parsed = parser.Parse(mml); }
public void TripletTest1() { string mml = "L6CあCあCあR2"; MMLParser parser = new MMLParser(); IElement[] elements = new IElement[] { new Length { Value = 6, MML = "L6" }, new Note { Octave = 4, Step = "C", Length = 6, Alter = 0, HasDot = false, Lyric = "あ", MML = "Cあ" }, new Note { Octave = 4, Step = "C", Length = 6, Alter = 0, HasDot = false, Lyric = "あ", MML = "Cあ" }, new Note { Octave = 4, Step = "C", Length = 6, Alter = 0, HasDot = false, Lyric = "あ", MML = "Cあ" }, new Rest { Length = 2, MML = "R2" } }; IElement[] parsed = parser.Parse(mml); CollectionAssert.AreEqual(elements, parsed); }
public void Exception8() { string mml = "Cあ>>Dい<<E"; MMLParser parser = new MMLParser(); IElement[] parsed = parser.Parse(mml); }
public void MMLTestBig() { Dictionary <string, object> testDict = MMLParser.Parse("-aa:ab -bc:12, -yes:no -no:yes -num:123"); Debug.Assert("ab" == (string)testDict["aa"], "MML string failed"); Debug.Assert(12 == (int)testDict["bc"], "MML Test int Failed");; Debug.Assert(!(bool)testDict["no"], "MML Test Big Failed"); }
private void AssertException(string mml) { MMLParser parser = new MMLParser(); var parsed = parser.Parse(mml); MusicXMLGenerator g = new MusicXMLGenerator(); g.GenerateFromElements(parsed); }
public async Task SetupNotifications(EventContext e) { MMLParser mml = new MMLParser(e.Arguments.ToString()); MSLResponse response = mml.Parse(); bool global = response.GetBool("g"); LevelNotificationsSetting type = Enum.Parse <LevelNotificationsSetting>(response.GetString("type"), true); await Setting.UpdateAsync(e.Channel.Id, DatabaseSettingId.LEVEL_NOTIFICATIONS, (int)type); }
public void RemoveSpaceTest1() { string mml1 = "T150CあDいEうFえ"; string mml2 = " T150Cあ \tDい Eう\r\nFえ "; MMLParser parser = new MMLParser(); var p1 = parser.Parse(mml1); var p2 = parser.Parse(mml2); CollectionAssert.AreEqual(p1, p2); }
public void EmptyTest0() { string mml = ""; MMLParser parser = new MMLParser(); IElement[] elements = new IElement[] { }; IElement[] parsed = parser.Parse(mml); CollectionAssert.AreEqual(elements, parsed); }
public override bool OnInitialize() { base.OnInitialize(); _dataBuffer = new UnsafeBuffer(Header->_dataLength); Memory.Move(_dataBuffer.Address, Header->Data, (uint)Header->_dataLength); SetSizeInternal(Header->_dataLength); _cmds = MMLParser.Parse(Header->Data + 12); return(true); }
public void NoteFlatTest1() { string mml = "C-あ"; MMLParser parser = new MMLParser(); IElement[] elements = new IElement[] { new Note { Octave = 4, Step = "C", Length = 4, Alter = -1, HasDot = false, Lyric = "あ", MML = "C-あ" }, }; IElement[] parsed = parser.Parse(mml); CollectionAssert.AreEqual(elements, parsed); }
public void LengthTest1() { string mml = "L4"; MMLParser parser = new MMLParser(); IElement[] elements = new IElement[] { new Length { Value = 4, MML = "L4" } }; IElement[] parsed = parser.Parse(mml); CollectionAssert.AreEqual(elements, parsed); }
public async Task SetupNotifications(EventContext e) { if (string.IsNullOrWhiteSpace(e.Arguments.ToString())) { Task.Run(async() => await SetupNotificationsInteractive <LevelNotificationsSetting>(e, DatabaseSettingId.LEVEL_NOTIFICATIONS)); } else { MMLParser mml = new MMLParser(e.Arguments.ToString()); MSLResponse response = mml.Parse(); bool global = response.GetBool("g"); LevelNotificationsSetting type = Enum.Parse <LevelNotificationsSetting>(response.GetString("type"), true); await Setting.UpdateAsync(e.Channel.Id, DatabaseSettingId.LEVEL_NOTIFICATIONS, (int)type); } }
public void TempoTest1() { string mml = "T150Cあ"; MMLParser parser = new MMLParser(); IElement[] elements = new IElement[] { new Tempo { Value = 150, MML = "T150" }, new Note { Octave = 4, Step = "C", Length = 4, Alter = 0, HasDot = false, Lyric = "あ", MML = "Cあ" } }; IElement[] parsed = parser.Parse(mml); CollectionAssert.AreEqual(elements, parsed); }
public void DotTest1() { string mml = "C2.うC4.あC8.い"; MMLParser parser = new MMLParser(); IElement[] elements = new IElement[] { new Note { Octave = 4, Step = "C", Length = 2, Alter = 0, HasDot = true, Lyric = "う", MML = "C2.う" }, new Note { Octave = 4, Step = "C", Length = 4, Alter = 0, HasDot = true, Lyric = "あ", MML = "C4.あ" }, new Note { Octave = 4, Step = "C", Length = 8, Alter = 0, HasDot = true, Lyric = "い", MML = "C8.い" } }; IElement[] parsed = parser.Parse(mml); CollectionAssert.AreEqual(elements, parsed); }
private void AssertMusicXmlAreEqual(string mml, bool create) { System.Diagnostics.StackFrame callerFrame = new System.Diagnostics.StackFrame(1); System.Reflection.MethodBase callerMethod = callerFrame.GetMethod(); string methodName = callerMethod.Name; MMLParser parser = new MMLParser(); IElement[] parsed = parser.Parse(mml); MusicXMLGenerator g = new MusicXMLGenerator(); var xElement = g.GenerateFromElements(parsed); if (create) { WriteXml(methodName, xElement); } var expected = ReadXml(methodName); Assert.AreEqual(expected, xElement.ToString()); }
public void NoteTest1() { string mml = "CあDいEうFえGおAかBき>Cく"; MMLParser parser = new MMLParser(); IElement[] elements = new IElement[] { new Note { Octave = 4, Step = "C", Length = 4, Alter = 0, HasDot = false, Lyric = "あ", MML = "Cあ" }, new Note { Octave = 4, Step = "D", Length = 4, Alter = 0, HasDot = false, Lyric = "い", MML = "Dい" }, new Note { Octave = 4, Step = "E", Length = 4, Alter = 0, HasDot = false, Lyric = "う", MML = "Eう" }, new Note { Octave = 4, Step = "F", Length = 4, Alter = 0, HasDot = false, Lyric = "え", MML = "Fえ" }, new Note { Octave = 4, Step = "G", Length = 4, Alter = 0, HasDot = false, Lyric = "お", MML = "Gお" }, new Note { Octave = 4, Step = "A", Length = 4, Alter = 0, HasDot = false, Lyric = "か", MML = "Aか" }, new Note { Octave = 4, Step = "B", Length = 4, Alter = 0, HasDot = false, Lyric = "き", MML = "Bき" }, new Octave { Value = 5, MML = ">" }, new Note { Octave = 5, Step = "C", Length = 4, Alter = 0, HasDot = false, Lyric = "く", MML = "Cく" } }; IElement[] parsed = parser.Parse(mml); CollectionAssert.AreEqual(elements, parsed); }
public void NoteTest3() { string mml = "CあL8DいE4う"; MMLParser parser = new MMLParser(); IElement[] elements = new IElement[] { new Note { Octave = 4, Step = "C", Length = 4, Alter = 0, HasDot = false, Lyric = "あ", MML = "Cあ" }, new Length { Value = 8, MML = "L8" }, new Note { Octave = 4, Step = "D", Length = 8, Alter = 0, HasDot = false, Lyric = "い", MML = "Dい" }, new Note { Octave = 4, Step = "E", Length = 4, Alter = 0, HasDot = false, Lyric = "う", MML = "E4う" } }; IElement[] parsed = parser.Parse(mml); CollectionAssert.AreEqual(elements, parsed); }
public void RestTest1() { string mml = "RR1L8R"; MMLParser parser = new MMLParser(); IElement[] elements = new IElement[] { new Rest { Length = 4, HasDot = false, MML = "R" }, new Rest { Length = 1, HasDot = false, MML = "R1" }, new Length { Value = 8, MML = "L8" }, new Rest { Length = 8, HasDot = false, MML = "R" } }; IElement[] parsed = parser.Parse(mml); CollectionAssert.AreEqual(elements, parsed); }
public async Task GiveawayAsync(EventContext e) { DiscordEmoji emoji = new DiscordEmoji(); emoji.Name = "🎁"; e.Arguments.Take(out string giveawayText); while (!e.Arguments.Pack.Peek().StartsWith("-")) { giveawayText += " " + e.Arguments.Pack.Take(); } var mml = new MMLParser(e.Arguments.Pack.TakeAll()).Parse(); int amount = mml.Get("amount", 1); TimeSpan timeLeft = mml.Get("time", "1h").GetTimeFromString(); if (amount > 10) { await e.ErrorEmbed("We can only allow up to 10 picks per giveaway") .ToEmbed().QueueToChannelAsync(e.Channel); return; } giveawayText = giveawayText + ((amount > 1) ? " x " + amount : ""); List <IDiscordUser> winners = new List <IDiscordUser>(); IDiscordMessage msg = await CreateGiveawayEmbed(e, giveawayText) .AddField("Time", timeLeft.ToTimeString(e.Locale), true) .AddField("React to participate", "good luck", true) .ToEmbed().SendToChannel(e.Channel); await msg.CreateReactionAsync(emoji); int updateTask = -1; int task = taskScheduler.AddTask(e.Author.Id, async(desc) => { msg = await e.Channel.GetMessageAsync(msg.Id); if (msg != null) { await msg.DeleteReactionAsync(emoji); await Task.Delay(1000); var reactions = await msg.GetReactionsAsync(emoji); //do //{ // reactions.AddRange(); // reactionsGained += 100; //} while (reactions.Count == reactionsGained); // Select random winners for (int i = 0; i < amount; i++) { if (reactions.Count == 0) { break; } int index = MikiRandom.Next(reactions.Count); winners.Add(reactions[index]); } if (updateTask != -1) { taskScheduler.CancelReminder(e.Author.Id, updateTask); } string winnerText = string.Join("\n", winners.Select(x => x.Username + "#" + x.Discriminator).ToArray()); if (string.IsNullOrEmpty(winnerText)) { winnerText = "nobody!"; } await msg.EditAsync(new EditMessageArgs { embed = CreateGiveawayEmbed(e, giveawayText) .AddField("Winners", winnerText) .ToEmbed() }); } }, "description var", timeLeft); }
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("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(); Utils.Embed.SetTitle("⚙ Role Config") .SetColor(102, 117, 127) .SetDescription($"Updated {role.Name}!") .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.GetChannel()); * 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.GetGuild(), 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.GetGuild().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.GetChannel()); * 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.GetGuild().Id.ToDbLong(), role.Id.ToDbLong()); * if(newRole == null) * { * newRole = (await context.LevelRoles.AddAsync(new LevelRole() * { * RoleId = role.Id.ToDbLong(), * GuildId = e.GetGuild().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.GetChannel()); * * while (true) * { * msg = await e.EventSystem.GetCommandHandler<MessageListener>().WaitForNextMessage(e.CreateSession()); * * rolesFound = (await GetRolesByName(e.GetGuild(), 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.GetChannel()); * 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.GetChannel()); * * 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.GetChannel()); * * 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.GetChannel()); * * 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.GetChannel()); * * 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().QueueToChannelAsync(e.GetChannel()); * } * }*/ public async Task ConfigRoleQuickAsync(IContext e) { var context = e.GetService <MikiDbContext>(); if (!e.GetArgumentPack().Take(out string roleName)) { await e.ErrorEmbed("Expected a role name") .ToEmbed().QueueAsync(e, e.GetChannel()); return; } IDiscordRole role = null; if (ulong.TryParse(roleName, out ulong s)) { role = await e.GetGuild().GetRoleAsync(s); } else { role = (await GetRolesByNameAsync(e.GetGuild(), roleName)).FirstOrDefault(); } var newRole = await context.LevelRoles.FindAsync((long)e.GetGuild().Id, (long)role.Id); var arguments = new MMLParser(e.GetArgumentPack().Pack.TakeAll()).Parse(); if (role.Name.Length > 20) { await e.ErrorEmbed("Please keep role names below 20 letters.") .ToEmbed() .QueueAsync(e, e.GetChannel()); return; } if (newRole == null) { newRole = context.LevelRoles.Add(new LevelRole() { GuildId = (e.GetGuild().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.GetGuild().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(); await new EmbedBuilder() .SetTitle("⚙ Role Config") .SetColor(102, 117, 127) .SetDescription($"Updated {role.Name}!") .ToEmbed().QueueAsync(e, e.GetChannel()); }
public async Task GiveawayAsync(IContext e) { if (!e.HasFeatureEnabled(FeatureFlags.GiveawayUsingNewScheduler)) { throw new CommandDisabledException(); } DiscordEmoji.TryParse("🎁", out var emoji); var args = e.GetArgumentPack(); var giveawayText = args.TakeRequired <string>(); if (args.CanTake) { while (!args.Pack.Peek().HasValue) { giveawayText += " " + args.Pack.Take(); } } var mml = new MMLParser(e.GetArgumentPack().Pack.TakeAll()).Parse(); int amount = mml.Get("amount", 1); TimeSpan timeLeft = mml.Get("time", "1h").GetTimeFromString(); if (amount > 10) { await e.ErrorEmbed("We can only allow up to 10 picks per giveaway") .ToEmbed() .QueueAsync(e, e.GetChannel()) .ConfigureAwait(false); return; } giveawayText += amount > 1 ? $" x {amount:N0}" : ""; List <IDiscordUser> winners = new List <IDiscordUser>(); IDiscordMessage msg = await CreateGiveawayEmbed(e, giveawayText) .AddField("Time", timeLeft.ToTimeString(e.GetLocale()), true) .AddField("React to participate", "good luck", true) .ToEmbed() .SendToChannelAsync(e.GetChannel()) .ConfigureAwait(false); await msg.CreateReactionAsync(emoji) .ConfigureAwait(false); //taskScheduler.AddTask(e.GetAuthor().Id, async (desc) => //{ // msg = await e.GetChannel() // .GetMessageAsync(msg.Id) // .ConfigureAwait(false); // if(msg == null) // { // return; // } // await msg.DeleteReactionAsync(emoji) // .ConfigureAwait(false); // await Task.Delay(1000) // .ConfigureAwait(false); // var reactions = (await msg.GetReactionsAsync(emoji) // .ConfigureAwait(false)) // .ToList(); // //do // //{ // // reactions.AddRange(); // // reactionsGained += 100; // //} while (reactions.Count == reactionsGained); // // Select random winners // for(int i = 0; i < amount; i++) // { // if(!reactions.Any()) // { // break; // } // int index = MikiRandom.Next(reactions.Count()); // winners.Add(reactions.ElementAtOrDefault(index)); // } // if(updateTask != -1) // { // taskScheduler.CancelReminder(e.GetAuthor().Id, updateTask); // } // string winnerText = string.Join( // "\n", winners.Select(x => $"{x.Username}#{x.Discriminator}").ToArray()); // if(string.IsNullOrEmpty(winnerText)) // { // winnerText = "nobody!"; // } // await msg.EditAsync(new EditMessageArgs // { // Embed = CreateGiveawayEmbed(e, giveawayText) // .AddField("Winners", winnerText) // .ToEmbed() // }).ConfigureAwait(false); //}, "description var", timeLeft); }
public async Task GiveawayAsync(EventContext e) { //Emoji emoji = new Emoji("🎁"); var arg = e.Arguments.FirstOrDefault(); string giveAwayText = arg?.Argument ?? ""; arg = arg?.Next(); while (!(arg?.Argument ?? "-").StartsWith("-")) { giveAwayText += " " + arg.Argument; arg = arg?.Next(); } var mml = new MMLParser(arg?.TakeUntilEnd()?.Argument ?? "").Parse(); bool isUnique = mml.Get("unique", false); int amount = mml.Get("amount", 1); TimeSpan timeLeft = mml.Get("time", "1h").GetTimeFromString(); if (amount > 10) { e.ErrorEmbed("We can only allow up to 10 picks per giveaway") .ToEmbed().QueueToChannel(e.Channel); return; } giveAwayText = giveAwayText + ((amount > 1) ? " x " + amount : ""); List <IDiscordUser> winners = new List <IDiscordUser>(); IDiscordMessage msg = await CreateGiveawayEmbed(e, giveAwayText) .AddField("Time", (DateTime.Now + timeLeft).ToShortTimeString(), true) .AddField("React to participate", "good luck", true) .ToEmbed().SendToChannel(e.Channel); //await (msg as IUserMessage).AddReactionAsync(emoji); int updateTask = -1; int task = taskScheduler.AddTask(e.Author.Id, async(desc) => { //msg = await e.Channel.GetMessageAsync(msg.Id); if (msg != null) { //await msg.RemoveReactionAsync(emoji, await e.Guild.GetCurrentUserAsync()); List <IDiscordUser> reactions = new List <IDiscordUser>(); int reactionsGained = 0; do { //reactions.AddRange(await (msg as IUserMessage).GetReactionUsersAsync(emoji, 100, reactions.LastOrDefault()?.Id ?? null)); reactionsGained += 100; } while (reactions.Count == reactionsGained); // Select random winners for (int i = 0; i < amount; i++) { if (reactions.Count == 0) { break; } int index = MikiRandom.Next(reactions.Count); winners.Add(reactions[index]); if (isUnique) { reactions.RemoveAt(index); } } if (updateTask != -1) { taskScheduler.CancelReminder(e.Author.Id, updateTask); } string winnerText = string.Join("\n", winners.Select(x => x.Username + "#" + x.Discriminator).ToArray()); if (string.IsNullOrEmpty(winnerText)) { winnerText = "nobody!"; } await msg.EditAsync(new EditMessageArgs { embed = CreateGiveawayEmbed(e, giveAwayText) .AddField("Winners", winnerText) .ToEmbed() }); } }, "description var", timeLeft); }