Задать вопрос
@Smilleey

Как лучше реализовать бота telegram?

Коллеги, добрый день. Помогите, пожалуйста, корректно реализовать бота telegram. Вопрос заключается в следующем:
Как корректно обрабатывать входящие команды боту? В данный момент есть два предположения:
1) Большая-большая вереница if-ов. Кажется мне не очень вариантом.
2) Реализовать нечто подобное:
async void BotOnMessageReceived(object sender, MessageEventArgs messageEventArgs)
        {
            var message = messageEventArgs.Message;
            if (message == null || message.Type != MessageType.TextMessage) return;
            try
            {
                this.GetType().GetMethod(message.Text.Substring(0, message.Text.IndexOf(" ")).ToLower().Replace("/", "")).Invoke(this, new object[] { message });
            }
            catch (Exception ex)
            {
                if (message.Chat.Type == ChatType.Private)
                {
                    var usage = @"Usage:
                            /inline   - send inline keyboard
                            /keyboard - send custom keyboard
                            /photo    - send a photo
                            /request  - request location or contact
                            ";
                    await Bot.SendTextMessageAsync(message.Chat.Id, usage, replyMarkup: new ReplyKeyboardHide());
                }
            }
        }

        public async void test(object args)
        {
            var message = (Message)args;
            await Bot.SendTextMessageAsync(message.Chat.Id, "echo", replyMarkup: new ReplyKeyboardHide());
        }

Т.е. под каждый код свой метод делать.

Может есть другие способы? Сейчас только начал делать бота и хотелось бы со старта выбрать правильную архитектуру.
Заранее спасибо.

Update:
Реализовал нечто следующее -
//Dictionary, который сам заполняется
Dictionary<string, Type> CommandsDictionary = new Dictionary<string, Type>();
foreach (var type in Assembly.GetExecutingAssembly().GetTypes())
{
    if (type.ToString().EndsWith("ChatCommand"))
    {
         foreach (var str in (string[])type.GetProperty("Commands").GetValue(type))
         {
              CommandsDictionary.Add(str, type);
         }
     }
}
// Реализация тестовой команды
public static class TestChatCommand
{
    private static string[] commands = { "Test", "test", "Тест", "тест" };
    public static string[] Commands => commands;
    public static async void Execute(TelegramBotClient Bot, Message message)
    {
         await Bot.SendTextMessageAsync(message.Chat.Id, "I'm working!");
    }
}
//Ну и собственно поиск команды
try
{
    Type type;
     var command = message.Text.Replace("/", "");
     if (CommandsDictionary.TryGetValue(command, out type))
     {
          type.GetMethod("Execute").Invoke(type, new object[] { Bot, message });
    }
}

Насколько ужасно, оцените плиз? Спасибо.
  • Вопрос задан
  • 1676 просмотров
Подписаться 3 Оценить Комментировать
Решения вопроса 2
GavriKos
@GavriKos
Словарь, в котором ключ - это команда, а значение - это обработчик этой команды "CommandExecutor"
Все обработчики - это классы, наследуемые от единого класса "CommandExecutor", который умеет сам регистрироваться в словаре этом, и у которого есть метод Execute, который собственно и будет вызываться в момент прихода сообщения из того самого словаря.
Ответ написан
@kvasek
Для C# есть Bot framework
Сейчас он поддерживает достаточное количество мессенджеров.

Можете посмотреть как работает поддержка диалогов
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@AdaStreamer
Вообще, для этих задач уже есть фреймворки. Какие именно - зависит от вашего языка программирования.

Лично мое решение - метапрограммирование, но я пишу на питоне, там с динамической типизацией все просто. Имхо, шарп не самый удачный выбор.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы