public ShiritoriPreload() { if (!File.Exists("Saves/Game/ShiritoriJapanese.txt")) { File.WriteAllBytes("Saves/Game/ShiritoriJapanese.txt", StaticObjects.HttpClient.GetByteArrayAsync("https://files.zirk.eu/Sanara/ShiritoriJapanese.txt").GetAwaiter().GetResult()); } string[] lines = File.ReadAllLines("Saves/Game/ShiritoriJapanese.txt"); _preload = new ShiritoriPreloadResult[lines.Length]; for (int i = 0; i < lines.Length; i++) { string[] curr = lines[i].Split('$'); string word = curr[0]; _preload[i] = new ShiritoriPreloadResult(word, LanguageModule.ToRomaji(word), curr[1]); } }
protected override async Task CheckAnswerInternalAsync(string answer) { // We convert to hiragana so it's then easier to check if the word really exist // Especially for some edge case, like りゅう (ryuu) is starting by "ri" and not by "ry" string hiraganaAnswer = LanguageModule.ToHiragana(answer); if (hiraganaAnswer.Any(c => c < 0x0041 || (c > 0x005A && c < 0x0061) || (c > 0x007A && c < 0x3041) || (c > 0x3096 && c < 0x30A1) || c > 0x30FA)) { throw new InvalidGameAnswer("Your answer must be in hiragana, katakana or romaji"); } JObject json = JsonConvert.DeserializeObject <JObject>(await StaticObjects.HttpClient.GetStringAsync("http://jisho.org/api/v1/search/words?keyword=" + HttpUtility.UrlEncode(string.Join("%20", hiraganaAnswer)))); var data = (JArray)json["data"]; if (data.Count == 0) { throw new InvalidGameAnswer("This word doesn't exist."); } bool isCorrect = false, isNoun = false; string reading; string[] meanings = new string[0]; // For each answer we check if it match our answer foreach (var d in data) { foreach (var jp in d["japanese"]) { var readingObj = jp["reading"]; if (readingObj == null) { continue; } reading = LanguageModule.ToHiragana(readingObj.Value <string>()); if (reading == hiraganaAnswer) { isCorrect = true; // For each meaning we check if the word is a noun foreach (var meaning in d["senses"]) { foreach (var partSpeech in meaning["parts_of_speech"]) { if (partSpeech.Value <string>() == "Noun") { isNoun = true; meanings = ((JArray)meaning["english_definitions"]).Select(x => (string)x).ToArray(); goto ContinueCheck; // The word is valid, we are done with the basic checks } } } } } } ContinueCheck: if (!isCorrect) { throw new InvalidGameAnswer("This word doesn't exist."); } var ending = GetWordEnding(_currWord); if (!hiraganaAnswer.StartsWith(ending)) { throw new InvalidGameAnswer($"Your word must begin by {ending} ({LanguageModule.ToRomaji(ending)})."); } if (!isNoun) { throw new InvalidGameAnswer("Your word must be a noun."); } if (hiraganaAnswer == GetWordEnding(hiraganaAnswer)) // We can't just check the word count since しゃ would count as only one character { throw new InvalidGameAnswer("Your word must be at least 2 characters."); } if (_alreadySaid.Contains(hiraganaAnswer)) { throw new GameLost("This word was already said."); } if (hiraganaAnswer.Last() == 'ん') { throw new GameLost("Your word is finishing with a ん (n)."); } if (_words.Any(x => x.Word == hiraganaAnswer)) { _words.Remove(_words.Where(x => x.Word == hiraganaAnswer).First()); } _alreadySaid.Add(hiraganaAnswer); _currWord = hiraganaAnswer; }