private async Task <string> GetPostSolo() { if (_currWord == null) // The bot start the game by saying しりとり { _currWord = "しりとり"; _dictionnary.Remove(_dictionnary.Find(x => x.Split('$')[0] == _currWord)); _alreadySaid.Add("しりとり"); return("しりとり (shiritori)"); } string[] validWords = GetValidWords(); if (validWords.Length == 0) // Not supposed to happen { LooseException le = new LooseException(GetStringFromSentence(Sentences.ShiritoriNoWord)); await Program.p.LogError(new LogMessage(LogSeverity.Error, le.Source, le.Message, le)); throw le; } string word = validWords[Program.p.rand.Next(0, validWords.Length)]; string[] splitWord = word.Split('$'); _dictionnary.Remove(word); _alreadySaid.Add(splitWord[0]); _currWord = Linguist.ToHiragana(splitWord[0]); return(splitWord[0] + " (" + Linguist.ToRomaji(splitWord[0]) + ") - " + GetStringFromSentence(Sentences.Meaning) + ": " + splitWord[1]); }
protected override async Task <string> GetCheckCorrectAsync(string userAnswer) { string hiraganaAnswer = ReplaceLocalString(Linguist.ToHiragana(userAnswer)); if (_currWord == null) // Multiplayer only { if (hiraganaAnswer != "しりとり") { return(GetStringFromSentence(Sentences.ShiritoriExplainBegin)); } _currWord = "しりとり"; _alreadySaid.Add(_currWord); _dictionnary.Remove(_dictionnary.Find(x => x.Split('$')[0] == _currWord)); return(null); } if (hiraganaAnswer.Any(c => c < 0x0041 || (c > 0x005A && c < 0x0061) || (c > 0x007A && c < 0x3041) || (c > 0x3096 && c < 0x30A1) || c > 0x30FA)) { return(GetStringFromSentence(Sentences.OnlyHiraganaKatakanaRomaji)); } dynamic json; json = JsonConvert.DeserializeObject(await _http.GetStringAsync("http://www.jisho.org/api/v1/search/words?keyword=" + Uri.EscapeDataString(userAnswer))); if (json.data.Count == 0) { return(GetStringFromSentence(Sentences.ShiritoriDoesntExist)); } bool isCorrect = false, isNoun = false; string reading; string[] meanings = new string[] { }; foreach (dynamic s in json.data) { foreach (dynamic jp in s.japanese) { reading = Linguist.ToHiragana((string)jp.reading); if (reading == null) { continue; } reading = ReplaceLocalString(reading); if (reading == hiraganaAnswer) { isCorrect = true; foreach (dynamic meaning in s.senses) { foreach (dynamic partSpeech in meaning.parts_of_speech) { if (partSpeech == "Noun") { isNoun = true; meanings = ((JArray)meaning.english_definitions).Select(x => (string)x).ToArray(); goto ContinueCheck; } } } } } } ContinueCheck: if (!isCorrect) { return(GetStringFromSentence(Sentences.ShiritoriDoesntExist)); } string lastCharac = GetLastCharacter(_currWord); if (!hiraganaAnswer.StartsWith(ReplaceLocalString(GetLastCharacter(_currWord)))) { return(Sentences.ShiritoriMustBegin(GetGuild(), lastCharac, Linguist.ToRomaji(lastCharac))); } if (!isNoun) { return(GetStringFromSentence(Sentences.ShiritoriNotNoun)); } if (GetLastCharacter(hiraganaAnswer) == hiraganaAnswer) { return(GetStringFromSentence(Sentences.ShiritoriTooSmall)); } if (_alreadySaid.Contains(hiraganaAnswer)) { await LooseAsync(GetStringFromSentence(Sentences.ShiritoriAlreadySaid)); return(""); } if (hiraganaAnswer.Last() == 'ん') { await LooseAsync(GetStringFromSentence(Sentences.ShiritoriEndWithN)); return(""); } var elem = _dictionnary.Find(x => x.Split('$')[0] == hiraganaAnswer); if (HaveMultiplayerLobby()) { _endTurnMsg = hiraganaAnswer + " (" + Linguist.ToRomaji(hiraganaAnswer) + ") - " + GetStringFromSentence(Sentences.Meaning) + ": " + string.Join(", ", meanings.Select(x => "\"" + x + "\"")); } _dictionnary.Remove(elem); _alreadySaid.Add(hiraganaAnswer); _currWord = hiraganaAnswer; return(null); }