BotSharp/src/Plugins/BotSharp.Plugin.MetaMessenger/Services/MessageHandleService.cs

132 lines
4.8 KiB
C#
Raw Normal View History

2023-11-27 03:04:48 +00:00
using BotSharp.Abstraction.Agents.Enums;
using BotSharp.Abstraction.Conversations.Enums;
2023-12-19 13:16:43 +00:00
using BotSharp.Abstraction.Messaging.JsonConverters;
2023-11-24 23:26:33 +00:00
using BotSharp.Abstraction.Messaging.Models.RichContent;
2023-12-18 22:38:12 +00:00
using System.Text.Json.Serialization.Metadata;
2023-11-24 23:26:33 +00:00
namespace BotSharp.Plugin.MetaMessenger.Services;
public class MessageHandleService
{
private readonly IServiceProvider _services;
private JsonSerializerOptions _serializerOptions;
public MessageHandleService(IServiceProvider services)
{
_services = services;
_serializerOptions = new JsonSerializerOptions
{
PropertyNamingPolicy = JsonNamingPolicy.CamelCase,
Converters =
{
new RichContentJsonConverter(),
2023-12-18 22:38:12 +00:00
new TemplateMessageJsonConverter(),
},
TypeInfoResolver = new DefaultJsonTypeInfoResolver
{
Modifiers = { ConditionalSerialization.IgnoreRichType }
2023-11-24 23:26:33 +00:00
}
};
}
public async Task Handle(string sender, string agentId, string message)
{
var setting = _services.GetRequiredService<MetaMessengerSetting>();
var messenger = _services.GetRequiredService<IMessengerGraphAPI>();
var recipient = JsonSerializer.Serialize(new { Id = sender }, _serializerOptions);
// Marking seen
await messenger.SendMessage(setting.ApiVersion, setting.PageId,
new SendingMessageRequest(setting.PageAccessToken, recipient)
{
SenderAction = SenderActionEnum.MarkSeen
});
// Typing on
await messenger.SendMessage(setting.ApiVersion, setting.PageId,
new SendingMessageRequest(setting.PageAccessToken, recipient)
{
SenderAction = SenderActionEnum.TypingOn
});
// Go to LLM
var conv = _services.GetRequiredService<IConversationService>();
2023-11-27 03:44:17 +00:00
conv.SetConversationId(sender, new List<string>
{
$"channel={ConversationChannel.Messenger}"
});
2023-11-24 23:26:33 +00:00
var replies = new List<IRichMessage>();
2023-11-27 03:44:17 +00:00
var result = await conv.SendMessage(agentId,
2023-11-27 03:04:48 +00:00
new RoleDialogModel(AgentRole.User, message), async msg =>
2023-11-24 23:26:33 +00:00
{
2023-11-27 03:04:48 +00:00
if (msg.RichContent != null)
2023-11-26 17:53:44 +00:00
{
2023-11-27 03:04:48 +00:00
// Official API doesn't support to show extra content above the products
if (!string.IsNullOrEmpty(msg.RichContent.Message.Text) &&
// avoid duplicated text
msg.RichContent.Message is not QuickReplyMessage)
{
replies.Add(new TextMessage(msg.RichContent.Message.Text));
}
2023-11-24 23:26:33 +00:00
if (msg.RichContent.Message is GenericTemplateMessage<GenericElement> genericTemplate)
2023-11-24 23:26:33 +00:00
{
2023-11-27 03:04:48 +00:00
replies.Add(new AttachmentMessage
2023-11-26 17:53:44 +00:00
{
2023-11-27 03:04:48 +00:00
Attachment = new AttachmentBody
{
Payload = genericTemplate
}
});
}
else if (msg.RichContent.Message is CouponTemplateMessage couponTemplate)
2023-11-24 23:26:33 +00:00
{
2023-11-27 03:04:48 +00:00
replies.Add(new AttachmentMessage
2023-11-26 17:53:44 +00:00
{
2023-11-27 03:04:48 +00:00
Attachment = new AttachmentBody
{
Payload = couponTemplate
}
});
}
else if (msg.RichContent.Message is QuickReplyMessage quickReplyMessage)
{
replies.Add(quickReplyMessage);
}
else
{
replies.Add(msg.RichContent.Message);
}
2023-11-26 17:53:44 +00:00
}
else
{
2023-11-27 03:04:48 +00:00
replies.Add(new TextMessage(msg.Content));
2023-11-26 17:53:44 +00:00
}
2023-11-27 03:04:48 +00:00
},
_ => Task.CompletedTask,
_ => Task.CompletedTask);
2023-11-24 23:26:33 +00:00
// Response to user
foreach(var reply in replies)
{
var content = JsonSerializer.Serialize(reply, _serializerOptions);
2023-11-24 23:26:33 +00:00
await messenger.SendMessage(setting.ApiVersion, setting.PageId,
2023-11-26 17:53:44 +00:00
new SendingMessageRequest(setting.PageAccessToken, recipient)
{
Message = content
2023-11-26 17:53:44 +00:00
});
2023-11-24 23:26:33 +00:00
Thread.Sleep(500);
}
// Typing off
await messenger.SendMessage(setting.ApiVersion, setting.PageId,
new SendingMessageRequest(setting.PageAccessToken, recipient)
{
SenderAction = SenderActionEnum.TypingOff
});
}
}