Skip to content

Commit

Permalink
feat: support adapter dodo (#33)
Browse files Browse the repository at this point in the history
  • Loading branch information
MeetWq committed Nov 29, 2023
1 parent ac28ac2 commit 61e4e58
Show file tree
Hide file tree
Showing 8 changed files with 313 additions and 120 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/codecov.yml
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ jobs:
MYSQL_ROOT_PASSWORD: mysql
MYSQL_USER: mysql
MYSQL_PASSWORD: mysql
MYSQL_DATABASE: mysql
MYSQL_DATABASE: test
ports:
- 3306:3306
options: --health-cmd "mysqladmin ping -h localhost -umysql -pmysql" --health-interval 10s --health-timeout 5s --health-retries 5
Expand All @@ -110,7 +110,7 @@ jobs:

- name: Run tests
run: |
sed -ie "s#sqlite+aiosqlite:///:memory:#mysql+aiomysql://mysql:mysql@localhost:3306/mysql#g" tests/conftest.py
sed -ie "s#sqlite+aiosqlite:///:memory:#mysql+aiomysql://mysql:mysql@localhost:3306/test#g" tests/conftest.py
sed -ie "s#StaticPool#NullPool#g" tests/conftest.py
poetry run pytest --cov-report xml
Expand Down
1 change: 1 addition & 0 deletions nonebot_plugin_chatrecorder/adapters/__init__.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from . import console as console
from . import discord as discord
from . import dodo as dodo
from . import feishu as feishu
from . import kaiheila as kaiheila
from . import onebot_v11 as onebot_v11
Expand Down
111 changes: 111 additions & 0 deletions nonebot_plugin_chatrecorder/adapters/dodo.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
from datetime import datetime
from typing import Any, Dict, Optional, Type

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.dodo import Bot, Message, MessageEvent
from nonebot.adapters.dodo.models import MessageReturn

adapter = SupportedAdapter.dodo

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

record = MessageRecord(
session_persist_id=session_persist_id,
time=event.timestamp,
type=event.get_type(),
message_id=event.message_id,
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 or not isinstance(result, MessageReturn):
return

island_source_id = None
channel_id = None
if api == "set_channel_message_send":
level = SessionLevel.LEVEL3
channel_id = data["channel_id"]
dodo_source_id = data.get("dodo_source_id")
elif api == "set_personal_message_send":
level = SessionLevel.LEVEL1
island_source_id = data["island_source_id"]
dodo_source_id = data["dodo_source_id"]
else:
return

message = Message.from_message_body(data["message_body"])

session = Session(
bot_id=bot.self_id,
bot_type=bot.type,
platform=SupportedPlatform.dodo,
level=level,
id1=dodo_source_id,
id2=channel_id,
id3=island_source_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=result.message_id,
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

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 @@ -21,6 +21,7 @@ class SupportedAdapter(StrEnum):
feishu = "Feishu"
red = "RedProtocol"
discord = "Discord"
dodo = "DoDo"


class SupportedPlatform(StrEnum):
Expand All @@ -31,4 +32,5 @@ class SupportedPlatform(StrEnum):
telegram = "telegram"
feishu = "feishu"
discord = "discord"
dodo = "dodo"
unknown = "unknown"
Loading

0 comments on commit 61e4e58

Please sign in to comment.