Skip to content

Commit 53337e0

Browse files
committed
🚧 Middleware(Telegram): add more actions
1 parent 72f6430 commit 53337e0

File tree

2 files changed

+113
-8
lines changed

2 files changed

+113
-8
lines changed

nonebot_plugin_all4one/middlewares/telegram.py

Lines changed: 54 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ async def to_onebot_event(self, event: Event) -> List[OneBotEvent]:
4848
event_dict["time"] = event.date
4949
event_dict["detail_type"] = event.get_event_name().split(".")[1]
5050
event_dict["sub_type"] = ""
51-
event_dict["message_id"] = str(event.message_id)
51+
event_dict["message_id"] = f"{event.chat.id}/{event.message_id}"
5252
event_dict["message"] = await self.to_onebot_message(event.message)
5353
event_dict["alt_message"] = str(event.message)
5454
if isinstance(event, PrivateMessageEvent):
@@ -65,7 +65,7 @@ async def to_onebot_event(self, event: Event) -> List[OneBotEvent]:
6565
event_dict["message"].insert(
6666
0,
6767
OneBotMessageSegment.reply(
68-
str(event.reply_to_message.message_id),
68+
f"{event.reply_to_message.chat.id}/{event.reply_to_message.message_id}",
6969
user_id=event.reply_to_message.get_user_id()
7070
if not isinstance(event.reply_to_message, ChannelPostEvent)
7171
else "",
@@ -204,7 +204,9 @@ async def send_message(
204204

205205
reply_to_message_id = None
206206
if message.count("reply"):
207-
reply_to_message_id = int(message["reply", 0].data["message_id"])
207+
reply_to_message_id = int(
208+
message["reply", 0].data["message_id"].split("/")[1]
209+
)
208210

209211
result = await self.send(
210212
int(chat_id),
@@ -217,6 +219,10 @@ async def send_message(
217219
result = result[0]
218220
return {"message_id": str(result.message_id), "time": result.date}
219221

222+
@supported_action
223+
async def delete_message(self, *, message_id: str, **kwargs: Any) -> None:
224+
await self.bot.delete_message(*map(int, message_id.split("/")))
225+
220226
@supported_action
221227
async def get_self_info(
222228
self, **kwargs: Any
@@ -270,3 +276,48 @@ async def set_group_name(
270276
@supported_action
271277
async def leave_group(self, *, group_id: str, **kwargs: Any) -> None:
272278
await self.bot.leave_chat(int(group_id))
279+
280+
@supported_action
281+
async def get_guild_info(
282+
self, *, guild_id: str, **kwargs: Any
283+
) -> Dict[Union[Literal["guild_id", "guild_name"], str], str]:
284+
result = await self.bot.get_chat(int(guild_id))
285+
return {"guild_id": str(result.id), "guild_id": result.title} # type: ignore
286+
287+
@supported_action
288+
async def set_guild_name(
289+
self, *, guild_id: str, guild_name: str, **kwargs: Any
290+
) -> None:
291+
await self.bot.set_chat_title(int(guild_id), guild_name)
292+
293+
@supported_action
294+
async def get_guild_member_info(
295+
self, *, guild_id: str, user_id: str, **kwargs: Any
296+
) -> Dict[Union[Literal["user_id", "user_name", "user_displayname"], str], str]:
297+
result = await self.bot.get_chat_member(int(guild_id), int(user_id))
298+
return {
299+
"user_id": str(result.user.id),
300+
"user_name": result.user.username if result.user.username else "",
301+
"user_displayname": result.user.first_name,
302+
}
303+
304+
@supported_action
305+
async def leave_guild(self, *, guild_id: str, **kwargs: Any) -> None:
306+
await self.bot.leave_chat(int(guild_id))
307+
308+
@supported_action
309+
async def set_channel_name(
310+
self, *, guild_id: str, channel_id: str, channel_name: str, **kwargs: Any
311+
) -> None:
312+
await self.bot.edit_forum_topic(int(guild_id), int(channel_id), channel_name)
313+
314+
@supported_action
315+
async def get_channel_member_info(
316+
self, *, guild_id: str, channel_id: str, user_id: str, **kwargs: Any
317+
) -> Dict[Union[Literal["user_id", "user_name", "user_displayname"], str], str]:
318+
result = await self.bot.get_chat_member(int(guild_id), int(user_id))
319+
return {
320+
"user_id": str(result.user.id),
321+
"user_name": result.user.username if result.user.username else "",
322+
"user_displayname": result.user.first_name,
323+
}

tests/middlewares/telegram/test_telegram.py

Lines changed: 59 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,14 @@
22
from pathlib import Path
33

44
from nonebug import App
5-
from nonebot.adapters.telegram import Bot, Event
6-
from nonebot.adapters.telegram.model import File
5+
from nonebot.adapters.telegram.model import Chat
6+
from nonebot.adapters.telegram.model import Message
77
from nonebot.adapters.telegram.config import BotConfig
8+
from nonebot.adapters.telegram.message import File, Entity
89
from nonebot.adapters.onebot.v12 import PrivateMessageEvent
10+
from nonebot.adapters.telegram import Bot, Event, MessageSegment
11+
from nonebot.adapters.telegram.model import File as TelegramFile
12+
from nonebot.adapters.onebot.v12 import MessageSegment as OneBotMessageSegment
913

1014
bot_config = BotConfig(token="1234567890:ABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHI")
1115

@@ -33,7 +37,7 @@ async def test_to_onebot_event(app: App):
3337
ctx.should_call_api(
3438
"get_file",
3539
{"file_id": "AwADBAADbXXXXXXXXXXXGBdhD2l6_XX"},
36-
File(file_id="AwADBAADbXXXXXXXXXXXGBdhD2l6_XX", file_unique_id=""),
40+
TelegramFile(file_id="AwADBAADbXXXXXXXXXXXGBdhD2l6_XX", file_unique_id=""),
3741
)
3842
event = await middleware.to_onebot_event(event)
3943
assert isinstance(event[0], PrivateMessageEvent)
@@ -43,7 +47,7 @@ async def test_to_onebot_event(app: App):
4347
ctx.should_call_api(
4448
"get_file",
4549
{"file_id": "AwADBAADbXXXXXXXXXXXGBdhD2l6_XX"},
46-
File(file_id="AwADBAADbXXXXXXXXXXXGBdhD2l6_XX", file_unique_id=""),
50+
TelegramFile(file_id="AwADBAADbXXXXXXXXXXXGBdhD2l6_XX", file_unique_id=""),
4751
)
4852
event = await middleware.to_onebot_event(event)
4953
assert isinstance(event[0], PrivateMessageEvent)
@@ -53,8 +57,58 @@ async def test_to_onebot_event(app: App):
5357
ctx.should_call_api(
5458
"get_file",
5559
{"file_id": "AwADBAADbXXXXXXXXXXXGBdhD2l6_XX"},
56-
File(file_id="AwADBAADbXXXXXXXXXXXGBdhD2l6_XX", file_unique_id=""),
60+
TelegramFile(file_id="AwADBAADbXXXXXXXXXXXGBdhD2l6_XX", file_unique_id=""),
5761
)
5862
event = await middleware.to_onebot_event(event)
5963
assert isinstance(event[0], PrivateMessageEvent)
6064
assert event[0].message[0].type == "file"
65+
66+
67+
async def test_send_message(app: App):
68+
from nonebot_plugin_all4one.database import upload_file
69+
from nonebot_plugin_all4one.middlewares.telegram import Middleware
70+
71+
async with app.test_api() as ctx:
72+
bot = ctx.create_bot(base=Bot, self_id=bot_config) # type:ignore
73+
middleware = Middleware(bot)
74+
75+
class FakeEvent(Event):
76+
chat: Chat
77+
78+
fake_event = FakeEvent(
79+
**{
80+
"chat": Chat(id=1111, type="private"),
81+
"message_thread_id": None,
82+
}
83+
)
84+
85+
file_id = await upload_file(
86+
name="test",
87+
data=b"test",
88+
src=middleware.get_platform(),
89+
src_id="test",
90+
)
91+
ctx.should_call_send(
92+
fake_event,
93+
Entity.text("Test") + File.photo("test"),
94+
Message(message_id=2222, date=1, chat=fake_event.chat),
95+
reply_to_message_id=None,
96+
)
97+
await middleware.send_message(
98+
detail_type="private",
99+
user_id="1111",
100+
message=OneBotMessageSegment.text("Test")
101+
+ OneBotMessageSegment.image(file_id),
102+
)
103+
104+
105+
async def test_delete_message(app: App):
106+
from nonebot_plugin_all4one.middlewares.telegram import Middleware
107+
108+
async with app.test_api() as ctx:
109+
bot = ctx.create_bot(base=Bot, self_id=bot_config) # type:ignore
110+
middleware = Middleware(bot)
111+
ctx.should_call_api(
112+
"delete_message", {"chat_id": 1111, "message_id": 2222}, True
113+
)
114+
await middleware.delete_message(message_id="1111/2222")

0 commit comments

Comments
 (0)