public void TestThatCultureIsSavedAndReturned() { var culture = new CultureData(CultureInfo.CurrentCulture); var entry = new LanguageEntry(culture); Assert.AreEqual(culture, entry.Language); }
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)); }
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); } }
public string GetLanguageValue(string key) { if (LanguageEntry.ContainsKey(key)) { return(LanguageEntry[key]); } else { return(null); } }
//获取就得翻译表数据 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()); } } }
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(""); } }
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()); }
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); }
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); }
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); } }
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!"); } } }
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); }
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()); }
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."); } } }
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(); } }
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; } }
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)); }
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; } } } } } } } }
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)); }
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)); }
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); }
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); }; }
} // 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); }
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); } }
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(); } }