public static void DevideJasoShouldWork(char c, char expected)
        {
            char actual = KoreanLetterDivider.DevideJaso(c).chars[0];

            Assert.Equal(expected, actual);
        }
Example #2
0
        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();
        }