mirror of
https://github.com/langbot-app/LangBot.git
synced 2026-09-17 15:27:15 +00:00
feat(platform): add wecom eba adapters
This commit is contained in:
@@ -0,0 +1,124 @@
|
||||
from __future__ import annotations
|
||||
|
||||
import time
|
||||
import typing
|
||||
|
||||
from langbot.libs.wecom_ai_bot_api.wecombotevent import WecomBotEvent
|
||||
from langbot.pkg.platform.adapters.wecombot.message_converter import WecomBotMessageConverter
|
||||
from langbot.pkg.platform.adapters.wecombot.types import ADAPTER_NAME
|
||||
import langbot_plugin.api.definition.abstract.platform.adapter as abstract_platform_adapter
|
||||
from langbot_plugin.api.entities.builtin.platform import entities as platform_entities
|
||||
from langbot_plugin.api.entities.builtin.platform import events as platform_events
|
||||
|
||||
|
||||
class WecomBotEventConverter(abstract_platform_adapter.AbstractEventConverter):
|
||||
def __init__(self, bot_name: str = ''):
|
||||
self.bot_name = bot_name
|
||||
|
||||
@staticmethod
|
||||
async def yiri2target(event: platform_events.Event) -> typing.Any:
|
||||
return getattr(event, 'source_platform_object', None)
|
||||
|
||||
async def target2legacy(self, event: WecomBotEvent) -> platform_events.FriendMessage | platform_events.GroupMessage | None:
|
||||
eba_event = await self.target2yiri(event)
|
||||
if not isinstance(eba_event, platform_events.MessageReceivedEvent):
|
||||
return None
|
||||
if eba_event.chat_type == platform_entities.ChatType.PRIVATE:
|
||||
return platform_events.FriendMessage(
|
||||
sender=platform_entities.Friend(id=eba_event.sender.id, nickname=eba_event.sender.nickname, remark=''),
|
||||
message_chain=eba_event.message_chain,
|
||||
time=eba_event.timestamp,
|
||||
source_platform_object=event,
|
||||
)
|
||||
return platform_events.GroupMessage(
|
||||
sender=platform_entities.GroupMember(
|
||||
id=eba_event.sender.id,
|
||||
permission='MEMBER',
|
||||
member_name=eba_event.sender.nickname,
|
||||
group=platform_entities.Group(
|
||||
id=eba_event.group.id if eba_event.group else eba_event.chat_id,
|
||||
name=eba_event.group.name if eba_event.group else '',
|
||||
permission=platform_entities.Permission.Member,
|
||||
),
|
||||
special_title='',
|
||||
),
|
||||
message_chain=eba_event.message_chain,
|
||||
time=eba_event.timestamp,
|
||||
source_platform_object=event,
|
||||
)
|
||||
|
||||
async def target2yiri(self, event: WecomBotEvent) -> platform_events.Event:
|
||||
if event.type in {'single', 'group'} and event.msgtype != 'event':
|
||||
return await self.message_to_eba(event)
|
||||
return self.platform_specific(event, f'wecombot.{event.get("eventtype") or event.msgtype or event.type or "unknown"}')
|
||||
|
||||
async def message_to_eba(self, event: WecomBotEvent) -> platform_events.MessageReceivedEvent:
|
||||
sender = platform_entities.User(id=event.userid, nickname=event.username or event.userid)
|
||||
group = None
|
||||
chat_type = platform_entities.ChatType.PRIVATE
|
||||
chat_id = event.userid
|
||||
if event.type == 'group':
|
||||
chat_type = platform_entities.ChatType.GROUP
|
||||
chat_id = str(event.chatid)
|
||||
group = platform_entities.UserGroup(id=str(event.chatid), name=event.chatname or str(event.chatid))
|
||||
|
||||
return platform_events.MessageReceivedEvent(
|
||||
type='message.received',
|
||||
adapter_name=ADAPTER_NAME,
|
||||
message_id=event.message_id or '',
|
||||
message_chain=await WecomBotMessageConverter.target2yiri(event, self.bot_name),
|
||||
sender=sender,
|
||||
chat_type=chat_type,
|
||||
chat_id=chat_id or '',
|
||||
group=group,
|
||||
timestamp=time.time(),
|
||||
source_platform_object=event,
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def feedback_to_eba(
|
||||
*,
|
||||
feedback_id: str,
|
||||
feedback_type: int,
|
||||
feedback_content: str | None = None,
|
||||
inaccurate_reasons: list | None = None,
|
||||
session=None,
|
||||
) -> platform_events.FeedbackReceivedEvent:
|
||||
session_id = None
|
||||
user_id = None
|
||||
message_id = None
|
||||
stream_id = None
|
||||
if session:
|
||||
if getattr(session, 'chat_id', None):
|
||||
session_id = f'group_{session.chat_id}'
|
||||
elif getattr(session, 'user_id', None):
|
||||
session_id = f'person_{session.user_id}'
|
||||
user_id = getattr(session, 'user_id', None)
|
||||
message_id = getattr(session, 'msg_id', None)
|
||||
stream_id = getattr(session, 'stream_id', None)
|
||||
|
||||
return platform_events.FeedbackReceivedEvent(
|
||||
type='feedback.received',
|
||||
adapter_name=ADAPTER_NAME,
|
||||
feedback_id=feedback_id,
|
||||
feedback_type=feedback_type,
|
||||
feedback_content=feedback_content,
|
||||
inaccurate_reasons=[str(reason) for reason in (inaccurate_reasons or [])] or None,
|
||||
user_id=user_id,
|
||||
session_id=session_id,
|
||||
message_id=message_id,
|
||||
stream_id=stream_id,
|
||||
timestamp=time.time(),
|
||||
source_platform_object=session,
|
||||
)
|
||||
|
||||
@staticmethod
|
||||
def platform_specific(event: WecomBotEvent, action: str) -> platform_events.PlatformSpecificEvent:
|
||||
return platform_events.PlatformSpecificEvent(
|
||||
type='platform.specific',
|
||||
adapter_name=ADAPTER_NAME,
|
||||
action=action,
|
||||
data=dict(event),
|
||||
timestamp=time.time(),
|
||||
source_platform_object=event,
|
||||
)
|
||||
Reference in New Issue
Block a user