Skip to content

Commit 0c8cc10

Browse files
committed
<onebot>[feat]support event: GroupBanNoticeEvent; [feat]support msg_chain: Quote(Receive) At
1 parent e9a45c6 commit 0c8cc10

File tree

11 files changed

+346
-44
lines changed

11 files changed

+346
-44
lines changed

README.markdown

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -58,9 +58,9 @@
5858
- [x] Image
5959
- [x] Audio
6060
- [ ] File
61-
- [ ] At
61+
- [x] At
6262
- [ ] MarketFace
63-
- [ ] Quote
63+
- [x] Quote (Receive Only)
6464

6565
## 事件
6666

@@ -75,10 +75,10 @@
7575
- [ ] GroupAdmin
7676
- [x] GroupDecrease
7777
- [ ] GroupIncrease
78-
- [ ] GroupBan
78+
- [x] GroupBan
7979
- [ ] FriendAdd
8080
- [x] GroupRecall
81-
- [ ] FriendRecall
81+
- [x] FriendRecall
8282
- [ ] PokeNotify
8383
- [ ] LuckyKingNotify
8484
- [ ] HonorNotify

app.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@
99
GroupRecall,
1010
GroupMemberQuit,
1111
GroupInvite,
12-
GroupMemberJoinRequest
12+
GroupMemberJoinRequest,
13+
GroupMuteMember
1314
)
1415
from lagrange.client.events.friend import (
1516
FriendMessage,
@@ -22,7 +23,8 @@
2223
GroupDecreaseEventHandler,
2324
GroupRecallEventHandler,
2425
GroupRequestEventHandler,
25-
FriendRecallEventHandler
26+
FriendRecallEventHandler,
27+
GroupBanEventHandler
2628
)
2729
from onebot.utils.database import db
2830
from onebot.utils.datamodels import UserInformation
@@ -73,4 +75,5 @@ async def handle_kick(client: "Client", event: "ServerKick"):
7375
lag.subscribe(GroupInvite, GroupRequestEventHandler)
7476
lag.subscribe(GroupMemberJoinRequest, GroupRequestEventHandler)
7577
lag.subscribe(FriendRecall, FriendRecallEventHandler)
78+
lag.subscribe(GroupMuteMember, GroupBanEventHandler)
7679
lag.subscribe(ServerKick, handle_kick)

onebot/communications/api.py

Lines changed: 15 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
from lagrange.client.client import Client, BotFriend
66
from lagrange.client.message.elems import Text
7+
from lagrange.client.message.types import Element
78
from lagrange.pb.service.group import GetGrpMemberInfoRspBody
89

910
from onebot.utils.message_segment import MessageSegment
@@ -33,7 +34,7 @@ async def send_group_msg(self, group_id: int, message: list | str, echo: str, us
3334
message = self.message_converter.parse_message(message, MessageSegment)
3435
message_ = await self.message_converter.convert_to_elements(message, group_id)
3536
elif isinstance(message, str):
36-
message_ = [Text(message)]
37+
message_: List[Element] = [Text(message)]
3738
message = message_
3839
try:
3940
seq = await self.client.send_grp_msg(msg_chain=message_, grp_id=group_id) # type: ignore
@@ -46,7 +47,7 @@ async def send_group_msg(self, group_id: int, message: list | str, echo: str, us
4647
uid = self.client.uid,
4748
seq = seq,
4849
grp_id = group_id,
49-
msg_chain = [json.dumps(element.__dict__, ensure_ascii=False) for element in message]
50+
msg_chain = [segment.__dict__ for segment in (await self.message_converter.convert_to_segments(message_, "grp", group_id=group_id))]
5051
)
5152
db.save(msg_content)
5253
return {"status": "ok", "retcode": 0, "data": {"message_id": message_id}, "echo": echo}
@@ -59,7 +60,7 @@ async def send_private_msg(self, user_id: int, message: list | str, echo: str, g
5960
message = self.message_converter.parse_message(message, MessageSegment)
6061
message_ = await self.message_converter.convert_to_elements(message, 0, str(uid))
6162
elif isinstance(message, str):
62-
message_ = [Text(message)]
63+
message_: List[Element] = [Text(message)]
6364
try:
6465
seq = await self.client.send_friend_msg(msg_chain=message_, uid=str(uid)) # type: ignore
6566
except AssertionError:
@@ -71,7 +72,7 @@ async def send_private_msg(self, user_id: int, message: list | str, echo: str, g
7172
uid = self.client.uid,
7273
seq = seq,
7374
grp_id = group_id,
74-
msg_chain = [(json.dumps(element.__dict__, ensure_ascii=False) for element in message)]
75+
msg_chain = [segment.__dict__ for segment in (await self.message_converter.convert_to_segments(message_, "grp", uid=str(uid)))]
7576
)
7677
db.save(msg_content)
7778
return {"status": "ok", "retcode": 0, "data": {"message_id": seq}, "echo": echo}
@@ -125,16 +126,19 @@ async def get_msg(self, message_id: int, echo: str) -> dict:
125126
if message_event is None:
126127
return {"status": "failed", "retcode": -1, "data": None, "echo": echo}
127128
data = {
128-
"message_type": "private",
129+
"message_type": "private" if message_event.grp_id == 0 else "group",
129130
"message_id": message_event.msg_id,
130131
"real_id": message_event.msg_id,
131-
"sender": GroupMessageSender(
132-
user_id = message_event.uin,
133-
nickname = message_event.nickname
134-
).model_dump(),
135-
"message": [json.loads(chain) for chain in message_event.msg_chain]
132+
"sender": self.message_converter.convert_to_dict(
133+
GroupMessageSender(
134+
user_id = message_event.uin,
135+
nickname = message_event.nickname
136+
)
137+
),
138+
"message": message_event.msg_chain,
139+
"time": message_event.time
136140
}
137-
return {"status": "failed", "retcode": 0, "data": data, "echo": echo}
141+
return {"status": "ok", "retcode": 0, "data": data, "echo": echo}
138142

139143
async def get_forward_msg(self, id: str, echo: str) -> dict:
140144
# Not Impl

onebot/event/NoticeEvent.py

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,11 @@ class GroupRecallNoticeEvent(NoticeEvent):
2222
class FriendRecallNoticeEvent(NoticeEvent):
2323
notice_type: str = "friend_recall"
2424
user_id: int = 0
25-
message_id: int = 0
25+
message_id: int = 0
26+
27+
class GroupBanNoticeEvent(NoticeEvent):
28+
notice_type: str = "group_ban"
29+
group_id: int = 0
30+
operator_id: int = 0
31+
user_id: int = 0
32+
duration: int = 0

onebot/handlers.py

Lines changed: 37 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
GroupRecall,
88
GroupMemberQuit,
99
GroupInvite,
10-
GroupMemberJoinRequest
10+
GroupMemberJoinRequest,
11+
GroupMuteMember
1112
)
1213
from lagrange.client.events.friend import (
1314
FriendMessage,
@@ -21,7 +22,8 @@
2122
from onebot.event.NoticeEvent import (
2223
GroupDecreaseNoticeEvent,
2324
GroupRecallNoticeEvent,
24-
FriendRecallNoticeEvent
25+
FriendRecallNoticeEvent,
26+
GroupBanNoticeEvent
2527
)
2628
from onebot.event.RequestEvent import (
2729
GroupRequestEvent
@@ -56,11 +58,12 @@ async def GroupMessageEventHandler(client: Client, converter: MessageConverter,
5658
return
5759

5860
logger.onebot.info(f"Received message ({message_id}/{event.seq}) from group ({event.grp_id}): {event.msg}")
59-
61+
msg_chain = event.msg_chain
6062
event_content = event.__dict__
63+
event_content.pop("msg_chain")
6164
record_data = MessageEvent(
6265
msg_id=message_id,
63-
msg_chain=list([json.dumps(element.__dict__, ensure_ascii=False, default=converter.bytes_serializer) for element in event_content.pop("msg_chain")]),
66+
msg_chain=[segment.__dict__ for segment in (await converter.convert_to_segments(msg_chain, "grp", group_id=event.grp_id))],
6467
**(event_content)
6568
)
6669
db.save(record_data)
@@ -98,7 +101,7 @@ async def PrivateMessageEventHandler(client: Client, converter: MessageConverter
98101
seq=event.seq,
99102
uin=event.from_uin,
100103
msg=event.msg,
101-
msg_chain=list([json.dumps(element.__dict__, ensure_ascii=False, default=converter.bytes_serializer) for element in event_content.pop("msg_chain")])
104+
msg_chain=[segment.__dict__ for segment in (await converter.convert_to_segments(event.msg_chain, "friend", uid=event.from_uid))]
102105
)
103106
db.save(record_data)
104107
formatted_event = PrivateMessageEvent(
@@ -207,3 +210,32 @@ async def FriendRecallEventHandler(client: Client, converter: MessageConverter,
207210
ensure_ascii=False
208211
)
209212
)
213+
214+
215+
@init_handler
216+
async def GroupBanEventHandler(client: Client, converter: MessageConverter, event: GroupMuteMember):
217+
operator_uid = event.operator_uid
218+
target_uid = event.target_uid
219+
operator_uin = get_info(operator_uid)
220+
target_uin = get_info(target_uid)
221+
if operator_uin is None:
222+
return
223+
if target_uid != "" and target_uin is None:
224+
return
225+
duration = event.duration
226+
if target_uid == "":
227+
target_uin = 0
228+
duration = -1
229+
formatted_event = GroupBanNoticeEvent(
230+
self_id = client.uin,
231+
group_id = event.grp_id,
232+
operator_id = int(operator_uin),
233+
user_id = int(target_uin), # type: ignore
234+
duration = duration
235+
)
236+
await ws.websocket_connection.send(
237+
json.dumps(
238+
converter.convert_to_dict(formatted_event),
239+
ensure_ascii=False
240+
)
241+
)

onebot/utils/datamodels.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ class MessageEvent(LagrangeModel):
2727
grp_name: str = ""
2828
nickname: str = ""
2929
msg: str = ""
30-
msg_chain: List[str] = []
30+
msg_chain: List[dict] = []
3131

3232
class UserInformation(LagrangeModel):
3333
TABLE_NAME: str | None = "UserInformation"

onebot/utils/flag.py

Whitespace-only changes.

onebot/utils/message_chain.py

Lines changed: 29 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
from typing import List, Literal, Type
1+
from typing import List, Literal, Type, Any
22
from urllib.parse import urlparse
33

44
from lagrange.client.message.elems import Text, Image, At, Quote, MarketFace, Audio
@@ -7,6 +7,8 @@
77

88
from onebot.utils.message_segment import MessageSegment
99
from onebot.utils.audio import mp3_to_silk
10+
from onebot.utils.database import db
11+
from onebot.utils.datamodels import MessageEvent
1012

1113
import io
1214
import httpx
@@ -27,18 +29,16 @@ async def convert_to_segments(self, elements: List[Element], message_type: Liter
2729
segments: List[MessageSegment] = []
2830
for element in elements:
2931
if isinstance(element, At):
30-
segments.append(MessageSegment.at(str(element.uin)))
32+
segments.append(MessageSegment.at(element.uin))
3133
elif isinstance(element, Quote):
32-
segments.append(MessageSegment.reply(int(str(element.seq))))
34+
msg_data: MessageEvent | Any = db.where_one(MessageEvent(), "uin = ? AND seq = ?", element.uin, element.seq, default=None)
35+
if msg_data is None:
36+
continue
37+
segments.append(MessageSegment.reply(msg_data.msg_id))
3338
elif isinstance(element, (Image, MarketFace)):
34-
segments.append(MessageSegment.image(str(element.url)))
39+
segments.append(MessageSegment.image(element.url))
3540
elif isinstance(element, Audio):
36-
# RIP: wyapx 呜呜呜呜
37-
if message_type == "grp":
38-
url = await self.client._highway.get_audio_down_url(element, gid=group_id)
39-
elif message_type == "friend":
40-
url = await self.client._highway.get_audio_down_url(element, uid=uid)
41-
segments.append(MessageSegment.record(file=url))
41+
segments.append(MessageSegment.record(element.url))
4242
elif isinstance(element, Text):
4343
segments.append(MessageSegment.text(element.text))
4444
else:
@@ -56,8 +56,25 @@ async def convert_to_elements(self, segments: List[MessageSegment], group_id: in
5656
elements.append(At(uin=int(int(segment.data["qq"])))) # type: ignore
5757
# Not Support Yet
5858
elif segment.type == "reply":
59-
elements.append(Quote(seq=int(segment.data["id"]))) # type: ignore
60-
# Not Support Yet
59+
# message_id = segment.data["id"]
60+
# message_event: MessageEvent | Any = db.where_one(MessageEvent(), "msg_id = ?", message_id, default=None)
61+
# if not message_event:
62+
# continue
63+
# elements.append(Quote.build(
64+
# GroupMessage(
65+
# uid=message_event.uid,
66+
# seq=message_event.seq,
67+
# time=message_event.time,
68+
# rand=message_event.rand,
69+
# grp_id=message_event.grp_id,
70+
# uin=message_event.uin,
71+
# grp_name=message_event.grp_name,
72+
# nickname=message_event.nickname,
73+
74+
# )
75+
# ))
76+
continue
77+
# Not Support Yet 谁爱写谁写吧
6178
elif segment.type == "image":
6279
image_content = segment.data["file"]
6380
image_content = await self._process_image_content(image_content)

0 commit comments

Comments
 (0)