public static void DevideJasoShouldWork(char c, char expected) { char actual = KoreanLetterDivider.DevideJaso(c).chars[0]; Assert.Equal(expected, actual); }
public async Task GenerateAsync([Remainder] string user_ans = "") { long time_limit = 60; //time limit before you can enter your answer if (DataStorage.userData.ContainsKey(Context.User.ToString()) == false) { DataStorage.AddUserPair(Context.User.ToString()); DataStorage.RegisterUserInSQL(Context); } string correctAnswer = DataStorage.GetUserOptionVal(Context.User.ToString(), Option.ANSWER); string question = DataStorage.GetUserOptionVal(Context.User.ToString(), Option.QUESTION); string questionTheme = DataStorage.GetUserOptionVal(Context.User.ToString(), Option.QUESTION_THEME); string current_theme = DataStorage.GetUserOptionVal(Context.User.ToString(), Option.SET_THEME); int reward = (int)DataStorage.GetUserOptionVal(Context.User.ToString(), Option.REWARD); int streak = (int)DataStorage.GetUserOptionVal(Context.User.ToString(), Option.CORRECT_STREAK); long currentScore = DataStorage.GetUserScore(Context); double magicNumber = 5000; //after this point they get no handicap bool generated = DataStorage.GetUserOptionVal(Context.User.ToString(), Option.GENERATED); TimeSpan t = (DateTime.UtcNow - new DateTime(1970, 1, 1)); long currentSeconds = (long)t.TotalSeconds; int win = (int)DataStorage.GetUserOptionVal(Context.User.ToString(), Option.WIN); int lose = (int)DataStorage.GetUserOptionVal(Context.User.ToString(), Option.LOSE); string resultMsg = ""; // discord can't afford to have multiple ReplyAsync Pepega int decrement = currentScore >= 0 ? (int)Math.Round((reward - streak) / (magicNumber / currentScore)) : 0; if (generated == false) //if g was NOT invoked by user { Dictionary <string, dynamic> query_data = DataStorage.FetchWord(current_theme); correctAnswer = query_data["_id"].Trim(); string[] slangs = query_data["theme"].Split(","); string problem = ""; const int MaxhintPercentage = 25; // in percentage int hintPercentage = (int)(MaxhintPercentage - currentScore / magicNumber * MaxhintPercentage); foreach (char c in correctAnswer) { if (new Random().Next(0, 100) <= 25) { problem += c; } else { problem += KoreanLetterDivider.DevideJaso(c).chars[0]; } } generated = true; reward = currentScore >= 0 ? (int)Math.Round((correctAnswer.Length * 2) + 20.0 + streak) : 15; question = problem; resultMsg += $"문제: {problem}\t힌트:"; string themeAll = ""; foreach (string theme_i in DataStorage.GetThemeFromSlangs(slangs)) { themeAll += theme_i + ","; resultMsg += theme_i + ", "; } resultMsg = resultMsg.Trim(' ').Trim(','); resultMsg += "\n"; themeAll = themeAll.TrimEnd(','); // exclude that last comma DataStorage.SetUserOptionVal(Context.User.ToString(), Option.QUESTION_THEME, themeAll); DataStorage.SetUserOptionVal(Context.User.ToString(), Option.GENERATED_TIME, currentSeconds); } else if (generated) { long time_passed = currentSeconds - DataStorage.GetUserOptionVal(Context.User.ToString(), Option.GENERATED_TIME); if (user_ans == "" || Regex.IsMatch(user_ans, "^[a-zA-Z0-9]*$") || Regex.IsMatch(user_ans, "[!@#$%^&*(),.?\":{ }|<>]") || KoreanLetterDivider.HTable_JungSung.Intersect(user_ans).Count() > 0) { if (new Random().Next(1, 10) == 1) { await ReplyAsync(Context.User.Mention + "답을 입력하시면되요 :)"); } else { await ReplyAsync(Context.User.Mention + "답을 끼어넣으세요!"); } return; } //check if answer is correct if (current_theme == "random") //only random go on record { if (user_ans == correctAnswer && time_passed < time_limit) { streak += 1; win += 1; currentScore += reward < magicNumber ? (int)((magicNumber - currentScore) / magicNumber * reward): (int)(magicNumber - 1); if (streak > 1) { resultMsg += ($"정답입니다!!! +{reward}\n현재까지 {streak} 연승중!!! 연전연승!!\n"); } else { resultMsg += ($"정답입니다!!! +{reward}\n"); } } else if (time_passed > time_limit) { if (new Random().Next(1, 1000) == 1) { string speicalMsg = $"{Context.User.Mention}\n" + "***가끔씩은 조금 늦어도 괜찮아, 내가 항상 여기서 기다리고 있을테니까...***"; await SpecialMsgEventWasInvokedTask(speicalMsg, 5000); } else { currentScore -= decrement; lose += 1; streak = 0; resultMsg += $"시간초과 ㅠㅠ 이미 {time_passed}초가 경과했습니다. 정답은 {correctAnswer}, 점수 -{decrement}\n시간제한: ({time_limit}초)\n"; } } else { // 틀렸어도 유저의 답 자음과 theme 이 데이터베이스에 존재하면 불상하니가 정답처리해주쟝 if (new Random().Next(1, 10000) == 1) { string speicalMsg = $"{Context.User.Mention}\n" + "***틀리지 않았어... 그저 길이 다를뿐...***"; await SpecialMsgEventWasInvokedTask(speicalMsg, 3000); } if (DataStorage.ChceckIfSynonym(user_ans, correctAnswer, DataStorage.GetUserOptionVal(Context.User.ToString(), Option.QUESTION_THEME))) { streak += 1; win += 1; currentScore += reward; if (streak > 1) { resultMsg += ($"정답입니다!!! +{reward}\n현재까지 {streak} 연승중!!! 연전연승!!\n"); } else { resultMsg += ($"정답입니다!!! +{reward}\n"); } } else { currentScore -= decrement; lose += 1; streak = 0; resultMsg += ($"오답입니다! 정답은 {correctAnswer}, 점수 -{decrement}\n"); } } } else if (current_theme != "random") // if not random { if (user_ans == correctAnswer && time_passed < time_limit) { resultMsg += ($"정답입니다!!! \n"); } else if (time_passed > time_limit) { resultMsg += $"시간초과 ㅠㅠ 이미 {time_passed}초가 경과했습니다. 시간제한: ({time_limit}초)\n"; } else { // 틀렸어도 유저의 답 자음과 theme 이 데이터베이스에 존재하면 불상하니가 정답처리해주쟝 if (DataStorage.ChceckIfSynonym(user_ans, correctAnswer, DataStorage.GetUserOptionVal(Context.User.ToString(), Option.QUESTION_THEME))) { resultMsg += ($"정답입니다!!! +{reward}\n"); } else { resultMsg += ($"오답입니다! 정답은 {correctAnswer}\n"); } } } generated = false; } double winRate = Math.Round(win == 0 && lose == 0 ? 0 : (double)win / (win + lose) * 100, 1); resultMsg += ($"현재 점수 : {currentScore} \n" + $"승: {win} 패: {lose} 승률:{winRate}%"); await ReplyAsync(Context.User.Mention + "\n" + resultMsg); DataStorage.UpdateScoreInSQL(Context, currentScore); DataStorage.SetUserOptionVal(Context.User.ToString(), Option.QUESTION, question); DataStorage.SetUserOptionVal(Context.User.ToString(), Option.GENERATED, generated); DataStorage.SetUserOptionVal(Context.User.ToString(), Option.ANSWER, correctAnswer); DataStorage.SetUserOptionVal(Context.User.ToString(), Option.CORRECT_STREAK, streak); DataStorage.SetUserOptionVal(Context.User.ToString(), Option.REWARD, reward); DataStorage.SetUserOptionVal(Context.User.ToString(), Option.WIN, win); DataStorage.SetUserOptionVal(Context.User.ToString(), Option.LOSE, lose); DataStorage.SaveEntirePairsToJson(); }