mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2025-12-15 06:12:53 +08:00
update v0.1.5.6
This commit is contained in:
parent
404e47332e
commit
1040bd0d58
@ -238,10 +238,16 @@ __Docker 最新版本由 [Sakuracio](https://github.com/Sakuracio) 提供__
|
|||||||
|
|
||||||
## 更新
|
## 更新
|
||||||
|
|
||||||
### 2022/5/23
|
### 2022/5/23 \[v1.5.7]
|
||||||
|
|
||||||
* 修复"清除已删除插件数据" [@pull/545](https://github.com/HibiKier/zhenxun_bot/pull/545)
|
* 修复"清除已删除插件数据" [@pull/545](https://github.com/HibiKier/zhenxun_bot/pull/545)
|
||||||
* 修复有置顶的up主B站动态获取失败 [@pull/552](https://github.com/HibiKier/zhenxun_bot/pull/552)
|
* 修复有置顶的up主B站动态获取失败 [@pull/552](https://github.com/HibiKier/zhenxun_bot/pull/552)
|
||||||
|
* 添加pixiv搜图多关键词支持;修复p站搜图数量参数问题 [@pull/441](https://github.com/HibiKier/zhenxun_bot/pull/441)
|
||||||
|
* 修复开箱更新价格错误传参
|
||||||
|
* 修复pix无法正确查询uid
|
||||||
|
* 新增色图插件添加配置项ALLOW_GROUP_R18:允许群聊中使用色图r
|
||||||
|
* 新增PIX插件添加配置项ALLOW_GROUP_SETU:允许非超级用户使用-s参数
|
||||||
|
* 新增PIX插件添加配置项ALLOW_GROUP_R18:允许非超级用户使用-r参数
|
||||||
|
|
||||||
### 2022/5/22 \[v0.1.5.4]
|
### 2022/5/22 \[v0.1.5.4]
|
||||||
|
|
||||||
|
|||||||
@ -1 +1 @@
|
|||||||
__version__: v0.1.5.4
|
__version__: v0.1.5.6
|
||||||
@ -2,6 +2,7 @@ from configs.config import Config
|
|||||||
from models.chat_history import ChatHistory
|
from models.chat_history import ChatHistory
|
||||||
from nonebot import on_message
|
from nonebot import on_message
|
||||||
from nonebot.adapters.onebot.v11 import GroupMessageEvent, MessageEvent
|
from nonebot.adapters.onebot.v11 import GroupMessageEvent, MessageEvent
|
||||||
|
from utils.utils import get_message_text
|
||||||
|
|
||||||
from ._rule import rule
|
from ._rule import rule
|
||||||
|
|
||||||
@ -22,10 +23,10 @@ chat_history = on_message(rule=rule, priority=1, block=False)
|
|||||||
async def _(event: MessageEvent):
|
async def _(event: MessageEvent):
|
||||||
if isinstance(event, GroupMessageEvent):
|
if isinstance(event, GroupMessageEvent):
|
||||||
await ChatHistory.add_chat_msg(
|
await ChatHistory.add_chat_msg(
|
||||||
event.user_id, event.group_id, str(event.get_message())
|
event.user_id, event.group_id, str(event.get_message()), get_message_text(event.json())
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
await ChatHistory.add_chat_msg(event.user_id, None, str(event.get_message()))
|
await ChatHistory.add_chat_msg(event.user_id, None, str(event.get_message()), get_message_text(event.json()))
|
||||||
|
|
||||||
|
|
||||||
# @test.handle()
|
# @test.handle()
|
||||||
|
|||||||
@ -108,6 +108,10 @@ async def _():
|
|||||||
"ALTER TABLE genshin ADD bind_group Integer;",
|
"ALTER TABLE genshin ADD bind_group Integer;",
|
||||||
"genshin"
|
"genshin"
|
||||||
), # 新增原神群号绑定字段
|
), # 新增原神群号绑定字段
|
||||||
|
(
|
||||||
|
"ALTER TABLE chat_history ADD plain_text Text;",
|
||||||
|
"chat_history"
|
||||||
|
), # 新增纯文本
|
||||||
]
|
]
|
||||||
for sql in sql_str:
|
for sql in sql_str:
|
||||||
try:
|
try:
|
||||||
|
|||||||
@ -11,12 +11,13 @@ class ChatHistory(db.Model):
|
|||||||
user_qq = db.Column(db.BigInteger(), nullable=False)
|
user_qq = db.Column(db.BigInteger(), nullable=False)
|
||||||
group_id = db.Column(db.BigInteger())
|
group_id = db.Column(db.BigInteger())
|
||||||
text = db.Column(db.Text())
|
text = db.Column(db.Text())
|
||||||
|
plain_text = db.Column(db.Text())
|
||||||
create_time = db.Column(db.DateTime(timezone=True), nullable=False)
|
create_time = db.Column(db.DateTime(timezone=True), nullable=False)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
async def add_chat_msg(cls, user_qq: int, group_id: Optional[int], text: str):
|
async def add_chat_msg(cls, user_qq: int, group_id: Optional[int], text: str, plain_text: str):
|
||||||
await cls.create(
|
await cls.create(
|
||||||
user_qq=user_qq, group_id=group_id, text=text, create_time=datetime.now()
|
user_qq=user_qq, group_id=group_id, text=text, plain_text=plain_text, create_time=datetime.now()
|
||||||
)
|
)
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
@ -97,7 +98,6 @@ class ChatHistory(db.Model):
|
|||||||
if date_scope:
|
if date_scope:
|
||||||
sql += f"AND create_time BETWEEN '{date_scope[0]}' AND '{date_scope[1]}' "
|
sql += f"AND create_time BETWEEN '{date_scope[0]}' AND '{date_scope[1]}' "
|
||||||
sql += f"GROUP BY user_qq ORDER BY sum {order if order and order.upper() != 'DES' else ''} LIMIT {limit}"
|
sql += f"GROUP BY user_qq ORDER BY sum {order if order and order.upper() != 'DES' else ''} LIMIT {limit}"
|
||||||
print(sql)
|
|
||||||
return await db.all(db.text(sql))
|
return await db.all(db.text(sql))
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
|
|||||||
@ -38,7 +38,6 @@ async def create_live_des_image(uid: int, title: str, cover: str, tags: str, des
|
|||||||
ava = BuildImage(100, 100, background=BytesIO(await get_pic(face)))
|
ava = BuildImage(100, 100, background=BytesIO(await get_pic(face)))
|
||||||
ava.circle()
|
ava.circle()
|
||||||
cover = BuildImage(470, 265, background=BytesIO(await get_pic(cover)))
|
cover = BuildImage(470, 265, background=BytesIO(await get_pic(cover)))
|
||||||
print()
|
|
||||||
|
|
||||||
|
|
||||||
def _create_live_des_image(
|
def _create_live_des_image(
|
||||||
|
|||||||
@ -241,7 +241,6 @@ async def _(event: MessageEvent, arg: Message = CommandArg()):
|
|||||||
uid = int(msg[0])
|
uid = int(msg[0])
|
||||||
id_ = int(msg[1])
|
id_ = int(msg[1])
|
||||||
punish_level = int(msg[2])
|
punish_level = int(msg[2])
|
||||||
print(uid, id_, punish_level)
|
|
||||||
rst = await set_user_punish(uid, id_, punish_level)
|
rst = await set_user_punish(uid, id_, punish_level)
|
||||||
await set_punish.send(rst)
|
await set_punish.send(rst)
|
||||||
logger.info(
|
logger.info(
|
||||||
|
|||||||
@ -68,7 +68,6 @@ class BlackWord(db.Model):
|
|||||||
user = await query.where(cls.black_word == black_word).order_by(cls.id.desc()).gino.first()
|
user = await query.where(cls.black_word == black_word).order_by(cls.id.desc()).gino.first()
|
||||||
elif id_:
|
elif id_:
|
||||||
user_list = await query.gino.all()
|
user_list = await query.gino.all()
|
||||||
print(len(user_list))
|
|
||||||
if len(user_list) == 0 or (id_ < 0 or id_ > len(user_list)):
|
if len(user_list) == 0 or (id_ < 0 or id_ > len(user_list)):
|
||||||
return False
|
return False
|
||||||
user = user_list[id_]
|
user = user_list[id_]
|
||||||
|
|||||||
@ -88,9 +88,7 @@ class BlackWordManager:
|
|||||||
:param group_id: 群号
|
:param group_id: 群号
|
||||||
:param message: 消息
|
:param message: 消息
|
||||||
"""
|
"""
|
||||||
print(user_id, group_id, message)
|
|
||||||
if data := self._check(message):
|
if data := self._check(message):
|
||||||
print(data)
|
|
||||||
if data[0]:
|
if data[0]:
|
||||||
await _add_user_black_word(
|
await _add_user_black_word(
|
||||||
user_id, group_id, data[0], message, int(data[1])
|
user_id, group_id, data[0], message, int(data[1])
|
||||||
|
|||||||
@ -211,16 +211,16 @@ update_price = on_command("更新开箱价格", priority=1, permission=SUPERUSER
|
|||||||
|
|
||||||
|
|
||||||
@update_price.handle()
|
@update_price.handle()
|
||||||
async def _( event: MessageEvent):
|
async def _(event: MessageEvent, arg: Message = CommandArg()):
|
||||||
await update_price.send(await util_get_buff_price(str(event.get_message())))
|
await update_price.send(await util_get_buff_price(arg.extract_plain_text().strip()))
|
||||||
|
|
||||||
|
|
||||||
update_img = on_command("更新开箱图片", priority=1, permission=SUPERUSER, block=True)
|
update_img = on_command("更新开箱图片", priority=1, permission=SUPERUSER, block=True)
|
||||||
|
|
||||||
|
|
||||||
@update_img.handle()
|
@update_img.handle()
|
||||||
async def _(event: MessageEvent):
|
async def _(event: MessageEvent, arg: Message = CommandArg()):
|
||||||
await update_img.send(await util_get_buff_img(str(event.get_message())))
|
await update_img.send(await util_get_buff_img(str(arg.extract_plain_text().strip())))
|
||||||
|
|
||||||
|
|
||||||
# 重置开箱
|
# 重置开箱
|
||||||
|
|||||||
@ -139,15 +139,14 @@ class OmegaPixivIllusts(db.Model):
|
|||||||
data = await cls.select('pid').gino.all()
|
data = await cls.select('pid').gino.all()
|
||||||
return [x[0] for x in data]
|
return [x[0] for x in data]
|
||||||
|
|
||||||
@classmethod
|
# async def test(cls, nsfw_tag: int = 1):
|
||||||
async def test(cls, nsfw_tag: int = 1):
|
# if nsfw_tag is not None:
|
||||||
if nsfw_tag is not None:
|
# query = cls.query.where(cls.nsfw_tag == nsfw_tag)
|
||||||
query = cls.query.where(cls.nsfw_tag == nsfw_tag)
|
# else:
|
||||||
else:
|
# query = cls.query
|
||||||
query = cls.query
|
# query = query.where((cls.width - cls.height) < 50)
|
||||||
query = query.where((cls.width - cls.height) < 50)
|
# for x in await query.gino.all():
|
||||||
for x in await query.gino.all():
|
# print(x.pid)
|
||||||
print(x.pid)
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -18,6 +18,7 @@ usage:
|
|||||||
查看 pix 好康图库
|
查看 pix 好康图库
|
||||||
指令:
|
指令:
|
||||||
pix ?*[tags]: 通过 tag 获取相似图片,不含tag时随机抽取
|
pix ?*[tags]: 通过 tag 获取相似图片,不含tag时随机抽取
|
||||||
|
pid [uid]: 通过uid获取图片
|
||||||
pix pid[pid]: 查看图库中指定pid图片
|
pix pid[pid]: 查看图库中指定pid图片
|
||||||
""".strip()
|
""".strip()
|
||||||
__plugin_superuser_usage__ = """
|
__plugin_superuser_usage__ = """
|
||||||
@ -49,7 +50,9 @@ __plugin_configs__ = {
|
|||||||
"value": None,
|
"value": None,
|
||||||
"help": "单次发送的图片数量达到指定值时转发为合并消息",
|
"help": "单次发送的图片数量达到指定值时转发为合并消息",
|
||||||
"default_value": None,
|
"default_value": None,
|
||||||
}
|
},
|
||||||
|
"ALLOW_GROUP_SETU": {"value": False, "help": "允许非超级用户使用-s参数", "default_value": False},
|
||||||
|
"ALLOW_GROUP_R18": {"value": False, "help": "允许非超级用户使用-r参数", "default_value": False},
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -80,10 +83,13 @@ async def _(bot: Bot, event: MessageEvent, arg: Message = CommandArg()):
|
|||||||
nsfw_tag = 2
|
nsfw_tag = 2
|
||||||
else:
|
else:
|
||||||
nsfw_tag = 0
|
nsfw_tag = 0
|
||||||
if nsfw_tag != 0 and str(event.user_id) not in bot.config.superusers:
|
if str(event.user_id) not in bot.config.superusers:
|
||||||
await pix.finish("你不能看这些噢,这些都是是留给管理员看的...")
|
if (nsfw_tag == 1 and not Config.get_config("pix", "ALLOW_GROUP_SETU")) or (
|
||||||
if n := len(x) == 1 and is_number(x[0]):
|
nsfw_tag == 2 and not Config.get_config("pix", "ALLOW_GROUP_R18")
|
||||||
num = int(x[-1])
|
):
|
||||||
|
await pix.finish("你不能看这些噢,这些都是是留给管理员看的...")
|
||||||
|
if n := len(x) == 1 and is_number(x[0]) and int(x[0]) < 100:
|
||||||
|
num = int(x[0])
|
||||||
keyword = ""
|
keyword = ""
|
||||||
elif n > 1:
|
elif n > 1:
|
||||||
if is_number(x[-1]):
|
if is_number(x[-1]):
|
||||||
|
|||||||
@ -97,6 +97,7 @@ __plugin_configs__ = {
|
|||||||
},
|
},
|
||||||
"TIMEOUT": {"value": 10, "help": "色图下载超时限制(秒)", "default_value": 10},
|
"TIMEOUT": {"value": 10, "help": "色图下载超时限制(秒)", "default_value": 10},
|
||||||
"SHOW_INFO": {"value": True, "help": "是否显示色图的基本信息,如PID等", "default_value": True},
|
"SHOW_INFO": {"value": True, "help": "是否显示色图的基本信息,如PID等", "default_value": True},
|
||||||
|
"ALLOW_GROUP_R18": {"value": False, "help": "在群聊中启用R18权限", "default_value": False},
|
||||||
}
|
}
|
||||||
Config.add_plugin_config("pixiv", "PIXIV_NGINX_URL", "i.pixiv.re", help_="Pixiv反向代理")
|
Config.add_plugin_config("pixiv", "PIXIV_NGINX_URL", "i.pixiv.re", help_="Pixiv反向代理")
|
||||||
|
|
||||||
@ -148,10 +149,16 @@ async def _(
|
|||||||
if cmd[0] == "色图r" and isinstance(event, PrivateMessageEvent):
|
if cmd[0] == "色图r" and isinstance(event, PrivateMessageEvent):
|
||||||
r18 = 1
|
r18 = 1
|
||||||
num = 10
|
num = 10
|
||||||
elif cmd[0] == "色图r" and isinstance(event, GroupMessageEvent):
|
elif (
|
||||||
await setu.finish(
|
cmd[0] == "色图r"
|
||||||
random.choice(["这种不好意思的东西怎么可能给这么多人看啦", "羞羞脸!给我滚出克私聊!", "变态变态变态变态大变态!"])
|
and isinstance(event, GroupMessageEvent)
|
||||||
)
|
):
|
||||||
|
if not Config.get_config("send_setu", "ALLOW_GROUP_R18"):
|
||||||
|
await setu.finish(
|
||||||
|
random.choice(["这种不好意思的东西怎么可能给这么多人看啦", "羞羞脸!给我滚出克私聊!", "变态变态变态变态大变态!"])
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
r18 = 1
|
||||||
# 有 数字 的话先尝试本地色图id
|
# 有 数字 的话先尝试本地色图id
|
||||||
if msg and is_number(msg):
|
if msg and is_number(msg):
|
||||||
setu_list, code = await get_setu_list(int(msg), r18=r18)
|
setu_list, code = await get_setu_list(int(msg), r18=r18)
|
||||||
|
|||||||
@ -12,6 +12,7 @@ import numpy as np
|
|||||||
import matplotlib.pyplot as plt
|
import matplotlib.pyplot as plt
|
||||||
from io import BytesIO
|
from io import BytesIO
|
||||||
from configs.path_config import IMAGE_PATH, FONT_PATH
|
from configs.path_config import IMAGE_PATH, FONT_PATH
|
||||||
|
from services import logger
|
||||||
from utils.http_utils import AsyncHttpx
|
from utils.http_utils import AsyncHttpx
|
||||||
from models.chat_history import ChatHistory
|
from models.chat_history import ChatHistory
|
||||||
from configs.config import Config
|
from configs.config import Config
|
||||||
@ -19,10 +20,11 @@ from configs.config import Config
|
|||||||
|
|
||||||
async def pre_precess(msg: List[str], config) -> str:
|
async def pre_precess(msg: List[str], config) -> str:
|
||||||
return await asyncio.get_event_loop().run_in_executor(
|
return await asyncio.get_event_loop().run_in_executor(
|
||||||
None, _pre_precess, msg,config)
|
None, _pre_precess, msg, config
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
def _pre_precess(msg: List[str],config) -> str:
|
def _pre_precess(msg: List[str], config) -> str:
|
||||||
"""对消息进行预处理"""
|
"""对消息进行预处理"""
|
||||||
# 过滤掉命令
|
# 过滤掉命令
|
||||||
command_start = tuple([i for i in config.command_start if i])
|
command_start = tuple([i for i in config.command_start if i])
|
||||||
@ -46,7 +48,6 @@ def _pre_precess(msg: List[str],config) -> str:
|
|||||||
return msg
|
return msg
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
async def draw_word_cloud(messages, config):
|
async def draw_word_cloud(messages, config):
|
||||||
wordcloud_dir = IMAGE_PATH / "wordcloud"
|
wordcloud_dir = IMAGE_PATH / "wordcloud"
|
||||||
wordcloud_dir.mkdir(exist_ok=True, parents=True)
|
wordcloud_dir.mkdir(exist_ok=True, parents=True)
|
||||||
@ -57,19 +58,21 @@ async def draw_word_cloud(messages, config):
|
|||||||
url = "https://ghproxy.com/https://raw.githubusercontent.com/HibiKier/zhenxun_bot/main/resources/image/wordcloud/default.png"
|
url = "https://ghproxy.com/https://raw.githubusercontent.com/HibiKier/zhenxun_bot/main/resources/image/wordcloud/default.png"
|
||||||
try:
|
try:
|
||||||
await AsyncHttpx.download_file(url, zx_logo_path)
|
await AsyncHttpx.download_file(url, zx_logo_path)
|
||||||
except:
|
except Exception as e:
|
||||||
|
logger.error(f"词云图片资源下载发生错误 {type(e)}:{e}")
|
||||||
return False
|
return False
|
||||||
if not wordcloud_ttf.exists():
|
if not wordcloud_ttf.exists():
|
||||||
ttf_url = 'https://ghproxy.com/https://raw.githubusercontent.com/HibiKier/zhenxun_bot/main/resources/font/STKAITI.TTF'
|
ttf_url = "https://ghproxy.com/https://raw.githubusercontent.com/HibiKier/zhenxun_bot/main/resources/font/STKAITI.TTF"
|
||||||
try:
|
try:
|
||||||
await AsyncHttpx.download_file(ttf_url, wordcloud_ttf)
|
await AsyncHttpx.download_file(ttf_url, wordcloud_ttf)
|
||||||
except:
|
except Exception as e:
|
||||||
|
logger.error(f"词云字体资源下载发生错误 {type(e)}:{e}")
|
||||||
return False
|
return False
|
||||||
|
|
||||||
topK = min(int(len(messages)), 100000)
|
topK = min(int(len(messages)), 100000)
|
||||||
read_name = jieba.analyse.extract_tags(await pre_precess(messages, config), topK=topK,
|
read_name = jieba.analyse.extract_tags(
|
||||||
withWeight=True,
|
await pre_precess(messages, config), topK=topK, withWeight=True, allowPOS=()
|
||||||
allowPOS=())
|
)
|
||||||
name = []
|
name = []
|
||||||
value = []
|
value = []
|
||||||
for t in read_name:
|
for t in read_name:
|
||||||
@ -79,10 +82,11 @@ async def draw_word_cloud(messages, config):
|
|||||||
name[i] = str(name[i])
|
name[i] = str(name[i])
|
||||||
dic = dict(zip(name, value))
|
dic = dict(zip(name, value))
|
||||||
if Config.get_config("word_clouds", "WORD_CLOUDS_TEMPLATE") == 1:
|
if Config.get_config("word_clouds", "WORD_CLOUDS_TEMPLATE") == 1:
|
||||||
|
|
||||||
def random_pic(base_path: str) -> str:
|
def random_pic(base_path: str) -> str:
|
||||||
path_dir = os.listdir(base_path)
|
path_dir = os.listdir(base_path)
|
||||||
path = random.sample(path_dir, 1)[0]
|
path = random.sample(path_dir, 1)[0]
|
||||||
return (str(base_path) + "/" + str(path))
|
return str(base_path) + "/" + str(path)
|
||||||
|
|
||||||
mask = np.array(IMG.open(random_pic(wordcloud_dir)))
|
mask = np.array(IMG.open(random_pic(wordcloud_dir)))
|
||||||
wc = WordCloud(
|
wc = WordCloud(
|
||||||
@ -113,7 +117,11 @@ async def draw_word_cloud(messages, config):
|
|||||||
|
|
||||||
|
|
||||||
async def get_list_msg(user_id, group_id, days):
|
async def get_list_msg(user_id, group_id, days):
|
||||||
messages_list = await ChatHistory()._get_msg(uid=user_id, gid=group_id, type_="group", days=days).gino.all()
|
messages_list = (
|
||||||
|
await ChatHistory()
|
||||||
|
._get_msg(uid=user_id, gid=group_id, type_="group", days=days)
|
||||||
|
.gino.all()
|
||||||
|
)
|
||||||
if messages_list:
|
if messages_list:
|
||||||
messages = [i.text for i in messages_list]
|
messages = [i.text for i in messages_list]
|
||||||
return messages
|
return messages
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user