Skip to content

Commit

Permalink
feat: support adapter villa
Browse files Browse the repository at this point in the history
  • Loading branch information
MeetWq committed Nov 29, 2023
1 parent e668ee8 commit 05458d4
Show file tree
Hide file tree
Showing 6 changed files with 341 additions and 118 deletions.
1 change: 1 addition & 0 deletions nonebot_plugin_chatrecorder/adapters/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -8,3 +8,4 @@
from . import qqguild as qqguild
from . import red as red
from . import telegram as telegram
from . import villa as villa
103 changes: 103 additions & 0 deletions nonebot_plugin_chatrecorder/adapters/villa.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,103 @@
from datetime import datetime
from typing import Any, Dict, Optional, Type, Union

from nonebot.adapters import Bot as BaseBot
from nonebot.message import event_postprocessor
from nonebot_plugin_orm import get_session
from nonebot_plugin_session import Session, SessionLevel, extract_session
from nonebot_plugin_session_orm import get_session_persist_id
from typing_extensions import override

from ..config import plugin_config
from ..consts import SupportedAdapter, SupportedPlatform
from ..message import (
MessageDeserializer,
MessageSerializer,
register_deserializer,
register_serializer,
serialize_message,
)
from ..model import MessageRecord

try:
from nonebot.adapters.villa import Bot, Message, SendMessageEvent
from nonebot.adapters.villa.models import MessageContentInfo

adapter = SupportedAdapter.villa

@event_postprocessor
async def record_recv_msg(bot: Bot, event: SendMessageEvent):
session = extract_session(bot, event)
session_persist_id = await get_session_persist_id(session)

record = MessageRecord(
session_persist_id=session_persist_id,
time=datetime.utcfromtimestamp(event.send_at / 1000),
type=event.get_type(),
message_id=event.msg_uid,
message=serialize_message(adapter, event.message),
plain_text=event.message.extract_plain_text(),
)
async with get_session() as db_session:
db_session.add(record)
await db_session.commit()

if plugin_config.chatrecorder_record_send_msg:

@Bot.on_called_api
async def record_send_msg(
bot: BaseBot,
e: Optional[Exception],
api: str,
data: Dict[str, Any],
result: Optional[Any],
):
if not isinstance(bot, Bot):
return
if e or not result:
return

Check warning on line 58 in nonebot_plugin_chatrecorder/adapters/villa.py

View check run for this annotation

Codecov / codecov/patch

nonebot_plugin_chatrecorder/adapters/villa.py#L58

Added line #L58 was not covered by tests
if api not in ["send_message"]:
return

Check warning on line 60 in nonebot_plugin_chatrecorder/adapters/villa.py

View check run for this annotation

Codecov / codecov/patch

nonebot_plugin_chatrecorder/adapters/villa.py#L60

Added line #L60 was not covered by tests

msg_content: Union[str, MessageContentInfo] = data["msg_content"]
if isinstance(msg_content, str):
msg_content = MessageContentInfo.parse_raw(msg_content)
message = Message.from_message_content_info(msg_content)

session = Session(
bot_id=bot.self_id,
bot_type=bot.type,
platform=SupportedPlatform.villa,
level=SessionLevel.LEVEL3,
id1=None,
id2=str(data["room_id"]),
id3=str(data["villa_id"]),
)
session_persist_id = await get_session_persist_id(session)

record = MessageRecord(
session_persist_id=session_persist_id,
time=datetime.utcnow(),
type="message_sent",
message_id=str(result),
message=serialize_message(adapter, message),
plain_text=message.extract_plain_text(),
)
async with get_session() as db_session:
db_session.add(record)
await db_session.commit()

class Serializer(MessageSerializer[Message]):
pass

class Deserializer(MessageDeserializer[Message]):
@classmethod
@override
def get_message_class(cls) -> Type[Message]:
return Message

Check warning on line 97 in nonebot_plugin_chatrecorder/adapters/villa.py

View check run for this annotation

Codecov / codecov/patch

nonebot_plugin_chatrecorder/adapters/villa.py#L97

Added line #L97 was not covered by tests

register_serializer(adapter, Serializer)
register_deserializer(adapter, Deserializer)

except ImportError:
pass
2 changes: 2 additions & 0 deletions nonebot_plugin_chatrecorder/consts.py
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ class SupportedAdapter(StrEnum):
red = "RedProtocol"
discord = "Discord"
dodo = "DoDo"
villa = "Villa"


class SupportedPlatform(StrEnum):
Expand All @@ -33,4 +34,5 @@ class SupportedPlatform(StrEnum):
feishu = "feishu"
discord = "discord"
dodo = "dodo"
villa = "villa"
unknown = "unknown"
Loading

0 comments on commit 05458d4

Please sign in to comment.