Skip to content

Commit 727ed73

Browse files
authored
feat: 优化gateway, api, flags, http中的部分逻辑构建与冗余代码
feat: 优化gateway, api, flags, http中的部分逻辑构建与冗余代码
2 parents 06afb53 + 5d664dd commit 727ed73

File tree

6 files changed

+63
-108
lines changed

6 files changed

+63
-108
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ class MyClient(botpy.Client):
109109
├── demo_at_reply.py # 机器人at被动回复async示例
110110
├── demo_at_reply_ark.py # 机器人at被动回复ark消息示例
111111
├── demo_at_reply_embed.py # 机器人at被动回复embed消息示例
112+
├── demo_at_reply_command.py # 机器人at被动使用Command指令装饰器回复消息示例
112113
├── demo_at_reply_file_data.py # 机器人at被动回复本地图片消息示例
113114
├── demo_at_reply_keyboard.py # 机器人at被动回复md带内嵌键盘的示例
114115
├── demo_at_reply_markdown.py # 机器人at被动回复md消息示例

README.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ botpy
139139
├── demo_at_reply.py # 机器人at被动回复async示例
140140
├── demo_at_reply_ark.py # 机器人at被动回复ark消息示例
141141
├── demo_at_reply_embed.py # 机器人at被动回复embed消息示例
142+
├── demo_at_reply_command.py # 机器人at被动使用Command指令装饰器回复消息示例
142143
├── demo_at_reply_file_data.py # 机器人at被动回复本地图片消息示例
143144
├── demo_at_reply_keyboard.py # 机器人at被动回复md带内嵌键盘的示例
144145
├── demo_at_reply_markdown.py # 机器人at被动回复md消息示例

botpy/api.py

Lines changed: 35 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
# 异步api
44

55
from io import BufferedReader
6-
from typing import Any, List, Dict, Union, BinaryIO
6+
from typing import Any, List, Union, BinaryIO
77

88
from .flags import Permission
99
from .http import BotHttp, Route
@@ -23,24 +23,6 @@
2323
)
2424

2525

26-
def _handle_message_parameters(
27-
content: str = None,
28-
embed: message.Embed = None,
29-
ark: message.Ark = None,
30-
message_reference: message.Reference = None,
31-
image: str = None,
32-
file_image: Union[bytes, BinaryIO, str] = None,
33-
msg_id: str = None,
34-
event_id: str = None,
35-
markdown: message.MarkdownPayload = None,
36-
keyboard: message.Keyboard = None,
37-
) -> Dict:
38-
payload = {}
39-
params = locals()
40-
payload.update({k: v for k, v in params.items() if v})
41-
return payload
42-
43-
4426
class BotAPI:
4527
"""
4628
机器人相关的API接口类
@@ -101,10 +83,8 @@ async def create_guild_role(self, guild_id: str, **fields: Any) -> guild.GuildRo
10183
Returns:
10284
class:GuildRole
10385
"""
104-
valid_keys = ("name", "color", "hoist")
105-
payload = {k: v for k, v in fields.items() if k in valid_keys}
10686
route = Route("POST", "/guilds/{guild_id}/roles", guild_id=guild_id)
107-
return await self._http.request(route, json=payload)
87+
return await self._http.request(route, json=fields)
10888

10989
async def update_guild_role(self, guild_id: str, role_id: str, **fields: Any) -> guild.GuildRole:
11090
"""
@@ -122,10 +102,8 @@ async def update_guild_role(self, guild_id: str, role_id: str, **fields: Any) ->
122102
Returns:
123103
class:GuildRole
124104
"""
125-
valid_keys = ("name", "color", "hoist")
126-
payload = {k: v for k, v in fields.items() if k in valid_keys}
127105
route = Route("PATCH", "/guilds/{guild_id}/roles/{role_id}", guild_id=guild_id, role_id=role_id)
128-
return await self._http.request(route, json=payload)
106+
return await self._http.request(route, json=fields)
129107

130108
async def delete_guild_role(self, guild_id: str, role_id: str) -> str:
131109
"""
@@ -160,9 +138,7 @@ async def create_guild_role_member(
160138
Returns:
161139
成功执行返回`None`。
162140
"""
163-
payload = {}
164-
if channel_id:
165-
payload = {"channel": {"id": channel_id}}
141+
payload = {"channel": {"id": channel_id}}
166142

167143
route = Route(
168144
"PUT",
@@ -187,9 +163,7 @@ async def delete_guild_role_member(self, guild_id: str, role_id: str, user_id: s
187163
Returns:
188164
成功执行返回`None`。
189165
"""
190-
payload = {}
191-
if channel_id:
192-
payload = {"channel": {"id": channel_id}}
166+
payload = {"channel": {"id": channel_id}}
193167

194168
route = Route(
195169
"DELETE",
@@ -234,12 +208,7 @@ async def get_guild_members(self, guild_id: str, after: str = "0", limit: int =
234208
Returns:
235209
user.Member 对象的列表。
236210
"""
237-
params: Dict[str, Any] = {}
238-
239-
if after is not None:
240-
params["after"] = after
241-
if limit is not None:
242-
params["limit"] = limit
211+
params = {"after": after, "limit": limit}
243212

244213
route = Route(
245214
"GET",
@@ -346,10 +315,8 @@ async def update_channel(self, channel_id: str, **fields) -> channel.ChannelPayl
346315
Returns:Dict:
347316
channel.Channel
348317
"""
349-
valid_keys = ("name", "position", "parent_id", "private_type", "speak_permission")
350-
payload = {k: v for k, v in fields.items() if k in valid_keys and v}
351318
route = Route("PATCH", "/channels/{channel_id}", channel_id=channel_id)
352-
return await self._http.request(route, json=payload)
319+
return await self._http.request(route, json=fields)
353320

354321
async def delete_channel(self, channel_id: str) -> channel.ChannelPayload:
355322
"""
@@ -396,11 +363,7 @@ async def update_channel_user_permissions(
396363
Returns:
397364
成功执行返回`None`。
398365
"""
399-
payload = {}
400-
if add is not None:
401-
payload.update({"add": str(add.value)})
402-
if remove is not None:
403-
payload.update({"remove": str(remove.value)})
366+
payload = {"add": str(add.value) if add else None, "remove": str(remove.value) if remove else None}
404367

405368
route = Route(
406369
"PUT", "/channels/{channel_id}/members/{user_id}/permissions", channel_id=channel_id, user_id=user_id
@@ -438,11 +401,7 @@ async def update_channel_role_permissions(
438401
Returns:
439402
成功执行返回`None`。
440403
"""
441-
payload = {}
442-
if add is not None:
443-
payload.update({"add": str(add.value)})
444-
if remove is not None:
445-
payload.update({"remove": str(remove.value)})
404+
payload = {"add": str(add.value) if add else None, "remove": str(remove.value) if remove else None}
446405

447406
route = Route(
448407
"PUT", "/channels/{channel_id}/roles/{role_id}/permissions", channel_id=channel_id, role_id=role_id
@@ -511,9 +470,9 @@ async def post_message(
511470
elif isinstance(file_image, str):
512471
with open(file_image, "rb") as img:
513472
file_image = img.read()
514-
payload = _handle_message_parameters(
515-
content, embed, ark, message_reference, image, file_image, msg_id, event_id, markdown, keyboard
516-
)
473+
payload = locals()
474+
payload.pop("self", None)
475+
payload.pop("img", None)
517476
route = Route("POST", "/channels/{channel_id}/messages", channel_id=channel_id)
518477
return await self._http.request(route, json=payload)
519478

@@ -533,7 +492,7 @@ async def recall_message(self, channel_id: str, message_id: str, hidetip: bool =
533492
Returns:
534493
成功执行返回`None`。
535494
"""
536-
params = {"hidetip": "true" if hidetip else "false"}
495+
params = {"hidetip": str(hidetip).lower()}
537496

538497
route = Route(
539498
"DELETE",
@@ -631,11 +590,11 @@ async def post_dms(
631590
elif isinstance(file_image, str):
632591
with open(file_image, "rb") as img:
633592
file_image = img.read()
634-
send_payload = _handle_message_parameters(
635-
content, embed, ark, message_reference, image, file_image, msg_id, event_id, markdown, keyboard
636-
)
593+
payload = locals()
594+
payload.pop("self", None)
595+
payload.pop("img", None)
637596
route = Route("POST", "/dms/{guild_id}/messages", guild_id=guild_id)
638-
return await self._http.request(route, json=send_payload)
597+
return await self._http.request(route, json=payload)
639598

640599
# 音频接口
641600
async def update_audio(self, channel_id: str, audio_control: audio.AudioControl) -> str:
@@ -714,9 +673,9 @@ async def me_guilds(self, guild_id: str = None, limit: int = 100, desc: bool = F
714673
"""
715674
params = {"limit": limit}
716675
if desc and guild_id:
717-
params.update({"before": guild_id})
676+
params["before"] = guild_id
718677
elif guild_id:
719-
params.update({"after": guild_id})
678+
params["after"] = guild_id
720679

721680
route = Route("GET", "/users/@me/guilds")
722681
return await self._http.request(route, params=params)
@@ -748,7 +707,10 @@ async def mute_all(self, guild_id: str, mute_end_timestamp: str = None, mute_sec
748707
Returns:
749708
成功执行返回`None`。
750709
"""
751-
payload = {k: v for k, v in locals().items() if k in ["mute_end_timestamp", "mute_seconds"] and v}
710+
payload = {
711+
"mute_end_timestamp": mute_end_timestamp,
712+
"mute_seconds": mute_seconds
713+
}
752714
route = Route("PATCH", "/guilds/{guild_id}/mute", guild_id=guild_id)
753715
return await self._http.request(route, json=payload)
754716

@@ -787,7 +749,10 @@ async def mute_member(
787749
Returns:
788750
成功执行返回`None`。
789751
"""
790-
payload = {k: v for k, v in locals().items() if k in ["mute_end_timestamp", "mute_seconds"] and v}
752+
payload = {
753+
"mute_end_timestamp": mute_end_timestamp,
754+
"mute_seconds": mute_seconds
755+
}
791756
route = Route("PATCH", "/guilds/{guild_id}/members/{user_id}/mute", guild_id=guild_id, user_id=user_id)
792757
return await self._http.request(route, json=payload)
793758

@@ -806,8 +771,11 @@ async def mute_multi_member(
806771
Returns:
807772
成功执行返回`None`。
808773
"""
809-
payload = {k: v for k, v in locals().items() if k in ["mute_end_timestamp", "mute_seconds"] and v}
810-
payload.update({"user_ids": user_ids})
774+
payload = {
775+
"mute_end_timestamp": mute_end_timestamp,
776+
"mute_seconds": mute_seconds,
777+
"user_ids": user_ids
778+
}
811779
route = Route("PATCH", "/guilds/{guild_id}/mute", guild_id=guild_id)
812780
return await self._http.request(route, json=payload)
813781

@@ -938,9 +906,7 @@ async def get_schedules(self, channel_id: str, since: str = None) -> List[schedu
938906
Returns:
939907
列表[schedule.Schedule]
940908
"""
941-
payload = {}
942-
if since:
943-
payload = {"since": since}
909+
payload = {"since": since}
944910
route = Route("GET", "/channels/{channel_id}/schedules", channel_id=channel_id)
945911
return await self._http.request(route, json=payload)
946912

@@ -1147,10 +1113,8 @@ async def get_reaction_users(
11471113
type=emoji_type,
11481114
id=emoji_id,
11491115
)
1150-
path = {"limit": limit}
1151-
if cookie:
1152-
path.update({"cookie": cookie})
1153-
return await self._http.request(route, params=path)
1116+
params = {"limit": limit, "cookie": cookie} if cookie else {"limit": limit}
1117+
return await self._http.request(route, params=params)
11541118

11551119
# 精华消息API
11561120
async def put_pin(self, channel_id: str, message_id: str) -> pins_message.PinsMessage:

botpy/flags.py

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -128,8 +128,7 @@ def __init__(self, **kwargs: bool) -> None:
128128
@classmethod
129129
def all(cls):
130130
"""打开所有事件的监听"""
131-
bits = max(cls.VALID_FLAGS.values()).bit_length()
132-
value = (1 << bits) - 1
131+
value = max(cls.VALID_FLAGS.values()) * 2 - 1
133132
self = cls.__new__(cls)
134133
self.value = value
135134
return self

botpy/gateway.py

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,7 @@
44
import traceback
55
from typing import Optional
66

7-
import aiohttp
8-
from aiohttp import WSMessage, ClientWebSocketResponse, TCPConnector
7+
from aiohttp import WSMessage, ClientWebSocketResponse, TCPConnector, ClientSession, WSMsgType
98
from ssl import SSLContext
109

1110
from . import logging
@@ -99,7 +98,7 @@ async def on_connected(self, ws: ClientWebSocketResponse):
9998
self._conn = ws
10099
if self._conn is None:
101100
raise Exception("[botpy] websocket连接失败")
102-
if self._session["session_id"] != "":
101+
if self._session["session_id"]:
103102
await self.ws_resume()
104103
else:
105104
await self.ws_identify()
@@ -111,28 +110,28 @@ async def ws_connect(self):
111110

112111
_log.info("[botpy] 启动中...")
113112
ws_url = self._session["url"]
114-
if ws_url == "":
113+
if not ws_url:
115114
raise Exception("[botpy] 会话url为空")
116115

117116
# adding SSLContext-containing connector to prevent SSL certificate verify failed error
118-
async with aiohttp.ClientSession(connector=TCPConnector(limit=10, ssl=SSLContext())) as session:
117+
async with ClientSession(connector=TCPConnector(limit=10, ssl=SSLContext())) as session:
119118
async with session.ws_connect(self._session["url"]) as ws_conn:
120119
while True:
121120
msg: WSMessage
122121
msg = await ws_conn.receive()
123-
if msg.type == aiohttp.WSMsgType.TEXT:
122+
if msg.type == WSMsgType.TEXT:
124123
await self.on_message(ws_conn, msg.data)
125-
elif msg.type == aiohttp.WSMsgType.ERROR:
124+
elif msg.type == WSMsgType.ERROR:
126125
await self.on_error(ws_conn.exception())
127-
elif msg.type == aiohttp.WSMsgType.CLOSED or msg.type == aiohttp.WSMsgType.CLOSE:
126+
elif msg.type == WSMsgType.CLOSED or msg.type == WSMsgType.CLOSE:
128127
await self.on_closed(ws_conn.close_code, msg.extra)
129128
if ws_conn.closed:
130129
_log.debug("[botpy] ws关闭, 停止接收消息!")
131130
break
132131

133132
async def ws_identify(self):
134133
"""websocket鉴权"""
135-
if self._session["intent"] == 0:
134+
if not self._session["intent"]:
136135
self._session["intent"] = 1
137136

138137
_log.info("[botpy] 鉴权中...")
@@ -230,5 +229,5 @@ async def _send_heart(self, interval):
230229
_log.debug("[botpy] ws连接已关闭, 心跳检测停止,ws对象: %s" % self._conn)
231230
return
232231

233-
await asyncio.sleep(interval)
234232
await self.send_msg(json.dumps(payload))
233+
await asyncio.sleep(interval)

0 commit comments

Comments
 (0)