nonebot-adapter-qq 1.0.0__py3-none-any.whl → 1.0.1__py3-none-any.whl

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.
@@ -2,6 +2,16 @@ from .event import *
2
2
  from .permission import *
3
3
  from .bot import Bot as Bot
4
4
  from .utils import log as log
5
+ from .utils import escape as escape
5
6
  from .adapter import Adapter as Adapter
6
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
7
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, # type: ignore
104
- message_id=event.message_reference.message_id, # type: ignore
104
+ channel_id=event.channel_id,
105
+ message_id=event.message_reference.message_id,
105
106
  )
106
- if event.reply.message.author.id == bot.self_info.id: # type: ignore
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 [user.id for user in event.mentions]
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 segment.type == "mention_user" and segment.data.get("user_id") == str(
125
- bot.self_info.id
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: int) -> "MentionUser":
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: int) -> "MentionChannel":
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
- third_url: str
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
  Metadata-Version: 2.1
2
2
  Name: nonebot-adapter-qq
3
- Version: 1.0.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,20 @@
1
+ nonebot/adapters/qq/__init__.py,sha256=u2bR9HLdgIEV22nu2VJeUFscklTUj8DN4650q0k5SHw,787
2
+ nonebot/adapters/qq/adapter.py,sha256=Y9fLS_mTI02WL5OoUKQ4qMQG5YM2OA9OguV5tPCzs9A,14246
3
+ nonebot/adapters/qq/bot.py,sha256=6BwS9fZrsMamLYMS6tvAJmNZfevqwyeBLjVhLhxzSaw,55006
4
+ nonebot/adapters/qq/config.py,sha256=9EbzpCFnWyMNXWlTZmx1WYKbEl1I9KMrTf9bIf9r7dg,1979
5
+ nonebot/adapters/qq/event.py,sha256=_uYE34D_qLzVKI1cRuyTUYHA1ylV5oK6-7Gp-BdB4mU,17286
6
+ nonebot/adapters/qq/exception.py,sha256=1imFgVyt0guQAjt10crZuTGWzYAzZip37W0ii3x1btA,2257
7
+ nonebot/adapters/qq/message.py,sha256=okWneGol_tvxvxFjUzOhuoyF6DKuy1Cc2AfFt9VhwW0,9208
8
+ nonebot/adapters/qq/models/__init__.py,sha256=AahR-O5B_1c8dMXHpDH68o4qojhF3vf4UPDGyH2MKjA,537
9
+ nonebot/adapters/qq/models/_transformer.py,sha256=Zrhno7aJKHkLnljFuyivndRKdrxtqZZaoiXOFx0JQdU,3416
10
+ nonebot/adapters/qq/models/common.py,sha256=rAhR3gJVKJVgmFky1jL68H1RPCSQlbkZgIgXYDkVIuc,2817
11
+ nonebot/adapters/qq/models/guild.py,sha256=4EZHvpzfPKwapCTAmI22zWaHtL0AZccIszQH3hTxoSo,11666
12
+ nonebot/adapters/qq/models/payload.py,sha256=dg9AYDI3YjWZ3bT-mn9596glszBwmI8i751sMY_maSM,2281
13
+ nonebot/adapters/qq/models/qq.py,sha256=Yr_0JKqqOXFusDzezFfHvEU2kUuojezsUVzq-JuSwBM,1582
14
+ nonebot/adapters/qq/permission.py,sha256=0aedypl6xymhAV3UkW0vlvHTBkJeDmOef3SxG2tPcHQ,988
15
+ nonebot/adapters/qq/store.py,sha256=X-NeSVCrxngQDPo9IXKWehERNa4sefdrYrZn5-yucF4,874
16
+ nonebot/adapters/qq/utils.py,sha256=bkHzMKYS5q7FadYfcwnMTCqRNTomOolRWrr4gow11hk,1576
17
+ nonebot_adapter_qq-1.0.1.dist-info/LICENSE,sha256=4EZBnkZPQYBvtO2KFGaUQHTO8nZ26pGeaCFchdBq_AE,1064
18
+ nonebot_adapter_qq-1.0.1.dist-info/METADATA,sha256=q3DY9FeCEFZzlkxqBoCX-xYnIVnUtctum1j5bHM-IP0,2261
19
+ nonebot_adapter_qq-1.0.1.dist-info/WHEEL,sha256=d2fvjOD7sXsVzChCqf0Ty0JbHKBaLYwDbGQDwQTnJ50,88
20
+ nonebot_adapter_qq-1.0.1.dist-info/RECORD,,
@@ -1,20 +0,0 @@
1
- nonebot/adapters/qq/__init__.py,sha256=0d_Pnv0dyePEjIncdf1eOpdecgUen93l4m3vnQwEdCk,239
2
- nonebot/adapters/qq/adapter.py,sha256=Y9fLS_mTI02WL5OoUKQ4qMQG5YM2OA9OguV5tPCzs9A,14246
3
- nonebot/adapters/qq/bot.py,sha256=gD33i9AjgS8YQLG1ZvlA501wgwWs949aImo4Y2S-Sjc,54459
4
- nonebot/adapters/qq/config.py,sha256=9EbzpCFnWyMNXWlTZmx1WYKbEl1I9KMrTf9bIf9r7dg,1979
5
- nonebot/adapters/qq/event.py,sha256=UR61GL1vDOXITLAw95UqgGaafbp3jL27-9DhGMFGpSw,15118
6
- nonebot/adapters/qq/exception.py,sha256=1imFgVyt0guQAjt10crZuTGWzYAzZip37W0ii3x1btA,2257
7
- nonebot/adapters/qq/message.py,sha256=uV-oGE65xcmw7Vh-7PlkiCffMz_xlMSDP84Kojn-xuk,8709
8
- nonebot/adapters/qq/models/__init__.py,sha256=AahR-O5B_1c8dMXHpDH68o4qojhF3vf4UPDGyH2MKjA,537
9
- nonebot/adapters/qq/models/_transformer.py,sha256=Zrhno7aJKHkLnljFuyivndRKdrxtqZZaoiXOFx0JQdU,3416
10
- nonebot/adapters/qq/models/common.py,sha256=rAhR3gJVKJVgmFky1jL68H1RPCSQlbkZgIgXYDkVIuc,2817
11
- nonebot/adapters/qq/models/guild.py,sha256=MbQMXNeQGZnKdxKGKykwOGEw7tIPP2d9l1eu8HXKPok,11395
12
- nonebot/adapters/qq/models/payload.py,sha256=dg9AYDI3YjWZ3bT-mn9596glszBwmI8i751sMY_maSM,2281
13
- nonebot/adapters/qq/models/qq.py,sha256=etDQwVvNtlBbyOAlykSsnCcEy41qNdY7C1Jkq27d_T8,1332
14
- nonebot/adapters/qq/permission.py,sha256=Kza9HVDLaWJZaQAxF7YRDT_DJXOsDaaaoxpWieGSHeA,982
15
- nonebot/adapters/qq/store.py,sha256=X-NeSVCrxngQDPo9IXKWehERNa4sefdrYrZn5-yucF4,874
16
- nonebot/adapters/qq/utils.py,sha256=bkHzMKYS5q7FadYfcwnMTCqRNTomOolRWrr4gow11hk,1576
17
- nonebot_adapter_qq-1.0.0.dist-info/LICENSE,sha256=4EZBnkZPQYBvtO2KFGaUQHTO8nZ26pGeaCFchdBq_AE,1064
18
- nonebot_adapter_qq-1.0.0.dist-info/METADATA,sha256=9DQKhQdLnjYZ-91XlZU-fumNAXuUq1V_8LRV85FCjxs,2224
19
- nonebot_adapter_qq-1.0.0.dist-info/WHEEL,sha256=d2fvjOD7sXsVzChCqf0Ty0JbHKBaLYwDbGQDwQTnJ50,88
20
- nonebot_adapter_qq-1.0.0.dist-info/RECORD,,