Skip to content

Commit 693b753

Browse files
✨ 简化事件日志输出并过滤 UNSET fix #38 (#68)
1 parent 2e2d0f0 commit 693b753

2 files changed

Lines changed: 84 additions & 3 deletions

File tree

nonebot/adapters/discord/event.py

Lines changed: 29 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
from nonebot.adapters import Event as BaseEvent
99

10-
from nonebot.compat import PYDANTIC_V2, model_dump
10+
from nonebot.compat import PYDANTIC_V2
1111
from nonebot.utils import escape_tag
1212
from pydantic import BaseModel, Field
1313

@@ -93,7 +93,7 @@
9393
)
9494
from .api.types import UNSET, InteractionType, Missing, is_unset
9595
from .message import Message
96-
from .utils import log
96+
from .utils import log, model_dump
9797

9898

9999
class EventType(str, Enum):
@@ -238,7 +238,7 @@ def get_event_name(self) -> str:
238238

239239
@override
240240
def get_event_description(self) -> str:
241-
return escape_tag(str(model_dump(self)))
241+
return escape_tag(str(model_dump(self, omit_unset_values=True)))
242242

243243
@override
244244
def get_message(self) -> Message:
@@ -303,6 +303,32 @@ def original_message(self) -> Message:
303303
def get_type(self) -> str:
304304
return "message"
305305

306+
@staticmethod
307+
def _format_preview(content: str, max_length: int = 120) -> str:
308+
normalized = content.replace("\r\n", "\n").replace("\r", "\n")
309+
normalized = normalized.replace("\n", "\\n").strip()
310+
if not normalized:
311+
return "<empty>"
312+
if len(normalized) > max_length:
313+
return normalized[: max_length - 3] + "..."
314+
return normalized
315+
316+
@override
317+
def get_event_description(self) -> str:
318+
guild_id = getattr(self, "guild_id", UNSET)
319+
location = (
320+
f"Guild {guild_id}, Channel {self.channel_id}"
321+
if not is_unset(guild_id)
322+
else f"Channel {self.channel_id}"
323+
)
324+
preview = self._format_preview(
325+
self.get_message().extract_content() or self.content
326+
)
327+
return escape_tag(
328+
f"Message {self.id} from {self.author.id}({self.author.username})"
329+
f"@[{location}] {preview}"
330+
)
331+
306332
@override
307333
def get_user_id(self) -> str:
308334
return str(self.author.id)
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
from nonebot.adapters.discord.event import (
2+
DirectMessageDeleteEvent,
3+
GuildMessageCreateEvent,
4+
)
5+
6+
from nonebot.compat import type_validate_python
7+
8+
9+
def _build_message_create_payload() -> dict[str, object]:
10+
return {
11+
"id": "1",
12+
"channel_id": "100",
13+
"guild_id": "300",
14+
"author": {
15+
"id": "2",
16+
"username": "tester",
17+
"discriminator": "0",
18+
"global_name": None,
19+
"avatar": None,
20+
},
21+
"content": "hello\nworld",
22+
"timestamp": "2026-02-14T00:00:00+00:00",
23+
"edited_timestamp": None,
24+
"tts": False,
25+
"mention_everyone": False,
26+
"mentions": [],
27+
"mention_roles": [],
28+
"attachments": [],
29+
"embeds": [],
30+
"pinned": False,
31+
"type": 0,
32+
}
33+
34+
35+
def test_message_event_description_is_simplified() -> None:
36+
event = type_validate_python(
37+
GuildMessageCreateEvent, _build_message_create_payload()
38+
)
39+
40+
desc = event.get_event_description()
41+
42+
assert "Message 1 from 2(tester)@[Guild 300, Channel 100]" in desc
43+
assert "hello\\nworld" in desc
44+
assert "<UNSET>" not in desc
45+
46+
47+
def test_non_message_event_description_omits_unset_fields() -> None:
48+
event = type_validate_python(
49+
DirectMessageDeleteEvent, {"id": "1", "channel_id": "100"}
50+
)
51+
52+
desc = event.get_event_description()
53+
54+
assert "<UNSET>" not in desc
55+
assert "guild_id" not in desc

0 commit comments

Comments
 (0)