mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2026-10-05 11:49:59 +08:00
feat✨: add dialogue
This commit is contained in:
@@ -4,7 +4,7 @@ from nonebot_plugin_apscheduler import scheduler
|
|||||||
from zhenxun.models.friend_user import FriendUser
|
from zhenxun.models.friend_user import FriendUser
|
||||||
from zhenxun.models.group_console import GroupConsole
|
from zhenxun.models.group_console import GroupConsole
|
||||||
from zhenxun.services.log import logger
|
from zhenxun.services.log import logger
|
||||||
from zhenxun.utils.platform import PlatformManage
|
from zhenxun.utils.platform import PlatformUtils
|
||||||
|
|
||||||
|
|
||||||
# 自动更新群组信息
|
# 自动更新群组信息
|
||||||
@@ -18,7 +18,7 @@ async def _():
|
|||||||
_used_group = []
|
_used_group = []
|
||||||
for bot in bots.values():
|
for bot in bots.values():
|
||||||
try:
|
try:
|
||||||
await PlatformManage.update_group(bot)
|
await PlatformUtils.update_group(bot)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"Bot: {bot.self_id} 自动更新群组信息", e=e)
|
logger.error(f"Bot: {bot.self_id} 自动更新群组信息", e=e)
|
||||||
logger.info("自动更新群组成员信息成功...")
|
logger.info("自动更新群组成员信息成功...")
|
||||||
@@ -34,7 +34,7 @@ async def _():
|
|||||||
bots = nonebot.get_bots()
|
bots = nonebot.get_bots()
|
||||||
for bot in bots.values():
|
for bot in bots.values():
|
||||||
try:
|
try:
|
||||||
await PlatformManage.update_friend(bot)
|
await PlatformUtils.update_friend(bot)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
logger.error(f"自动更新好友信息错误", "自动更新好友", e=e)
|
logger.error(f"自动更新好友信息错误", "自动更新好友", e=e)
|
||||||
logger.info("自动更新好友信息成功...")
|
logger.info("自动更新好友信息成功...")
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ from nonebot_plugin_session import EventSession
|
|||||||
|
|
||||||
from zhenxun.models.group_console import GroupConsole
|
from zhenxun.models.group_console import GroupConsole
|
||||||
from zhenxun.services.log import logger
|
from zhenxun.services.log import logger
|
||||||
from zhenxun.utils.platform import PlatformManage
|
from zhenxun.utils.platform import PlatformUtils
|
||||||
|
|
||||||
|
|
||||||
class BroadcastManage:
|
class BroadcastManage:
|
||||||
@@ -36,7 +36,7 @@ class BroadcastManage:
|
|||||||
message_list.append(Image(msg.url))
|
message_list.append(Image(msg.url))
|
||||||
elif isinstance(msg, alc.Text):
|
elif isinstance(msg, alc.Text):
|
||||||
message_list.append(Text(msg.text))
|
message_list.append(Text(msg.text))
|
||||||
group_list, _ = await PlatformManage.get_group_list(bot)
|
group_list, _ = await PlatformUtils.get_group_list(bot)
|
||||||
if group_list:
|
if group_list:
|
||||||
error_count = 0
|
error_count = 0
|
||||||
for group in group_list:
|
for group in group_list:
|
||||||
@@ -44,7 +44,7 @@ class BroadcastManage:
|
|||||||
if not await GroupConsole.is_block_task(
|
if not await GroupConsole.is_block_task(
|
||||||
group.group_id, "broadcast", group.channel_id
|
group.group_id, "broadcast", group.channel_id
|
||||||
):
|
):
|
||||||
target = PlatformManage.get_target(
|
target = PlatformUtils.get_target(
|
||||||
bot, None, group.group_id, group.channel_id
|
bot, None, group.group_id, group.channel_id
|
||||||
)
|
)
|
||||||
if target:
|
if target:
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ from nonebot_plugin_session import EventSession
|
|||||||
from zhenxun.configs.utils import PluginExtraData
|
from zhenxun.configs.utils import PluginExtraData
|
||||||
from zhenxun.services.log import logger
|
from zhenxun.services.log import logger
|
||||||
from zhenxun.utils.enum import PluginType
|
from zhenxun.utils.enum import PluginType
|
||||||
from zhenxun.utils.platform import PlatformManage
|
from zhenxun.utils.platform import PlatformUtils
|
||||||
|
|
||||||
__plugin_meta__ = PluginMetadata(
|
__plugin_meta__ = PluginMetadata(
|
||||||
name="更新群组/好友信息",
|
name="更新群组/好友信息",
|
||||||
@@ -54,7 +54,7 @@ async def _(
|
|||||||
arparma: Arparma,
|
arparma: Arparma,
|
||||||
):
|
):
|
||||||
try:
|
try:
|
||||||
num = await PlatformManage.update_group(bot)
|
num = await PlatformUtils.update_group(bot)
|
||||||
logger.info(
|
logger.info(
|
||||||
f"更新群聊信息完成,共更新了 {num} 个群组的信息!",
|
f"更新群聊信息完成,共更新了 {num} 个群组的信息!",
|
||||||
arparma.header_result,
|
arparma.header_result,
|
||||||
@@ -75,7 +75,7 @@ async def _(
|
|||||||
arparma: Arparma,
|
arparma: Arparma,
|
||||||
):
|
):
|
||||||
try:
|
try:
|
||||||
num = await PlatformManage.update_friend(bot, session.platform)
|
num = await PlatformUtils.update_friend(bot, session.platform)
|
||||||
logger.info(
|
logger.info(
|
||||||
f"更新好友信息完成,共更新了 {num} 个好友的信息!",
|
f"更新好友信息完成,共更新了 {num} 个好友的信息!",
|
||||||
arparma.header_result,
|
arparma.header_result,
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ from zhenxun.models.ban_console import BanConsole
|
|||||||
from zhenxun.models.group_member_info import GroupInfoUser
|
from zhenxun.models.group_member_info import GroupInfoUser
|
||||||
from zhenxun.services.log import logger
|
from zhenxun.services.log import logger
|
||||||
from zhenxun.utils.http_utils import AsyncHttpx
|
from zhenxun.utils.http_utils import AsyncHttpx
|
||||||
from zhenxun.utils.platform import PlatformManage
|
from zhenxun.utils.platform import PlatformUtils
|
||||||
from zhenxun.utils.utils import cn2py
|
from zhenxun.utils.utils import cn2py
|
||||||
|
|
||||||
from .model import BlackWord
|
from .model import BlackWord
|
||||||
@@ -173,7 +173,7 @@ async def _add_user_black_word(
|
|||||||
plant_text=message,
|
plant_text=message,
|
||||||
black_word=black_word,
|
black_word=black_word,
|
||||||
punish_level=punish_level,
|
punish_level=punish_level,
|
||||||
platform=PlatformManage.get_platform(bot),
|
platform=PlatformUtils.get_platform(bot),
|
||||||
)
|
)
|
||||||
logger.info(
|
logger.info(
|
||||||
f"已将 USER {user_id} GROUP {group_id} 添加至黑名单词汇记录 Black_word:{black_word} Plant_text:{message}"
|
f"已将 USER {user_id} GROUP {group_id} 添加至黑名单词汇记录 Black_word:{black_word} Plant_text:{message}"
|
||||||
@@ -325,7 +325,7 @@ async def _get_punish(
|
|||||||
return ban_4_duration
|
return ban_4_duration
|
||||||
# 口头警告
|
# 口头警告
|
||||||
elif id_ == 5:
|
elif id_ == 5:
|
||||||
await PlatformManage.send_message(bot, user_id, group_id, warning_result)
|
await PlatformUtils.send_message(bot, user_id, group_id, warning_result)
|
||||||
logger.info(f"BlackWord 口头警告 USER {user_id}")
|
logger.info(f"BlackWord 口头警告 USER {user_id}")
|
||||||
return warning_result
|
return warning_result
|
||||||
return None
|
return None
|
||||||
@@ -341,9 +341,9 @@ async def send_msg(bot: Bot, user_id: str, group_id: str | None, message: str):
|
|||||||
message: message
|
message: message
|
||||||
"""
|
"""
|
||||||
if not user_id:
|
if not user_id:
|
||||||
platform = PlatformManage.get_platform(bot)
|
platform = PlatformUtils.get_platform(bot)
|
||||||
user_id = bot.config.platform_superusers[platform][0]
|
user_id = bot.config.platform_superusers[platform][0]
|
||||||
await PlatformManage.send_message(bot, user_id, group_id, message)
|
await PlatformUtils.send_message(bot, user_id, group_id, message)
|
||||||
|
|
||||||
|
|
||||||
async def check_text(text: str) -> bool:
|
async def check_text(text: str) -> bool:
|
||||||
|
|||||||
@@ -0,0 +1,162 @@
|
|||||||
|
import nonebot
|
||||||
|
from nonebot import on_command
|
||||||
|
from nonebot.adapters import Bot
|
||||||
|
from nonebot.permission import SUPERUSER
|
||||||
|
from nonebot.plugin import PluginMetadata
|
||||||
|
from nonebot_plugin_alconna import At as alcAt
|
||||||
|
from nonebot_plugin_alconna import Target
|
||||||
|
from nonebot_plugin_alconna import Text as alcText
|
||||||
|
from nonebot_plugin_alconna import UniMsg
|
||||||
|
from nonebot_plugin_saa import Text
|
||||||
|
from nonebot_plugin_session import EventSession
|
||||||
|
from nonebot_plugin_userinfo import EventUserInfo, UserInfo
|
||||||
|
|
||||||
|
from zhenxun.configs.utils import PluginExtraData
|
||||||
|
from zhenxun.models.group_console import GroupConsole
|
||||||
|
from zhenxun.services.log import logger
|
||||||
|
from zhenxun.utils.platform import PlatformUtils
|
||||||
|
|
||||||
|
from ._data_source import DialogueManage
|
||||||
|
|
||||||
|
__plugin_meta__ = PluginMetadata(
|
||||||
|
name="联系管理员",
|
||||||
|
description="跨越空间与时间跟管理员对话",
|
||||||
|
usage="""
|
||||||
|
[滴滴滴]/滴滴滴- ?[文本] ?[图片]
|
||||||
|
示例:滴滴滴- 我喜欢你
|
||||||
|
|
||||||
|
超级管理员额外命令
|
||||||
|
/t: 查看当前存储的消息
|
||||||
|
/t [user_id] [group_id] [文本]: 在group回复指定用户
|
||||||
|
/t [user_id] [文本]: 私聊用户
|
||||||
|
/t -1 [group_id] [文本]: 在group内发送消息
|
||||||
|
/t [id] [文本]: 回复指定id的对话,id在 /t 中获取
|
||||||
|
示例:/t 73747222 32848432 你好啊
|
||||||
|
示例:/t 73747222 你好不好
|
||||||
|
示例:/t -1 32848432 我不太好
|
||||||
|
示例:/t 0 我收到你的话了
|
||||||
|
""".strip(),
|
||||||
|
extra=PluginExtraData(
|
||||||
|
author="HibiKier", version="0.1", menu_type="联系管理员"
|
||||||
|
).dict(),
|
||||||
|
)
|
||||||
|
|
||||||
|
config = nonebot.get_driver().config
|
||||||
|
|
||||||
|
|
||||||
|
_dialogue_matcher = on_command("滴滴滴-", priority=5, block=True)
|
||||||
|
_reply_matcher = on_command("/t", priority=1, permission=SUPERUSER, block=True)
|
||||||
|
|
||||||
|
|
||||||
|
@_dialogue_matcher.handle()
|
||||||
|
async def _(
|
||||||
|
bot: Bot,
|
||||||
|
message: UniMsg,
|
||||||
|
session: EventSession,
|
||||||
|
user_info: UserInfo = EventUserInfo(),
|
||||||
|
):
|
||||||
|
if session.id1:
|
||||||
|
message[0] = alcText(str(message[0]).replace("滴滴滴-", "", 1))
|
||||||
|
platform = PlatformUtils.get_platform(bot)
|
||||||
|
try:
|
||||||
|
superuser_id = config.platform_superusers["qq"][0]
|
||||||
|
if platform == "dodo":
|
||||||
|
superuser_id = config.platform_superusers["dodo"][0]
|
||||||
|
if platform == "kaiheila":
|
||||||
|
superuser_id = config.platform_superusers["kaiheila"][0]
|
||||||
|
if platform == "discord":
|
||||||
|
superuser_id = config.platform_superusers["discord"][0]
|
||||||
|
except IndexError:
|
||||||
|
await Text("管理员失联啦...").finish()
|
||||||
|
if not superuser_id:
|
||||||
|
await Text("管理员失联啦...").finish()
|
||||||
|
uname = user_info.user_displayname or user_info.user_name
|
||||||
|
group_name = ""
|
||||||
|
gid = session.id3 or session.id2
|
||||||
|
if gid:
|
||||||
|
if g := await GroupConsole.get(group_id=gid):
|
||||||
|
group_name = g.group_name
|
||||||
|
logger.info(
|
||||||
|
f"发送消息至{platform}管理员: {message}", "滴滴滴-", session=session
|
||||||
|
)
|
||||||
|
message.insert(0, "消息:\n")
|
||||||
|
if gid:
|
||||||
|
message.insert(0, f"群组: {group_name}({gid})\n")
|
||||||
|
message.insert(0, f"昵称: {uname}({session.id1})\n")
|
||||||
|
message.insert(0, f"Id: {DialogueManage._index}\n")
|
||||||
|
message.insert(0, "*****一份交流报告*****\n")
|
||||||
|
DialogueManage.add(uname, session.id1, gid, group_name, message, platform)
|
||||||
|
await message.send(bot=bot, target=Target(superuser_id, private=True))
|
||||||
|
await Text("已成功发送给管理员啦!").send(reply=True)
|
||||||
|
else:
|
||||||
|
await Text("用户id为空...").send()
|
||||||
|
|
||||||
|
|
||||||
|
@_reply_matcher.handle()
|
||||||
|
async def _(
|
||||||
|
bot: Bot,
|
||||||
|
message: UniMsg,
|
||||||
|
session: EventSession,
|
||||||
|
user_info: UserInfo = EventUserInfo(),
|
||||||
|
):
|
||||||
|
message[0] = alcText(str(message[0]).replace("/t", "", 1).strip())
|
||||||
|
if session.id1:
|
||||||
|
msg = message.extract_plain_text()
|
||||||
|
if not msg:
|
||||||
|
platform = PlatformUtils.get_platform(bot)
|
||||||
|
data = DialogueManage._data
|
||||||
|
if not data:
|
||||||
|
await Text("暂无待回复消息...").finish()
|
||||||
|
if platform:
|
||||||
|
data = [data[d] for d in data if data[d].platform == platform]
|
||||||
|
for d in data:
|
||||||
|
await d.message.send(
|
||||||
|
bot=bot, target=Target(session.id1, private=True)
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
msg = msg.split()
|
||||||
|
group_id = ""
|
||||||
|
user_id = ""
|
||||||
|
if msg[0].isdigit():
|
||||||
|
if len(msg[0]) < 4:
|
||||||
|
_id = int(msg[0])
|
||||||
|
if _id >= 0:
|
||||||
|
if model := DialogueManage.get(_id):
|
||||||
|
user_id = model.user_id
|
||||||
|
group_id = model.group_id
|
||||||
|
else:
|
||||||
|
return Text("未获取此id数据").finish()
|
||||||
|
message[0] = alcText(" ".join(str(message[0]).split(" ")[1:]))
|
||||||
|
else:
|
||||||
|
user_id = 0
|
||||||
|
if msg[1].isdigit():
|
||||||
|
group_id = msg[1]
|
||||||
|
message[0] = alcText(
|
||||||
|
" ".join(str(message[0]).split(" ")[2:])
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
await Text("群组id错误...").finish(at_sender=True)
|
||||||
|
DialogueManage.remove(_id)
|
||||||
|
else:
|
||||||
|
user_id = msg[0]
|
||||||
|
if msg[1].isdigit() and len(msg[1]) > 5:
|
||||||
|
group_id = msg[1]
|
||||||
|
message[0] = alcText(" ".join(str(message[0]).split(" ")[2:]))
|
||||||
|
else:
|
||||||
|
group_id = 0
|
||||||
|
message[0] = alcText(" ".join(str(message[0]).split(" ")[1:]))
|
||||||
|
else:
|
||||||
|
await Text("参数错误...").finish(at_sender=True)
|
||||||
|
if group_id:
|
||||||
|
if user_id:
|
||||||
|
message.insert(0, alcAt("user", user_id))
|
||||||
|
message.insert(1, "\n管理员回复\n=======\n")
|
||||||
|
await message.send(Target(group_id), bot)
|
||||||
|
await Text("消息发送成功!").finish(at_sender=True)
|
||||||
|
elif user_id:
|
||||||
|
await message.send(Target(user_id, private=True), bot)
|
||||||
|
await Text("消息发送成功!").finish(at_sender=True)
|
||||||
|
else:
|
||||||
|
await Text("群组id与用户id为空...").send()
|
||||||
|
else:
|
||||||
|
await Text("用户id为空...").send()
|
||||||
@@ -0,0 +1,55 @@
|
|||||||
|
from typing import Dict
|
||||||
|
|
||||||
|
from nonebot_plugin_alconna import UniMsg
|
||||||
|
from pydantic import BaseModel
|
||||||
|
|
||||||
|
|
||||||
|
class DialogueData(BaseModel):
|
||||||
|
|
||||||
|
name: str
|
||||||
|
"""用户名称"""
|
||||||
|
user_id: str
|
||||||
|
"""用户id"""
|
||||||
|
group_id: str | None
|
||||||
|
"""群组id"""
|
||||||
|
group_name: str | None
|
||||||
|
"""群组名称"""
|
||||||
|
message: UniMsg
|
||||||
|
"""UniMsg"""
|
||||||
|
platform: str | None
|
||||||
|
"""平台"""
|
||||||
|
|
||||||
|
|
||||||
|
class DialogueManage:
|
||||||
|
|
||||||
|
_data: Dict[int, DialogueData] = {}
|
||||||
|
_index = 0
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def add(
|
||||||
|
cls,
|
||||||
|
name: str,
|
||||||
|
uid: str,
|
||||||
|
gid: str | None,
|
||||||
|
group_name: str | None,
|
||||||
|
message: UniMsg,
|
||||||
|
platform: str | None,
|
||||||
|
):
|
||||||
|
cls._data[cls._index] = DialogueData(
|
||||||
|
name=name,
|
||||||
|
user_id=uid,
|
||||||
|
group_id=gid,
|
||||||
|
group_name=group_name,
|
||||||
|
message=message,
|
||||||
|
platform=platform,
|
||||||
|
)
|
||||||
|
cls._index += 1
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def remove(cls, index: int):
|
||||||
|
if index in cls._data:
|
||||||
|
del cls._data[index]
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def get(cls, k: int):
|
||||||
|
return cls._data.get(k)
|
||||||
@@ -25,7 +25,7 @@ from zhenxun.models.group_console import GroupConsole
|
|||||||
from zhenxun.services.log import logger
|
from zhenxun.services.log import logger
|
||||||
|
|
||||||
|
|
||||||
class PlatformManage:
|
class PlatformUtils:
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
async def send_message(
|
async def send_message(
|
||||||
@@ -97,6 +97,8 @@ class PlatformManage:
|
|||||||
return "dodo"
|
return "dodo"
|
||||||
if isinstance(bot, KaiheilaBot):
|
if isinstance(bot, KaiheilaBot):
|
||||||
return "kaiheila"
|
return "kaiheila"
|
||||||
|
if isinstance(bot, DiscordBot):
|
||||||
|
return "discord"
|
||||||
return None
|
return None
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@@ -308,9 +310,9 @@ async def broadcast_group(
|
|||||||
_used_group = []
|
_used_group = []
|
||||||
for _bot in bot_list:
|
for _bot in bot_list:
|
||||||
try:
|
try:
|
||||||
if platform and platform != PlatformManage.get_platform(_bot):
|
if platform and platform != PlatformUtils.get_platform(_bot):
|
||||||
continue
|
continue
|
||||||
group_list, _ = await PlatformManage.get_group_list(_bot)
|
group_list, _ = await PlatformUtils.get_group_list(_bot)
|
||||||
if group_list:
|
if group_list:
|
||||||
for group in group_list:
|
for group in group_list:
|
||||||
key = f"{group.group_id}:{group.channel_id}"
|
key = f"{group.group_id}:{group.channel_id}"
|
||||||
@@ -335,7 +337,7 @@ async def broadcast_group(
|
|||||||
)
|
)
|
||||||
if is_continue:
|
if is_continue:
|
||||||
continue
|
continue
|
||||||
target = PlatformManage.get_target(
|
target = PlatformUtils.get_target(
|
||||||
_bot, None, group.group_id, group.channel_id
|
_bot, None, group.group_id, group.channel_id
|
||||||
)
|
)
|
||||||
if target:
|
if target:
|
||||||
|
|||||||
Reference in New Issue
Block a user