From 81b524a4dcba7f5aa7ad09db93882486b12ec4d6 Mon Sep 17 00:00:00 2001 From: KimigaiiWuyi <444835641@qq.com> Date: Mon, 11 Dec 2023 03:40:20 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20=E6=94=AF=E6=8C=81=E5=90=91`adapter?= =?UTF-8?q?.discord`=E5=8F=91=E9=80=81=E6=8C=89=E9=92=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- GenshinUID/__init__.py | 41 ++++++++++++++++++++++++++++ GenshinUID/client.py | 62 +++++++++++++++++++++++++++++++++++------- 2 files changed, 93 insertions(+), 10 deletions(-) diff --git a/GenshinUID/__init__.py b/GenshinUID/__init__.py index 5b596c00..9bbd9ff3 100644 --- a/GenshinUID/__init__.py +++ b/GenshinUID/__init__.py @@ -167,6 +167,36 @@ async def get_notice_message(bot: Bot, ev: Event): else: logger.debug('[gsuid] 不支持该 Telegram 事件...') return + elif bot.adapter.get_name() == 'Discord': + from nonebot.adapters.discord.api import ChannelType + from nonebot.adapters.discord import MessageComponentInteractionEvent + + sender = {} + if isinstance(ev, MessageComponentInteractionEvent): + user_type = ( + 'direct' + if ev.channel and ev.channel.type == ChannelType.DM + else 'group' + ) + msg_id = str(ev.id) + group_id = str(ev.channel_id) + message = [Message('text', ev.data.custom_id)] + if user_type == 'direct': + nickname = ev.user.username # type: ignore + avatar = ev.user.avatar # type: ignore + user_id = str(ev.user.id) # type: ignore + else: + nickname = ev.member.user.username # type: ignore + avatar = ev.member.user.avatar # type: ignore + user_id = str(ev.member.user.id) # type: ignore + sender = { + 'nickname': nickname, + 'avatar': 'https://cdn.discordapp.com/avatars/' + f'{user_id}/{avatar}', + } + else: + logger.debug('[gsuid] 不支持该 Discord 事件...') + return else: return @@ -508,9 +538,20 @@ async def get_all_message(bot: Bot, ev: Event): user_type = 'group' msg_id = str(ev.message_id) group_id = str(int(ev.channel_id)) + sender = { + 'nickname': ev.author.username, + 'avatar': 'https://cdn.discordapp.com/avatars/' + f'{user_id}/{ev.author.avatar}', + } elif isinstance(ev, DirectMessageCreateEvent): msg_id = str(ev.message_id) user_type = 'direct' + group_id = str(int(ev.channel_id)) + sender = { + 'nickname': ev.author.username, + 'avatar': 'https://cdn.discordapp.com/avatars/' + f'{user_id}/{ev.author.avatar}', + } else: logger.debug('[gsuid] 不支持该 Discord 事件...') return diff --git a/GenshinUID/client.py b/GenshinUID/client.py index e70ddc9a..181fbde0 100644 --- a/GenshinUID/client.py +++ b/GenshinUID/client.py @@ -290,6 +290,19 @@ class GsClient: msg.target_type, group_id, ) + elif msg.bot_id == 'discord': + await discord_send( + bot, + content, + image, + node, + at_list, + markdown, + buttons, + msg.target_id, + msg.target_type, + group_id, + ) except Exception as e: logger.exception(e) except RuntimeError as e: @@ -460,6 +473,16 @@ def _tg_kb(button: Dict): ) +def _dc_kb(button: Dict): + from nonebot.adapters.discord.api import Button, ButtonStyle + + return Button( + label=button['text'], + custom_id=button['data'], + style=ButtonStyle.Primary, + ) + + async def villa_send( bot: Bot, content: Optional[str], @@ -733,14 +756,15 @@ async def discord_send( buttons: Optional[Union[List[Dict], List[List[Dict]]]], target_id: Optional[str], target_type: Optional[str], + group_id: Optional[str], ): - from nonebot.adapters.discord.message import parse_message + from nonebot.adapters.discord.api import ActionRow from nonebot.adapters.discord import Bot, Message, MessageSegment assert isinstance(bot, Bot) async def _send(content: Optional[str], image: Optional[str]): - if target_id: + if group_id: message = Message() if image: img_bytes = base64.b64decode(image.replace('base64://', '')) @@ -757,15 +781,33 @@ async def discord_send( if markdown: logger.warning('[gscore] discord暂不支持发送markdown消息') if buttons: - logger.warning('[gscore] discord暂不支持发送markdown消息') + bt = [] + for button in buttons: + if isinstance(button, Dict): + bt.append(_dc_kb(button)) + if len(bt) >= 2: + message.append( + MessageSegment.component( + ActionRow(components=bt) + ) + ) + bt = [] + if isinstance(button, List): + _t = [] + for i in button: + _t.append(_dc_kb(i)) + else: + message.append( + MessageSegment.component( + ActionRow(components=_t) + ) + ) + _t = [] - message_data = parse_message(message) - await bot.create_message( - channel_id=int(target_id), - nonce=None, - tts=False, - allowed_mentions=None, - **message_data, + await bot.call_api('trigger_typing_indicator', channel_id=group_id) + await bot.send_to( + channel_id=int(group_id), + message=message, ) if node: