using BotSharp.Abstraction.Conversations.Models;
using BotSharp.Abstraction.Conversations;
using BotSharp.Plugin.MetaMessenger.GraphAPIs;
using BotSharp.Plugin.MetaMessenger.MessagingModels;
using BotSharp.Plugin.MetaMessenger.Settings;
using BotSharp.Plugin.MetaMessenger.WebhookModels;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.DependencyInjection;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Text.Json;
using System.Threading;
using System.Threading.Tasks;
namespace BotSharp.Plugin.MetaMessenger.Controllers;
///
/// This controller is used to receive Wehbook from Messenger platform
/// https://developers.facebook.com/docs/graph-api/webhooks/
///
[AllowAnonymous]
public class WebhookController : ControllerBase
{
private readonly IServiceProvider _services;
public WebhookController(IServiceProvider services)
{
_services = services;
}
[HttpGet("/webhook")]
public string Verificate([FromQuery(Name = "hub.mode")] string mode,
[FromQuery(Name = "hub.verify_token")] string token,
[FromQuery(Name = "hub.challenge")] string challenge)
{
return challenge;
}
///
/// https://developers.facebook.com/docs/messenger-platform/webhooks
///
///
[HttpPost("/webhook")]
public async Task> Messages()
{
using var stream = new StreamReader(Request.Body);
var body = await stream.ReadToEndAsync();
var req = JsonSerializer.Deserialize(body, new JsonSerializerOptions
{
PropertyNameCaseInsensitive = true,
});
// TODO validate request
// https://developers.facebook.com/docs/messenger-platform/webhooks#verification-requests
try
{
// received message
if (req.Entry[0].Messaging[0].Message != null)
{
var conv = _services.GetRequiredService();
string content = "";
var sessionId = req.Entry[0].Messaging[0].Sender.Id;
var input = req.Entry[0].Messaging[0].Message.Text;
var result = await conv.SendMessage("", sessionId, new RoleDialogModel("user", input), async msg =>
{
content = msg.Content;
});
var setting = _services.GetRequiredService();
var messenger = _services.GetRequiredService();
var jsonOpt = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
};
await messenger.SendMessage(setting.ApiVersion, setting.PageId, new SendingMessageRequest
{
AccessToken = setting.PageAccessToken,
Recipient = JsonSerializer.Serialize(new { Id = sessionId }, jsonOpt),
Message = JsonSerializer.Serialize(new { Text = content }, jsonOpt)
});
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
return Ok(new WebhookResponse
{
Success = true
});
}
}