Skip to content

Commit f62fa98

Browse files
RF-Tar-Railtwyapx
andauthored
fix: proto_decode & proto_field (#31)
* fix: typing * feat: proto_field(default_factory) * fix: remove unused import * Update version.py --------- Co-authored-by: nullcat <[email protected]>
1 parent 9b21b79 commit f62fa98

37 files changed

+256
-212
lines changed

lagrange/__init__.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,8 @@
22
import asyncio
33

44
from .client.client import Client as Client
5-
from .client.server_push.msg import msg_push_handler
6-
from .client.server_push.service import server_kick_handler
5+
# from .client.server_push.msg import msg_push_handler
6+
# from .client.server_push.service import server_kick_handler
77
from .utils.log import log as log
88
from .utils.log import install_loguru as install_loguru
99
from .utils.sign import sign_provider

lagrange/client/base.py

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
import asyncio
22
import hashlib
33
import time
4-
from typing import Callable, Coroutine, Dict, Optional, Tuple, Union, overload
4+
from typing import Callable, Optional, Union, overload
5+
from collections.abc import Coroutine
56

67
from typing_extensions import Literal
78

@@ -60,7 +61,7 @@ def __init__(
6061
self._captcha_info = ["", "", ""] # ticket, rand_str, aid
6162

6263
self._server_push_queue: asyncio.Queue[SSOPacket] = asyncio.Queue()
63-
self._tasks: Dict[str, asyncio.Task] = {}
64+
self._tasks: dict[str, asyncio.Task] = {}
6465
self._network = ClientNetwork(
6566
sig_info,
6667
self._server_push_queue,
@@ -70,8 +71,8 @@ def __init__(
7071
)
7172
self._sign_provider = sign_provider
7273

73-
self._t106 = bytes()
74-
self._t16a = bytes()
74+
self._t106 = b""
75+
self._t16a = b""
7576

7677
self._online = asyncio.Event()
7778

@@ -214,7 +215,7 @@ async def send_uni_packet(self, cmd, buf, send_only: bool = False, timeout=10):
214215
return await self._network.send(packet, wait_seq=-1, timeout=timeout)
215216
return await self._network.send(packet, wait_seq=seq, timeout=timeout)
216217

217-
async def fetch_qrcode(self) -> Union[int, Tuple[bytes, str]]:
218+
async def fetch_qrcode(self) -> Union[int, tuple[bytes, str]]:
218219
tlv = QrCodeTlvBuilder()
219220
body = (
220221
PacketBuilder()

lagrange/client/client.py

Lines changed: 23 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,12 @@
55
from typing import (
66
BinaryIO,
77
Callable,
8-
Coroutine,
9-
List,
108
Optional,
119
Union,
1210
overload,
1311
Literal,
1412
)
13+
from collections.abc import Coroutine
1514

1615
from lagrange.info import AppInfo, DeviceInfo, SigInfo
1716
from lagrange.pb.message.msg_push import MsgPushBody
@@ -176,7 +175,7 @@ async def send_oidb_svc(
176175
rsp = OidbResponse.decode(
177176
(
178177
await self.send_uni_packet(
179-
"OidbSvcTrpcTcp.0x{:0>2X}_{}".format(cmd, sub_cmd),
178+
f"OidbSvcTrpcTcp.0x{cmd:0>2X}_{sub_cmd}",
180179
OidbRequest(
181180
cmd=cmd, sub_cmd=sub_cmd, data=bytes(buf), is_uid=is_uid
182181
).encode(),
@@ -219,15 +218,15 @@ async def _send_msg_raw(self, pb: dict, *, grp_id=0, uid="") -> SendMsgRsp:
219218
packet = await self.send_uni_packet("MessageSvc.PbSendMsg", proto_encode(body))
220219
return SendMsgRsp.decode(packet.data)
221220

222-
async def send_grp_msg(self, msg_chain: List[Element], grp_id: int) -> int:
221+
async def send_grp_msg(self, msg_chain: list[Element], grp_id: int) -> int:
223222
result = await self._send_msg_raw(
224223
{1: build_message(msg_chain).encode()}, grp_id=grp_id
225224
)
226225
if result.ret_code:
227226
raise AssertionError(result.ret_code, result.err_msg)
228227
return result.seq
229228

230-
async def send_friend_msg(self, msg_chain: List[Element], uid: str) -> int:
229+
async def send_friend_msg(self, msg_chain: list[Element], uid: str) -> int:
231230
result = await self._send_msg_raw(
232231
{1: build_message(msg_chain).encode()}, uid=uid
233232
)
@@ -257,7 +256,7 @@ async def upload_grp_audio(self, voice: BinaryIO, grp_id: int) -> Audio:
257256
async def upload_friend_audio(self, voice: BinaryIO, uid: str) -> Audio:
258257
return await self._highway.upload_voice(voice, uid=uid)
259258

260-
async def fetch_audio_url(self, file_key: str, uid=None, gid=None):
259+
async def fetch_audio_url(self, file_key: str, gid: int = 0, uid: str = ""):
261260
return await self._highway.get_audio_down_url(file_key, uid=uid, gid=gid)
262261

263262
async def down_grp_audio(self, audio: Audio, grp_id: int) -> BytesIO:
@@ -267,7 +266,7 @@ async def down_friend_audio(self, audio: Audio) -> BytesIO:
267266
return await self._highway.download_audio(audio, uid=self.uid)
268267

269268
async def fetch_image_url(
270-
self, bus_type: Literal[10, 20], node: "IndexNode", uid=None, gid=None
269+
self, bus_type: Literal[10, 20], node: "IndexNode", gid: int = 0, uid: str = ""
271270
):
272271
if bus_type == 10:
273272
return await self._get_pri_img_url(uid, node)
@@ -327,7 +326,7 @@ async def get_grp_members(
327326

328327
async def get_grp_msg(
329328
self, grp_id: int, start: int, end: int = 0, filter_deleted_msg=True
330-
) -> List[GroupMessage]:
329+
) -> list[GroupMessage]:
331330
if not end:
332331
end = start
333332
payload = GetGrpMsgRsp.decode(
@@ -354,9 +353,9 @@ async def get_grp_msg(
354353
return [*filter(lambda msg: msg.rand != -1, rsp)]
355354
return rsp
356355

357-
async def get_friend_list(self) -> List[BotFriend]:
358-
nextuin_cache: List[GetFriendListUin] = []
359-
rsp: List[BotFriend] = []
356+
async def get_friend_list(self) -> list[BotFriend]:
357+
nextuin_cache: list[GetFriendListUin] = []
358+
rsp: list[BotFriend] = []
360359
frist_send = GetFriendListRsp.decode(
361360
(await self.send_oidb_svc(0xFD4, 1, PBGetFriendListRequest().encode())).data
362361
)
@@ -416,7 +415,7 @@ async def recall_grp_msg(self, grp_id: int, seq: int):
416415
PBGroupRecallRequest.build(grp_id, seq).encode(),
417416
)
418417
result = proto_decode(payload.data)
419-
if result[2] != b"Success":
418+
if result.into(2, bytes) != b"Success":
420419
raise AssertionError(result)
421420

422421
async def rename_grp_name(self, grp_id: int, name: str) -> int: # not test
@@ -550,11 +549,11 @@ async def set_grp_request(
550549
async def get_user_info(self, uid: str) -> UserInfo: ...
551550

552551
@overload
553-
async def get_user_info(self, uid: List[str]) -> List[UserInfo]: ...
552+
async def get_user_info(self, uid: list[str]) -> list[UserInfo]: ...
554553

555554
async def get_user_info(
556-
self, uid: Union[str, List[str]]
557-
) -> Union[UserInfo, List[UserInfo]]:
555+
self, uid: Union[str, list[str]]
556+
) -> Union[UserInfo, list[UserInfo]]:
558557
if isinstance(uid, str):
559558
uid = [uid]
560559
rsp = GetInfoFromUidRsp.decode(
@@ -615,7 +614,7 @@ def _gtk_1(self, skey_or_pskey: str):
615614
_hash += (_hash << 5) + ord(skey_or_pskey[i])
616615
return _hash & 2147483647
617616

618-
async def get_cookies(self, domains: list[str]) -> List[str]:
617+
async def get_cookies(self, domains: list[str]) -> list[str]:
619618
"""pskey"""
620619
return [
621620
i.value.decode()
@@ -631,8 +630,14 @@ async def get_cookies(self, domains: list[str]) -> List[str]:
631630
]
632631

633632
async def get_skey(self) -> str:
634-
jump = "https%3A%2F%2Fh5.qzone.qq.com%2Fqqnt%2Fqzoneinpcqq%2Ffriend%3Frefresh%3D0%26clientuin%3D0%26darkMode%3D0&keyindex=19&random=2599"
635-
url = f"https://ssl.ptlogin2.qq.com/jump?ptlang=1033&clientuin={self.uin}&clientkey={await self._get_client_key()}&u1={jump}"
633+
jump = (
634+
"https%3A%2F%2Fh5.qzone.qq.com%2Fqqnt%2Fqzoneinpcqq%2F"
635+
"friend%3Frefresh%3D0%26clientuin%3D0%26darkMode%3D0&keyindex=19&random=2599"
636+
)
637+
url = (
638+
f"https://ssl.ptlogin2.qq.com/jump?ptlang=1033&clientuin={self.uin}"
639+
f"&clientkey={await self._get_client_key()}&u1={jump}"
640+
)
636641
resp = await HttpCat.request("GET", url, follow_redirect=False)
637642
return resp.cookies["skey"]
638643

lagrange/client/event.py

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import asyncio
2-
from typing import TYPE_CHECKING, Any, Callable, Awaitable, Dict, Set, Type, TypeVar
2+
from typing import TYPE_CHECKING, Any, Callable, TypeVar
3+
from collections.abc import Awaitable
34

45
from lagrange.utils.log import log
56

@@ -13,26 +14,26 @@
1314

1415
class Events:
1516
def __init__(self):
16-
self._task_group: Set[asyncio.Task] = set()
17-
self._handle_map: Dict[Type["BaseEvent"], EVENT_HANDLER] = {}
17+
self._task_group: set[asyncio.Task] = set()
18+
self._handle_map: dict[type["BaseEvent"], EVENT_HANDLER] = {}
1819

19-
def subscribe(self, event: Type[T], handler: EVENT_HANDLER[T]):
20+
def subscribe(self, event: type[T], handler: EVENT_HANDLER[T]):
2021
if event not in self._handle_map:
2122
self._handle_map[event] = handler
2223
else:
2324
raise AssertionError(
24-
"Event already subscribed to {}".format(self._handle_map[event])
25+
f"Event already subscribed to {self._handle_map[event]}"
2526
)
2627

27-
def unsubscribe(self, event: Type["BaseEvent"]):
28+
def unsubscribe(self, event: type["BaseEvent"]):
2829
return self._handle_map.pop(event)
2930

3031
async def _task_exec(self, client: "Client", event: "BaseEvent", handler: EVENT_HANDLER):
3132
try:
3233
await handler(client, event)
3334
except Exception as e:
3435
log.root.error(
35-
"Unhandled exception on task {}".format(event), exc_info=e
36+
f"Unhandled exception on task {event}", exc_info=e
3637
)
3738

3839
def emit(self, event: "BaseEvent", client: "Client"):

lagrange/client/events/friend.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from __future__ import annotations
22

33
from dataclasses import dataclass
4-
from typing import TYPE_CHECKING, List
4+
from typing import TYPE_CHECKING
55
from . import BaseEvent
66

77
if TYPE_CHECKING:
@@ -22,4 +22,4 @@ class FriendMessage(FriendEvent):
2222
msg_id: int
2323
timestamp: int
2424
msg: str
25-
msg_chain: List[Element]
25+
msg_chain: list[Element]

lagrange/client/events/group.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from __future__ import annotations
22

33
from dataclasses import dataclass, field
4-
from typing import TYPE_CHECKING, List, Optional, Union, Dict
4+
from typing import TYPE_CHECKING
55

66
from . import BaseEvent
77

@@ -30,7 +30,7 @@ class GroupMessage(GroupEvent, MessageInfo):
3030
sub_id: int = field(repr=False) # client ver identify
3131
sender_type: int = field(repr=False)
3232
msg: str
33-
msg_chain: List[Element]
33+
msg_chain: list[Element]
3434

3535
@property
3636
def is_bot(self) -> bool:
@@ -48,7 +48,7 @@ class GroupNudge(GroupEvent):
4848
target_uin: int
4949
action: str
5050
suffix: str
51-
attrs: Dict[str, Union[str, int]] = field(repr=False)
51+
attrs: dict[str, str | int] = field(repr=False)
5252
attrs_xml: str = field(repr=False)
5353

5454

@@ -59,7 +59,7 @@ class GroupSign(GroupEvent):
5959
uin: int
6060
nickname: str
6161
timestamp: int
62-
attrs: Dict[str, Union[str, int]] = field(repr=False)
62+
attrs: dict[str, str | int] = field(repr=False)
6363
attrs_xml: str = field(repr=False)
6464

6565

@@ -75,8 +75,8 @@ class GroupMuteMember(GroupEvent):
7575
@dataclass
7676
class GroupMemberJoinRequest(GroupEvent):
7777
uid: str
78-
invitor_uid: Optional[str] = None
79-
answer: Optional[str] = None # 问题:(.*)答案:(.*)
78+
invitor_uid: str | None = None
79+
answer: str | None = None # 问题:(.*)答案:(.*)
8080

8181

8282
@dataclass
@@ -96,7 +96,7 @@ class GroupMemberQuit(GroupEvent):
9696
@property
9797
def is_kicked(self) -> bool:
9898
return self.exit_type in [3, 131]
99-
99+
100100
@property
101101
def is_kicked_self(self) -> bool:
102102
return self.exit_type == 3

lagrange/client/highway/encoders.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,8 +83,8 @@ def encode_upload_img_req(
8383
fn = f"{md5.hex().upper()}.{info.name or 'jpg'}"
8484
c2c_info = None
8585
grp_info = None
86-
c2c_pb = bytes()
87-
grp_pb = bytes()
86+
c2c_pb = b""
87+
grp_pb = b""
8888
if grp_id:
8989
scene_type = 2
9090
grp_info = GroupInfo(grp_id=grp_id)

lagrange/client/highway/frame.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import struct
2-
from typing import BinaryIO, Tuple
2+
from typing import BinaryIO
33

44
from lagrange.pb.highway.head import HighwayTransRespHead
55

@@ -16,7 +16,7 @@ def write_frame(head: bytes, body: bytes) -> bytes:
1616

1717
def read_frame(
1818
reader: BinaryIO,
19-
) -> Tuple[HighwayTransRespHead, bytes]:
19+
) -> tuple[HighwayTransRespHead, bytes]:
2020
head = reader.read(9)
2121
if len(head) != 9 and head[0] != 0x28:
2222
raise ValueError("Invalid frame head", head)

0 commit comments

Comments
 (0)