コード例 #1
0
        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());
        }
コード例 #2
0
        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);
        }
コード例 #3
0
        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);
        }