public ActionResult Update([ModelBinder(typeof(UpdateModelBinder))] WebhookUpdateDto webhookUpdateDto) { Logger.LogInformation("Telegram hit webhook BotInstanceId: {BotInstanceId} Secret: {Secret} UpdateType: {UpdateType} MessageType: {MessageType}.", webhookUpdateDto.BotInstanceId, webhookUpdateDto.Secret, webhookUpdateDto.Update.Type, webhookUpdateDto.Update.Message?.Type); var botInstanceRecord = Db.BotInstanceRecords.SingleOrDefault(x => x.Id == webhookUpdateDto.BotInstanceId && x.WebhookSecret == webhookUpdateDto.Secret); if (botInstanceRecord == null) { ModelState.AddModelError("", "BotUniqueName or Secret is invalid."); return(BadRequest(ModelState)); } HttpContextAccessor.HttpContext.Items.Add("BotClientToken", botInstanceRecord.Token); HttpContextAccessor.HttpContext.Items.Add("BotInstanceId", webhookUpdateDto.BotInstanceId); using (var scope = IocConfig.Container.BeginLifetimeScope(MatchingScopeLifetimeTags.RequestLifetimeScopeTag)) { var botInstance = GetBotInstance(botInstanceRecord, scope); var subscriber = GetOrAddSubscriber(webhookUpdateDto, scope); Dump(botInstance, webhookUpdateDto.Update); botInstance.Update(webhookUpdateDto.Update, subscriber); } return(Ok()); }
private SubscriberRecord GetOrAddSubscriber(WebhookUpdateDto webhookUpdateDto, ILifetimeScope scope) { SubscriberRepo = scope.Resolve <SubscriberRepo>(); var message = webhookUpdateDto.Update.Message; var subscriber = SubscriberRepo.GetByChatId(message.Chat.Id); if (subscriber != null) { return(subscriber); } subscriber = new SubscriberRecord { ChatId = message.Chat.Id, BotInstanceRecordId = webhookUpdateDto.BotInstanceId, Username = message.Chat.Username, FirstName = message.From.FirstName, LastName = message.From.LastName }; SubscriberRepo.Add(subscriber); return(subscriber); }
public Task BindModelAsync(ModelBindingContext bindingContext) { var request = bindingContext.HttpContext.Request; if (!request.ContentType.StartsWith("application/json", StringComparison.OrdinalIgnoreCase)) { return(null); } //request.Body.Position = 0; // see: http://stackoverflow.com/a/3468653/331281 var stream = request.Body; string json; using (var readStream = new StreamReader(stream, Encoding.UTF8)) json = readStream.ReadToEnd(); var values = bindingContext.ActionContext.RouteData.Values; var result = new WebhookUpdateDto { BotInstanceId = int.Parse(values[nameof(WebhookUpdateDto.BotInstanceId)].ToString()), Secret = bindingContext.ActionContext.RouteData.Values[nameof(WebhookUpdateDto.Secret)].ToString(), Update = JsonConvert.DeserializeObject <Update>(json) }; bindingContext.Result = ModelBindingResult.Success(result); return(Task.CompletedTask); }