nonebot-adapter-qq 1.4.3__tar.gz → 1.5.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (20) hide show
  1. {nonebot_adapter_qq-1.4.3 → nonebot_adapter_qq-1.5.0}/PKG-INFO +3 -4
  2. {nonebot_adapter_qq-1.4.3 → nonebot_adapter_qq-1.5.0}/nonebot/adapters/qq/adapter.py +11 -10
  3. {nonebot_adapter_qq-1.4.3 → nonebot_adapter_qq-1.5.0}/nonebot/adapters/qq/message.py +4 -0
  4. {nonebot_adapter_qq-1.4.3 → nonebot_adapter_qq-1.5.0}/nonebot/adapters/qq/models/common.py +15 -0
  5. {nonebot_adapter_qq-1.4.3 → nonebot_adapter_qq-1.5.0}/nonebot/adapters/qq/models/guild.py +0 -12
  6. {nonebot_adapter_qq-1.4.3 → nonebot_adapter_qq-1.5.0}/pyproject.toml +4 -4
  7. {nonebot_adapter_qq-1.4.3 → nonebot_adapter_qq-1.5.0}/LICENSE +0 -0
  8. {nonebot_adapter_qq-1.4.3 → nonebot_adapter_qq-1.5.0}/README.md +0 -0
  9. {nonebot_adapter_qq-1.4.3 → nonebot_adapter_qq-1.5.0}/nonebot/adapters/qq/__init__.py +0 -0
  10. {nonebot_adapter_qq-1.4.3 → nonebot_adapter_qq-1.5.0}/nonebot/adapters/qq/bot.py +4 -4
  11. {nonebot_adapter_qq-1.4.3 → nonebot_adapter_qq-1.5.0}/nonebot/adapters/qq/compat.py +0 -0
  12. {nonebot_adapter_qq-1.4.3 → nonebot_adapter_qq-1.5.0}/nonebot/adapters/qq/config.py +0 -0
  13. {nonebot_adapter_qq-1.4.3 → nonebot_adapter_qq-1.5.0}/nonebot/adapters/qq/event.py +0 -0
  14. {nonebot_adapter_qq-1.4.3 → nonebot_adapter_qq-1.5.0}/nonebot/adapters/qq/exception.py +0 -0
  15. {nonebot_adapter_qq-1.4.3 → nonebot_adapter_qq-1.5.0}/nonebot/adapters/qq/models/__init__.py +0 -0
  16. {nonebot_adapter_qq-1.4.3 → nonebot_adapter_qq-1.5.0}/nonebot/adapters/qq/models/payload.py +0 -0
  17. {nonebot_adapter_qq-1.4.3 → nonebot_adapter_qq-1.5.0}/nonebot/adapters/qq/models/qq.py +0 -0
  18. {nonebot_adapter_qq-1.4.3 → nonebot_adapter_qq-1.5.0}/nonebot/adapters/qq/permission.py +0 -0
  19. {nonebot_adapter_qq-1.4.3 → nonebot_adapter_qq-1.5.0}/nonebot/adapters/qq/store.py +0 -0
  20. {nonebot_adapter_qq-1.4.3 → nonebot_adapter_qq-1.5.0}/nonebot/adapters/qq/utils.py +0 -0
@@ -1,25 +1,24 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: nonebot-adapter-qq
3
- Version: 1.4.3
3
+ Version: 1.5.0
4
4
  Summary: QQ adapter for nonebot2
5
5
  Home-page: https://github.com/nonebot/adapter-qq
6
6
  License: MIT
7
7
  Keywords: bot,qq,qqbot,qqguild
8
8
  Author: yanyongyu
9
9
  Author-email: yyy@nonebot.dev
10
- Requires-Python: >=3.8,<4.0
10
+ Requires-Python: >=3.9,<4.0
11
11
  Classifier: Development Status :: 5 - Production/Stable
12
12
  Classifier: Framework :: Robot Framework
13
13
  Classifier: Framework :: Robot Framework :: Library
14
14
  Classifier: License :: OSI Approved :: MIT License
15
15
  Classifier: Operating System :: OS Independent
16
16
  Classifier: Programming Language :: Python :: 3
17
- Classifier: Programming Language :: Python :: 3.8
18
17
  Classifier: Programming Language :: Python :: 3.9
19
18
  Classifier: Programming Language :: Python :: 3.10
20
19
  Classifier: Programming Language :: Python :: 3.11
21
20
  Classifier: Programming Language :: Python :: 3.12
22
- Requires-Dist: nonebot2 (>=2.2.0,<3.0.0)
21
+ Requires-Dist: nonebot2 (>=2.2.1,<3.0.0)
23
22
  Requires-Dist: pydantic (>=1.10.0,<3.0.0,!=2.5.0,!=2.5.1)
24
23
  Requires-Dist: typing-extensions (>=4.4.0,<5.0.0)
25
24
  Requires-Dist: yarl (>=1.9.0,<2.0.0)
@@ -1,12 +1,11 @@
1
1
  import sys
2
- import json
3
2
  import asyncio
4
3
  from typing_extensions import override
5
4
  from typing import Any, List, Tuple, Literal, Optional
6
5
 
7
6
  from nonebot.utils import escape_tag
8
7
  from nonebot.exception import WebSocketClosed
9
- from nonebot.compat import PYDANTIC_V2, type_validate_python
8
+ from nonebot.compat import PYDANTIC_V2, type_validate_json, type_validate_python
10
9
  from nonebot.drivers import (
11
10
  URL,
12
11
  Driver,
@@ -68,7 +67,7 @@ class Adapter(BaseAdapter):
68
67
  "websocket client! "
69
68
  "QQ Adapter need a WebSocketClient Driver to work."
70
69
  )
71
- self.driver.on_startup(self.startup)
70
+ self.on_ready(self.startup)
72
71
  self.driver.on_shutdown(self.shutdown)
73
72
 
74
73
  async def startup(self) -> None:
@@ -241,7 +240,8 @@ class Adapter(BaseAdapter):
241
240
  ) -> Optional[Literal[True]]:
242
241
  """鉴权连接"""
243
242
  if not bot.ready:
244
- payload = Identify.parse_obj(
243
+ payload = type_validate_python(
244
+ Identify,
245
245
  {
246
246
  "data": {
247
247
  "token": await bot._get_authorization_header(),
@@ -252,18 +252,19 @@ class Adapter(BaseAdapter):
252
252
  "$language": f"python {sys.version}",
253
253
  "$sdk": "NoneBot2",
254
254
  },
255
- },
256
- }
255
+ }
256
+ },
257
257
  )
258
258
  else:
259
- payload = Resume.parse_obj(
259
+ payload = type_validate_python(
260
+ Resume,
260
261
  {
261
262
  "data": {
262
263
  "token": await bot._get_authorization_header(),
263
264
  "session_id": bot.session_id,
264
265
  "seq": bot.sequence,
265
266
  }
266
- }
267
+ },
267
268
  )
268
269
 
269
270
  try:
@@ -326,7 +327,7 @@ class Adapter(BaseAdapter):
326
327
  while True:
327
328
  if bot.ready:
328
329
  log("TRACE", f"Heartbeat {bot.sequence}")
329
- payload = Heartbeat.parse_obj({"data": bot.sequence})
330
+ payload = type_validate_python(Heartbeat, {"data": bot.sequence})
330
331
  try:
331
332
  await ws.send(self.payload_to_json(payload))
332
333
  except Exception as e:
@@ -387,7 +388,7 @@ class Adapter(BaseAdapter):
387
388
 
388
389
  @staticmethod
389
390
  async def receive_payload(bot: Bot, ws: WebSocket) -> Payload:
390
- payload = type_validate_python(PayloadType, json.loads(await ws.receive()))
391
+ payload = type_validate_json(PayloadType, await ws.receive())
391
392
  if isinstance(payload, Dispatch):
392
393
  bot.on_dispatch(payload)
393
394
  return payload
@@ -428,3 +428,7 @@ class Message(BaseMessage[MessageSegment]):
428
428
  if seg.type
429
429
  in ("text", "emoji", "mention_user", "mention_everyone", "mention_channel")
430
430
  )
431
+
432
+ @override
433
+ def extract_plain_text(self) -> str:
434
+ return "".join(seg.data["text"] for seg in self if seg.is_text())
@@ -1,3 +1,4 @@
1
+ from datetime import datetime
1
2
  from urllib.parse import urlparse
2
3
  from typing import List, Literal, Optional
3
4
 
@@ -119,6 +120,19 @@ class MessageKeyboard(BaseModel):
119
120
  content: Optional[InlineKeyboard] = None
120
121
 
121
122
 
123
+ # Message Audit Event
124
+ class MessageAudited(BaseModel):
125
+ audit_id: str
126
+ message_id: Optional[str] = None
127
+ user_openid: Optional[str] = None
128
+ group_openid: Optional[str] = None
129
+ guild_id: Optional[str] = None
130
+ channel_id: Optional[str] = None
131
+ audit_time: datetime
132
+ create_time: Optional[datetime] = None
133
+ seq_in_channel: Optional[str] = None
134
+
135
+
122
136
  # Interaction Event
123
137
  class ButtonInteractionContent(BaseModel):
124
138
  user_id: Optional[str] = None
@@ -167,6 +181,7 @@ __all__ = [
167
181
  "InlineKeyboardRow",
168
182
  "InlineKeyboard",
169
183
  "MessageKeyboard",
184
+ "MessageAudited",
170
185
  "ButtonInteractionContent",
171
186
  "ButtonInteractionData",
172
187
  "ButtonInteraction",
@@ -162,17 +162,6 @@ class MessageDelete(BaseModel):
162
162
  op_user: User
163
163
 
164
164
 
165
- # Message Audit Event
166
- class MessageAudited(BaseModel):
167
- audit_id: str
168
- message_id: Optional[str] = None
169
- guild_id: str
170
- channel_id: str
171
- audit_time: datetime
172
- create_time: Optional[datetime] = None
173
- seq_in_channel: Optional[str] = None
174
-
175
-
176
165
  # Message Setting
177
166
  class MessageSetting(BaseModel):
178
167
  disable_create_dm: bool
@@ -525,7 +514,6 @@ __all__ = [
525
514
  "ChannelPermissions",
526
515
  "Message",
527
516
  "MessageDelete",
528
- "MessageAudited",
529
517
  "MessageSetting",
530
518
  "DMS",
531
519
  "RecommendChannel",
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "nonebot-adapter-qq"
3
- version = "1.4.3"
3
+ version = "1.5.0"
4
4
  description = "QQ adapter for nonebot2"
5
5
  authors = ["yanyongyu <yyy@nonebot.dev>"]
6
6
  license = "MIT"
@@ -19,14 +19,14 @@ classifiers = [
19
19
  packages = [{ include = "nonebot" }]
20
20
 
21
21
  [tool.poetry.dependencies]
22
- python = "^3.8"
22
+ python = "^3.9"
23
23
  yarl = "^1.9.0"
24
- nonebot2 = "^2.2.0"
24
+ nonebot2 = "^2.2.1"
25
25
  typing-extensions = ">=4.4.0, <5.0.0"
26
26
  pydantic = ">=1.10.0,<3.0.0,!=2.5.0,!=2.5.1"
27
27
 
28
28
  [tool.poetry.group.dev.dependencies]
29
- ruff = "^0.3.0"
29
+ ruff = "^0.5.0"
30
30
  isort = "^5.10.1"
31
31
  black = "^24.0.0"
32
32
  nonemoji = "^0.1.3"
@@ -327,12 +327,12 @@ class Bot(BaseBot):
327
327
  elif file_image := message["file_image"]:
328
328
  kwargs["file_type"] = 1
329
329
  kwargs["file_data"] = file_image[-1].data["content"]
330
- elif file_audio := message["file_audio"]:
331
- kwargs["file_type"] = 2
332
- kwargs["file_data"] = file_audio[-1].data["content"]
333
330
  elif file_video := message["file_video"]:
334
- kwargs["file_type"] = 3
331
+ kwargs["file_type"] = 2
335
332
  kwargs["file_data"] = file_video[-1].data["content"]
333
+ elif file_audio := message["file_audio"]:
334
+ kwargs["file_type"] = 3
335
+ kwargs["file_data"] = file_audio[-1].data["content"]
336
336
  elif file_file := message["file_file"]:
337
337
  kwargs["file_type"] = 4
338
338
  kwargs["file_data"] = file_file[-1].data["content"]