Пример #1
0
        public void Exception7()
        {
            string    mml    = "O8>";
            MMLParser parser = new MMLParser();

            IElement[] parsed = parser.Parse(mml);
        }
Пример #2
0
        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);
        }
Пример #3
0
        public void LengthException1()
        {
            string    mml    = "L";
            MMLParser parser = new MMLParser();

            IElement[] parsed = parser.Parse(mml);
        }
Пример #4
0
        public void OctaveException1()
        {
            string    mml    = "O";
            MMLParser parser = new MMLParser();

            IElement[] parsed = parser.Parse(mml);
        }
Пример #5
0
        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);
        }
Пример #6
0
        public void Exception8()
        {
            string    mml    = "Cあ>>Dい<<E";
            MMLParser parser = new MMLParser();

            IElement[] parsed = parser.Parse(mml);
        }
Пример #7
0
        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");
        }
Пример #8
0
        private void AssertException(string mml)
        {
            MMLParser         parser = new MMLParser();
            var               parsed = parser.Parse(mml);
            MusicXMLGenerator g      = new MusicXMLGenerator();

            g.GenerateFromElements(parsed);
        }
Пример #9
0
        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);
        }
Пример #10
0
        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);
        }
Пример #11
0
        public void EmptyTest0()
        {
            string    mml    = "";
            MMLParser parser = new MMLParser();

            IElement[] elements = new IElement[]
            {
            };
            IElement[] parsed = parser.Parse(mml);
            CollectionAssert.AreEqual(elements, parsed);
        }
Пример #12
0
        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);
        }
Пример #13
0
        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);
        }
Пример #14
0
        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);
        }
Пример #15
0
        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);
            }
        }
Пример #16
0
        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);
        }
Пример #17
0
        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);
        }
Пример #18
0
        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());
        }
Пример #19
0
        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);
        }
Пример #20
0
        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);
        }
Пример #21
0
        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);
        }
Пример #22
0
        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);
        }
Пример #23
0
        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);
            }
        }
Пример #24
0
        /*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());
        }
Пример #25
0
        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);
        }
Пример #26
0
        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);
        }