nonebot-adapter-qq 1.0.0__tar.gz → 1.0.1__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.
- {nonebot_adapter_qq-1.0.0 → nonebot_adapter_qq-1.0.1}/PKG-INFO +2 -1
- nonebot_adapter_qq-1.0.1/nonebot/adapters/qq/__init__.py +17 -0
- {nonebot_adapter_qq-1.0.0 → nonebot_adapter_qq-1.0.1}/nonebot/adapters/qq/bot.py +25 -6
- {nonebot_adapter_qq-1.0.0 → nonebot_adapter_qq-1.0.1}/nonebot/adapters/qq/event.py +96 -0
- {nonebot_adapter_qq-1.0.0 → nonebot_adapter_qq-1.0.1}/nonebot/adapters/qq/message.py +18 -2
- {nonebot_adapter_qq-1.0.0 → nonebot_adapter_qq-1.0.1}/nonebot/adapters/qq/models/guild.py +12 -4
- {nonebot_adapter_qq-1.0.0 → nonebot_adapter_qq-1.0.1}/nonebot/adapters/qq/models/qq.py +13 -1
- {nonebot_adapter_qq-1.0.0 → nonebot_adapter_qq-1.0.1}/nonebot/adapters/qq/permission.py +3 -3
- {nonebot_adapter_qq-1.0.0 → nonebot_adapter_qq-1.0.1}/pyproject.toml +3 -2
- nonebot_adapter_qq-1.0.0/nonebot/adapters/qq/__init__.py +0 -7
- {nonebot_adapter_qq-1.0.0 → nonebot_adapter_qq-1.0.1}/LICENSE +0 -0
- {nonebot_adapter_qq-1.0.0 → nonebot_adapter_qq-1.0.1}/README.md +0 -0
- {nonebot_adapter_qq-1.0.0 → nonebot_adapter_qq-1.0.1}/nonebot/adapters/qq/adapter.py +0 -0
- {nonebot_adapter_qq-1.0.0 → nonebot_adapter_qq-1.0.1}/nonebot/adapters/qq/config.py +0 -0
- {nonebot_adapter_qq-1.0.0 → nonebot_adapter_qq-1.0.1}/nonebot/adapters/qq/exception.py +0 -0
- {nonebot_adapter_qq-1.0.0 → nonebot_adapter_qq-1.0.1}/nonebot/adapters/qq/models/__init__.py +0 -0
- {nonebot_adapter_qq-1.0.0 → nonebot_adapter_qq-1.0.1}/nonebot/adapters/qq/models/_transformer.py +0 -0
- {nonebot_adapter_qq-1.0.0 → nonebot_adapter_qq-1.0.1}/nonebot/adapters/qq/models/common.py +0 -0
- {nonebot_adapter_qq-1.0.0 → nonebot_adapter_qq-1.0.1}/nonebot/adapters/qq/models/payload.py +0 -0
- {nonebot_adapter_qq-1.0.0 → nonebot_adapter_qq-1.0.1}/nonebot/adapters/qq/store.py +0 -0
- {nonebot_adapter_qq-1.0.0 → nonebot_adapter_qq-1.0.1}/nonebot/adapters/qq/utils.py +0 -0
@@ -1,6 +1,6 @@
|
|
1
1
|
Metadata-Version: 2.1
|
2
2
|
Name: nonebot-adapter-qq
|
3
|
-
Version: 1.0.
|
3
|
+
Version: 1.0.1
|
4
4
|
Summary: QQ adapter for nonebot2
|
5
5
|
Home-page: https://github.com/nonebot/adapter-qq
|
6
6
|
License: MIT
|
@@ -21,6 +21,7 @@ Classifier: Programming Language :: Python :: 3.11
|
|
21
21
|
Requires-Dist: nonebot2 (>=2.1.0,<3.0.0)
|
22
22
|
Requires-Dist: pydantic (>=1.9.0,<2.0.0)
|
23
23
|
Requires-Dist: typing-extensions (>=4.4.0,<5.0.0)
|
24
|
+
Requires-Dist: yarl (>=1.9.0,<2.0.0)
|
24
25
|
Project-URL: Documentation, https://github.com/nonebot/adapter-qq#readme
|
25
26
|
Project-URL: Repository, https://github.com/nonebot/adapter-qq
|
26
27
|
Description-Content-Type: text/markdown
|
@@ -0,0 +1,17 @@
|
|
1
|
+
from .event import *
|
2
|
+
from .permission import *
|
3
|
+
from .bot import Bot as Bot
|
4
|
+
from .utils import log as log
|
5
|
+
from .utils import escape as escape
|
6
|
+
from .adapter import Adapter as Adapter
|
7
|
+
from .message import Message as Message
|
8
|
+
from .utils import unescape as unescape
|
9
|
+
from .exception import ActionFailed as ActionFailed
|
10
|
+
from .exception import NetworkError as NetworkError
|
11
|
+
from .message import MessageSegment as MessageSegment
|
12
|
+
from .exception import AuditException as AuditException
|
13
|
+
from .exception import NoLogException as NoLogException
|
14
|
+
from .exception import ApiNotAvailable as ApiNotAvailable
|
15
|
+
from .exception import QQAdapterException as QQAdapterException
|
16
|
+
from .exception import RateLimitException as RateLimitException
|
17
|
+
from .exception import UnauthorizedException as UnauthorizedException
|
@@ -77,6 +77,7 @@ from .models import (
|
|
77
77
|
PostGroupFilesReturn,
|
78
78
|
PostC2CMessagesReturn,
|
79
79
|
GetReactionUsersReturn,
|
80
|
+
PostGroupMembersReturn,
|
80
81
|
PostGroupMessagesReturn,
|
81
82
|
APIPermissionDemandIdentify,
|
82
83
|
GetGuildAPIPermissionReturn,
|
@@ -100,10 +101,10 @@ async def _check_reply(
|
|
100
101
|
return
|
101
102
|
try:
|
102
103
|
event.reply = await bot.get_message_of_id(
|
103
|
-
channel_id=event.channel_id,
|
104
|
-
message_id=event.message_reference.message_id,
|
104
|
+
channel_id=event.channel_id,
|
105
|
+
message_id=event.message_reference.message_id,
|
105
106
|
)
|
106
|
-
if event.reply.
|
107
|
+
if event.reply.author.id == bot.self_info.id:
|
107
108
|
event.to_me = True
|
108
109
|
except Exception as e:
|
109
110
|
log("WARNING", f"Error when getting message reply info: {repr(e)}", e)
|
@@ -116,13 +117,14 @@ def _check_at_me(
|
|
116
117
|
if (
|
117
118
|
isinstance(event, GuildMessageEvent)
|
118
119
|
and event.mentions is not None
|
119
|
-
and bot.self_info.id in
|
120
|
+
and bot.self_info.id in {user.id for user in event.mentions}
|
120
121
|
):
|
121
122
|
event.to_me = True
|
122
123
|
|
123
124
|
def _is_at_me_seg(segment: MessageSegment) -> bool:
|
124
|
-
return
|
125
|
-
|
125
|
+
return (
|
126
|
+
segment.type == "mention_user"
|
127
|
+
and segment.data.get("user_id") == bot.self_info.id
|
126
128
|
)
|
127
129
|
|
128
130
|
message = event.get_message()
|
@@ -135,6 +137,7 @@ def _check_at_me(
|
|
135
137
|
if _is_at_me_seg(message[0]):
|
136
138
|
message.pop(0)
|
137
139
|
deleted = True
|
140
|
+
event.to_me = True
|
138
141
|
if message and message[0].type == "text":
|
139
142
|
message[0].data["text"] = message[0].data["text"].lstrip("\xa0").lstrip()
|
140
143
|
if not message[0].data["text"]:
|
@@ -154,6 +157,7 @@ def _check_at_me(
|
|
154
157
|
|
155
158
|
if _is_at_me_seg(last_msg_seg):
|
156
159
|
deleted = True
|
160
|
+
event.to_me = True
|
157
161
|
del message[i:]
|
158
162
|
|
159
163
|
if not message:
|
@@ -1666,3 +1670,18 @@ class Bot(BaseBot):
|
|
1666
1670
|
),
|
1667
1671
|
)
|
1668
1672
|
return parse_obj_as(PostGroupFilesReturn, await self._request(request))
|
1673
|
+
|
1674
|
+
@API
|
1675
|
+
async def post_group_members(
|
1676
|
+
self,
|
1677
|
+
*,
|
1678
|
+
group_id: str,
|
1679
|
+
limit: Optional[int] = None,
|
1680
|
+
start_index: Optional[int] = None,
|
1681
|
+
) -> PostGroupMembersReturn:
|
1682
|
+
request = Request(
|
1683
|
+
"POST",
|
1684
|
+
self.adapter.get_api_base().joinpath("v2", "groups", group_id, "members"),
|
1685
|
+
json=exclude_none({"limit": limit, "start_index": start_index}),
|
1686
|
+
)
|
1687
|
+
return parse_obj_as(PostGroupMembersReturn, await self._request(request))
|
@@ -1,4 +1,5 @@
|
|
1
1
|
from enum import Enum
|
2
|
+
from datetime import datetime
|
2
3
|
from typing_extensions import override
|
3
4
|
from typing import Dict, Type, Tuple, TypeVar, Optional
|
4
5
|
|
@@ -97,6 +98,18 @@ class EventType(str, Enum):
|
|
97
98
|
AT_MESSAGE_CREATE = "AT_MESSAGE_CREATE"
|
98
99
|
PUBLIC_MESSAGE_DELETE = "PUBLIC_MESSAGE_DELETE"
|
99
100
|
|
101
|
+
# FRIEND_ROBOT_EVENT
|
102
|
+
FRIEND_ADD = "FRIEND_ADD"
|
103
|
+
FRIEND_DEL = "FRIEND_DEL"
|
104
|
+
C2C_MSG_REJECT = "C2C_MSG_REJECT"
|
105
|
+
C2C_MSG_RECEIVE = "C2C_MSG_RECEIVE"
|
106
|
+
|
107
|
+
# GROUP_ROBOT_EVENT
|
108
|
+
GROUP_ADD_ROBOT = "GROUP_ADD_ROBOT"
|
109
|
+
GROUP_DEL_ROBOT = "GROUP_DEL_ROBOT"
|
110
|
+
GROUP_MSG_REJECT = "GROUP_MSG_REJECT"
|
111
|
+
GROUP_MSG_RECEIVE = "GROUP_MSG_RECEIVE"
|
112
|
+
|
100
113
|
|
101
114
|
class Event(BaseEvent):
|
102
115
|
__type__: EventType
|
@@ -574,6 +587,75 @@ class OpenForumReplyDeleteEvent(OpenForumEvent):
|
|
574
587
|
__type__ = EventType.OPEN_FORUM_REPLY_DELETE
|
575
588
|
|
576
589
|
|
590
|
+
# Friend Robot Event
|
591
|
+
class FriendRobotEvent(NoticeEvent):
|
592
|
+
timestamp: datetime
|
593
|
+
open_id: str
|
594
|
+
|
595
|
+
@override
|
596
|
+
def get_user_id(self) -> str:
|
597
|
+
return self.open_id
|
598
|
+
|
599
|
+
@override
|
600
|
+
def get_session_id(self) -> str:
|
601
|
+
return self.open_id
|
602
|
+
|
603
|
+
|
604
|
+
@register_event_class
|
605
|
+
class FriendAddEvent(FriendRobotEvent):
|
606
|
+
__type__ = EventType.FRIEND_ADD
|
607
|
+
|
608
|
+
|
609
|
+
@register_event_class
|
610
|
+
class FriendDelEvent(FriendRobotEvent):
|
611
|
+
__type__ = EventType.FRIEND_DEL
|
612
|
+
|
613
|
+
|
614
|
+
@register_event_class
|
615
|
+
class C2CMsgRejectEvent(FriendRobotEvent):
|
616
|
+
__type__ = EventType.C2C_MSG_REJECT
|
617
|
+
|
618
|
+
|
619
|
+
@register_event_class
|
620
|
+
class C2CMsgReceiveEvent(FriendRobotEvent):
|
621
|
+
__type__ = EventType.C2C_MSG_RECEIVE
|
622
|
+
|
623
|
+
|
624
|
+
# Group Robot Event
|
625
|
+
class GroupRobotEvent(NoticeEvent):
|
626
|
+
timestamp: datetime
|
627
|
+
group_openid: str
|
628
|
+
op_member_openid: str
|
629
|
+
|
630
|
+
@override
|
631
|
+
def get_user_id(self) -> str:
|
632
|
+
return self.op_member_openid
|
633
|
+
|
634
|
+
@override
|
635
|
+
def get_session_id(self) -> str:
|
636
|
+
return self.op_member_openid
|
637
|
+
|
638
|
+
|
639
|
+
@register_event_class
|
640
|
+
class GroupAddRobotEvent(GroupRobotEvent):
|
641
|
+
__type__ = EventType.GROUP_ADD_ROBOT
|
642
|
+
|
643
|
+
|
644
|
+
@register_event_class
|
645
|
+
class GroupDelRobotEvent(GroupRobotEvent):
|
646
|
+
__type__ = EventType.GROUP_DEL_ROBOT
|
647
|
+
|
648
|
+
|
649
|
+
@register_event_class
|
650
|
+
class GroupMsgRejectEvent(GroupRobotEvent):
|
651
|
+
__type__ = EventType.GROUP_MSG_REJECT
|
652
|
+
|
653
|
+
|
654
|
+
@register_event_class
|
655
|
+
class GroupMsgReceiveEvent(GroupRobotEvent):
|
656
|
+
__type__ = EventType.GROUP_MSG_RECEIVE
|
657
|
+
|
658
|
+
|
577
659
|
__all__ = [
|
578
660
|
"EVENT_CLASSES",
|
579
661
|
"EventType",
|
@@ -595,12 +677,16 @@ __all__ = [
|
|
595
677
|
"GuildMemberUpdateEvent",
|
596
678
|
"GuildMemberRemoveEvent",
|
597
679
|
"MessageEvent",
|
680
|
+
"GuildMessageEvent",
|
598
681
|
"MessageCreateEvent",
|
599
682
|
"MessageDeleteEvent",
|
600
683
|
"AtMessageCreateEvent",
|
601
684
|
"PublicMessageDeleteEvent",
|
602
685
|
"DirectMessageCreateEvent",
|
603
686
|
"DirectMessageDeleteEvent",
|
687
|
+
"C2CMessageCreateEvent",
|
688
|
+
"GroupAtMessageCreateEvent",
|
689
|
+
"InteractionCreateEvent",
|
604
690
|
"MessageAuditEvent",
|
605
691
|
"MessageAuditPassEvent",
|
606
692
|
"MessageAuditRejectEvent",
|
@@ -632,4 +718,14 @@ __all__ = [
|
|
632
718
|
"OpenForumPostDeleteEvent",
|
633
719
|
"OpenForumReplyCreateEvent",
|
634
720
|
"OpenForumReplyDeleteEvent",
|
721
|
+
"FriendRobotEvent",
|
722
|
+
"FriendAddEvent",
|
723
|
+
"FriendDelEvent",
|
724
|
+
"C2CMsgRejectEvent",
|
725
|
+
"C2CMsgReceiveEvent",
|
726
|
+
"GroupRobotEvent",
|
727
|
+
"GroupAddRobotEvent",
|
728
|
+
"GroupDelRobotEvent",
|
729
|
+
"GroupMsgRejectEvent",
|
730
|
+
"GroupMsgReceiveEvent",
|
635
731
|
]
|
@@ -34,11 +34,11 @@ class MessageSegment(BaseMessageSegment["Message"]):
|
|
34
34
|
return Emoji("emoji", data={"id": id})
|
35
35
|
|
36
36
|
@staticmethod
|
37
|
-
def mention_user(user_id:
|
37
|
+
def mention_user(user_id: str) -> "MentionUser":
|
38
38
|
return MentionUser("mention_user", {"user_id": str(user_id)})
|
39
39
|
|
40
40
|
@staticmethod
|
41
|
-
def mention_channel(channel_id:
|
41
|
+
def mention_channel(channel_id: str) -> "MentionChannel":
|
42
42
|
return MentionChannel("mention_channel", {"channel_id": str(channel_id)})
|
43
43
|
|
44
44
|
@staticmethod
|
@@ -106,6 +106,22 @@ class MessageSegment(BaseMessageSegment["Message"]):
|
|
106
106
|
},
|
107
107
|
)
|
108
108
|
|
109
|
+
@override
|
110
|
+
def __add__(
|
111
|
+
self, other: Union[str, "MessageSegment", Iterable["MessageSegment"]]
|
112
|
+
) -> "Message":
|
113
|
+
return Message(self) + (
|
114
|
+
MessageSegment.text(other) if isinstance(other, str) else other
|
115
|
+
)
|
116
|
+
|
117
|
+
@override
|
118
|
+
def __radd__(
|
119
|
+
self, other: Union[str, "MessageSegment", Iterable["MessageSegment"]]
|
120
|
+
) -> "Message":
|
121
|
+
return (
|
122
|
+
MessageSegment.text(other) if isinstance(other, str) else Message(other)
|
123
|
+
) + self
|
124
|
+
|
109
125
|
@override
|
110
126
|
def is_text(self) -> bool:
|
111
127
|
return self.type == "text"
|
@@ -73,8 +73,8 @@ class Channel(BaseModel):
|
|
73
73
|
position: int
|
74
74
|
parent_id: Optional[str] = None
|
75
75
|
owner_id: Optional[str] = None
|
76
|
-
private_type: Union[PrivateType, int]
|
77
|
-
speak_permission: Union[SpeakPermission, int]
|
76
|
+
private_type: Optional[Union[PrivateType, int]] = None
|
77
|
+
speak_permission: Optional[Union[SpeakPermission, int]] = None
|
78
78
|
application_id: Optional[str] = None
|
79
79
|
permissions: Optional[int] = None
|
80
80
|
|
@@ -83,7 +83,7 @@ class Channel(BaseModel):
|
|
83
83
|
class Member(BaseModel):
|
84
84
|
user: Optional[User] = None
|
85
85
|
nick: Optional[str] = None
|
86
|
-
roles: List[str]
|
86
|
+
roles: Optional[List[str]] = None
|
87
87
|
joined_at: datetime
|
88
88
|
|
89
89
|
|
@@ -300,8 +300,16 @@ class TextElem(BaseModel):
|
|
300
300
|
props: Optional[TextProps] = None
|
301
301
|
|
302
302
|
|
303
|
+
class PlatImage(BaseModel):
|
304
|
+
url: Optional[str] = None
|
305
|
+
width: Optional[int] = None
|
306
|
+
height: Optional[int] = None
|
307
|
+
image_id: Optional[str] = None
|
308
|
+
|
309
|
+
|
303
310
|
class ImageElem(BaseModel):
|
304
|
-
|
311
|
+
plat_image: Optional[PlatImage] = None
|
312
|
+
third_url: Optional[str] = None
|
305
313
|
width_percent: Optional[float] = None
|
306
314
|
|
307
315
|
|
@@ -1,5 +1,5 @@
|
|
1
1
|
from datetime import datetime
|
2
|
-
from typing import Literal, Optional
|
2
|
+
from typing import List, Literal, Optional
|
3
3
|
|
4
4
|
from pydantic import BaseModel
|
5
5
|
|
@@ -28,6 +28,16 @@ class PostGroupFilesReturn(BaseModel):
|
|
28
28
|
timestamp: Optional[datetime] = None
|
29
29
|
|
30
30
|
|
31
|
+
class GroupMember(BaseModel):
|
32
|
+
member_openid: str
|
33
|
+
join_timestamp: datetime
|
34
|
+
|
35
|
+
|
36
|
+
class PostGroupMembersReturn(BaseModel):
|
37
|
+
members: List[GroupMember]
|
38
|
+
next_index: Optional[int] = None
|
39
|
+
|
40
|
+
|
31
41
|
# Interaction Event
|
32
42
|
class ButtonInteractionContent(BaseModel):
|
33
43
|
user_id: str
|
@@ -58,6 +68,8 @@ __all__ = [
|
|
58
68
|
"PostC2CMessagesReturn",
|
59
69
|
"PostGroupMessagesReturn",
|
60
70
|
"PostC2CFilesReturn",
|
71
|
+
"GroupMember",
|
72
|
+
"PostGroupMembersReturn",
|
61
73
|
"PostGroupFilesReturn",
|
62
74
|
"ButtonInteractionContent",
|
63
75
|
"ButtonInteractionData",
|
@@ -8,15 +8,15 @@ from .event import MessageCreateEvent, AtMessageCreateEvent
|
|
8
8
|
async def _guild_channel_admin(
|
9
9
|
event: Union[AtMessageCreateEvent, MessageCreateEvent]
|
10
10
|
) -> bool:
|
11
|
-
return 5 in getattr(event.member, "roles", ())
|
11
|
+
return "5" in getattr(event.member, "roles", ())
|
12
12
|
|
13
13
|
|
14
14
|
async def _guild_admin(event: Union[AtMessageCreateEvent, MessageCreateEvent]) -> bool:
|
15
|
-
return 2 in getattr(event.member, "roles", ())
|
15
|
+
return "2" in getattr(event.member, "roles", ())
|
16
16
|
|
17
17
|
|
18
18
|
async def _guild_owner(event: Union[AtMessageCreateEvent, MessageCreateEvent]) -> bool:
|
19
|
-
return 4 in getattr(event.member, "roles", ())
|
19
|
+
return "4" in getattr(event.member, "roles", ())
|
20
20
|
|
21
21
|
|
22
22
|
GUILD_CHANNEL_ADMIN: Permission = Permission(_guild_channel_admin)
|
@@ -1,6 +1,6 @@
|
|
1
1
|
[tool.poetry]
|
2
2
|
name = "nonebot-adapter-qq"
|
3
|
-
version = "1.0.
|
3
|
+
version = "1.0.1"
|
4
4
|
description = "QQ adapter for nonebot2"
|
5
5
|
authors = ["yanyongyu <yyy@nonebot.dev>"]
|
6
6
|
license = "MIT"
|
@@ -20,16 +20,17 @@ packages = [{ include = "nonebot" }]
|
|
20
20
|
|
21
21
|
[tool.poetry.dependencies]
|
22
22
|
python = "^3.8"
|
23
|
+
yarl = "^1.9.0"
|
23
24
|
pydantic = "^1.9.0"
|
24
25
|
nonebot2 = "^2.1.0"
|
25
26
|
typing-extensions = ">=4.4.0, <5.0.0"
|
26
27
|
|
27
28
|
[tool.poetry.group.dev.dependencies]
|
29
|
+
ruff = "^0.1.0"
|
28
30
|
isort = "^5.10.1"
|
29
31
|
black = "^23.1.0"
|
30
32
|
nonemoji = "^0.1.3"
|
31
33
|
pre-commit = "^3.3.0"
|
32
|
-
ruff = ">=0.0.282, <0.1.0"
|
33
34
|
|
34
35
|
[tool.black]
|
35
36
|
line-length = 88
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
{nonebot_adapter_qq-1.0.0 → nonebot_adapter_qq-1.0.1}/nonebot/adapters/qq/models/__init__.py
RENAMED
File without changes
|
{nonebot_adapter_qq-1.0.0 → nonebot_adapter_qq-1.0.1}/nonebot/adapters/qq/models/_transformer.py
RENAMED
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|