commit
49f616034f
|
|
@ -63,7 +63,7 @@ sequenceDiagram
|
||||||
- [x] 读取戳一戳的自定义内容
|
- [x] 读取戳一戳的自定义内容
|
||||||
- [ ] 语音解析(?)
|
- [ ] 语音解析(?)
|
||||||
- [ ] 所有的notice类
|
- [ ] 所有的notice类
|
||||||
- [ ] <del>撤回</del>
|
- [x] 撤回(已添加相关指令)
|
||||||
- [x] 发送消息
|
- [x] 发送消息
|
||||||
- [x] 发送文本
|
- [x] 发送文本
|
||||||
- [x] 发送图片
|
- [x] 发送图片
|
||||||
|
|
|
||||||
|
|
@ -46,4 +46,15 @@ Seg.data: Dict[str, Any] = {
|
||||||
"qq_id": "目标QQ号"
|
"qq_id": "目标QQ号"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## 撤回消息
|
||||||
|
```python
|
||||||
|
Seg.data: Dict[str, Any] = {
|
||||||
|
"name": "DELETE_MSG",
|
||||||
|
"args": {
|
||||||
|
"message_id": "消息所对应的message_id"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
message_id怎么搞到手全凭你本事,也请在自己的插件里写好确定是否能撤回对应的消息的功能,毕竟这玩意真的单纯根据message_id撤消息
|
||||||
|
|
@ -11,6 +11,7 @@ class CommandType(Enum):
|
||||||
GROUP_WHOLE_BAN = "set_group_whole_ban" # 群全体禁言
|
GROUP_WHOLE_BAN = "set_group_whole_ban" # 群全体禁言
|
||||||
GROUP_KICK = "set_group_kick" # 踢出群聊
|
GROUP_KICK = "set_group_kick" # 踢出群聊
|
||||||
SEND_POKE = "send_poke" # 戳一戳
|
SEND_POKE = "send_poke" # 戳一戳
|
||||||
|
DELETE_MSG = "delete_msg" # 撤回消息
|
||||||
|
|
||||||
def __str__(self) -> str:
|
def __str__(self) -> str:
|
||||||
return self.value
|
return self.value
|
||||||
|
|
|
||||||
|
|
@ -78,6 +78,7 @@ class CommandType(Enum):
|
||||||
GROUP_WHOLE_BAN = "set_group_whole_ban" # 群全体禁言
|
GROUP_WHOLE_BAN = "set_group_whole_ban" # 群全体禁言
|
||||||
GROUP_KICK = "set_group_kick" # 踢出群聊
|
GROUP_KICK = "set_group_kick" # 踢出群聊
|
||||||
SEND_POKE = "send_poke" # 戳一戳
|
SEND_POKE = "send_poke" # 戳一戳
|
||||||
|
DELETE_MSG = "delete_msg" # 撤回消息
|
||||||
|
|
||||||
def __str__(self) -> str:
|
def __str__(self) -> str:
|
||||||
return self.value
|
return self.value
|
||||||
|
|
|
||||||
|
|
@ -78,6 +78,7 @@ class NoticeHandler:
|
||||||
|
|
||||||
group_id = raw_message.get("group_id")
|
group_id = raw_message.get("group_id")
|
||||||
user_id = raw_message.get("user_id")
|
user_id = raw_message.get("user_id")
|
||||||
|
target_id = raw_message.get("target_id")
|
||||||
|
|
||||||
handled_message: Seg = None
|
handled_message: Seg = None
|
||||||
user_info: UserInfo = None
|
user_info: UserInfo = None
|
||||||
|
|
@ -151,6 +152,7 @@ class NoticeHandler:
|
||||||
group_info=group_info,
|
group_info=group_info,
|
||||||
template_info=None,
|
template_info=None,
|
||||||
format_info=None,
|
format_info=None,
|
||||||
|
additional_config = {"target_id": target_id}# 在这里塞了一个target_id,方便mmc那边知道被戳的人是谁
|
||||||
)
|
)
|
||||||
|
|
||||||
message_base: MessageBase = MessageBase(
|
message_base: MessageBase = MessageBase(
|
||||||
|
|
@ -165,68 +167,79 @@ class NoticeHandler:
|
||||||
logger.info("发送到Maibot处理通知信息")
|
logger.info("发送到Maibot处理通知信息")
|
||||||
await message_send_instance.message_send(message_base)
|
await message_send_instance.message_send(message_base)
|
||||||
|
|
||||||
async def handle_poke_notify(self, raw_message: dict, group_id: int, user_id: int) -> Tuple[Seg | None, UserInfo]:
|
async def handle_poke_notify(self, raw_message: dict, group_id: int, user_id: int) -> Tuple[Seg | None, UserInfo | None]:
|
||||||
self_info: dict = await get_self_info(self.server_connection)
|
self_info: dict = await get_self_info(self.server_connection)
|
||||||
|
|
||||||
if not self_info:
|
if not self_info:
|
||||||
logger.error("自身信息获取失败")
|
logger.error("自身信息获取失败")
|
||||||
return None
|
return None, None
|
||||||
|
|
||||||
self_id = raw_message.get("self_id")
|
self_id = raw_message.get("self_id")
|
||||||
target_id = raw_message.get("target_id")
|
target_id = raw_message.get("target_id")
|
||||||
target_name: str = None
|
target_name: str = None
|
||||||
raw_info: list = raw_message.get("raw_info")
|
raw_info: list = raw_message.get("raw_info")
|
||||||
|
|
||||||
# 计算user_info
|
|
||||||
source_name: str = None
|
|
||||||
source_cardname: str = None
|
|
||||||
if group_id:
|
if group_id:
|
||||||
member_info: dict = await get_member_info(self.server_connection, group_id, user_id)
|
user_qq_info: dict = await get_member_info(
|
||||||
if member_info:
|
self.server_connection, group_id, user_id
|
||||||
source_name = member_info.get("nickname")
|
)
|
||||||
source_cardname = member_info.get("card")
|
if user_qq_info:
|
||||||
|
user_name = user_qq_info.get("nickname")
|
||||||
|
user_cardname = user_qq_info.get("card")
|
||||||
else:
|
else:
|
||||||
logger.warning("无法获取戳一戳消息发送者的昵称,消息可能会无效")
|
user_name = "QQ用户"
|
||||||
source_name = "QQ用户"
|
user_cardname = "QQ用户"
|
||||||
|
logger.info("无法获取戳一戳对方的用户昵称")
|
||||||
else:
|
else:
|
||||||
stranger_info = await get_stranger_info(self.server_connection, user_id)
|
user_qq_info: dict = await get_stranger_info(
|
||||||
if stranger_info:
|
self.server_connection, user_id
|
||||||
source_name = stranger_info.get("nickname")
|
)
|
||||||
|
if user_qq_info:
|
||||||
|
user_name = user_qq_info.get("nickname")
|
||||||
|
user_cardname = user_qq_info.get("card")
|
||||||
else:
|
else:
|
||||||
logger.warning("无法获取戳一戳消息发送者的昵称,消息可能会无效")
|
user_name = "QQ用户"
|
||||||
source_name = "QQ用户"
|
user_cardname = "QQ用户"
|
||||||
|
logger.info("无法获取戳一戳对方的用户昵称")
|
||||||
user_info: UserInfo = UserInfo(
|
|
||||||
platform=global_config.maibot_server.platform_name,
|
|
||||||
user_id=user_id,
|
|
||||||
user_nickname=source_name,
|
|
||||||
user_cardname=source_cardname,
|
|
||||||
)
|
|
||||||
|
|
||||||
# 计算Seg
|
# 计算Seg
|
||||||
if self_id == target_id:
|
if self_id == target_id: # 现在这里应当是专注于处理私聊戳一戳的,也就是说当私聊里,被戳的是另一方时,不会给这个消息。
|
||||||
|
display_name = ""
|
||||||
target_name = self_info.get("nickname")
|
target_name = self_info.get("nickname")
|
||||||
|
|
||||||
|
elif self_id == user_id:
|
||||||
|
return None, None # 这应当让ada不发送麦麦戳别人的消息,因为这个消息已经被mmc的命令记录了,没必要记第二次。
|
||||||
|
|
||||||
else:
|
else:
|
||||||
return None, None
|
if group_id: # 如果是群聊环境,老实说做这一步判定没啥意义,毕竟私聊是没有其他人之间的戳一戳的,但是感觉可以有这个判定来强限制群聊环境
|
||||||
|
fetched_member_info: dict = await get_member_info(
|
||||||
|
self.server_connection, group_id, target_id
|
||||||
|
)
|
||||||
|
if fetched_member_info:
|
||||||
|
target_name = fetched_member_info.get("nickname")
|
||||||
|
else:
|
||||||
|
target_name = "QQ用户"
|
||||||
|
logger.info("无法获取被戳一戳方的用户昵称")
|
||||||
|
display_name = user_name
|
||||||
|
else:
|
||||||
|
return None, None
|
||||||
try:
|
try:
|
||||||
first_txt = raw_info[2].get("txt", "戳了戳")
|
first_txt = raw_info[2].get("txt", "戳了戳")
|
||||||
second_txt = raw_info[4].get("txt", "")
|
second_txt = raw_info[4].get("txt", "")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.warning(f"解析戳一戳消息失败: {str(e)},将使用默认文本")
|
logger.warning(f"解析戳一戳消息失败: {str(e)},将使用默认文本")
|
||||||
first_txt = "戳了戳"
|
first_txt = "戳了戳"
|
||||||
second_txt = ""
|
|
||||||
"""
|
user_info: UserInfo = UserInfo(
|
||||||
# 不启用戳其他人的处理
|
platform=global_config.maibot_server.platform_name,
|
||||||
else:
|
user_id=user_id,
|
||||||
# 由于Napcat不支持获取昵称,所以需要单独获取
|
user_nickname=user_name,
|
||||||
group_id = raw_message.get("group_id")
|
user_cardname=user_cardname,
|
||||||
fetched_member_info: dict = await get_member_info(
|
)
|
||||||
self.server_connection, group_id, target_id
|
|
||||||
)
|
|
||||||
if fetched_member_info:
|
|
||||||
target_name = fetched_member_info.get("nickname")
|
|
||||||
"""
|
|
||||||
seg_data: Seg = Seg(
|
seg_data: Seg = Seg(
|
||||||
type="text",
|
type="text",
|
||||||
data=f"{first_txt}{target_name}{second_txt}(这是QQ的一个功能,用于提及某人,但没那么明显)",
|
data=f"{display_name}{first_txt}{target_name}{second_txt}(这是QQ的一个功能,用于提及某人,但没那么明显)",
|
||||||
)
|
)
|
||||||
return seg_data, user_info
|
return seg_data, user_info
|
||||||
|
|
||||||
|
|
@ -503,4 +516,4 @@ class NoticeHandler:
|
||||||
await asyncio.sleep(1)
|
await asyncio.sleep(1)
|
||||||
|
|
||||||
|
|
||||||
notice_handler = NoticeHandler()
|
notice_handler = NoticeHandler()
|
||||||
|
|
@ -103,6 +103,8 @@ class SendHandler:
|
||||||
command, args_dict = self.handle_kick_command(seg_data.get("args"), group_info)
|
command, args_dict = self.handle_kick_command(seg_data.get("args"), group_info)
|
||||||
case CommandType.SEND_POKE.name:
|
case CommandType.SEND_POKE.name:
|
||||||
command, args_dict = self.handle_poke_command(seg_data.get("args"), group_info)
|
command, args_dict = self.handle_poke_command(seg_data.get("args"), group_info)
|
||||||
|
case CommandType.DELETE_MSG.name:
|
||||||
|
command, args_dict = self.delete_msg_command(seg_data.get("args"))
|
||||||
case _:
|
case _:
|
||||||
logger.error(f"未知命令: {command_name}")
|
logger.error(f"未知命令: {command_name}")
|
||||||
return
|
return
|
||||||
|
|
@ -347,6 +349,31 @@ class SendHandler:
|
||||||
"user_id": user_id,
|
"user_id": user_id,
|
||||||
},
|
},
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def delete_msg_command(self, args: Dict[str, Any]) -> Tuple[str, Dict[str, Any]]:
|
||||||
|
"""处理撤回消息命令
|
||||||
|
|
||||||
|
Args:
|
||||||
|
args (Dict[str, Any]): 参数字典
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Tuple[CommandType, Dict[str, Any]]
|
||||||
|
"""
|
||||||
|
try:
|
||||||
|
message_id = int(args["message_id"])
|
||||||
|
if message_id <= 0:
|
||||||
|
raise ValueError("消息ID无效")
|
||||||
|
except KeyError:
|
||||||
|
raise ValueError("缺少必需参数: message_id")
|
||||||
|
except (ValueError, TypeError) as e:
|
||||||
|
raise ValueError(f"消息ID无效: {args['message_id']} - {str(e)}")
|
||||||
|
|
||||||
|
return (
|
||||||
|
CommandType.DELETE_MSG.value,
|
||||||
|
{
|
||||||
|
"message_id": message_id
|
||||||
|
},
|
||||||
|
)
|
||||||
|
|
||||||
async def send_message_to_napcat(self, action: str, params: dict) -> dict:
|
async def send_message_to_napcat(self, action: str, params: dict) -> dict:
|
||||||
request_uuid = str(uuid.uuid4())
|
request_uuid = str(uuid.uuid4())
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue