public void TestThatCultureIsSavedAndReturned()
        {
            var culture = new CultureData(CultureInfo.CurrentCulture);

            var entry = new LanguageEntry(culture);

            Assert.AreEqual(culture, entry.Language);
        }
Пример #2
0
        public void TestThatCultureIsSavedAndReturned()
        {
            var culture = new CultureData(CultureInfo.CurrentCulture);

            var entry = new LanguageEntry(culture);

            Assert.AreEqual(culture, entry.Language);
        }
Пример #3
0
        string GetModules()
        {
            List <string> ModuleNames = new List <string>();
            List <Module> Modules     = new List <Module>();
            LanguageEntry lang        = Global.Languages.GetLanguage("en_US");

            foreach (var Module in Global.CommandService.Modules)
            {
                Module mod = new Module()
                {
                    name     = Module.Name,
                    commands = new List <Command>()
                };

                int Index = -1;
                if ((Index = ModuleNames.IndexOf(Module.Name)) > -1)
                {
                    mod = Modules[Index];
                }
                mod.commands.AddRange(Module.Commands.Select(t =>
                {
                    string Name = t.Name;

                    if (!string.IsNullOrWhiteSpace(Module.Group))
                    {
                        Name = Module.Group + (Name.Length > 0 ? " " : "") + Name;
                    }

                    string Help = t.Summary;
                    if (lang.Commands.ContainsKey(t.Name))
                    {
                        Help = lang.Prepare(lang.Commands[t.Name].Help, "PREFIX", ";");
                    }


                    return(new Command()
                    {
                        name = Name,
                        help = Help
                    });
                }));
                if (Index > -1)
                {
                    Modules[Index] = mod;
                }
                else
                {
                    Modules.Add(mod);
                }

                if (!ModuleNames.Contains(mod.name))
                {
                    ModuleNames.Add(mod.name);
                }
            }

            return(JsonConvert.SerializeObject(Modules));
        }
Пример #4
0
 private void duohnRabql_SelectedIndexChanged(object sender, EventArgs e)
 {
     if (duohnRabql.SelectedItems.Count > 0)
     {
         method_5();
         LanguageEntry languageEntry = duohnRabql.SelectedItems[0].Tag as LanguageEntry;
         method_6(languageEntry.Messages);
     }
 }
Пример #5
0
 public string GetLanguageValue(string key)
 {
     if (LanguageEntry.ContainsKey(key))
     {
         return(LanguageEntry[key]);
     }
     else
     {
         return(null);
     }
 }
Пример #6
0
    //获取就得翻译表数据
    public void GetCacheLanguages()
    {
        Logger.info("正在获取旧翻译数据");
        if (!FileUtil.FileExist(m_TranslationFile))
        {
            return;
        }
        IWorkbook workbook = new HSSFWorkbook(new FileStream(m_TranslationFile, FileMode.Open, FileAccess.Read));

        foreach (var pair in m_Tables)
        {
            try {
                ISheet sheet = workbook.GetSheet(pair.Key);
                if (sheet == null)
                {
                    continue;
                }
                //获得Translation表第一行数据
                IRow firstRow = sheet.GetRow(0);
                //查出所有的多国语言
                //0 列是关键字 1列是中文
                List <string> languages = new List <string>();
                for (int i = 2; i < firstRow.LastCellNum; ++i)
                {
                    languages.Add(Util.GetCellString(firstRow.GetCell(i)));
                }
                //查出旧的翻译
                for (int i = 1; i <= sheet.LastRowNum; ++i)
                {
                    IRow row = sheet.GetRow(i);
                    if (row == null)
                    {
                        continue;
                    }
                    var key = Util.GetCellString(row.GetCell(0));       //取出关键字
                    if (string.IsNullOrEmpty(key))
                    {
                        continue;
                    }
                    var value = Util.GetCellString(row.GetCell(1));     //取出中文
                    Dictionary <string, string> keyValue = new Dictionary <string, string>();
                    for (int j = 0; j < languages.Count; ++j)
                    {
                        keyValue.Add(languages[j], Util.GetCellString(row.GetCell(2 + j)));     //取出其他语言
                    }
                    m_CacheLanguages[key] = new LanguageEntry(key, value, keyValue);
                }
            } catch (System.Exception e) {
                Logger.error("GetCacheLanguages is error {0} : {1}", pair.Key, e.ToString());
            }
        }
    }
Пример #7
0
    public string FindKey(string p_line)
    {
        LanguageEntry entry = m_entries.Find(le => le.m_line == p_line);

        if (entry != null && HasEntry(entry.m_key))
        {
            return(entry.m_key);
        }
        else
        {
            return("");
        }
    }
Пример #8
0
        public async Task ListAsync(ICommandContext Context = null, ITextChannel Channel = null)
        {
            if (Channel == null)
            {
                Channel = Context.Channel as ITextChannel;
            }

            LanguageEntry Language = Channel.GetSettings().GetLanguage();

            var Builder = new EmbedBuilder()
            {
                Color = Color,
                Title = Language.GetEntry("MusicHandler:Queue"),
            };

            if (Queue.Count == 0)
            {
                Builder.Description = Language.GetEntry("MusicHandler:EmptyQueue");
            }
            else
            {
                int Count = Math.Min(5, Queue.Count);
                for (int i = 0; i < Count; i++)
                {
                    var    CurrentItem = Queue[i];
                    string fval        = $"[URL]({ CurrentItem.PublicUrl })\n" +
                                         $"{ Language.GetEntry("MusicHandler:UploadedBy") }: { CurrentItem.Author }\n" +
                                         $"{ Language.GetEntry("MusicHandler:Length") }: " + CurrentItem.Duration.ToString(@"hh\:mm\:ss");

                    Builder.AddField(new EmbedFieldBuilder()
                    {
                        IsInline = false,
                        Name     = "#" + (i + 1) + ": " + (CurrentItem.IsListenMoe ? "LISTEN.moe" : (CurrentItem.Title + " (" + (CurrentItem.IsYouTube ? "YouTube" : "SoundCloud") + ")")),
                        Value    = CurrentItem.IsListenMoe ? "[LISTEN.moe](https://listen.moe/)" : fval
                    });
                    if (i != Count - 1)
                    {
                        Builder.Fields[Builder.Fields.Count - 1].Value += "\n-----------";
                    }
                }

                if (Queue.Count > 5)
                {
                    Builder.WithFooter(Language.GetEntry("MusicHandler:MoreItems", "X", "" + (Queue.Count - 5)));
                }
            }
            await Channel.SendMessageAsync("", embed : Builder.Build());
        }
Пример #9
0
        public void Load()
        {
            Dictionary <string, LanguageEntry> Languages = new Dictionary <string, LanguageEntry>();

            if (Directory.Exists("lang"))
            {
                IEnumerable <string> Files      = Directory.EnumerateFiles("lang", "*.json");
                IEnumerator <string> enumerator = Files.GetEnumerator();

                while (enumerator.MoveNext())
                {
                    LanguageEntry le = JsonConvert.DeserializeObject <LanguageEntry>(File.ReadAllText(enumerator.Current, Encoding.UTF8));
                    le.Path = enumerator.Current;

                    if (string.IsNullOrWhiteSpace(le.Id))
                    {
                        continue;
                    }
                    else
                    {
                        if (Languages.ContainsKey(le.Id))
                        {
                            LanguageEntry sle = Languages[le.Id];
                            Logger.Log(LogType.Language, ConsoleColor.Red, "Error", $"Duplication found with id \"{ le.Id }\" " +
                                       $"between files: \"{ sle.Path }\" and \"{ le.Path }\"");
                        }
                        else
                        {
                            Languages.Add(le.Id, le);
                            Logger.Log(LogType.Language, ConsoleColor.Cyan, null, $"{ le.Name } ({ le.Id }) language loaded!");
                        }
                    }
                }
                Logger.Log(LogType.Language, ConsoleColor.Cyan, null, $"Loaded { Languages.Count } language files! Be aware that everything is case sensitive!");
            }
            else
            {
                Directory.CreateDirectory("lang");
            }
            this.Languages = Languages;

            DownloadMustHaveLanguages(false);
        }
Пример #10
0
        protected override void ReadChunks(long totalSize)
        {
            var chunkRunTo = BinaryReader.BaseStream.Position + totalSize;
            var curPos     = BinaryReader.BaseStream.Position;
            var header     = BinaryUtil.ReadStruct <MWLanguageHeader>(BinaryReader);

            // seek back to after size
            BinaryReader.BaseStream.Seek(curPos, SeekOrigin.Begin);
            BinaryReader.BaseStream.Seek(header.HashTableOffset, SeekOrigin.Current);

            /**
             * Read hash table
             */
            for (var i = 0; i < header.NumStrings; i++)
            {
                var entry = new LanguageEntry
                {
                    HashOne = BinaryReader.ReadUInt32(),
                    HashTwo = BinaryReader.ReadUInt32(),
                };

                _languagePack.Entries.Add(entry);
            }

            BinaryReader.BaseStream.Seek(curPos, SeekOrigin.Begin);
            BinaryReader.BaseStream.Seek(header.StringTableOffset, SeekOrigin.Current);

            for (var i = 0; i < header.NumStrings; i++)
            {
                _languagePack.Entries[i].Text = BinaryUtil.ReadNullTerminatedString(BinaryReader);
            }

            if (BinaryReader.BaseStream.Position > chunkRunTo)
            {
                throw new Exception(
                          $"Buffer overflow? Chunk runs to 0x{chunkRunTo:X16}, we're at 0x{BinaryReader.BaseStream.Position:X16} (diff: {(BinaryReader.BaseStream.Position - chunkRunTo):X16})");
            }

            BinaryReader.BaseStream.Seek(chunkRunTo - BinaryReader.BaseStream.Position, SeekOrigin.Current);
        }
Пример #11
0
        protected override void Read(long size)
        {
            var curPos = Context.Reader.BaseStream.Position;
            var runTo  = curPos + size;
            var header = BinaryUtil.ReadStruct <LanguageHeader>(Context.Reader);

            DebugUtil.EnsureCondition(
                header.HashTableOffset % 2 == 0,
                () => "Hash table is not aligned evenly! This is very bad.");
            DebugUtil.EnsureCondition(
                header.StringTableOffset % 2 == 0,
                () => "String table is not aligned evenly! This is very bad.");

            Context.Reader.BaseStream.Position = curPos + header.HashTableOffset;

            DebugUtil.PrintPosition(Context.Reader, GetType());
            DebugUtil.EnsureCondition(
                Context.Reader.BaseStream.Position + header.NumStrings * 8 < runTo,
                () => "Cannot read further - hash table would overflow and/or leave no room for strings. This is very bad.");

            for (var i = 0; i < header.NumStrings; i++)
            {
                var entry = new LanguageEntry
                {
                    HashOne = Context.Reader.ReadUInt32(),
                    HashTwo = Context.Reader.ReadUInt32(),
                };

                LanguagePack.Entries.Add(entry);
            }

            Context.Reader.BaseStream.Position = curPos + header.StringTableOffset;
            DebugUtil.PrintPosition(Context.Reader, GetType());

            for (var i = 0; i < header.NumStrings; i++)
            {
                LanguagePack.Entries[i].Text = BinaryUtil.ReadNullTerminatedString(Context.Reader);
            }
        }
Пример #12
0
        private void DownloadMustHaveLanguages(bool Redownload = false)
        {
            Dictionary <string, string> MustHaveLanguages = new Dictionary <string, string>()
            {
                { "Enlgish;en_US", "https://drive.google.com/uc?authuser=0&id=1WgyLE88t137d9Aau-Id_8pgsD0r2qRKz&export=download" },
                { "Hungarian;hu_HU", "https://drive.google.com/uc?authuser=0&id=1AHeE_UwwrPOBWGUnx9x7T90tFTIa1_LX&export=download" }
            };
            IEnumerator <string> keys = MustHaveLanguages.Keys.GetEnumerator();

            while (keys.MoveNext())
            {
                string[] split = keys.Current.Split(';');
                if (!Languages.ContainsKey(split[1]) || Redownload)
                {
                    Logger.Log(LogType.Language, ConsoleColor.Cyan, null, $"{ split[0] } ({ split[1] }) file not found! Downloading...");
                    WebClient wc = new WebClient
                    {
                        Encoding = Encoding.UTF8
                    };
                    string        Content = wc.DownloadString(MustHaveLanguages[keys.Current]);
                    LanguageEntry le      = JsonConvert.DeserializeObject <LanguageEntry>(Content);

                    Logger.Log(LogType.Language, ConsoleColor.Cyan, null, "Saving...");

                    File.WriteAllText($"lang/{ le.Id }.json", Content);
                    if (Languages.ContainsKey(le.Id))
                    {
                        Languages[le.Id] = le;
                    }
                    else
                    {
                        Languages.Add(le.Id, le);
                    }

                    Logger.Log(LogType.Language, ConsoleColor.Cyan, null, $"{ le.Name } ({ le.Id }) language loaded!");
                }
            }
        }
Пример #13
0
        public async Task SendNowPlayingAsync(ICommandContext Context = null, ITextChannel Channel = null)
        {
            if (Channel == null)
            {
                Channel = Context.Channel as ITextChannel;
            }

            LanguageEntry Language = Channel.GetSettings().GetLanguage();

            Embed Final;

            if (Current == null)
            {
                Final = CreateMusicEmbed(Language.GetEntry("MusicHandler:NotPlaying"), Language);
            }
            else
            {
                Final = CreateMusicEmbed(Language.GetEntry("MusicHandler:NowPlaying"), Language, Current.Title,
                                         Current.Duration, Current.IsListenMoe ? Current.PublicUrl.Replace("fallback", "") : Current.PublicUrl, Current.Author, Current.IsListenMoe ? ListenMoeCurrentTime : CurrentTime, Current.Thumbnail);
            }

            await Channel.SendMessageAsync("", embed : Final);
        }
Пример #14
0
        private Embed CreateMusicEmbed(string EmbedTitle, LanguageEntry Language, string SongTitle = null, TimeSpan?Length = null,
                                       string Url = null, string UploadedBy = null, TimeSpan?Current = null, string ThumbnailUrl = null)
        {
            EmbedBuilder Builder = new EmbedBuilder()
            {
                Title = EmbedTitle,
                Color = Color
            };

            string Description = "";

            if (SongTitle != null)
            {
                if (!string.IsNullOrWhiteSpace(Url))
                {
                    Description += $"[{ SongTitle }]({ Url })";
                }
                else
                {
                    Description += SongTitle;
                }
            }
            if (Length.HasValue && !Current.HasValue)
            {
                Description += $"\n{ Language.GetEntry("MusicHandler:Length") }: " + Length.Value.ToString(@"hh\:mm\:ss");
            }
            if (!string.IsNullOrWhiteSpace(UploadedBy))
            {
                Description += $"\n{ Language.GetEntry("MusicHandler:UploadedBy") }: { UploadedBy }";
            }

            if (!string.IsNullOrWhiteSpace(Description))
            {
                Builder.Description = Description;
            }

            if (Current.HasValue)
            {
                TimeSpan checkTotal = TotalTime.Ticks == 0 ? this.Current.Duration : TotalTime;

                string Text         = $"{ Current.Value:hh\\:mm\\:ss} - { checkTotal:hh\\:mm\\:ss} \n[";
                double CurrentTicks = Current.Value.TotalMilliseconds;
                double TotalTicks   = checkTotal.TotalMilliseconds;

                int IndicatorLength = 31;

                int Index = (int)((CurrentTicks / (TotalTicks + (TotalTicks / IndicatorLength))) * IndicatorLength);

                for (int i = 0; i < IndicatorLength; i++)
                {
                    if (i == Index)
                    {
                        Text += "ꞁ";
                    }
                    else
                    {
                        Text += "-";
                    }
                }

                Text += "]";

                Builder.AddField(Language.GetEntry("MusicHandler:Current"), Text, false);
            }

            if (ThumbnailUrl != null)
            {
                Builder.WithThumbnailUrl(ThumbnailUrl);
            }

            return(Builder.Build());
        }
Пример #15
0
        private void Button_BuildNSP_Click(object sender, RoutedEventArgs e)
        {
            string appid = Box_ApplicationId.Text;

            if (string.IsNullOrEmpty(appid))
            {
                Log("No application Id was set.");
                return;
            }
            else if (appid.Length != 16)
            {
                Log("Application Id is not 16 characters long.");
                return;
            }
            else if (!Regex.IsMatch(appid, @"\A\b[0-9a-fA-F]+\b\Z"))
            {
                Log("Application Id is not a valid hexadecimal string.");
                return;
            }
            byte   keygen = 5;
            string kgen   = Combo_KeyGen.Text;

            if (kgen is "1 (1.0.0 - 2.3.0)")
            {
                keygen = 1;
            }
            else if (kgen is "2 (3.0.0)")
            {
                keygen = 2;
            }
            else if (kgen is "3 (3.0.1 - 3.0.2)")
            {
                keygen = 3;
            }
            else if (kgen is "4 (4.0.0 - 4.1.0)")
            {
                keygen = 4;
            }
            else if (kgen is "5 (5.0.0 - 5.1.0)")
            {
                keygen = 5;
            }
            else if (kgen is "6 (6.0.0 - Latest)")
            {
                keygen = 6;
            }
            if (string.IsNullOrEmpty(Box_Name.Text))
            {
                Log("No application name was set.");
                return;
            }
            if (string.IsNullOrEmpty(Box_Version.Text))
            {
                Log("No application version string was set.");
                return;
            }
            if (string.IsNullOrEmpty(Box_ProductCode.Text))
            {
                Log("No product code was set.");
                return;
            }
            bool screen = (Check_AllowScreenshots.IsChecked.HasValue) ? false : Check_AllowScreenshots.IsChecked.Value;
            bool video  = (Check_AllowVideo.IsChecked.HasValue) ? false : Check_AllowVideo.IsChecked.Value;
            byte user   = Convert.ToByte((Check_UserAccount.IsChecked.HasValue) ? false : Check_UserAccount.IsChecked.Value);

            byte[] bappid = StringToByteArray(appid);
            Array.Reverse(bappid, 0, bappid.Length);
            byte[] npdm       = Properties.Resources.main;
            int    aci0offset = 0;

            for (int i = 0; i < npdm.Length; i++)
            {
                char   c1  = Convert.ToChar(npdm[i]);
                char   c2  = Convert.ToChar(npdm[i + 1]);
                char   c3  = Convert.ToChar(npdm[i + 2]);
                char   c4  = Convert.ToChar(npdm[i + 3]);
                string str = new string(new char[] { c1, c2, c3, c4 });
                if (str == "ACI0")
                {
                    aci0offset = i;
                    break;
                }
            }
            int appidoffset = aci0offset + 0x10;

            byte[] rappid = ReverseApplicationId(appid);
            foreach (byte rb in rappid)
            {
                npdm[appidoffset] = rb;
                appidoffset++;
            }
            if (Directory.Exists(Brew.Pack.Utils.TemporaryDirectory + "\\gen"))
            {
                Directory.Delete(Brew.Pack.Utils.TemporaryDirectory + "\\gen", true);
            }
            Directory.CreateDirectory(Brew.Pack.Utils.TemporaryDirectory + "\\gen");
            Directory.CreateDirectory(Brew.Pack.Utils.TemporaryDirectory + "\\gen\\exefs");
            Directory.CreateDirectory(Brew.Pack.Utils.TemporaryDirectory + "\\gen\\romfs");
            File.WriteAllBytes(Brew.Pack.Utils.TemporaryDirectory + "\\gen\\exefs\\main", Properties.Resources.Packager);
            File.WriteAllBytes(Brew.Pack.Utils.TemporaryDirectory + "\\gen\\exefs\\main.npdm", npdm);
            FileSystem.CopyDirectory(Box_SourcePath.Text, Brew.Pack.Utils.TemporaryDirectory + "\\gen\\romfs");
            Directory.CreateDirectory(Brew.Pack.Utils.TemporaryDirectory + "\\gen\\out");
            NACP          n  = new NACP();
            LanguageEntry en = new LanguageEntry();

            en.Name              = Box_Name.Text;
            en.Author            = Box_Author.Text;
            n.Version            = Box_Version.Text;
            n.ApplicationId      = appid;
            n.Screenshot         = screen;
            n.VideoCapture       = video;
            n.StartupUserAccount = user;
            n.ProductCode        = Box_ProductCode.Text;
            n.Entries.Add(en);
            n.Entries.Add(en);
            n.Entries.Add(en);
            n.Entries.Add(en);
            n.Entries.Add(en);
            n.Entries.Add(en);
            n.Entries.Add(en);
            n.Entries.Add(en);
            n.Entries.Add(en);
            n.Entries.Add(en);
            n.Entries.Add(en);
            n.Entries.Add(en);
            n.Entries.Add(en);
            n.Entries.Add(en);
            n.Entries.Add(en);
            n.Entries.Add(en);
            Directory.CreateDirectory(Brew.Pack.Utils.TemporaryDirectory + "\\gen\\control");
            ControlIcons.Save(logopath, Brew.Pack.Utils.TemporaryDirectory + "\\gen\\control");
            n.Save(Brew.Pack.Utils.TemporaryDirectory + "\\gen\\control");
            string cmd = "-k \"" + Box_KeySet.Text + "\"";

            cmd += " --exefsdir=\"" + Brew.Pack.Utils.TemporaryDirectory + "\\gen\\exefs\"";
            cmd += " --romfsdir=\"" + Brew.Pack.Utils.TemporaryDirectory + "\\gen\\romfs\"";
            cmd += " --controldir=\"" + Brew.Pack.Utils.TemporaryDirectory + "\\gen\\control\"";
            cmd += " --nologo";
            cmd += " --keygeneration=" + keygen.ToString();
            cmd += " --tempdir=\"" + Brew.Pack.Utils.TemporaryDirectory + "\\bin\\temp\"";
            cmd += " --nspdir=\"" + Brew.Pack.Utils.TemporaryDirectory + "\\out\"";
            SaveFileDialog nsp = new SaveFileDialog()
            {
                Title            = "Package as an installable NSP package",
                Filter           = "Nintendo Submission Package (*.nsp)|*.nsp",
                AddExtension     = true,
                InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Desktop),
            };
            DialogResult res = nsp.ShowDialog();

            if (res is System.Windows.Forms.DialogResult.OK)
            {
                string outnsp = nsp.FileName;
                Brew.Pack.Utils.ExecuteCommand(Brew.Pack.Utils.TemporaryDirectory + "\\bin\\hacbrewpack.exe", cmd, true);
                if (File.Exists(Brew.Pack.Utils.TemporaryDirectory + "\\out\\" + appid + ".nsp"))
                {
                    File.Move(Brew.Pack.Utils.TemporaryDirectory + "\\out\\" + appid + ".nsp", outnsp);
                }
                if (File.Exists(outnsp))
                {
                    long nspsize = new FileInfo(outnsp).Length;
                    if (nspsize is 0)
                    {
                        Log("The build failed. The built NSP seems to be empty.");
                    }
                    else
                    {
                        Log("The NSP was successfully built:\n" + outnsp + " (" + Brew.Pack.Utils.FormatSize(nspsize) + ")", LogMode.Information);
                    }
                }
                else
                {
                    Log("The build failed. The built NSP does not exist.");
                }
            }
        }
Пример #16
0
        private void ProcessImages(object sender, EventArgs e)
        {
            bool SaveTags = false;

            foreach (ulong key in Tags.Keys)
            {
                if (!Checker.Enabled || Entrance.CancellationToken.IsCancellationRequested)
                {
                    break;
                }

                if (Global.Client.GetChannel(key) is ITextChannel channel)
                {
                    LanguageEntry language = channel.GetSettings().GetLanguage();
                    List <SubTag> SubTags  = Tags[key];

                    for (int i = 0; i < SubTags.Count; i++)
                    {
                        if (!Checker.Enabled || Entrance.CancellationToken.IsCancellationRequested)
                        {
                            break;
                        }

                        List <Post> CurrentImages = new List <Post>();
                        try
                        {
                            CurrentImages.AddRange(Gelbooru.FetchImages(SubTags[i].Tags));
                        }
                        catch (Exception ex)
                        {
                            SendToErrorChannel(ex, $"Couldn't fetch images with tags: `{ string.Join(", ", SubTags[i].Tags) }`!\nWaiting 30 seconds...");
                            if (!Checker.Enabled || Entrance.CancellationToken.IsCancellationRequested)
                            {
                                break;
                            }
                            Thread.Sleep(30 * 1000);
                        }
                        if (!Checker.Enabled || Entrance.CancellationToken.IsCancellationRequested)
                        {
                            break;
                        }
                        Thread.Sleep(2000);
                        if (CurrentImages.Count == 0)
                        {
                            continue;
                        }

                        bool PerformSave = false;
                        for (int j = 0; j < CurrentImages.Count; j++)
                        {
                            Post post = CurrentImages[j];

                            if (!SubTags[i].PostIds.Contains(post.PostId))
                            {
                                PerformSave = true;
                                string joined_tags = SubTags[i].Tags.Count == 0 ? language.GetEntry("SubTagHandler:NoTag") : string.Join(" ", SubTags[i].Tags);
                                string mentions    = "";
                                if (SubTags[i].UserMentions.Count != 0)
                                {
                                    mentions = string.Join(", ", SubTags[i].UserMentions.Select(t => $"<@{ t }>"));
                                }
                                channel.SendMessageAsync(mentions, embed: new EmbedBuilder()
                                {
                                    Color    = Color.Magenta,
                                    Title    = language.GetEntry("SubTagHandler:NewImage", "TAGS", joined_tags) + (post.IsAnimated ? "[ANIMATED]" : "") + " - " + post.Filename,
                                    ImageUrl = (!post.IsAnimated || post.Filename.EndsWith(".gif") ? post.Link : post.ThumbnailUrl),
                                    Url      = post.PostLink
                                }.Build());
                                if (!Checker.Enabled || Entrance.CancellationToken.IsCancellationRequested)
                                {
                                    break;
                                }
                                Thread.Sleep(2000);
                            }
                        }

                        if (PerformSave)
                        {
                            Tags[key][i].PostIds = CurrentImages.Select(t => t.PostId).ToList();
                            Save();
                        }
                    }
                }
                else
                {
                    Tags.Remove(key);
                    SaveTags = true;
                }
            }
            if (SaveTags)
            {
                Save();
            }
        }
Пример #17
0
        private async Task DiscordMessageReceived(SocketMessage msg)
        {
            if (!(msg is SocketUserMessage message) || message.Author.IsBot)
            {
                return;
            }

            CommandContext context = new CommandContext(Global.Client, message);

            if (context.Guild == null || !Global.IsAdminOrHigher(message.Author.Id, context.Guild.Id))
            {
                return;
            }

            int index = GetCreation(context);

            if (index > -1)
            {
                ActiveMultiRoleCreation creation = ActiveCreations[index];
                if (creation.MessagesToDelete[0].Id == message.Id)
                {
                    return;
                }


                LanguageEntry language = context.GetSettings().GetLanguage();

                creation.MessagesToDelete.Add(message);

                switch (creation.State)
                {
                case CreationState.WaitMessage:
                    creation.Message = message.Content;
                    creation.MessagesToDelete.Add(await context.Channel.SendMessageAsync(language.GetEntry("MultiRoleSystem:RequestEmotes")));
                    creation.State = CreationState.WaitEmotes;
                    break;

                case CreationState.WaitEmotes:
                    if (message.Content.Equals("no", StringComparison.InvariantCultureIgnoreCase))
                    {
                        if (creation.EmoteRolePairs.Count == 0)
                        {
                            creation.MessagesToDelete.Add(await context.Channel.SendMessageAsync(language.GetEntry("MultiRoleSystem:MinOne")));
                            break;
                        }
                        await ClearAsync(index);
                        await CreateMessageAsync(context, creation);

                        return;
                    }
                    else if (message.Content.Equals("cancel", StringComparison.InvariantCultureIgnoreCase))
                    {
                        await ClearAsync(index);

                        return;
                    }
                    else
                    {
                        string          text    = message.Content;
                        MatchCollection matches = RoleRegex.Matches(text);

                        if (matches.Count != 1)
                        {
                            creation.MessagesToDelete.Add(await context.Channel.SendMessageAsync(language.GetEntry("MultiRoleSystem:InvalidFormat")));
                            break;
                        }
                        Match roleMatch = matches[0];
                        text = text.Remove(roleMatch.Index, roleMatch.Length).Trim(' ');
                        IRole role = null;

                        if (ulong.TryParse(roleMatch.Groups[1].Value, out ulong roleId))
                        {
                            role = context.Guild.GetRole(roleId);
                        }

                        if (role == null)
                        {
                            creation.MessagesToDelete.Add(await context.Channel.SendMessageAsync(language.GetEntry("MultiRoleSystem:CouldntGetRole")));
                            break;
                        }

                        IEmote emote = null;

                        try
                        {
                            if (Emote.TryParse(text, out Emote e))
                            {
                                if (await context.Guild.GetEmoteAsync(e.Id) != null)
                                {
                                    emote = e;
                                }
                            }
                            else
                            {
                                try
                                {
                                    emote = new Emoji(text);
                                }
                                catch { }
                            }
                        }
                        catch { }

                        if (emote == null)
                        {
                            creation.MessagesToDelete.Add(await context.Channel.SendMessageAsync(language.GetEntry("MultiRoleSystem:CouldntCreateEmote")));
                        }
                        else
                        {
                            creation.EmoteRolePairs.Add(emote, role.Id);
                            creation.MessagesToDelete.Add(await context.Channel.SendMessageAsync(language.GetEntry("MultiRoleSystem:EmoteAdded")));
                        }
                    }
                    break;
                }

                ActiveCreations[index] = creation;
            }
        }
Пример #18
0
        public async Task <Track> Select(MusicPlayer client, List <Track> Tracks, ICommandContext Context, LanguageEntry Language)
        {
            if (Tracks.Count > 20)
            {
                Tracks.RemoveRange(20, Tracks.Count - 20);
            }
            string Description = string.Join("\n", Tracks.Select((t, index) => "#" + (index + 1) + " - **" + t.Title + "** by " + t.User.Username));

            return(await SelectAsync(Tracks, client, Context, Language.GetEntry("MusicHandler:SelectTrackSoundCloud"), Description, Language));
        }
Пример #19
0
        private static void Load()
        {
            foreach (Assembly assembly in AppDomain.CurrentDomain.GetAssemblies())
            {
                foreach (Type type in assembly.GetTypes())
                {
                    foreach (MethodInfo mi in type.GetMethods(BindingFlags.Static | BindingFlags.Public | BindingFlags.NonPublic))
                    {
                        if (mi.GetCustomAttribute(typeof(LanguageLoadAttribute)) != null)
                        {
                            string o = (string)mi.Invoke(null, null);
                            string line;
                            string entry;
                            string value;
                            using (StringReader reader = new StringReader(o))
                            {
                                while (true)
                                {
                                    line = reader.ReadLine();
                                    if (line != null && line != "")
                                    {
                                        if (line[0] == '#')                                         //comment, ignore
                                        {
                                            continue;
                                        }
                                        else
                                        {
                                            // Read the object name
                                            int i = line.IndexOf(' ');
                                            entry = line.Substring(0, i);

                                            i = line.IndexOf('=');

                                            // Check if it's an array
                                            if (i + 4 < line.Length && line[i + 1] == '>' && line[i + 2] == ' ' && line[i + 3] == '(' && line[i + 4] == ')')
                                            {
                                                LanguageEntry le   = new LanguageEntry();
                                                List <string> list = new List <string>();
                                                int           iLast;
                                                while (true)
                                                {
                                                    line = reader.ReadLine();
                                                    if (line.IndexOf("() => end") > 0)
                                                    {
                                                        le.text = list.ToArray();
                                                        dictionary.Add(entry, le);
                                                        goto End;
                                                    }
                                                    i = 0;
                                                    while (line[i] == '\t')
                                                    {
                                                        i++;
                                                    }
                                                    while (true)
                                                    {
                                                        iLast = line.IndexOf('=', i);
                                                        if (iLast > 0 && line[iLast + 1] == '>')
                                                        {
                                                            list.Add(line.Substring(i, iLast - i - 1));
                                                        }
                                                        else                                                         // Last one, read till the end
                                                        {
                                                            list.Add(line.Substring(i));
                                                            break;
                                                        }
                                                        i = iLast + 3;                                                         // We skip "=> "
                                                    }
                                                }
                                            }

                                            // Check if it's multi conditional
                                            if (i + 1 < line.Length && line[i + 1] == '>')
                                            {
                                                LanguageEntry le = new LanguageEntry();
                                                string        condition;
                                                while (true)
                                                {
                                                    line = reader.ReadLine();
                                                    // Should never happen
                                                    if (line == null)
                                                    {
                                                        goto End;
                                                    }
                                                    if (line.IndexOf("() => end") > 0)
                                                    {
                                                        dictionary.Add(entry, le);
                                                        goto End;
                                                    }
                                                    i         = line.IndexOf('(');
                                                    condition = line.Substring(i + 1, line.IndexOf(')', i) - i - 1);
                                                    i         = line.IndexOf('=');
Loop:
                                                    if (i + 1 < line.Length && line[i + 1] == ' ')
                                                    {
                                                        i++;
                                                        goto Loop;
                                                    }
                                                    if (i + 1 < line.Length)
                                                    {
                                                        value         = line.Substring(i + 1);
                                                        le[condition] = value;
                                                    }
                                                    else
                                                    {
                                                        le[condition] = "";
                                                    }
                                                }
                                            }

                                            // Read the value
                                            // Notes: No need to check for "=" here. From the first white space we read it to the end.
                                            // Todo: Remove spaces on end if any?
                                            i     = line.IndexOf(' ', i + 1);
                                            value = line.Substring(i + 1);

                                            dictionary.Add(entry, new LanguageEntry(value));
End:
                                            continue;
                                        }
                                    }
                                    else if (line == null)
                                    {
                                        break;
                                    }
                                    else
                                    {
                                        continue;
                                    }
                                }
                            }
                        }
                    }
                }
            }
        }
Пример #20
0
        public async Task <VideoSearchResult> Select(MusicPlayer client, List <VideoSearchResult> Videos, ICommandContext Context, LanguageEntry Language)
        {
            if (Videos.Count > 20)
            {
                Videos.RemoveRange(20, Videos.Count - 20);
            }
            string Description = string.Join("\n", Videos.Select((t, index) => "#" + (index + 1) + " - **" + t.Title + "** by " + t.Author.ChannelTitle));

            return(await SelectAsync(Videos, client, Context, Language.GetEntry("MusicHandler:SelectVideoYouTube"), Description, Language));
        }
Пример #21
0
        public async Task <Models.SoundCloud.Playlist> Select(MusicPlayer client, List <Models.SoundCloud.Playlist> Playlists, ICommandContext Context, LanguageEntry Language)
        {
            if (Playlists.Count > 20)
            {
                Playlists.RemoveRange(20, Playlists.Count - 20);
            }
            string Description = string.Join("\n", Playlists.Select((t, index) => "#" + (index + 1) + " - **" + t.Title + "** by " + t.User.Username + " (" + t.TrackCount + " tracks)"));

            return(await SelectAsync(Playlists, client, Context, Language.GetEntry("MusicHandler:SelectPlaylistSoundCloud"), Description, Language));
        }
Пример #22
0
        private async Task <T> SelectAsync <T>(List <T> Tracks, MusicPlayer client, ICommandContext Context, string Title, string Description, LanguageEntry Language)
            where T : class
        {
            EmbedBuilder Builder = new EmbedBuilder()
            {
                Title       = Title,
                Color       = client.Color,
                Description = Description,
                Footer      = new EmbedFooterBuilder()
                {
                    Text = Language.GetEntry("MusicHandler:SelectOneMinute")
                }
            };
            IUserMessage Message = await Context.Channel.SendMessageAsync("", embed : Builder.Build());

            Choice choice = new Choice()
            {
                UserId    = Context.User.Id,
                ChannelId = Context.Channel.Id,
                MaxNumber = Tracks.Count
            };
            T selected = null;

            CancellationTokenSource source = new CancellationTokenSource();
            CancellationToken       token  = source.Token;

            choice.ChoiceMade += (i) =>
            {
                selected = Tracks[i];
                source.Cancel();
            };
            choice.Canceled += () => source.Cancel();

            RequestUserChoice.Add(choice);

            try { await Task.Delay(60 * 1000, token); } catch { } // cancelled task

            RequestUserChoice.Remove(choice);
            try
            {
                await Message.DeleteAsync();
            }
            catch { } // message got already deleted

            return(selected);
        }
Пример #23
0
        public LevelSystem(DiscordSocketClient Client)
        {
            Levels = new List <uint>()
            {
                100
            };

            Users = new UserHandler(this);

            Client.MessageReceived += async(Message) =>
            {
                if (!(Message is SocketUserMessage sMessage))
                {
                    return;
                }

                ICommandContext Context = new SocketCommandContext(Global.Client, sMessage);

                if (Context.Guild == null || Message.Author.IsBot)
                {
                    return;
                }

                GuildSetting  Settings = Context.Guild.GetSettings();
                LanguageEntry Language = Settings.GetLanguage();

                if (!Settings.Leveling)
                {
                    return;
                }

                if (Settings.LevelingAvoidChannel.Contains(Context.Channel.Id))
                {
                    return;
                }

                if (Settings.LevelingWatchExtensions.Count != 0)
                {
                    if (Message.Attachments.Count == 0)
                    {
                        return;
                    }

                    foreach (IAttachment Attachment in Message.Attachments)
                    {
                        if (!Settings.LevelingWatchExtensions.Contains(Attachment.Url.Split('.').Last().ToLower()))
                        {
                            return;
                        }
                    }
                }

                User User;

                if (Users.ContainsKey(Message.Author.Id))
                {
                    User = Users[Message.Author.Id];
                }
                else
                {
                    User = new User()
                    {
                        UserId = Message.Author.Id
                    };
                }


                uint Xp = Global.Random.NextUInt(5, 7);

                uint LengthBonus = (uint)(Message.Content.Length / 40);
                if (LengthBonus > 5)
                {
                    LengthBonus = 5;
                }

                Xp += LengthBonus;

                if (!User.GuildXps.ContainsKey(Context.Guild.Id))
                {
                    User.GuildXps.Add(Context.Guild.Id, Xp);
                    User.GuildLevels.Add(Context.Guild.Id, 0);
                }
                else
                {
                    User.GuildXps[Context.Guild.Id] += Xp;
                }

                uint NextLevelExp = Levels[(int)User.GuildLevels[Context.Guild.Id]];
                if (User.GuildXps[Context.Guild.Id] > NextLevelExp)
                {
                    User.GuildLevels[Context.Guild.Id]++;
                    if (Levels.Count - 1 <= User.GuildLevels[Context.Guild.Id])
                    {
                        GenerateLevel(1);
                    }

                    IGuildUser gUser = Context.User as IGuildUser;

                    string Prefix = Context.Guild.GetSettings().Prefix;

                    IMessageChannel Channel = Message.Channel;

                    if (Settings.LevelupReport != 0)
                    {
                        ITextChannel ReportChannel = await Context.Guild.GetTextChannelAsync(Settings.LevelupReport);

                        if (ReportChannel != null)
                        {
                            Channel = ReportChannel;
                        }
                    }
                    EmbedBuilder Embed = new EmbedBuilder()
                    {
                        Author = new EmbedAuthorBuilder()
                        {
                            Name    = gUser.Nickname ?? gUser.Username,
                            IconUrl = gUser.GetAvatarUrl()
                        },
                        Description = Language.GetEntry("LevelSystem:Congratulation", "USER", gUser.Nickname ?? gUser.Username, "LEVEL", User.GuildLevels[Context.Guild.Id] + ""),
                        Footer      = new EmbedFooterBuilder()
                        {
                            Text = Language.GetEntry("LevelSystem:LevelFooter", "PREFIX", Prefix)
                        },
                        Color = Color.DarkPurple
                    };
                    try
                    {
                        await Channel.SendMessageAsync("", embed : Embed.Build());
                    }
                    catch { } // Couldn't send the message, doesn't have permission or sth like that

                    if (Settings.AssignRoleAtLevels.ContainsKey(User.GuildLevels[Context.Guild.Id]))
                    {
                        List <ulong> RoleIds = Settings.AssignRoleAtLevels[User.GuildLevels[Context.Guild.Id]];

                        foreach (ulong RoleId in RoleIds)
                        {
                            if (Context.Guild.GetRole(RoleId) is IRole Role)
                            {
                                if (!gUser.RoleIds.Contains(RoleId))
                                {
                                    await gUser.AddRoleAsync(Role);
                                }
                            }
                        }
                    }
                }

                Users.UpdateUser(User);
            };
        }
Пример #24
0
        }                        // Json

        public async Task <bool> ConnectAsync(ICommandContext Context = null, IVoiceChannel Channel = null)
        {
            if (Context == null)
            {
                if (VoiceChannelId == 0)
                {
                    return(false);
                }
                else
                {
                    if (Global.Client.GetChannel(VoiceChannelId) is IVoiceChannel channel)
                    {
                        try
                        {
                            Client = await channel.ConnectAsync();

                            State = PlayerState.Connected;
                            return(true);
                        }
                        catch { }
                    }
                    return(false);
                }
            }
            await DisconnectAsync();

            LanguageEntry Language = Context.GetSettings().GetLanguage();

            if (Channel != null)
            {
                try
                {
                    Client = await Channel.ConnectAsync();

                    VoiceChannelId = Channel.Id;
                    await Context.Channel.SendMessageAsync(Language.GetEntry("MusicHandler:ConnectedTo", "NAME", Channel.Name));
                }
                catch (Exception e)
                {
                    string msg = $"```${ e }```";
                    if (Global.Client.GetChannel(Global.Settings.DevServer.ErrorReportChannelId) is ITextChannel errChannel)
                    {
                        await Global.SendMessageAsync(msg, errChannel);
                    }
                    await Context.Channel.SendMessageAsync(Language.GetEntry("MusicHandler:CannotConnectToChannel"));

                    return(false);
                }
            }
            else if ((Context.User as IGuildUser).VoiceChannel is IVoiceChannel UserChannel)
            {
                try
                {
                    Client = await UserChannel.ConnectAsync();

                    VoiceChannelId = UserChannel.Id;
                    await Context.Channel.SendMessageAsync(Language.GetEntry("MusicHandler:ConnectedTo", "NAME", UserChannel.Name));
                }
                catch (Exception e)
                {
                    string msg = $"```${ e }```";
                    if (Global.Client.GetChannel(Global.Settings.DevServer.ErrorReportChannelId) is ITextChannel errChannel)
                    {
                        await Global.SendMessageAsync(msg, errChannel);
                    }
                    await Context.Channel.SendMessageAsync(Language.GetEntry("MusicHandler:CannotConnectToUser"));

                    return(false);
                }
            }
            else
            {
                IReadOnlyCollection <IVoiceChannel> Channels = await Context.Guild.GetVoiceChannelsAsync();

                IEnumerator <IVoiceChannel> enumerator = Channels.GetEnumerator();
                bool Connected = false;

                for (int i = 0; i < Channels.Count; i++)
                {
                    enumerator.MoveNext();

                    try
                    {
                        Client = await enumerator.Current.ConnectAsync();

                        await Context.Channel.SendMessageAsync(Language.GetEntry("MusicHandler:ConnectedTo", "NAME", enumerator.Current.Name));

                        VoiceChannelId = enumerator.Current.Id;
                        Connected      = true;
                        break;
                    }
                    catch { } // has no permission to connect
                }
                if (!Connected)
                {
                    await Context.Channel.SendMessageAsync(Language.GetEntry("MusicHandler:CannotConnectToAny"));
                }
            }

            State = PlayerState.Connected;

            // Assumption: only triggered when exception
            Client.Disconnected += (e) =>
            {
                if (!DisconnectInvoked)
                {
                    SetDisconnected();
                }
                return(Task.CompletedTask);
            };
            return(true);
        }
Пример #25
0
        public void Load(System.IO.Stream stream)
        {
            Sounds.Clear();

            _stream = stream;
            Text    = FileName;
            CanSave = true;

            using (var reader = new FileReader(stream, true))
            {
                reader.ReadSignature(4, "AKPK");
                //Total size of language, banks, and sound headers
                uint HeaderSize = reader.ReadUInt32();
                Flags = reader.ReadUInt32();
                uint LanguageSize = reader.ReadUInt32();
                uint BanksSize    = reader.ReadUInt32();
                uint SoundsSize   = reader.ReadUInt32();

                uint SectionSizes = LanguageSize + BanksSize + SoundsSize + 0x10;
                if (SectionSizes == HeaderSize)
                {
                    Version = 1;
                }
                else
                {
                    Version = 2;
                    uint Section4 = reader.ReadUInt32();
                }

                //Parse sections

                //Parse language
                long LanguagePos   = reader.Position;
                uint LanguageCount = reader.ReadUInt32();
                for (int i = 0; i < LanguageCount; i++)
                {
                    var  lang       = new LanguageEntry();
                    uint nameOffset = reader.ReadUInt32();;
                    lang.ID = reader.ReadUInt32();
                    Languages.Add(lang);

                    using (reader.TemporarySeek(LanguagePos + nameOffset, System.IO.SeekOrigin.Begin)) {
                        lang.Name = reader.ReadZeroTerminatedString();
                    }
                }

                reader.SeekBegin(LanguagePos + LanguageSize);

                //Parse bansk
                long banksPos   = reader.Position;
                uint BanksCount = reader.ReadUInt32();
                for (int i = 0; i < BanksCount; i++)
                {
                    Banks.Add(new BankEntry());
                }
                reader.SeekBegin(banksPos + BanksSize);

                //Parse sounds
                long soundPos    = reader.Position;
                uint SoundsCount = reader.ReadUInt32();
                Console.WriteLine($"SoundsCount {SoundsCount}");
                for (int i = 0; i < SoundsCount; i++)
                {
                    var entry = new AudioEntry();
                    Sounds.Add(entry);

                    entry.HashID    = reader.ReadUInt32();
                    entry.Alignment = reader.ReadUInt32();
                    uint size   = reader.ReadUInt32();
                    uint offset = reader.ReadUInt32();
                    entry.LanguageID = reader.ReadUInt32();

                    entry.FileName       = entry.HashID.ToString("X") + ".wem";
                    entry.FileDataStream = new SubStream(reader.BaseStream, offset * entry.Alignment, size);
                }

                reader.SeekBegin(soundPos + SoundsSize);
            }
        }
Пример #26
0
        public async Task PlayAsync(ICommandContext Context, ITextChannel Channel = null, bool KeepCurrent = false, TimeSpan?SeekTo = null, bool AvoidState = false)
        {
            if (Channel == null)
            {
                Channel = Context.Channel as ITextChannel;
            }

            string lId = Channel.GetSettings().Language;

            LanguageEntry Language = Global.Languages.GetLanguage(lId);

            if (!AvoidState)
            {
                if (State == PlayerState.Playing || State == PlayerState.Paused)
                {
                    await Channel.SendMessageAsync(Language.GetEntry("MusicHandler:AlreadyPlaying"));

                    return;
                }
            }
            if (State == PlayerState.Disconnected)
            {
                bool Success = await ConnectAsync(Context);

                if (!Success)
                {
                    return;
                }
            }
            if (!KeepCurrent || Current == null)
            {
                Current = Queue[QueueIndex];
            }

            string Url = Current.UrlOrId;

            WebSocket ws = null;

            if (Current.IsYouTube)
            {
                YoutubeClient  Client = new YoutubeClient();
                StreamManifest sm     = null;
                try
                {
                    sm = await Client.Videos.Streams.GetManifestAsync(VideoId.TryParse(Current.UrlOrId).Value);
                }
                catch (Exception e)
                {
                    File.WriteAllText("tempexceptionfrommusicplayer.json", JsonConvert.SerializeObject(e, Formatting.Indented));

                    await Global.Client.GetGuild(Global.Settings.DevServer.Id)
                    .GetTextChannel(Global.Settings.DevServer.ErrorReportChannelId).SendFileAsync("tempexceptionfrommusicplayer.json", "");

                    File.Delete("tempexceptionfrommusicplayer.json");
                }
                if (sm != null)
                {
                    IEnumerable <IAudioStreamInfo> streamInfos = sm.GetAudioStreams();

                    if (streamInfos.Count() > 0)
                    {
                        IStreamInfo info = streamInfos.GetWithHighestBitrate();
                        Url = info.Url;
                    }
                }

                if (Url == Current.UrlOrId)
                {
                    Url = null;
                }
            }
            else
            {
                if (Current.IsListenMoe)
                {
                    Url = Current.PublicUrl;
                    ws  = new WebSocket(Current.PublicUrl.Contains("kpop") ? "wss://listen.moe/kpop/gateway_v2" : "wss://listen.moe/gateway_v2");

                    Timer t = new Timer((state) =>
                    {
                        try
                        {
                            ws.Send("{ \"op\": 9 }");
                        }
                        catch
                        {
                            Logger.Log(LogType.WebSocket, ConsoleColor.Red, "Error", "Couldn't send heartbeat to LISTEN.moe!");
                        }
                    }, null, -1, -1);

                    ws.OnOpen += (s, e) =>
                    {
                        ws.Send("{ \"op\": 0, \"d\": { \"auth\": \"\" } }"); // { op: 0, d: { auth: "" } }
                    };
                    ws.OnMessage += (s, e) =>
                    {
                        ListenMoe parsed = JsonConvert.DeserializeObject <ListenMoe>(e.Data);
                        if (parsed.OpCode == 0)
                        {
                            t.Change(0, parsed.Data.HeartBeat);
                        }
                        else if (parsed.OpCode == 1 && parsed.Type == "TRACK_UPDATE")
                        {
                            ListenMoeStartTime = parsed.Data.StartTime;
                            Current.Author     = string.Join(" && ", parsed.Data.Song.Artists.Select(i => i.NameRomaji ?? i.Name));
                            Current.Duration   = TimeSpan.FromSeconds(parsed.Data.Song.Duration);
                            Current.Title      = parsed.Data.Song.Title;
                            Current.Thumbnail  = null;
                            foreach (ListenMoeAlbum album in parsed.Data.Song.Albums)
                            {
                                if (album.Image != null)
                                {
                                    Current.Thumbnail = album.Image;
                                    break;
                                }
                            }
                            if (State > PlayerState.Connected && State != PlayerState.Paused)
                            {
                                SendNowPlayingAsync(Context, Channel).GetAwaiter().GetResult();
                            }
                        }
                    };
                    ws.OnClose += (s, e) =>
                    {
                        t.Change(Timeout.Infinite, Timeout.Infinite);
                        t.Dispose();
                    };

                    ws.Connect();
                }
                else if (Global.SoundCloud == null)
                {
                    if (!IterateIndex(true))
                    {
                        Current = null;
                        await Channel.SendMessageAsync(Language.GetEntry("MusicHandler:SoundCloudNotAvailable"));
                    }
                    else
                    {
                        await Channel.SendMessageAsync(Language.GetEntry("MusicHandler:OnlySoundCloudTracks"));

                        new Task(async() => await PlayAsync(Context, Channel, AvoidState: true));
                    }
                    return;
                }
                else
                {
                    Url += "?client_id=" + Global.SoundCloud.ClientId;
                }
            }

            if (Url == null)
            {
                if (!IterateIndex())
                {
                    Current = null;
                    await Channel.SendMessageAsync(Language.GetEntry("MusicHandler:FinishedPlaying"));

                    State = PlayerState.Connected;
                }
                else
                {
                    new Task(async() => await PlayAsync(Context, Channel, AvoidState: true)).Start();
                    return;
                }
            }

            try
            {
                Reader = new FFmpegReader(Url);

                /*
                 * switch (encoding.Name)
                 * {
                 *  case "webm":
                 *  case "3gpp":
                 *      Stream s = await new HttpClient().GetStreamAsync(Url);
                 *      Reader = new NAudio.Vorbis.VorbisWaveReader(s);
                 *      break;
                 *
                 *  default:
                 *      Reader = new MediaFoundationReader(Url);
                 *      break;
                 * }
                 */
            }
            catch (Exception e)
            {
                System.Console.WriteLine(e);
                await Channel.SendMessageAsync(Language.GetEntry("MusicHandler:SongInaccessible", "SONGNAME", Current.Title));

                if (!IterateIndex(Global.SoundCloud == null))
                {
                    Current = null;
                    await Channel.SendMessageAsync(Language.GetEntry("MusicHandler:FinishedPlaying"));

                    State = PlayerState.Connected;
                }
                else
                {
                    new Task(async() => await PlayAsync(Context, Channel, AvoidState: true)).Start();
                }
                return;
            }

            if (PCMStream == null || !PCMStream.CanWrite)
            {
                PCMStream = Client.CreatePCMStream(AudioApplication.Music, 128 * 1024, 200, 0);
            }

            //WaveFormat OutFormat = new WaveFormat(48000, 16, 2);


            /*
             * MediaFoundationResampler Resampler = new MediaFoundationResampler(Reader, OutFormat)
             * {
             *  ResamplerQuality = 60
             * };
             */

            //if (SeekTo.HasValue && !Current.IsListenMoe) Reader.CurrentTime = SeekTo.Value;
            if (SeekTo.HasValue && SeekTo != TimeSpan.Zero && !Current.IsListenMoe)
            {
                Reader.ReadUntil(SeekTo.Value);
            }
            BackupTime = TimeSpan.Zero;

            //int Size = OutFormat.AverageBytesPerSecond / 50;
            int Size = Reader.BufferSize(1);

            byte[] Buffer = new byte[Size];
            int    Count  = 0;

            State         = PlayerState.Playing;
            TextChannelId = Channel.Id;
            if (!Current.IsListenMoe)
            {
                await SendNowPlayingAsync(Context, Channel);
            }

            /*while (Reader.CanRead && (Count = Resampler.Read(Buffer, 0, Size)) > 0
             *  && Request == PlayerRequest.Idle && State > PlayerState.Connected)*/
            while (Reader.CanRead && (Count = Reader.Read(Buffer, 0, Size)) > 0 &&
                   Request == PlayerRequest.Idle && State > PlayerState.Connected)
            {
                if (State == PlayerState.Paused)
                {
                    await Channel.SendMessageAsync("", embed : new EmbedBuilder()
                    {
                        Title = Language.GetEntry("MusicHandler:Paused"),
                        Color = Color
                    }.Build());


                    while (State == PlayerState.Paused && Request == PlayerRequest.Idle)
                    {
                        Thread.Sleep(100);
                    }

                    string cId = Channel.GetSettings().Language;
                    if (cId != lId)
                    {
                        Language = Global.Languages.GetLanguage(cId);
                    }
                    lId = cId;

                    if (State == PlayerState.Playing)
                    {
                        await Channel.SendMessageAsync("", embed : new EmbedBuilder()
                        {
                            Title = Language.GetEntry("MusicHandler:Resumed"),
                            Color = Color
                        }.Build());

                        if (Current.IsListenMoe)
                        {
                            await SendNowPlayingAsync(Context, Channel);
                        }
                    }
                }
                if (Request > 0)
                {
                    break;
                }

                if (CurrentTime.TotalSeconds % 10 == 0 && BackupTime.TotalSeconds != CurrentTime.TotalSeconds)
                {
                    PropertyChanged?.Invoke();
                    BackupTime = CurrentTime;
                }

                try
                {
                    if (State < PlayerState.Playing)
                    {
                        break;
                    }
                    ChangeVolume(Buffer, Volume / 100f);
                    await PCMStream.WriteAsync(Buffer, 0, Count);
                }
                catch (Exception e)
                {
                    if (State == PlayerState.Disconnected || Client.ConnectionState == ConnectionState.Disconnected || Client.ConnectionState == ConnectionState.Disconnecting)
                    {
                        break;
                    }

                    string cId = Channel.GetSettings().Language;
                    if (cId != lId)
                    {
                        Language = Global.Languages.GetLanguage(cId);
                    }
                    lId = cId;

                    await Channel.SendMessageAsync(Language.GetEntry("MusicHandler:PlaybackErrorOccured"));

                    Request = PlayerRequest.Stop;
                    Logger.Log(LogType.Music, ConsoleColor.Red, "Error", e.ToString());
                    if (Global.Settings.DevServer.ErrorReportChannelId != 0)
                    {
                        ITextChannel Report = Global.Client.GetChannel(Global.Settings.DevServer.ErrorReportChannelId) as ITextChannel;
                        await Report.SendMessageAsync($"An error occured while playing on a server!\n```\n{ e }\n```\n" +
                                                      $"Client:\n { JsonConvert.SerializeObject(this) }");
                    }
                    break;
                }
            }
            if (ws != null && ws.IsAlive)
            {
                ws.Close();
            }

            if (Request == PlayerRequest.Idle && State > PlayerState.Connected)
            {
                Request = PlayerRequest.Next;
            }

            //Resampler.Dispose();
            Reader.Dispose();
            Reader = null;
            //Resampler = null;
            try { await PCMStream.FlushAsync(); } catch { } // It may be disposed

            if (Request == PlayerRequest.Next)
            {
                Request = PlayerRequest.Idle;
                if (!IterateIndex(Global.SoundCloud == null))
                {
                    if (State != PlayerState.Connected && State != PlayerState.Disconnected)
                    {
                        State = PlayerState.Connected;
                    }
                    Current = null;

                    string cId = Channel.GetSettings().Language;
                    if (cId != lId)
                    {
                        Language = Global.Languages.GetLanguage(cId);
                    }
                    lId = cId;

                    await Channel.SendMessageAsync(Language.GetEntry("MusicHandler:FinishedPlaying"));
                }
            }
            else if (Request == PlayerRequest.Stop)
            {
                Request = PlayerRequest.Idle;
                State   = PlayerState.Connected;
                Current = null;
            }

            if (State > PlayerState.Connected)
            {
                new Task(async() => await PlayAsync(Context, Channel, AvoidState: true)).Start();
            }
        }