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

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

14.11.2019, 14:40. Показов 18200. Ответов 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
16 / 12 / 4
Регистрация: 10.09.2018
Сообщений: 373
14.11.2019, 23:32  [ТС]
Студворк — интернет-сервис помощи студентам
Добавлено через 9 минут
Цитата Сообщение от sau Посмотреть сообщение
код функции выполняется последовательно сверху-вниз , аргументы функции не могут измениться "сами по себе" пока ваша программа не закончит выполнять тело функции
Это я понимаю. Но как реализовать задумку, не могу решить уже третий день. В одном из кейсов я делал разветвление, где выводилось на экран несколько доступных команд, которые обрабатывались в главном свиче, и всё было гуд. Но здесь так не получится так-как я хочу что бы когда пользователь делал ошибку, то программа выбивала ему уведомление, об ошибке, а не просто выводила все доступные команды
0
 Аватар для IamRain
4695 / 2702 / 735
Регистрация: 02.08.2011
Сообщений: 7,236
14.11.2019, 23:36
Вам нужно передавать состояние взаимодействия, не просто строки, а объекты, которые бы говорили о том что делает пользователь. Если это возможно.
0
 Аватар для sau
2875 / 2081 / 386
Регистрация: 22.07.2011
Сообщений: 7,841
14.11.2019, 23:40
Но здесь так не получится так-как я хочу что бы когда пользователь делал ошибку, то программа выбивала ему уведомление, об ошибке, а не просто выводила все доступные команды
оокеей , давайте по строчкам:

C#
1
await botClient.SendTextMessageAsync(e.Message.Chat.Id, "Введите фамилию преподавателя: ");
- отправляем сообщение в чат юзеру , т.к пользователь ввел команду в чате , которую мы получаем в переменной e.Message == "/Teachers" , которая пришла на вход функции Bot_OnMessage
C#
1
if (e.Message.Text.Split(' ').First() == "Басараб")
- тут все еще e.Message == "/Teachers" , почему мы делаем проверку на "Басараб" ?
0
16 / 12 / 4
Регистрация: 10.09.2018
Сообщений: 373
14.11.2019, 23:44  [ТС]
Цитата Сообщение от sau Посмотреть сообщение
- тут все еще e.Message == "/Teachers" , почему мы делаем проверку на "Басараб" ?
В этом то и заключается моя проблема. Я не могу придумать или найти какой-то способ что бы юзер смог ввести какие-то данные, и потом проверить их в IF
0
 Аватар для sau
2875 / 2081 / 386
Регистрация: 22.07.2011
Сообщений: 7,841
14.11.2019, 23:50
В этом то и заключается моя проблема. Я не могу придумать или найти какой-то способ что бы юзер смог ввести какие-то данные,
пользователь вводит данные вне зависимости от вашего приложения ,
а получите новые данные Вы тогда , когда приложение завершит обработку текущего вызова функции Bot_OnMessage.
следующий вызов функции Bot_OnMessage может иметь аргумент e.Message со значением , например "Басараб" , т.е e.Message == "Басараб"

Данные содержатся в e.Message , отправка сообщения пользователем в чат бота = одно срабатывание Bot_OnMessage
на которое вы реагируете . что-то отправляете пользователю в ответ , и ждете следующего срабатывания Bot_OnMessage с новыми данными.
вот и вся логика.
0
16 / 12 / 4
Регистрация: 10.09.2018
Сообщений: 373
14.11.2019, 23:55  [ТС]
Цитата Сообщение от sau Посмотреть сообщение
пользователь вводит данные вне зависимости от вашего приложения
Мне после
C#
1
await botClient.SendTextMessageAsync(e.Message.Chat.Id, "Введите фамилию преподавателя: ");
нужно создать переменную, в которую запишется текст введённый пользователем, потом открыть case "/Teachers" и сделать проверку на "Басараб" ?
0
 Аватар для sau
2875 / 2081 / 386
Регистрация: 22.07.2011
Сообщений: 7,841
15.11.2019, 00:04
Цитата Сообщение от DragonBorn88 Посмотреть сообщение
нужно создать переменную, в которую запишется текст введённый пользователем, потом открыть case "/Teachers" и сделать проверку на "Басараб" ?
я выше писал , аргументы функции не изменятся , пока функция выполняется , исходя из этого , Вы можете определять сколько угодно переменных , значение e.Message будет все тем же "/Teachers" , пока тело функции не будет отработано = выполнено , и сама функция повторно вызвана с новым значением аргумента.
Вы лучше скажите в каком месте я непонятно пояснил , попробую уточнить , это лучше , чем пытаться гадать что нужно сделать )
ибо "мой глаз замылен" , возможно какие-то вещи неочевидны со стороны начинающих.
0
16 / 12 / 4
Регистрация: 10.09.2018
Сообщений: 373
15.11.2019, 00:07  [ТС]
Цитата Сообщение от sau Посмотреть сообщение
Вы лучше скажите в каком месте я непонятно пояснил
Вы всё понятно объясняете, просто я совсем неопытен в написании ботов, и мне тяжело всё это переводить в код.
Как я понял мне после
C#
1
                    await botClient.SendTextMessageAsync(e.Message.Chat.Id, "Введите фамилию преподавателя: ");
вызвать метод Bot_OnMessage и передать туда e.Message которому присвоен текст введённый пользователем, например "Басараб"
0
 Аватар для sau
2875 / 2081 / 386
Регистрация: 22.07.2011
Сообщений: 7,841
15.11.2019, 00:09
Цитата Сообщение от DragonBorn88 Посмотреть сообщение
вызвать метод Bot_OnMessage и передать туда e.Message которому присвоен текст введённый пользователем, например "Басараб"
Bot_OnMessage вызывается автоматически , функционалом вашей библиотеки , вам нужно лишь обрабатывать полученные данные.
Текст введенный пользователем будет в переменной e.Message
0
16 / 12 / 4
Регистрация: 10.09.2018
Сообщений: 373
15.11.2019, 00:14  [ТС]
Цитата Сообщение от sau Посмотреть сообщение
вам нужно лишь обрабатывать передаваемые данные.
Я не могу понять как мне это сделать. Нужно что бы пользователь ввёл даные, потом в независимости от введённых даных нужно насильно открыть case "/Teachers" и проверить даные в if ?
0
 Аватар для sau
2875 / 2081 / 386
Регистрация: 22.07.2011
Сообщений: 7,841
15.11.2019, 00:17
Цитата Сообщение от DragonBorn88 Посмотреть сообщение
нужно насильно открыть case "/Teachers"
нельзя насильно ничего открыть - это некорректная формулировка , оператором case лишь проверяется значение в e.Message , и если оно равно "/Teachers" , то будет выполнен соответствующий ему блок

Значение переменной e.Message никак не изменится до конца обработки текущего вызова функции Bot_OnMessage , только при следующем "автоматическом" вызове.
0
16 / 12 / 4
Регистрация: 10.09.2018
Сообщений: 373
15.11.2019, 00:25  [ТС]
?
Цитата Сообщение от sau Посмотреть сообщение
только при следующем "автоматическом" вызове.
Как можно это реализовать? Я не понимаю.
0
 Аватар для sau
2875 / 2081 / 386
Регистрация: 22.07.2011
Сообщений: 7,841
15.11.2019, 00:30
Цитата Сообщение от DragonBorn88 Посмотреть сообщение
Как можно это реализовать? Я не понимаю.
организовать что , автоматический вызов ? - пользователь введет какой то текст в чате , после чего в вашей программе сработает вызов этой функции. , в аргументах которой будет содержаться введенный пользователем текст.
Функция вызывается каждый раз , когда пользователь отправляет сообщение в чат , одно сообщение = один вызов функции. (упрощенно)
0
16 / 12 / 4
Регистрация: 10.09.2018
Сообщений: 373
15.11.2019, 00:37  [ТС]
Цитата Сообщение от sau Посмотреть сообщение
в аргументах которой будет содержаться введенный пользователем текст.
Вызываю мето, передаю id пользователя, и вторым аргументом нужно передать текст введённый пользователем. Правильно?
C#
1
2
3
4
5
await botClient.SendTextMessageAsync(e.Message.Chat.Id, "Введите фамилию преподавателя: ");
                    
                    Bot_OnMessage(e.Message.Chat.Id, ***);
 
                    if (e.Message.Text.Split(' ').First() == "Басараб")
0
 Аватар для sau
2875 / 2081 / 386
Регистрация: 22.07.2011
Сообщений: 7,841
15.11.2019, 00:43
Цитата Сообщение от DragonBorn88 Посмотреть сообщение
Вызываю мето, передаю id пользователя, и вторым аргументом нужно передать текст введённый пользователем. Правильно?
Допустим даже если так , после того , как Вы вызовите Bot_OnMessage , почему значение переменной e.Message должно измениться ?

Функция вызывается каждый раз , когда пользователь отправляет сообщение в чат , одно сообщение = один вызов функции. (упрощенно)
вызывается каждый раз не вашим алгоритмом , а функционалом используемой библиотеки , т.е ваша программа переходит к выполнению кода в определенной вами функции Bot_OnMessage.
В коде вашего приложение , есть что-то вроде вызова функции StartReceiving , в которой происходит вся "магия" , и , как только пользователь введет сообщение в чат , выполнение вашей программы перейдет в точку определения функции Bot_OnMessage.
0
16 / 12 / 4
Регистрация: 10.09.2018
Сообщений: 373
15.11.2019, 00:46  [ТС]
Цитата Сообщение от sau Посмотреть сообщение
почему значение переменной e.Message должно измениться ?
Я думал когда вызываешь функцию, выполнение программы находится в нужно месте, и то что введёт пользователь, будет уже проверятся только в этом кейсе.
Если это так не работает, тогда я окончательно запутсался, и не понимаю что делать
0
 Аватар для sau
2875 / 2081 / 386
Регистрация: 22.07.2011
Сообщений: 7,841
15.11.2019, 00:52
Ну , если не углубляться в дебри того , как работает апи для взаимодействия с телеграмм , то все что Вам нужно знать , это то , что функция Bot_OnMessage вызывается сторонней библиотекой , почитайте что-ли про делегаты и события.
https://docs.microsoft.com/ru-... ords/event
0
16 / 12 / 4
Регистрация: 10.09.2018
Сообщений: 373
15.11.2019, 01:00  [ТС]
Цитата Сообщение от sau Посмотреть сообщение
почитайте что-ли про делегаты и события.
Прочитал, но понятней как мне решаить проблему, не стало (
Чувствую себя аборигеном в програмировании...
0
 Аватар для sau
2875 / 2081 / 386
Регистрация: 22.07.2011
Сообщений: 7,841
15.11.2019, 01:01
Кстати . у Вас MVC приложение или консоль ?
- просто мы тут обсуждаем функционал пригодный больше для однопоточного приложения (консоли)
0
16 / 12 / 4
Регистрация: 10.09.2018
Сообщений: 373
15.11.2019, 01:03  [ТС]
Цитата Сообщение от sau Посмотреть сообщение
Кстати . у Вас MVC приложение или консоль ?
Консоль у меня
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.11.2019, 01:03

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе. Самым главным критерием для меня было создание паролей, в котором отсутствуют знаки: | 1 l I Обработка содержит следующие. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге). Задача: Программно добавить префикс в нумерацию документов. Решение: В модуле объекта. . .
После закрытия оутлука продолжает висеть процесс в диспетчере задач
Maks 27.10.2026
С недавнего времени в продакшене возникла проблема: при закрытии оутлука в диспетчере задач продолжал висеть процесс outlook. exe. Проблема возникла после установки MS Office 2021 LTSC на машинах, под. . .
Baragoz - DPS/HPS бот для WoW 3.3.5a, многоязычный
AmbA 26.10.2026
Хотите ещё ботов? У меня есть один! А я пока отдохну от него. https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=12062&stc=1&d=1793007952 Инструкция внутри. https:/ / youtu. be/ VpfFZSUDGnQ. . .
Особенности gif сгенерированных в Си
russiannick 21.10.2026
Рассмотрим генерацию gif файлов, которые в Си имеют свои особенности. Gif представляет собой графический формат популярный в интернете. Посмотрим на палитру. Gif файл сгенерированный в си отличается. . .
FPS контроллер с анимированными Y-Bot и 3D-звуком miniaudio (Box3D, Recast, BehaviorTree.CPP, ozz-animation, ImGui, OpenGL и SDL3)
8Observer8 18.10.2026
Содержание блога | English Version Полное мультиплатформенное руководство по стартовому проекту с FPS-контроллером игрока, анимированными роботами Y-Bot с 4-слойным блендингом, 3D-физикой Box3D,. . .
Локальный http сервер
Argus19 17.10.2026
Локальный http сервер На работе, на двух локальных компьютерах круглосуточно работают программы опроса приборов с записью в книги Excel,которые раз в сутки записываются на сервер компании. Т. к. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru