Коллеги, добрый день. Помогите, пожалуйста, корректно реализовать бота 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 });
}
}
Насколько ужасно, оцените плиз? Спасибо.