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

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

14.11.2019, 14:40. Показов 18208. Ответов 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
2875 / 2081 / 386
Регистрация: 22.07.2011
Сообщений: 7,841
15.11.2019, 14:31
Студворк — интернет-сервис помощи студентам
DragonBorn88, не совсем.
оно никогда не будет выполнено потому , что переход к этому условию возможен только когда в e.Message находится /Teachers , в то время как само условие требует иного значения.
- получаем логическое противоречие двух условий.
что нужно сделать , что бы это условие выполнилось ?
0
16 / 12 / 4
Регистрация: 10.09.2018
Сообщений: 373
15.11.2019, 14:37  [ТС]
Цитата Сообщение от sau Посмотреть сообщение
что нужно сделать , что бы это условие выполнилось ?
По моей логике, нужно что бы e.Message содержал "/Teachers", а потом в e.Message передать "Бассараб". Но вы говорили что так сделать нельзя. Потому я не знаю как это реализовать
0
 Аватар для sau
2875 / 2081 / 386
Регистрация: 22.07.2011
Сообщений: 7,841
15.11.2019, 14:44
Цитата Сообщение от DragonBorn88 Посмотреть сообщение
а потом в e.Message передать "Бассараб".
в том то и дело , что значение "Бассараб" в e.Message может быть только в начале срабатывания Bot_OnMessage , это же аргумент функции.
И пока функция обрабатывается , он никак не изменится с "/Teachers" на "Бассараб". , только на следующем вызове.
Т.е когда у Вас выполняется условие case "/Teachers": , то в следующей строчке переменная e.Message не изменит своего значения волшебным образом , с "/Teachers" на "Бассараб" , что бы удовлетворить условию if (e.Message.Text.Split(' ').First() == "Басараб").
Сам по себе вызов функции await botClient.SendChatActionAsync(e.Message. Chat.Id, ChatAction.UploadPhoto); никак не изменяет значение e.Message , она лишь отправляет сообщение в чат юзеру.
Что бы e.Message изменилось , пользователь должен написать новое сообщение в чат боту , после чего у Вас сработает функция Bot_OnMessage , в которой уже e.Message будет равен "Бассараб"
0
16 / 12 / 4
Регистрация: 10.09.2018
Сообщений: 373
15.11.2019, 14:48  [ТС]
Цитата Сообщение от sau Посмотреть сообщение
И пока функция обрабатывается , он никак не изменится с "/Teachers" на "Бассараб". , только на следующем вызове.
Я это уже понял. Именно поэтому я и в ступоре, в недоумения как делать
0
 Аватар для sau
2875 / 2081 / 386
Регистрация: 22.07.2011
Сообщений: 7,841
15.11.2019, 14:51
Вы понимаете как работают условия в c# ?
замените свой swtch на if , может будет нагляднее.
блок условия - от { до } , выполняется только тогда , когда условие истинно.
если условие ложно . ничего , что лежит в его блоке вызвано не будет.
из чего следует что ?

У вас сейчас такой аналог реализован:
C#
1
2
3
4
5
6
var a = 1
if(a==1)
{
      if(a==2) console.write("a==2");
      else console.write("a==1")
}
- что будет выведено в консоль ?


C#
1
2
3
4
5
6
var a = 2
if(a==1)
{
      if(a==2) console.write("a==2");
      else console.write("a==1")
}
- как переписать код , что бы в случае a=2 , оно было выведено в консоль ?
0
16 / 12 / 4
Регистрация: 10.09.2018
Сообщений: 373
15.11.2019, 14:58  [ТС]
Цитата Сообщение от sau Посмотреть сообщение
Вы понимаете как работают условия в c# ?
Да, понимаю.
Но здесь обычная логика не работает, или это просто я не понимаю
Я отталкиваюсь от обычного консольного выполнения кода. Но в боте вот это, не работает
C#
1
2
3
4
5
6
7
var a = 1;
            if (a == 1)
            {
                a = int.Parse(Console.ReadLine());
                if (a == 2) Console.Write("a==2");
                else Console.Write("a==1");
            }
0
 Аватар для sau
2875 / 2081 / 386
Регистрация: 22.07.2011
Сообщений: 7,841
15.11.2019, 15:01
DragonBorn88, да , тут вы пытаетесь своим алгоритмом изменить значение переменной "a" ,
в случае же бота , это значение программно менять нет смысла , оно вам уже передается аргументом функции.
на нашем простом примере , нужно переписать пример так , что бы условия выполнялись без Console.ReadLine().
по этому повторю вопрос для второго примера: - как переписать код , что бы в случае a=2 , оно было выведено в консоль ? , никак не изменяя переменную "a" в вашем алгоритме.

C#
1
2
3
4
5
6
const int a = 2; //значение подается на вход функции и является константой
if(a==1)
{
      if(a==2) console.write("a==2");
      else console.write("a==1")
}
0
16 / 12 / 4
Регистрация: 10.09.2018
Сообщений: 373
15.11.2019, 15:03  [ТС]
C#
1
2
3
4
5
6
7
var a = 1;
            if (a == 1)
            {
                a = 2;
                if (a == 2) Console.Write("a==2");
                else Console.Write("a==1");
            }
0
 Аватар для sau
2875 / 2081 / 386
Регистрация: 22.07.2011
Сообщений: 7,841
15.11.2019, 15:14
Цитата Сообщение от DragonBorn88 Посмотреть сообщение
a = 2;
нет , const int a = 2; , определение константы не даст вам задать новое значение
в примере можно менять только комбинации условий , само определение const int a = 2; трогать нельзя
вы написали свой пример , изменив изначальное значение переменой "a" , но мы договорились , что ее менять нельзя, иначе пример теряет смысл.

C#
1
2
3
4
5
6
const int a = 2; //значение подается на вход функции и является константой
if(a==1)
{
      if(a==2) console.write("a==2");
      else console.write("a==1")
}
задача: переписать условия таким образом , что бы в консоль было выведено "a==2" , т.е что бы выполнилось условие: if(a==2) console.write("a==2");
значение переменной "a" никак изменять и переписывать нельзя.
0
16 / 12 / 4
Регистрация: 10.09.2018
Сообщений: 373
15.11.2019, 15:19  [ТС]
C#
1
2
3
4
5
6
7
8
9
10
11
const int a = 1; 
            if (a == 1)
            {
                int b = 2;
                if (b == 2)
                {
                    Console.Write("a==2");
                }
                else 
                    Console.Write("a==1");
            }
0
 Аватар для sau
2875 / 2081 / 386
Регистрация: 22.07.2011
Сообщений: 7,841
15.11.2019, 15:20
DragonBorn88, ха ха ) , нет , ну серьезно что-ли ?

C#
1
2
3
4
 if (b == 2)
                {
                    Console.Write("a==2");
                }
тут вы пишете a==2 , в то время как на самом деле это b==2 , обманочка выходит.
и опять же , мы договорились , что const int a = 2; , и никак иначе. , эту строчку менять нельзя.
подсказка: в нашем примере нужно просто правильно определить проверку значения переменной , никаких дополнительных переменных вводить не нужно . и не нужно их никак изменять.
0
16 / 12 / 4
Регистрация: 10.09.2018
Сообщений: 373
15.11.2019, 15:23  [ТС]
Я не знаю ка кпо другому реализовать
0
 Аватар для sau
2875 / 2081 / 386
Регистрация: 22.07.2011
Сообщений: 7,841
15.11.2019, 15:41
DragonBorn88, хорошо.
у Вас есть где-то пробел в понимании логики обработки алгоритмов , притом что Вы знаете синтаксис c# и пишете какие то программы , что в принципе невозможно , если не получается решить эту задачку. Нужно нащупать этот пробел , с помощью примеров.

C#
1
2
3
4
5
6
const int a = 2; //значение подается на вход функции и является константой
if(a==1)
{
      if(a==2) console.write("a==2");
      else console.write("a==1")
}
что в нашем примере мешает выполнению условия в строке 4-е: if(a==2) console.write("a==2"); ?
- ведь значение A действительно равно 2-м

Окей , исключим синтаксис c# , чиcто на логику:

У Маши два яблока (const int а = 2)
Если у Маши одно яблоко if(a==1) тогда:
{
если у Маши два яблока (что ???) if(a==2) console.write("a==2");
иначе: у Маши одно яблоко
}
0
16 / 12 / 4
Регистрация: 10.09.2018
Сообщений: 373
15.11.2019, 18:28  [ТС]
Можно вот так реализовать
C#
1
2
3
4
5
const int a = 2; //значение подается на вход функции и является константой
            if (a == 1 || a == 2)
            {
                if (a == 2) Console.Write("a==2");
                else Console.Write("a==1");
0
 Аватар для sau
2875 / 2081 / 386
Регистрация: 22.07.2011
Сообщений: 7,841
15.11.2019, 18:34
Цитата Сообщение от DragonBorn88 Посмотреть сообщение
Можно вот так реализовать
ну , по меньшей мере это заработает.
а если теперь заменить if (a == 1 || a == 2) на switch , не нарушая логику ?
0
16 / 12 / 4
Регистрация: 10.09.2018
Сообщений: 373
15.11.2019, 18:38  [ТС]
Сейчас придумаю что-то
0
 Аватар для sau
2875 / 2081 / 386
Регистрация: 22.07.2011
Сообщений: 7,841
15.11.2019, 18:41
DragonBorn88, тут const уже можно убрать , это было для того . что бы не пытались "a" менять.
на реальном примере "a" будет меняться , но не вашим алгоритмом.
https://docs.microsoft.com/ru-... rds/switch
0
16 / 12 / 4
Регистрация: 10.09.2018
Сообщений: 373
15.11.2019, 18:46  [ТС]
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int a = 2; //значение подается на вход функции и является константой
 
            switch (a)
            { 
            case 2:
                    Console.Write("a==2");
                    break;
 
 
                case 1:
                 Console.Write("a==1");
                    break;
 
                default:
                    Console.WriteLine("error");
                    break;
 
 
            }
0
 Аватар для sau
2875 / 2081 / 386
Регистрация: 22.07.2011
Сообщений: 7,841
15.11.2019, 18:54
DragonBorn88, ну собственно вот и все.
дальше по аналогии переделываете ваш пример.

Касательно if варианта , аналогом будет такое:
C#
1
2
3
4
5
void OnMessage(int a) //что-то подано на вход
{
     if(a==1)  Console.Write("a==1");
     if(a==2)  Console.Write("a==2");
}
0
16 / 12 / 4
Регистрация: 10.09.2018
Сообщений: 373
15.11.2019, 18:59  [ТС]
Я не могу понять какие мне нужно параметры перадать в void OnMessage(int a)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.11.2019, 18:59

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
80
Ответ Создать тему
Новые блоги и статьи
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
Установка ChatGPT (Codex) на Windows без использования Microsoft Store
Fabien159 28.10.2026
Здравствуйте всем читающим! Опишу процесс установки ChatGPT (Codex) на Windows, если по каким-то причинам у вас не получается устанавить его через Microsoft Store. И так: 1. Скачиваем с. . .
Программное добавление префикса в нумерацию документов
Maks 27.10.2026
Реализация из решения ниже выполнена в самописной конфигурации на БСП (помощь начинающему коллеге). Задача: Программно добавить префикс в нумерацию документов. Решение: В модуле объекта. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru