Beispiel #1
0
 private void RemoveLanguage(ProgrammingLanguage language)
 {
     languages.Remove(language);
     languageChances.Remove(languageChances.Select(s => s.Key)
                            .Select(z => z)
                            .Where(x => x == language)
                            .FirstOrDefault());
 }
Beispiel #2
0
 public ProgrammingLanguage OfferLanguage(bool rnd)
 {
     if (!rnd)
     {
         return(OfferLanguage());
     }
     currentLanguage = languageChances.ElementAt(random.Next(languageChances.Count)).Key;
     RemoveLanguage(currentLanguage);
     isQuestionAsked = !isQuestionAsked;
     return(currentLanguage);
 }
Beispiel #3
0
 public ProgrammingLanguage OfferLanguage()
 {
     if (languageChances.Count == 0)
     {
         return(new ProgrammingLanguage(-1, ""));
     }
     currentLanguage = languageChances.OrderByDescending(x => x.Value).FirstOrDefault().Key;
     RemoveLanguage(currentLanguage);
     if (questions.Count > 0)
     {
         isQuestionAsked = !isQuestionAsked;
     }
     return(currentLanguage);
 }
        public static void UpdateDB(List <Answer> answs, ProgrammingLanguage lang)
        {
            bool notServed = true;

            while (notServed)
            {
                try
                {
                    lock (answers)
                    {
                        foreach (var answer in answs)
                        {
                            answers[lang.Id][answer.questionId] += answer.value;
                        }
                    }
                    notServed = false;
                }
                catch (Exception ex)
                {
                    Thread.Sleep(0);
                }
            }
        }
Beispiel #5
0
        private static async void BotOnMessageReceived(object sender, MessageEventArgs e)
        {
            var message = e.Message;

            if (message == null || message.Type != MessageType.TextMessage)
            {
                return;
            }

            string name = $"{message.From.FirstName} {message.From.LastName}";

            Console.WriteLine($"{name} отправил сообщение {message.Text}");
            Game game      = null;
            bool notServed = true;

            while (notServed)
            {
                try
                {
                    lock (Games)
                    {
                        if (Games.ContainsKey(name))
                        {
                            game = Games[name];
                        }
                    }
                    notServed = false;
                }
                catch (Exception ex)
                {
                    Thread.Sleep(0);
                }
            }
            if (game == null)
            {
                switch (message.Text.Substring(0, message.Text.Contains(' ')? message.Text.IndexOf(' '):message.Text.Length))
                {
                case "/start":
                    string text =
                        @"Список команд:
        /start - запуск бота
        /showbase - показ всей базы знаний
        /tellAbout {язык} - Информация по выбранному языку; 
        /guess - начать игру по угадыванию языка программирования";
                    await Bot.SendTextMessageAsync(message.From.Id, text);

                    break;

                case "/showbase":
                    await Bot.SendTextMessageAsync(message.From.Id, DB.TellAboutAllLanguages());

                    break;

                case "/tellAbout":
                    await Bot.SendTextMessageAsync(message.From.Id, DB.TellAboutTheLanguage(message.Text.Substring(message.Text.IndexOf(' ') + 1)));

                    break;

                case "/guess":
                    var replyKeyboard = new ReplyKeyboardMarkup(new[]
                    {
                        new[]
                        {
                            new KeyboardButton("Да"),
                            new KeyboardButton("Нет")
                        },
                        new[]
                        {
                            new KeyboardButton("Не знаю / не уверен"),
                            new KeyboardButton("Объясни выбор")
                        }
                    });
                    await Bot.SendTextMessageAsync(message.Chat.Id, "Сейчас я попробую угадать, какой язык программирования ты загадал(а)",
                                                   replyMarkup : replyKeyboard);

                    var  ngame = new Game();
                    bool ns    = true;
                    while (ns)
                    {
                        try
                        {
                            lock (Games)
                            {
                                Games.Add(name, ngame);
                            }
                            ns = false;
                        }
                        catch (Exception ex)
                        {
                            Thread.Sleep(0);
                        }
                    }
                    var lang = ngame.OfferLanguage(true);
                    await Bot.SendTextMessageAsync(message.From.Id, $"Это - {lang.Name}?");

                    if (lang.IconUrl.Length > 0)
                    {
                        await Bot.SendTextMessageAsync(message.From.Id, lang.IconUrl);
                    }
                    break;

                default:
                    var    response = ApiAi.TextRequest(message.Text);
                    string answer   = response.Result.Fulfillment.Speech;
                    if (answer == "")
                    {
                        answer = "Прости, я тебя не понял";
                    }
                    await Bot.SendTextMessageAsync(message.From.Id, answer);

                    break;
                }
            }
            else
            {
                if (!game.IsQuestionAsked && !game.IsEnded)
                {
                    Question question = new Question(-1, "");
                    switch (message.Text)
                    {
                    case "Да":
                        game.EndGame(true);
                        bool ns = true;
                        while (ns)
                        {
                            try
                            {
                                lock (Games)
                                {
                                    Games.Remove(name);
                                }
                                ns = false;
                            }
                            catch (Exception ex)
                            {
                                Thread.Sleep(0);
                            }
                        }
                        await Bot.SendTextMessageAsync(message.From.Id, "Отлично! Спасибо за игру :)");

                        await Bot.SendTextMessageAsync(message.From.Id, "https://i.imgur.com/1eJ1q0V.jpg");

                        await Bot.SendTextMessageAsync(message.From.Id, "Если хочешь сыграть еще раз, введи в чат команду /guess");

                        break;

                    case "Нет":
                        question = game.GetQuestion();
                        break;

                    case "Объясни выбор":
                        await Bot.SendTextMessageAsync(message.From.Id, game.ExplainChoice());

                        break;

                    default:
                        await Bot.SendTextMessageAsync(message.From.Id, @"Пожалуйста, отвечай на вопросы с помощью специальной клавиатуры:
    На вопросы о языке принимаются ответы да/нет/не знаю,
    На предложенный язык принимаются ответы да/нет");

                        break;
                    }
                    if (question.Id != -1)
                    {
                        await Bot.SendTextMessageAsync(message.From.Id, question.Text + '?');
                    }
                }
                else if (!game.IsEnded)
                {
                    var lang = new ProgrammingLanguage(-1, "");
                    if (game.QuestionsNotEnded)
                    {
                        switch (message.Text)
                        {
                        case "Да":
                            game.AddAnswer(1);
                            break;

                        case "Нет":
                            game.AddAnswer(-1);
                            break;

                        case "Не знаю / не уверен":
                            game.AddAnswer(0);
                            break;

                        case "Объясни выбор":
                            await Bot.SendTextMessageAsync(message.From.Id, game.ExplainChoice());

                            lang = new ProgrammingLanguage(-2, "");
                            break;

                        default:
                            await Bot.SendTextMessageAsync(message.From.Id, @"Пожалуйста, отвечай на вопросы с помощью специальной клавиатуры:
        На вопросы о языке принимаются ответы да/нет/не знаю,
        На предложенный язык принимаются ответы да/нет");

                            break;
                        }
                    }
                    else
                    {
                        switch (message.Text)
                        {
                        case "Да":
                            game.EndGame(true);
                            bool ns = true;
                            while (ns)
                            {
                                try
                                {
                                    lock (Games)
                                    {
                                        Games.Remove(name);
                                    }
                                    ns = false;
                                }
                                catch (Exception ex)
                                {
                                    Thread.Sleep(0);
                                }
                            }
                            await Bot.SendTextMessageAsync(message.From.Id, "Отлично! Спасибо за игру :)");

                            await Bot.SendTextMessageAsync(message.From.Id, "https://i.imgur.com/1eJ1q0V.jpg");

                            await Bot.SendTextMessageAsync(message.From.Id, "Если хочешь сыграть еще раз, введи в чат команду /guess");

                            break;

                        case "Нет":
                            break;

                        case "Объясни выбор":
                            await Bot.SendTextMessageAsync(message.From.Id, game.ExplainChoice());

                            break;

                        default:
                            await Bot.SendTextMessageAsync(message.From.Id, @"Пожалуйста, отвечай на вопросы с помощью специальной клавиатуры:
    На вопросы о языке принимаются ответы да/нет/не знаю,
    На предложенный язык принимаются ответы да/нет");

                            break;
                        }
                    }
                    if (lang.Id != -2)
                    {
                        lang = game.OfferLanguage();
                        if (lang.Id > -1)
                        {
                            await Bot.SendTextMessageAsync(message.From.Id, $"Это - {lang.Name}?");

                            if (lang.IconUrl.Length > 0)
                            {
                                await Bot.SendTextMessageAsync(message.From.Id, lang.IconUrl);
                            }
                        }
                        else
                        {
                            game.EndGame(false);
                            await Bot.SendTextMessageAsync(message.From.Id, "Я не смог угадать язык. Пожалуйста, подскажи его название. Если у тебя есть ссылка на картинку с его логотипом, добавь ее после символа\'*\'.\nФормат сообщения: {язык*ссылка}");
                        }
                    }
                }
                else if (game.IsQuestionAsked)
                {
                    string langName, iconurl = "";
                    if (message.Text.Contains("*"))
                    {
                        var parse = message.Text.Split('*');
                        langName = parse[0];
                        iconurl  = parse[1];
                    }
                    else
                    {
                        langName = message.Text;
                    }
                    if (iconurl == "")
                    {
                        DB.AddLanguage(langName);
                    }
                    else
                    {
                        DB.AddLanguage(langName, iconurl);
                    }
                    game.ChangeState();
                    await Bot.SendTextMessageAsync(message.From.Id, "Спасибо! Если ты знаешь, какой можно задать вопрос, на который можно ответить да/нет, чтобы отгадать этот язык, пришли мне его. Если не знаешь или не хочешь, нажми на клавиатуре \"Нет\"");
                }
                else
                {
                    if (message.Text != "Нет")
                    {
                        DB.AddQuestion(message.Text.TrimEnd('?'));
                    }
                    game.SaveData();
                    await Bot.SendTextMessageAsync(message.From.Id, "Благодарю. При следующих играх твои ответы будут учтены. Если хочешь сыграть еще раз, введи в чат команду /guess");

                    await Bot.SendTextMessageAsync(message.From.Id, "https://s.tcdn.co/bf4/93e/bf493ef3-930b-3769-9e1d-fc5832693e60/192/2.png");

                    bool ns = true;
                    while (ns)
                    {
                        try
                        {
                            lock (Games)
                            {
                                Games.Remove(name);
                            }
                            ns = false;
                        }
                        catch (Exception ex)
                        {
                            Thread.Sleep(0);
                        }
                    }
                }
            }
        }