Форум программистов, компьютерный форум, киберфорум
C#: API, боты
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.50/88: Рейтинг темы: голосов - 88, средняя оценка - 4.50
16 / 12 / 4
Регистрация: 10.09.2018
Сообщений: 373

Как реализовать ввод пользователя в Telegram Bot`e в разветвлении Switch?

14.11.2019, 14:40. Показов 17507. Ответов 89

Студворк — интернет-сервис помощи студентам
Здравствуйте! Пишу телеграм бота. Столкнулся со следующей проблемой:
Команды пользователя обрабатываю с помощью Swich Case. Понадобилось сдлеать разветвление. Когда пользователь выбирает команду "/Teachers" то бот просит его ввести Фамилию преподавателя, и выдаёт инфу о нём, а если такой фамилии нету, то выскакивает исключение.



C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
private static async void Bot_OnMessage(object sender, Telegram.Bot.Args.MessageEventArgs e)
        {     
            if (e.Message == null || e.Message.Type != MessageType.Text) return;
 
            switch (e.Message.Text.Split(' ').First())
            {
                case "/News": //Новинки происходящие на факультете
                    await botClient.SendChatActionAsync(e.Message.Chat.Id, ChatAction.UploadPhoto);
                    const string News = @"D:\Projekts\NulesIT_Bot\NulesIT_Bot\Image\News\photo_2019-11-11_10-12-57.jpg";
                    var news = News.Split(Path.DirectorySeparatorChar).Last();
                    using (var fileStream = new FileStream(News, FileMode.Open, FileAccess.Read, FileShare.Read))
                    {
                        await botClient.SendPhotoAsync(
                            e.Message.Chat.Id,
                            fileStream);
                    }
                    break;
                
                case "/PairSchedule": //Расписание занятий
                    await botClient.SendTextMessageAsync(e.Message.Chat.Id, "По этой ссылке вы можете детально ознакомиться с рассписанием занятий:\n" +
                    "https://nubip.edu.ua/node/2969/6");
                    break;
 ///////////////////////////////////Место для проб и ошибок////////////////////////////////////////////////////
                               
                case "/Teachers":
 
                    await botClient.SendTextMessageAsync(e.Message.Chat.Id, "Введите фамилию преподавателя: ");                    
 
                    if (e.Message.Text.Split(' ').First() == "Басараб")
                    {
                        await botClient.SendChatActionAsync(e.Message.Chat.Id, ChatAction.UploadPhoto);
                        const string Bas = @"D:\Projekts\NulesIT_Bot\NulesIT_Bot\Image\Screenshot_1.png";
                        var pr1 = News.Split(Path.DirectorySeparatorChar).Last();
                        using (var fileStream = new FileStream(Bas, FileMode.Open, FileAccess.Read, FileShare.Read))
                        {
                            await botClient.SendPhotoAsync(
                                e.Message.Chat.Id,
                                fileStream);
                        }
                    }
                    else if (e.Message.Text.Split(' ').First() == "Ткаченко")
                    {
 
                    }
                    else if (e.Message.Text.Split(' ').First() == "Миловидов")
                    {
 
                    }
                    else
                    {
                        await botClient.SendTextMessageAsync(e.Message.Chat.Id, "Вы ввели не правильную фамилию, или такого преподавателя нету!");
                    }
                    ////////////////////////////////////////////////////////////////////////////////////////////////////////////
                    break;
 
                default:
                    await botClient.SendTextMessageAsync(e.Message.Chat.Id, @"Доступные команды:
 
/News Новости факультета
/PairSchedule Рассписание занятий.
/Teachers преподаватели факультета.
                    ");
                    break;
            }
        }
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
14.11.2019, 14:40
Ответы с готовыми решениями:

Telegram.Bot Как используя бота пригласить пользователя в приват канал?
Не подскажите как можно при помощи бота пригласить пользователя в приват канал, зная номер этого юзера?

Как сделать так, чтобы Telegram bot работал для каждого пользователя отдельно?
Здравствуйте. Я написал телеграмм бота, он авторизуется на сайте электронного дневника и выдает расписание, дз и так далее. Моя проблема...

Ожидание ответа от пользователя telegram bot
Не приходит идей в голову как ожидать ответа от пользователя в данном случае. Что происходит: USER: /start BOT: Чем могу быть...

89
 Аватар для sau
2773 / 2073 / 386
Регистрация: 22.07.2011
Сообщений: 7,820
14.11.2019, 19:54
Цитата Сообщение от DragonBorn88 Посмотреть сообщение
botClient.SendTextMessageAsync
после этого нужно выходить из обработки текущего сообщения и ждать следующего.
иначе получается несуразица , e.Message.Text не может одновременно содержать текст команды , текст сообщения бота и текст ответа пользователя. На каждом вызове Bot_OnMessage будет что-то одно из.
0
16 / 12 / 4
Регистрация: 10.09.2018
Сообщений: 373
14.11.2019, 21:30  [ТС]
Спасибо за ваш ответ. Это мой первый бот, поэтому я ещё не силён в написании кода. Подскажите пожалуйста как можно "Выйти из обработки текущего сообщения"?

Добавлено через 47 минут
Цитата Сообщение от sau Посмотреть сообщение
выходить из обработки текущего сообщения
Можете пожалуйста написать кодом, как это сделать?
0
 Аватар для sau
2773 / 2073 / 386
Регистрация: 22.07.2011
Сообщений: 7,820
14.11.2019, 21:36
DragonBorn88,
После вызова функции await botClient.SendTextMessageAsync(e.Message .Chat.Id, "Введите фамилию преподавателя: ");
какое значение будет в переменной e.Message ?
0
16 / 12 / 4
Регистрация: 10.09.2018
Сообщений: 373
14.11.2019, 21:41  [ТС]
Цитата Сообщение от sau Посмотреть сообщение
какое значение будет в переменной e.Message ?
Текстовое. Фамилии преподавателей. Например "Басараб", "Миловидов" и тд.
Сейчас, как только я захожу в этот блок, бот мне присылает "Введите фамилию преподавателя: "
и за тем сразу же "Вы ввели не правильную фамилию, или такого преподавателя нету!". Что поидеи должно быть исключением, если пользователь ввёл не верную фамилию
0
 Аватар для sau
2773 / 2073 / 386
Регистрация: 22.07.2011
Сообщений: 7,820
14.11.2019, 21:44
Цитата Сообщение от DragonBorn88 Посмотреть сообщение
Текстовое. Фамилии преподавателей. Например "Басараб", "Миловидов" и тд.
а вот и нет , оно все так же будет "/Teachers" , потому как новые значения поступают на вход функции Bot_OnMessage
по этому , все ваши условия if else не пройдут проверку , кроме последнего , где будет вызов:
await botClient.SendTextMessageAsync(e.Message .Chat.Id, "Вы ввели не правильную фамилию, или такого преподавателя нету!");
0
16 / 12 / 4
Регистрация: 10.09.2018
Сообщений: 373
14.11.2019, 21:49  [ТС]
Цитата Сообщение от sau Посмотреть сообщение
потому как новые значения поступают на вход функции Bot_OnMessage
Я понял суть. Этого бота я начал писать с помощью ютуба), он там был элементарно прост, ну и я ж дальше начал писать логику не вглубляясь в суть. Спасибо что помогли разобраться в собственном коде.
Так как нужно зделать это разветвление, что бы оно обрабатывалось не в функции "Bot_OnMessage"?
0
 Аватар для sau
2773 / 2073 / 386
Регистрация: 22.07.2011
Сообщений: 7,820
14.11.2019, 21:55
Цитата Сообщение от DragonBorn88 Посмотреть сообщение
Так как нужно зделать это разветвление, что бы оно обрабатывалось не в функции "Bot_OnMessage"?
все сообщения обрабатываются тут , просто вызвана эта функция будет на следующей итерации , с новыми значениями в аргументах.
0
16 / 12 / 4
Регистрация: 10.09.2018
Сообщений: 373
14.11.2019, 21:59  [ТС]
Цитата Сообщение от sau Посмотреть сообщение
все сообщения обрабатываются тут
Так всё же, можно как-то решить мою проблему?
0
 Аватар для sau
2773 / 2073 / 386
Регистрация: 22.07.2011
Сообщений: 7,820
14.11.2019, 22:06
DragonBorn88,
Если значение e.Message обновится только с последующим вызовом функции Bot_OnMessage , как следует поступить ?
0
16 / 12 / 4
Регистрация: 10.09.2018
Сообщений: 373
14.11.2019, 22:09  [ТС]
Цитата Сообщение от sau Посмотреть сообщение
уточните вопрос.
Я понял что вы имеете введу. Но как реализовать саму логику в розветвлении,я не понимаю. Как я говорил выше, это мой первый бот и синтаксис мне даётся с трудом
0
 Аватар для sau
2773 / 2073 / 386
Регистрация: 22.07.2011
Сообщений: 7,820
14.11.2019, 22:13
В каком месте "логика разветвления" вызывает у Вас вопрос ?
По синтаксису можно почитать тут: https://docs.microsoft.com/ru-... reference/
Руководство по языку: https://docs.microsoft.com/ru-... harp/index
0
16 / 12 / 4
Регистрация: 10.09.2018
Сообщений: 373
14.11.2019, 22:27  [ТС]
Цитата Сообщение от sau Посмотреть сообщение
синтаксису можно почитать тут
С синтаксисом самого С# я знаком, в консоли пишу приложении. Я имел введу сам синтаксис телеграм бота

Цитата Сообщение от sau Посмотреть сообщение
В каком месте
В кейсе " case "/Teachers": "
Я хочу реализовать внутренюю логику. Когда пользователь попадает в этот кейс, он пишет Фамилию преподавателя, если он ввёл правильно, то бот обрабатывает этот текст, и высылает фото, а если пользователь ввёл не верно, то выдаёт следующее исключение:
C#
1
2
3
4
else
                    {
                        await botClient.SendTextMessageAsync(e.Message.Chat.Id, "Вы ввели не правильную фамилию, или такого преподавателя нету!");
                    }
0
 Аватар для sau
2773 / 2073 / 386
Регистрация: 22.07.2011
Сообщений: 7,820
14.11.2019, 22:40
Цитата Сообщение от DragonBorn88 Посмотреть сообщение
Когда пользователь попадает в этот кейс, он пишет Фамилию преподавателя, если он ввёл правильно, то бот обрабатывает этот текст, и высылает фото, а если пользователь ввёл не верно, то выдаёт следующее исключение:
А что происходит , когда пользователь вводит что либо в чате , какой метод у вашего бота срабатывает ?
Вам нужно получить данные , которые пользователь отправил в чат и обработать их тем или иным образом.
Данные содержатся в e.Message , отправка сообщения пользователем в чат бота = одно срабатывание Bot_OnMessage
на которое вы реагируете . что-то отправляете пользователю в ответ , и ждете следующего срабатывания Bot_OnMessage с новыми данными.
вот и вся логика.
0
16 / 12 / 4
Регистрация: 10.09.2018
Сообщений: 373
14.11.2019, 22:41  [ТС]
Цитата Сообщение от sau Посмотреть сообщение
А что происходит , когда пользователь вводит что либо в чате , какой метод у вашего бота срабатывает ?
Для вопроса на КиберФоруме, я сократил свой код, так-как он дублируется. У меня по мимо главного метода мейн, есть только один метод "Bot_OnMessage" где и происходит вся логика программы. Когда пользователь вводит существующую команду, он попадает в соответствующий кейс, а если введённой команды не существует, то SWICH выводит содерживоме "default" где есть перечень команд.
У меня не выход сделать так, что бы когда пользователь попадает в кейс "/Teachers" у него была возможность что либо ввести.
0
 Аватар для sau
2773 / 2073 / 386
Регистрация: 22.07.2011
Сообщений: 7,820
14.11.2019, 22:43
Цитата Сообщение от DragonBorn88 Посмотреть сообщение
У меня не выход сделать так, что бы когда пользователь попадает в кейс "/Teachers" у него была возможность что либо ввести.
Пользователь может вводить данные в любой удобный для него момент , а получать вы их будете в аргументах функции Bot_OnMessage , которая сработает при первой возможности.
Логику взаимодействия постом выше описал.
Бот никак не управляет приложением чата , он лишь получает сообщения из чата по апи телеграма, и отправляет туда свои сообщения.
0
16 / 12 / 4
Регистрация: 10.09.2018
Сообщений: 373
14.11.2019, 22:46  [ТС]
Цитата Сообщение от sau Посмотреть сообщение
Пользователь может вводить данные в любой удобный для него момент
Когда пользователь попадает в кейс Teachers. То программа мгновенно выбивает else. Не ту возможности ввести данные и обработатьих с помощью if. Вот на наглядном примере Вы можете посмотреть как это происходит
0
 Аватар для sau
2773 / 2073 / 386
Регистрация: 22.07.2011
Сообщений: 7,820
14.11.2019, 22:52
Цитата Сообщение от DragonBorn88 Посмотреть сообщение
Когда пользователь попадает в кейс Teachers.
пользователь никуда не попадает , это не так работает.
пользователь сидит в своем клиенте телеграмм - это может быть сайт , или мобильное приложение , или под винду.
он отправляет сообщение вашему "боту" , который по сути является таким же пользователем. , эти сообщения попадают и хранятся в базе телеграмма.

Ваше приложение просто подключается к этой базе , считывает из нее новые сообщения от пользователей адресованные "боту" , и , для удобства , передает их в функцию Bot_OnMessage. Вот и все , поэтому пользователь никуда попасть не может.

Мгновенно Вы эти сообщения обработаете или через год , так-же не имеет никакого значения , в один момент времени можно что-то прочитать , а через месяц отправить какой-то ответ.
Пользователь за это время может настрочить еще сотню сообщений , а Вы последовательно будете их получать в функцию Bot_OnMessage и обрабатывать.
0
16 / 12 / 4
Регистрация: 10.09.2018
Сообщений: 373
14.11.2019, 22:55  [ТС]
У меня выдаёт ошибку при попытке загрузить фото.
Вы можете посмотреть его за этой ссылкой https://drive.google.com/open?... 6NMzokLdX0

Добавлено через 2 минуты
Цитата Сообщение от sau Посмотреть сообщение
и , для удобства , передает их в функцию Bot_OnMessage.
Тоесть нет возможности реалтзовать микро логику в отдельном кейсе?
0
 Аватар для sau
2773 / 2073 / 386
Регистрация: 22.07.2011
Сообщений: 7,820
14.11.2019, 23:08
Цитата Сообщение от DragonBorn88 Посмотреть сообщение
Тоесть нет возможности реалтзовать микро логику в отдельном кейсе?
из чего это следует ? - можно.

Цитата Сообщение от DragonBorn88 Посмотреть сообщение
У меня выдаёт ошибку при попытке загрузить фото.
Вы можете посмотреть его за этой ссылкой https://drive.google.com/open?... 6NMzokLdX0
давайте пока не будем усложнять , и разберемся сперва с логикой обработки сообщений.

Тут я , наверное , важный концепт упустил , о котором следует упомянуть: код функции выполняется последовательно сверху-вниз , аргументы функции не могут измениться "сами по себе" пока ваша программа не закончит выполнять тело функции , так же как и сама функция не будет вызвана повторно пока не завершится ее текущая обработка.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
14.11.2019, 23:08
Помогаю со студенческими работами здесь

Как создать inline кнопки?
При создании бота столкнулся с одной, не очень приятной, проблемой. Связанна она с созданием inline кнопок. В более ранних версиях...

Как посмотреть текст сообщения бота (Telegram bot, Python)?
Использую библиотеку Telebot. Ситуация: пользователь написал боту сообщения. Мне нужно узнать текст сообщения бота, которое находится...

Telegram Bot(Telepot). Как сохранить введенное пользователем сообщение
Здравствуйте. Допустим, при запуске бот попросил пользователя ввести номер телефона (адрес Email, номер карты и т.д.). После того, как...

Telegram bot. Как вычислить на какое именно сообщение получен ответ?
Доброго времени суток, коллеги! Пишу своего первого бота на основе WebApi, использую Webhook, столкнулся с таким вопросом: Как вычислить...

Telegram bot: как отправлять сообщения пользователю в определённый момент времени?
Как отправлять сообщения пользователю, в определённый момент времени?


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru