using BotFramework.Abstractions.UpdateProvider; using BotFramework.Config; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using Newtonsoft.Json; using System.IO; using System.Threading.Tasks; using Telegram.Bot; using Telegram.Bot.Types; namespace Kruzya.TelegramBot.Core.Controllers { public class Telegram : Controller { private const string SecretTokenHeader = "X-Telegram-Bot-Api-Secret-Token"; private readonly ILogger _logger; private readonly ITelegramBotClient _client; private readonly IUpdateTarget _updateTarget; private readonly string _secretToken; public Telegram(ILogger logger, ITelegramBotClient client, IUpdateTarget updateTarget, IOptions config) { _logger = logger; _client = client; _updateTarget = updateTarget; _secretToken = config.Value.Webhook.SecretToken; if (string.IsNullOrEmpty(_secretToken)) { _secretToken = null; } } [HttpPost] public async IActionResult Index() { if (_secretToken != null && !Request.Headers.ContainsKey(SecretTokenHeader)) { _logger.LogWarning("Someone tried push update without secret key in headers"); return BadRequest(); } var ok = (_secretToken == null || Request.Headers[SecretTokenHeader] == _secretToken); if (!ok) { _logger.LogWarning("Someone tried push update with wrong secret key in headers"); return BadRequest(); } var body = await (new StreamReader(Request.Body)).ReadToEndAsync(); LaunchHandle(JsonConvert.DeserializeObject(body)); return Ok(); } private void LaunchHandle(Update? update) { try { if (update == null) { throw new System.Exception("Invalid request body"); } _updateTarget.Push(update); } catch (System.Exception e) { _logger.LogError($"Error occured when handling a new update: {e}"); } } } }