private async Task ProcessCommand(Message message, string input) { using (var context = new CallbackQueryContext(configuration, botClient, message, input)) { if (!commandHandlers.TryGetValue(context.Command, out var handler)) { return; } try { await handler(context); } catch (IncompleteDataException) { } catch (AuthenticationRequiredException) { try { await context.Interaction.Write("Please authenticate using '/apikey [API Key]' first."); } catch (Exception) { // Don't worry, be happy } } catch (Exception ex) { log($"[{nameof(ProcessCommand)}] Unhandled exception: {ex}"); } } }
private async Task ProcessMessage(Message message) { if (message?.Type != MessageType.Text) { return; } var words = message.Text.Split(' '); var fw = words[0]; var args = words.Skip(1); if (fw[0] != '/') { return; } var verb = fw.Substring(1); switch (verb) { case "start": var me = await botClient.GetMeAsync(); var reply = $"Hello I'm *{me.FirstName}*. Please setup your API Key by typing '/apikey [key]'."; await botClient.SendTextMessageAsync(message.Chat.Id, reply, ParseMode.Markdown); break; case "apikey": var key = args.First(); using (var context = new CallbackQueryContext(configuration, botClient, await botClient.SendTextMessageAsync(message.Chat.Id, "Trying to authenticate ..."), "")) { try { var api = await context.GetApi(key); var details = await api.MyDetails(); var user = await context.Db.Users.Where(u => u.ChatId == message.Chat.Id) .SingleOrDefaultAsync() ?? context.Db.Users.Add(new User()).Entity; user.ApiKey = key; user.ChatId = message.Chat.Id; user.SupportManagerUserId = details.Id; await context.Db.SaveChangesAsync(); await context.Interaction.Write($"Authenticated as *{details.DisplayName}*"); } catch (Exception) { await botClient.SendTextMessageAsync(message.Chat.Id, "Failed to authenticate."); } } break; default: if (commandHandlers.ContainsKey(verb)) { await ProcessCommand( await botClient.SendTextMessageAsync(message.Chat.Id, "Preparing response..."), verb); } break; } }