mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2025-12-15 06:12:53 +08:00
fix
This commit is contained in:
parent
96dc1d9851
commit
5ec89e7538
@ -67,6 +67,7 @@ SEMAPHORE = 5 # 限制碧蓝航线和FGO并发数
|
||||
ADMIN_DEFAULT_AUTH: int = 5 # 默认群管理员权限
|
||||
|
||||
MAX_SIGN_GOLD: int = 200 # 签到好感度加成额外获得的最大金币数
|
||||
MAX_RUSSIAN_BET_GOLD: int = 1000 # 俄罗斯轮盘最大赌注金额
|
||||
|
||||
INITIAL_SETU_PROBABILITY: float = 0.7 # 色图概率
|
||||
FUDU_PROBABILITY: float = 0.7 # 复读概率
|
||||
@ -97,7 +98,7 @@ HIBIAPI_BOOKMARKS: int = 5000
|
||||
|
||||
# 需要为哪些群更新最新版gocq吗?(上传最新版gocq)
|
||||
# 示例:[434995955, 239483248]
|
||||
UPDATE_GOCQ_GROUP: List[int] = [774261838]
|
||||
UPDATE_GOCQ_GROUP: List[int] = []
|
||||
|
||||
# 是否存储色图
|
||||
DOWNLOAD_SETU: bool = True
|
||||
@ -109,6 +110,8 @@ AUTO_ADD_FRIEND: bool = True
|
||||
ALAPI_AI_CHECK: bool = True
|
||||
# 导入商店自带的三个商品
|
||||
IMPORT_DEFAULT_SHOP_GOODS: bool = True
|
||||
# 真寻是否自动更新
|
||||
AUTO_UPDATE_ZHENXUN: bool = True
|
||||
|
||||
# 群管理员功能 与 对应权限
|
||||
admin_plugins_auth = {
|
||||
|
||||
@ -5,33 +5,36 @@ from datetime import datetime
|
||||
from configs.config import AUTO_ADD_FRIEND
|
||||
from nonebot.adapters.cqhttp.exception import ActionFailed
|
||||
from utils.utils import scheduler
|
||||
import time
|
||||
|
||||
__plugin_name__ = "好友群聊处理请求 [Hidden]"
|
||||
|
||||
friend_req = on_request(priority=5)
|
||||
|
||||
|
||||
exists_list = []
|
||||
exists_data = {"private": {}, "group": {}}
|
||||
|
||||
|
||||
@friend_req.handle()
|
||||
async def _(bot: Bot, event: FriendRequestEvent, state: dict):
|
||||
global exists_list
|
||||
if f"{event.user_id}" not in exists_list:
|
||||
exists_list.append(f"{event.user_id}")
|
||||
user = await bot.get_stranger_info(user_id=event.user_id)
|
||||
nickname = user["nickname"]
|
||||
await bot.send_private_msg(
|
||||
user_id=int(list(bot.config.superusers)[0]),
|
||||
message=f"*****一份好友申请*****\n"
|
||||
f"昵称:{nickname}({event.user_id})\n"
|
||||
f"自动同意:{'√' if AUTO_ADD_FRIEND else '×'}\n"
|
||||
f"日期:{str(datetime.now()).split('.')[0]}\n"
|
||||
f"备注:{event.comment}",
|
||||
)
|
||||
if AUTO_ADD_FRIEND:
|
||||
await bot.set_friend_add_request(flag=event.flag, approve=True)
|
||||
await FriendUser.add_friend_info(user["user_id"], user["nickname"])
|
||||
global exists_data
|
||||
if exists_data["private"].get(event.user_id):
|
||||
if time.time() - exists_data["private"][event.user_id] < 60 * 5:
|
||||
return
|
||||
exists_data["private"][event.user_id] = time.time()
|
||||
user = await bot.get_stranger_info(user_id=event.user_id)
|
||||
nickname = user["nickname"]
|
||||
await bot.send_private_msg(
|
||||
user_id=int(list(bot.config.superusers)[0]),
|
||||
message=f"*****一份好友申请*****\n"
|
||||
f"昵称:{nickname}({event.user_id})\n"
|
||||
f"自动同意:{'√' if AUTO_ADD_FRIEND else '×'}\n"
|
||||
f"日期:{str(datetime.now()).split('.')[0]}\n"
|
||||
f"备注:{event.comment}",
|
||||
)
|
||||
if AUTO_ADD_FRIEND:
|
||||
await bot.set_friend_add_request(flag=event.flag, approve=True)
|
||||
await FriendUser.add_friend_info(user["user_id"], user["nickname"])
|
||||
|
||||
|
||||
group_req = on_request(priority=5, block=True)
|
||||
@ -39,7 +42,7 @@ group_req = on_request(priority=5, block=True)
|
||||
|
||||
@group_req.handle()
|
||||
async def _(bot: Bot, event: GroupRequestEvent, state: dict):
|
||||
global exists_list
|
||||
global exists_data
|
||||
if event.sub_type == "invite":
|
||||
if str(event.user_id) in bot.config.superusers:
|
||||
try:
|
||||
@ -49,22 +52,26 @@ async def _(bot: Bot, event: GroupRequestEvent, state: dict):
|
||||
except ActionFailed:
|
||||
pass
|
||||
else:
|
||||
if f"{event.user_id}:{event.group_id}" not in exists_list:
|
||||
exists_list.append(f"{event.user_id}:{event.group_id}")
|
||||
nickname = await FriendUser.get_user_name(event.user_id)
|
||||
await bot.send_private_msg(
|
||||
user_id=int(list(bot.config.superusers)[0]),
|
||||
message=f"*****一份入群申请*****\n"
|
||||
f"申请人:{nickname}({event.user_id})\n"
|
||||
f"群聊:{event.group_id}\n"
|
||||
f"邀请日期:{str(datetime.now()).split('.')[0]}",
|
||||
)
|
||||
await bot.send_private_msg(
|
||||
user_id=event.user_id,
|
||||
message="想要邀请我偷偷入群嘛~已经提醒真寻的管理员大人了\n"
|
||||
"请确保已经群主或群管理沟通过!\n"
|
||||
"等待管理员处理吧!",
|
||||
)
|
||||
if exists_data["group"].get(f"{event.user_id}:{event.group_id}"):
|
||||
if (
|
||||
time.time()
|
||||
- exists_data["group"][f"{event.user_id}:{event.group_id}"]
|
||||
< 60 * 5
|
||||
):
|
||||
return
|
||||
exists_data["group"][f"{event.user_id}:{event.group_id}"] = time.time()
|
||||
nickname = await FriendUser.get_user_name(event.user_id)
|
||||
await bot.send_private_msg(
|
||||
user_id=int(list(bot.config.superusers)[0]),
|
||||
message=f"*****一份入群申请*****\n"
|
||||
f"申请人:{nickname}({event.user_id})\n"
|
||||
f"群聊:{event.group_id}\n"
|
||||
f"邀请日期:{str(datetime.now()).split('.')[0]}",
|
||||
)
|
||||
await bot.send_private_msg(
|
||||
user_id=event.user_id,
|
||||
message="想要邀请我偷偷入群嘛~已经提醒真寻的管理员大人了\n" "请确保已经群主或群管理沟通过!\n" "等待管理员处理吧!",
|
||||
)
|
||||
|
||||
|
||||
@scheduler.scheduled_job(
|
||||
@ -72,5 +79,5 @@ async def _(bot: Bot, event: GroupRequestEvent, state: dict):
|
||||
minutes=5,
|
||||
)
|
||||
async def _():
|
||||
global exists_list
|
||||
exists_list = []
|
||||
global exists_data
|
||||
exists_data = {"private": {}, "group": {}}
|
||||
|
||||
@ -33,8 +33,9 @@ ban = on_command(
|
||||
@ban.handle()
|
||||
async def _(bot: Bot, event: GroupMessageEvent, state: T_State):
|
||||
result = ""
|
||||
qq = get_message_at(event.json())[0]
|
||||
qq = get_message_at(event.json())
|
||||
if qq:
|
||||
qq = qq[0]
|
||||
user_name = await bot.get_group_member_info(group_id=event.group_id, user_id=qq)
|
||||
user_name = user_name['card'] if user_name['card'] else user_name['nickname']
|
||||
msg = get_message_text(event.json())
|
||||
@ -52,16 +53,16 @@ async def _(bot: Bot, event: GroupMessageEvent, state: T_State):
|
||||
time = -1
|
||||
if state["_prefix"]["raw_command"] in [".ban", "/ban"]:
|
||||
if (
|
||||
await LevelUser.get_user_level(event.user_id, event.group_id)
|
||||
<= await LevelUser.get_user_level(qq, event.group_id)
|
||||
and str(event.user_id) not in bot.config.superusers
|
||||
await LevelUser.get_user_level(event.user_id, event.group_id)
|
||||
<= await LevelUser.get_user_level(qq, event.group_id)
|
||||
and str(event.user_id) not in bot.config.superusers
|
||||
):
|
||||
await ban.finish(
|
||||
f"您的权限等级比对方低或相等, {list(bot.config.nickname)[0]}不能为您使用此功能!",
|
||||
at_sender=True,
|
||||
)
|
||||
if await BanUser.ban(
|
||||
qq, await LevelUser.get_user_level(event.user_id, event.group_id), time
|
||||
qq, await LevelUser.get_user_level(event.user_id, event.group_id), time
|
||||
):
|
||||
logger.info(
|
||||
f"USER {event.user_id} GROUP {event.group_id} 将 USER {qq} 封禁 时长 {time/60} 分钟"
|
||||
@ -82,10 +83,10 @@ async def _(bot: Bot, event: GroupMessageEvent, state: T_State):
|
||||
result = f"{user_name} 已在黑名单!预计 {time}后解封"
|
||||
else:
|
||||
if (
|
||||
await BanUser.check_ban_level(
|
||||
qq, await LevelUser.get_user_level(event.user_id, event.group_id)
|
||||
)
|
||||
and str(event.user_id) not in bot.config.superusers
|
||||
await BanUser.check_ban_level(
|
||||
qq, await LevelUser.get_user_level(event.user_id, event.group_id)
|
||||
)
|
||||
and str(event.user_id) not in bot.config.superusers
|
||||
):
|
||||
await ban.finish(
|
||||
f"ban掉 {user_name} 的管理员权限比您高,无法进行unban", at_sender=True
|
||||
@ -100,3 +101,7 @@ async def _(bot: Bot, event: GroupMessageEvent, state: T_State):
|
||||
else:
|
||||
await ban.finish("艾特人了吗??", at_sender=True)
|
||||
await ban.finish(result, at_sender=True)
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@ -6,15 +6,21 @@ from .data_source import check_update, get_latest_version
|
||||
from services.log import logger
|
||||
from utils.utils import scheduler, get_bot
|
||||
from pathlib import Path
|
||||
from configs.config import AUTO_UPDATE_ZHENXUN
|
||||
from nonebot.rule import to_me
|
||||
import platform
|
||||
import os
|
||||
|
||||
|
||||
update_zhenxun = on_command('检查更新真寻', permission=SUPERUSER, priority=1, block=True)
|
||||
|
||||
restart = on_command('重启', aliases={'restart'}, permission=SUPERUSER, rule=to_me(), priority=1, block=True)
|
||||
|
||||
|
||||
@update_zhenxun.handle()
|
||||
async def _(bot: Bot, event: MessageEvent, state: T_State):
|
||||
try:
|
||||
await check_update(bot)
|
||||
code = await check_update(bot)
|
||||
except Exception as e:
|
||||
logger.error(f'更新真寻未知错误 {type(e)}:{e}')
|
||||
await bot.send_private_msg(
|
||||
@ -22,41 +28,67 @@ async def _(bot: Bot, event: MessageEvent, state: T_State):
|
||||
message=f'更新真寻未知错误 {type(e)}:{e}'
|
||||
)
|
||||
else:
|
||||
await bot.send_private_msg(
|
||||
user_id=int(list(bot.config.superusers)[0]),
|
||||
message=f'更新完毕,请重启真寻....'
|
||||
)
|
||||
if code == 200:
|
||||
await bot.send_private_msg(
|
||||
user_id=int(list(bot.config.superusers)[0]),
|
||||
message=f'更新完毕,请重启真寻....'
|
||||
)
|
||||
|
||||
|
||||
@restart.handle()
|
||||
async def _(bot: Bot, event: MessageEvent, state: T_State):
|
||||
if str(platform.system()).lower() == 'windows':
|
||||
await restart.finish('暂无windows重启脚本...')
|
||||
|
||||
|
||||
@restart.got('flag', prompt='确定是否重启真寻?(重启失败咱们将失去联系,请谨慎!)')
|
||||
async def _(bot: Bot, event: MessageEvent, state: T_State):
|
||||
flag = state['flag']
|
||||
if flag.lower() in ['true', '是', '好']:
|
||||
await restart.send('开始重启真寻..请稍等...')
|
||||
open('is_restart', 'w')
|
||||
os.system('./restart.sh')
|
||||
else:
|
||||
await restart.send('已取消操作...')
|
||||
|
||||
|
||||
@scheduler.scheduled_job(
|
||||
"interval",
|
||||
hours=24,
|
||||
"cron",
|
||||
hour=12,
|
||||
minute=0,
|
||||
)
|
||||
async def _():
|
||||
_version = "v0.0.0"
|
||||
_version_file = Path() / "__version__"
|
||||
if _version_file.exists():
|
||||
_version = (
|
||||
open(_version_file, "r", encoding="utf8").readline().split(":")[-1].strip()
|
||||
)
|
||||
latest_version, tar_gz_url = await get_latest_version()
|
||||
if latest_version and tar_gz_url:
|
||||
if _version != latest_version:
|
||||
bot = get_bot()
|
||||
await bot.send_private_msg(
|
||||
user_id=int(list(bot.config.superusers)[0]),
|
||||
message=f'检测到真寻版本更新\n'
|
||||
f'当前版本:{_version},最新版本:{latest_version}\n'
|
||||
f'尝试自动更新...'
|
||||
if AUTO_UPDATE_ZHENXUN:
|
||||
_version = "v0.0.0"
|
||||
_version_file = Path() / "__version__"
|
||||
if _version_file.exists():
|
||||
_version = (
|
||||
open(_version_file, "r", encoding="utf8").readline().split(":")[-1].strip()
|
||||
)
|
||||
try:
|
||||
await check_update(bot)
|
||||
except Exception as e:
|
||||
logger.error(f'更新真寻未知错误 {type(e)}:{e}')
|
||||
latest_version, tar_gz_url = await get_latest_version()
|
||||
if latest_version and tar_gz_url:
|
||||
if _version != latest_version:
|
||||
bot = get_bot()
|
||||
await bot.send_private_msg(
|
||||
user_id=int(list(bot.config.superusers)[0]),
|
||||
message=f'更新真寻未知错误 {type(e)}:{e}\n'
|
||||
message=f'检测到真寻版本更新\n'
|
||||
f'当前版本:{_version},最新版本:{latest_version}\n'
|
||||
f'尝试自动更新...'
|
||||
)
|
||||
try:
|
||||
code = await check_update(bot)
|
||||
except Exception as e:
|
||||
logger.error(f'更新真寻未知错误 {type(e)}:{e}')
|
||||
await bot.send_private_msg(
|
||||
user_id=int(list(bot.config.superusers)[0]),
|
||||
message=f'更新真寻未知错误 {type(e)}:{e}\n'
|
||||
)
|
||||
else:
|
||||
if code == 200:
|
||||
await bot.send_private_msg(
|
||||
user_id=int(list(bot.config.superusers)[0]),
|
||||
message=f'更新完毕,请重启真寻....'
|
||||
)
|
||||
|
||||
|
||||
|
||||
|
||||
@ -1,13 +1,14 @@
|
||||
from aiohttp.client_exceptions import ClientConnectorError
|
||||
from nonebot.adapters.cqhttp import Bot
|
||||
from utils.user_agent import get_user_agent
|
||||
from utils.utils import get_local_proxy
|
||||
from utils.utils import get_local_proxy, get_bot
|
||||
from typing import List
|
||||
from bs4.element import Tag
|
||||
from services.log import logger
|
||||
from bs4 import BeautifulSoup
|
||||
from pathlib import Path
|
||||
import ujson as json
|
||||
import nonebot
|
||||
import asyncio
|
||||
import aiofiles
|
||||
import aiohttp
|
||||
@ -16,11 +17,13 @@ import tarfile
|
||||
import shutil
|
||||
import os
|
||||
|
||||
if str(platform.system()).lower() == 'windows':
|
||||
if str(platform.system()).lower() == "windows":
|
||||
policy = asyncio.WindowsSelectorEventLoopPolicy()
|
||||
asyncio.set_event_loop_policy(policy)
|
||||
|
||||
|
||||
driver = nonebot.get_driver()
|
||||
|
||||
version_url = "https://github.com/HibiKier/zhenxun_bot/releases"
|
||||
main_url = "https://github.com/HibiKier/zhenxun_bot"
|
||||
|
||||
@ -30,7 +33,39 @@ temp_dir = Path() / "temp"
|
||||
backup_dir = Path() / "backup"
|
||||
|
||||
|
||||
async def check_update(bot: Bot):
|
||||
@driver.on_startup
|
||||
def init():
|
||||
if str(platform.system()).lower() != "windows":
|
||||
restart = Path() / "restart.sh"
|
||||
env_file = Path() / ".env.dev"
|
||||
if not restart.exists() and env_file.exists():
|
||||
with open(env_file, "r", encoding="utf8") as ef:
|
||||
data = ef.readlines()
|
||||
port = [x.split("=")[1].strip() for x in data if "port" in x.lower()][0]
|
||||
with open(restart, "w", encoding="utf8") as f:
|
||||
f.write(
|
||||
"pid=$(netstat -tunlp | grep " + port + " | awk '{print $7}')\n"
|
||||
"pid=${pid%/*}\n"
|
||||
"kill -9 $pid\n"
|
||||
"sleep 3\n"
|
||||
"python3 bot.py"
|
||||
)
|
||||
os.system("chmod +x ./restart.sh")
|
||||
logger.info("已自动生成 restart.sh(重启) 文件,请检查是否与本地指令符合...")
|
||||
|
||||
|
||||
@driver.on_bot_connect
|
||||
async def remind(bot: Bot):
|
||||
is_restart_file = Path() / 'is_restart'
|
||||
if is_restart_file.exists():
|
||||
await bot.send_private_msg(
|
||||
user_id=int(list(bot.config.superusers)[0]),
|
||||
message=f"真寻重启完毕...",
|
||||
)
|
||||
is_restart_file.unlink()
|
||||
|
||||
|
||||
async def check_update(bot: Bot) -> int:
|
||||
logger.info("开始检查更新真寻酱....")
|
||||
_version = "v0.0.0"
|
||||
if _version_file.exists():
|
||||
@ -43,43 +78,51 @@ async def check_update(bot: Bot):
|
||||
logger.info(f"检测真寻已更新,当前版本:{_version},最新版本:{latest_version}")
|
||||
await bot.send_private_msg(
|
||||
user_id=int(list(bot.config.superusers)[0]),
|
||||
message=f"检测真寻已更新,当前版本:{_version},最新版本:{latest_version}\n"
|
||||
f"开始更新.....")
|
||||
message=f"检测真寻已更新,当前版本:{_version},最新版本:{latest_version}\n" f"开始更新.....",
|
||||
)
|
||||
logger.info(f"开始下载真寻最新版文件....")
|
||||
if await download_latest_file(tar_gz_url):
|
||||
logger.info("下载真寻最新版文件完成....")
|
||||
await asyncio.get_event_loop().run_in_executor(None, _file_handle, latest_version)
|
||||
await asyncio.get_event_loop().run_in_executor(
|
||||
None, _file_handle, latest_version
|
||||
)
|
||||
logger.info("真寻更新完毕,清理文件完成....")
|
||||
logger.info('开始获取真寻更新日志.....')
|
||||
logger.info("开始获取真寻更新日志.....")
|
||||
update_info = await get_updated_info()
|
||||
if update_info:
|
||||
logger.info('获取真寻更新日志成功...开始发送日志...')
|
||||
logger.info("获取真寻更新日志成功...开始发送日志...")
|
||||
await bot.send_private_msg(
|
||||
user_id=int(list(bot.config.superusers)[0]),
|
||||
message=f'真寻更新完成,版本:{_version} -> {latest_version}\n'
|
||||
f'更新日志:\n'
|
||||
f'{update_info}')
|
||||
message=f"真寻更新完成,版本:{_version} -> {latest_version}\n"
|
||||
f"更新日志:\n"
|
||||
f"{update_info}",
|
||||
)
|
||||
else:
|
||||
logger.warning('获取真寻更新日志失败...')
|
||||
logger.warning("获取真寻更新日志失败...")
|
||||
await bot.send_private_msg(
|
||||
user_id=int(list(bot.config.superusers)[0]),
|
||||
message=f'真寻更新完成,版本:{_version} -> {latest_version}\n'
|
||||
f'获取真寻更新日志失败...')
|
||||
message=f"真寻更新完成,版本:{_version} -> {latest_version}\n"
|
||||
f"获取真寻更新日志失败...",
|
||||
)
|
||||
return 200
|
||||
else:
|
||||
logger.warning(f'下载真寻最新版本失败...版本号:{latest_version}')
|
||||
logger.warning(f"下载真寻最新版本失败...版本号:{latest_version}")
|
||||
await bot.send_private_msg(
|
||||
user_id=int(list(bot.config.superusers)[0]),
|
||||
message=f'下载真寻最新版本失败...版本号:{latest_version}.')
|
||||
message=f"下载真寻最新版本失败...版本号:{latest_version}.",
|
||||
)
|
||||
else:
|
||||
logger.info(f"自动获取真寻版本成功:{latest_version},当前版本为最新版,无需更新...")
|
||||
await bot.send_private_msg(
|
||||
user_id=int(list(bot.config.superusers)[0]),
|
||||
message=f'自动获取真寻版本成功:{latest_version},当前版本为最新版,无需更新...')
|
||||
message=f"自动获取真寻版本成功:{latest_version},当前版本为最新版,无需更新...",
|
||||
)
|
||||
else:
|
||||
logger.warning("自动获取真寻版本失败....")
|
||||
await bot.send_private_msg(
|
||||
user_id=int(list(bot.config.superusers)[0]),
|
||||
message=f'自动获取真寻版本失败....')
|
||||
user_id=int(list(bot.config.superusers)[0]), message=f"自动获取真寻版本失败...."
|
||||
)
|
||||
return 999
|
||||
|
||||
|
||||
def _file_handle(latest_version: str):
|
||||
@ -98,8 +141,8 @@ def _file_handle(latest_version: str):
|
||||
update_file = update_info["update_file"]
|
||||
add_file = update_info["add_file"]
|
||||
delete_file = update_info["delete_file"]
|
||||
config_file = Path() / 'configs' / 'config.py'
|
||||
config_path_file = Path() / 'configs' / 'config_path.py'
|
||||
config_file = Path() / "configs" / "config.py"
|
||||
config_path_file = Path() / "configs" / "config_path.py"
|
||||
for file in delete_file + update_file:
|
||||
file = Path() / file
|
||||
backup_file = Path(backup_dir) / file
|
||||
@ -110,9 +153,9 @@ def _file_handle(latest_version: str):
|
||||
if file not in [config_file, config_path_file]:
|
||||
os.rename(file.absolute(), backup_file.absolute())
|
||||
else:
|
||||
with open(file, 'r', encoding='utf8') as rf:
|
||||
with open(file, "r", encoding="utf8") as rf:
|
||||
data = rf.read()
|
||||
with open(backup_file, 'w', encoding='utf8') as wf:
|
||||
with open(backup_file, "w", encoding="utf8") as wf:
|
||||
wf.write(data)
|
||||
logger.info(f"已备份文件:{file}")
|
||||
for file in add_file + update_file:
|
||||
@ -128,7 +171,7 @@ def _file_handle(latest_version: str):
|
||||
old_lines = open(old_file, "r", encoding="utf8").readlines()
|
||||
for nl in new_lines:
|
||||
tmp += check_old_lines(old_lines, nl)
|
||||
with open(file, 'w', encoding='utf8') as f:
|
||||
with open(file, "w", encoding="utf8") as f:
|
||||
f.write(tmp)
|
||||
if tf:
|
||||
tf.close()
|
||||
@ -156,8 +199,8 @@ async def get_latest_version() -> "str, str":
|
||||
div.find(
|
||||
"div", {"class": "f1 flex-auto min-width-0 text-normal"}
|
||||
)
|
||||
.find("a")
|
||||
.text
|
||||
.find("a")
|
||||
.text
|
||||
)
|
||||
tar_gz_url = div.find_all(
|
||||
"a", {"class": "d-flex flex-items-center"}
|
||||
@ -176,9 +219,7 @@ async def download_latest_file(url_: str) -> bool:
|
||||
try:
|
||||
async with session.get(url_, proxy=get_local_proxy()) as res:
|
||||
if res.status == 200:
|
||||
async with aiofiles.open(
|
||||
zhenxun_latest_tar_gz, "wb"
|
||||
) as f:
|
||||
async with aiofiles.open(zhenxun_latest_tar_gz, "wb") as f:
|
||||
await f.write(await res.read())
|
||||
return True
|
||||
except (TimeoutError, ClientConnectorError):
|
||||
@ -202,24 +243,26 @@ async def get_updated_info() -> str:
|
||||
for _ in range(3):
|
||||
try:
|
||||
async with session.get(main_url, proxy=get_local_proxy()) as res:
|
||||
soup = BeautifulSoup(await res.text(), 'lxml')
|
||||
children_list = list(soup.find('article').children)
|
||||
children_list = [x for x in children_list if x != '\n']
|
||||
soup = BeautifulSoup(await res.text(), "lxml")
|
||||
children_list = list(soup.find("article").children)
|
||||
children_list = [x for x in children_list if x != "\n"]
|
||||
for i, children in enumerate(children_list):
|
||||
a = children.find('a')
|
||||
if a and isinstance(a, Tag) and a.get('href') == '#更新':
|
||||
update_info = ''
|
||||
a = children.find("a")
|
||||
if a and isinstance(a, Tag) and a.get("href") == "#更新":
|
||||
update_info = ""
|
||||
tmp_children_list = children_list[i:]
|
||||
tmp_children_list = [x for x in tmp_children_list if 'ul' in str(x)]
|
||||
tmp_children_list = [
|
||||
x for x in tmp_children_list if "ul" in str(x)
|
||||
]
|
||||
for j, chi in enumerate(tmp_children_list):
|
||||
if 'ul' in str(chi):
|
||||
update_time = children_list[i:][j+1].text
|
||||
update_info += f'更新日期:{update_time}\n'
|
||||
ul = children_list[i:][j+2]
|
||||
if "ul" in str(chi):
|
||||
update_time = children_list[i:][j + 1].text
|
||||
update_info += f"更新日期:{update_time}\n"
|
||||
ul = children_list[i:][j + 2]
|
||||
break
|
||||
for li in ul.find_all('li'):
|
||||
update_info += f'\t● {li.text}\n'
|
||||
for li in ul.find_all("li"):
|
||||
update_info += f"\t● {li.text}\n"
|
||||
return update_info
|
||||
except (TimeoutError, ClientConnectorError):
|
||||
pass
|
||||
return ''
|
||||
return ""
|
||||
|
||||
@ -27,7 +27,7 @@ async def _(bot: Bot, event: MessageEvent, state: T_State):
|
||||
if time.strftime("%w") == "0":
|
||||
await material.send("今天是周日,所有材料副本都开放了。")
|
||||
return
|
||||
await material.send(Message(image('daily_material.png', 'genshin/material') + '\n※ 黄历数据来源于 genshin.pub'))
|
||||
await material.send(Message(image('daily_material.png', 'genshin/material') + '\n※ 每日素材数据来源于 genshin.pub'))
|
||||
logger.info(
|
||||
f"(USER {event.user_id}, GROUP {event.group_id if event.message_type != 'private' else 'private'})"
|
||||
f" 发送查看今日素材")
|
||||
|
||||
@ -146,41 +146,81 @@ class Map:
|
||||
|
||||
# 生成最优路线(说是最优其实就是直线最短)
|
||||
def _generate_best_route(self):
|
||||
resources_route = []
|
||||
# 先连上最近的资源路径
|
||||
for res in self.resource_point:
|
||||
# 拿到最近的资源
|
||||
current_res, _ = res.get_resource_distance(
|
||||
self.resource_point
|
||||
+ self.teleport_anchor_point
|
||||
+ self.teleport_god_point
|
||||
)
|
||||
self.map.line(
|
||||
(current_res.x, current_res.y, res.x, res.y), (255, 0, 0), width=1
|
||||
)
|
||||
resources_route.append((current_res, res))
|
||||
line_points = []
|
||||
teleport_list = self.teleport_anchor_point + self.teleport_god_point
|
||||
for res1, res2 in resources_route:
|
||||
point_list = [x for x in resources_route if res1 in x or res2 in x]
|
||||
if not list(set(point_list).intersection(set(teleport_list))):
|
||||
if res1 not in teleport_list and res2 not in teleport_list:
|
||||
# while True:
|
||||
# tmp = [x for x in point_list]
|
||||
# break
|
||||
teleport1, distance1 = res1.get_resource_distance(teleport_list)
|
||||
teleport2, distance2 = res2.get_resource_distance(teleport_list)
|
||||
if distance1 > distance2:
|
||||
self.map.line(
|
||||
(teleport1.x, teleport1.y, res1.x, res1.y),
|
||||
(255, 0, 0),
|
||||
width=1,
|
||||
)
|
||||
else:
|
||||
self.map.line(
|
||||
(teleport2.x, teleport2.y, res2.x, res2.y),
|
||||
(255, 0, 0),
|
||||
width=1,
|
||||
)
|
||||
for teleport in teleport_list:
|
||||
current_res, res_min_distance = teleport.get_resource_distance(self.resource_point)
|
||||
current_teleport, teleport_min_distance = current_res.get_resource_distance(teleport_list)
|
||||
if current_teleport == teleport:
|
||||
self.map.line(
|
||||
(current_teleport.x, current_teleport.y, current_res.x, current_res.y), (255, 0, 0), width=1
|
||||
)
|
||||
is_used_res_points = []
|
||||
for res in self.resource_point:
|
||||
if res in is_used_res_points:
|
||||
continue
|
||||
current_teleport, teleport_min_distance = res.get_resource_distance(teleport_list)
|
||||
current_res, res_min_distance = res.get_resource_distance(self.resource_point)
|
||||
if teleport_min_distance < res_min_distance:
|
||||
self.map.line(
|
||||
(current_teleport.x, current_teleport.y, res.x, res.y), (255, 0, 0), width=1
|
||||
)
|
||||
else:
|
||||
is_used_res_points.append(current_res)
|
||||
self.map.line(
|
||||
(current_res.x, current_res.y, res.x, res.y), (255, 0, 0), width=1
|
||||
)
|
||||
res_cp = self.resource_point[:]
|
||||
res_cp.remove(current_res)
|
||||
# for _ in res_cp:
|
||||
current_teleport_, teleport_min_distance = res.get_resource_distance(teleport_list)
|
||||
current_res, res_min_distance = res.get_resource_distance(res_cp)
|
||||
if teleport_min_distance < res_min_distance:
|
||||
self.map.line(
|
||||
(current_teleport.x, current_teleport.y, res.x, res.y), (255, 0, 0), width=1
|
||||
)
|
||||
else:
|
||||
self.map.line(
|
||||
(current_res.x, current_res.y, res.x, res.y), (255, 0, 0), width=1
|
||||
)
|
||||
is_used_res_points.append(current_res)
|
||||
is_used_res_points.append(res)
|
||||
|
||||
# resources_route = []
|
||||
# # 先连上最近的资源路径
|
||||
# for res in self.resource_point:
|
||||
# # 拿到最近的资源
|
||||
# current_res, _ = res.get_resource_distance(
|
||||
# self.resource_point
|
||||
# + self.teleport_anchor_point
|
||||
# + self.teleport_god_point
|
||||
# )
|
||||
# self.map.line(
|
||||
# (current_res.x, current_res.y, res.x, res.y), (255, 0, 0), width=1
|
||||
# )
|
||||
# resources_route.append((current_res, res))
|
||||
# teleport_list = self.teleport_anchor_point + self.teleport_god_point
|
||||
# for res1, res2 in resources_route:
|
||||
# point_list = [x for x in resources_route if res1 in x or res2 in x]
|
||||
# if not list(set(point_list).intersection(set(teleport_list))):
|
||||
# if res1 not in teleport_list and res2 not in teleport_list:
|
||||
# # while True:
|
||||
# # tmp = [x for x in point_list]
|
||||
# # break
|
||||
# teleport1, distance1 = res1.get_resource_distance(teleport_list)
|
||||
# teleport2, distance2 = res2.get_resource_distance(teleport_list)
|
||||
# if distance1 > distance2:
|
||||
# self.map.line(
|
||||
# (teleport1.x, teleport1.y, res1.x, res1.y),
|
||||
# (255, 0, 0),
|
||||
# width=1,
|
||||
# )
|
||||
# else:
|
||||
# self.map.line(
|
||||
# (teleport2.x, teleport2.y, res2.x, res2.y),
|
||||
# (255, 0, 0),
|
||||
# width=1,
|
||||
# )
|
||||
|
||||
# self.map.line(xy, (255, 0, 0), width=3)
|
||||
|
||||
|
||||
@ -50,6 +50,8 @@ entertainment_help = {
|
||||
"poetry": "突然文艺的真寻是否搞错了什么 --> 指令:念诗/来首诗/念首诗",
|
||||
"comments_163": "生了个人,我很抱歉 --> 指令:到点了/12点了/网易云热评/网易云评论",
|
||||
"pix_gallery": "偶尔也想看看美图? --> 指令:PIX [关键词/uid/pid:pid] [num]/查看pix图库 [关键词]/显示pix关键词",
|
||||
'nbnhhsh': "会说话就多说点! --> 指令:nbnhhsh/能不能好好说话 [文本](空格划分)",
|
||||
"roll": "让真寻来帮你决定吧! --> 指令:roll/ roll [文本](空格划分)"
|
||||
}
|
||||
# 其他
|
||||
other_help = [
|
||||
|
||||
49
plugins/nbnhhsh.py
Normal file
49
plugins/nbnhhsh.py
Normal file
@ -0,0 +1,49 @@
|
||||
from nonebot import on_command
|
||||
from nonebot.typing import T_State
|
||||
from nonebot.adapters.cqhttp import Bot, MessageEvent, GroupMessageEvent
|
||||
from utils.utils import get_message_text
|
||||
from services.log import logger
|
||||
import ujson as json
|
||||
import aiohttp
|
||||
|
||||
__plugin_name__ = "能不能好好说话"
|
||||
__plugin_usage__ = "用法:\n nbnhhsh [文本]"
|
||||
|
||||
|
||||
HHSH_GUESS_URL = "https://lab.magiconch.com/api/nbnhhsh/guess"
|
||||
|
||||
nbnhhsh = on_command("nbnhhsh", aliases={"能不能好好说话"}, priority=5, block=True)
|
||||
|
||||
|
||||
@nbnhhsh.handle()
|
||||
async def _(bot: Bot, event: MessageEvent, state: T_State):
|
||||
msg = get_message_text(event.json())
|
||||
async with aiohttp.ClientSession(
|
||||
headers={"content-type": "application/json"}
|
||||
) as session:
|
||||
async with session.post(
|
||||
HHSH_GUESS_URL, data=json.dumps({"text": msg}), timeout=5
|
||||
) as response:
|
||||
if response.status == 200:
|
||||
try:
|
||||
data = await response.json()
|
||||
tmp = ""
|
||||
rst = ""
|
||||
for x in data:
|
||||
trans = ""
|
||||
if x.get("trans"):
|
||||
trans = x["trans"][0]
|
||||
elif x.get("inputting"):
|
||||
trans = ",".join(x["inputting"])
|
||||
tmp += f'{x["name"]} -> {trans}\n'
|
||||
rst += trans
|
||||
logger.info(
|
||||
f"(USER {event.user_id}, GROUP "
|
||||
f"{event.group_id if isinstance(event, GroupMessageEvent) else 'private'})"
|
||||
f" 发送能不能好好说话: {msg} -> {rst}"
|
||||
)
|
||||
await nbnhhsh.send(f"{tmp}={rst}", at_sender=True)
|
||||
except (IndexError, KeyError):
|
||||
await nbnhhsh.finish("没有找到对应的翻译....")
|
||||
else:
|
||||
await nbnhhsh.finish("网络访问失败了....")
|
||||
49
plugins/roll.py
Normal file
49
plugins/roll.py
Normal file
@ -0,0 +1,49 @@
|
||||
from nonebot import on_command
|
||||
from nonebot.typing import T_State
|
||||
from nonebot.adapters.cqhttp import Bot, MessageEvent, GroupMessageEvent
|
||||
from utils.utils import get_message_text
|
||||
from services.log import logger
|
||||
import random
|
||||
import asyncio
|
||||
|
||||
__plugin_name__ = "roll"
|
||||
__plugin_usage__ = (
|
||||
"用法:\n" "\troll -> 随机数字\n" "\troll *[文本] -> 决定事件\n" "示例:roll 吃饭 睡觉 打游戏"
|
||||
)
|
||||
|
||||
|
||||
roll = on_command("roll", priority=5, block=True)
|
||||
|
||||
|
||||
@roll.handle()
|
||||
async def _(bot: Bot, event: MessageEvent, state: T_State):
|
||||
msg = get_message_text(event.json()).split()
|
||||
if not msg:
|
||||
await roll.finish(f"roll: {random.randint(0, 100)}", at_sender=True)
|
||||
user_name = event.sender.card if event.sender.card else event.sender.nickname
|
||||
await roll.send(
|
||||
random.choice(
|
||||
[
|
||||
"转动命运的齿轮,拨开眼前迷雾...",
|
||||
f"启动吧,命运的水晶球,为{user_name}指引方向!",
|
||||
"嗯哼,在此刻转动吧!命运!",
|
||||
f"在此祈愿,请为{user_name}降下指引...",
|
||||
]
|
||||
)
|
||||
)
|
||||
await asyncio.sleep(1)
|
||||
x = random.choice(msg)
|
||||
await roll.send(
|
||||
random.choice(
|
||||
[
|
||||
f"让真寻看看是什么结果!答案是:‘{x}’",
|
||||
f"根据命运的指引,接下来{user_name} ‘{x}’ 会比较好",
|
||||
f"祈愿被回应了!是 ‘{x}’!",
|
||||
f"结束了,{user_name},命运之轮停在了 ‘{x}’!",
|
||||
]
|
||||
)
|
||||
)
|
||||
logger.info(
|
||||
f"(USER {event.user_id}, "
|
||||
f"GROUP {event.group_id if isinstance(event, GroupMessageEvent) else 'private'}) 发送roll:{msg}"
|
||||
)
|
||||
@ -11,6 +11,7 @@ from models.bag_user import BagUser
|
||||
from services.log import logger
|
||||
import time
|
||||
from .data_source import rank
|
||||
from configs.config import MAX_RUSSIAN_BET_GOLD
|
||||
|
||||
__plugin_name__ = '俄罗斯轮盘'
|
||||
|
||||
@ -158,7 +159,7 @@ async def _(bot: Bot, event: GroupMessageEvent, state: T_State):
|
||||
except KeyError:
|
||||
pass
|
||||
if msg:
|
||||
msg = msg.split(' ')
|
||||
msg = msg.split()
|
||||
if len(msg) == 1:
|
||||
msg = msg[0]
|
||||
if is_number(msg) and not (int(msg) < 1 or int(msg) > 6):
|
||||
@ -168,8 +169,11 @@ async def _(bot: Bot, event: GroupMessageEvent, state: T_State):
|
||||
msg = msg[0].strip()
|
||||
if is_number(msg) and not (int(msg) < 1 or int(msg) > 6):
|
||||
state['bullet_num'] = int(msg)
|
||||
if is_number(money) and 0 < int(money) <= 1000:
|
||||
if is_number(money) and 0 < int(money) <= MAX_RUSSIAN_BET_GOLD:
|
||||
state['money'] = int(money)
|
||||
else:
|
||||
state['money'] = 200
|
||||
await rssian.send(f'赌注金额超过限制(MAX_RUSSIAN_BET_GOLD),已改为200(默认)')
|
||||
state['at'] = get_message_at(event.json())
|
||||
|
||||
|
||||
@ -182,8 +186,8 @@ async def _(bot: Bot, event: GroupMessageEvent, state: T_State):
|
||||
user_money = await BagUser.get_gold(event.user_id, event.group_id)
|
||||
if bullet_num < 0 or bullet_num > 6:
|
||||
await rssian.reject('子弹数量必须大于0小于7!速速重新装弹!')
|
||||
if money > 1000:
|
||||
await rssian.finish('太多了!单次金额不能超过1000!', at_sender=True)
|
||||
if money > MAX_RUSSIAN_BET_GOLD:
|
||||
await rssian.finish(f'太多了!单次金额不能超过{MAX_RUSSIAN_BET_GOLD}!', at_sender=True)
|
||||
if money > user_money:
|
||||
await rssian.finish('你没有足够的钱支撑起这场挑战', at_sender=True)
|
||||
|
||||
|
||||
@ -73,7 +73,7 @@ async def arg_handle(bot: Bot, event: MessageEvent, state: T_State):
|
||||
|
||||
|
||||
update_buff_session = on_command(
|
||||
"更新cookie", rule=to_me(), permission=SUPERUSER, priority=1
|
||||
"更新cookie", aliases={'设置cookie'}, rule=to_me(), permission=SUPERUSER, priority=1
|
||||
)
|
||||
|
||||
|
||||
|
||||
@ -18,7 +18,7 @@ async def _(bot: Bot, event: Event, state: T_State):
|
||||
3.广播 --> 指令:广播- [msg]
|
||||
4.更新色图
|
||||
5.回复 --> 指令:/t命令帮助
|
||||
6.更新cookie --> 指令:更新cookie [cookie]
|
||||
6.更新/设置cookie --> 指令:更新/设置cookie [cookie]
|
||||
7.开启广播通知 --> 指令:开启广播通知 [群号]
|
||||
8.退群 --> 指令:退群 [群号]
|
||||
9.自检
|
||||
@ -39,5 +39,6 @@ async def _(bot: Bot, event: Event, state: T_State):
|
||||
24.删除pix图片 *[pid] [-b](同时加入黑名单)?
|
||||
25.查看pix图库 [keyword]
|
||||
26.pix检测更新 [update]
|
||||
27.检查更新真寻"""
|
||||
27.检查更新真寻
|
||||
28.真寻重启"""
|
||||
await super_help.finish(result, at_sender=True)
|
||||
|
||||
@ -88,12 +88,14 @@ async def update_setu_img():
|
||||
_success = 0
|
||||
error_info = []
|
||||
error_type = []
|
||||
count = 0
|
||||
async with aiohttp.ClientSession(headers=headers) as session:
|
||||
for image in image_list:
|
||||
count += 1
|
||||
path = _path / "_r18" if image.is_r18 else _path / "_setu"
|
||||
rar_path = "r18_rar" if image.is_r18 else "rar"
|
||||
local_image = path / f"{image.local_id}.jpg"
|
||||
if not local_image.exists():
|
||||
if not local_image.exists() or not image.img_hash:
|
||||
for _ in range(3):
|
||||
try:
|
||||
async with session.get(
|
||||
@ -153,9 +155,10 @@ async def update_setu_img():
|
||||
)
|
||||
else:
|
||||
logger.info(f'更新色图 {image.local_id}.jpg 已存在')
|
||||
error_info = ['无报错..'] if not error_info else error_info
|
||||
await get_bot().send_private_msg(
|
||||
user_id=int(list(get_bot().config.superusers)[0]),
|
||||
message=f'{str(datetime.now()).split(".")[0]} 更新 色图 完成,实际更新 {_success} 张,以下为更新时未知错误:\n'
|
||||
message=f'{str(datetime.now()).split(".")[0]} 更新 色图 完成,本地群在 {count} 张,实际更新 {_success} 张,以下为更新时未知错误:\n'
|
||||
+ "\n".join(error_info),
|
||||
)
|
||||
|
||||
|
||||
@ -3,6 +3,7 @@ from .data_source import get_yiqing_data
|
||||
from services.log import logger
|
||||
from nonebot.adapters.cqhttp import Bot, MessageEvent, GroupMessageEvent
|
||||
from nonebot.typing import T_State
|
||||
from utils.utils import get_message_text
|
||||
|
||||
__plugin_name__ = "疫情查询"
|
||||
__plugin_usage__ = "查询疫情帮助:\n\t对我说 查询疫情 省份/城市,我会回复疫情的实时数据\n\t示例: 查询疫情 温州"
|
||||
@ -13,7 +14,7 @@ yiqing = on_command("疫情", aliases={"查询疫情", "疫情查询"}, priority
|
||||
|
||||
@yiqing.handle()
|
||||
async def _(bot: Bot, event: MessageEvent, state: T_State):
|
||||
msg = str(event.get_message()).strip()
|
||||
msg = get_message_text(event.json())
|
||||
result = await get_yiqing_data(msg)
|
||||
if result:
|
||||
await yiqing.send(result)
|
||||
|
||||
@ -25,16 +25,16 @@ async def get_yiqing_data(area: str):
|
||||
if area == '中国':
|
||||
province = area
|
||||
province_type = ""
|
||||
elif area in data.keys():
|
||||
province = area
|
||||
if len(data[area]) == 1:
|
||||
province_type = "市"
|
||||
city = ""
|
||||
else:
|
||||
elif area[-1] != '省':
|
||||
for p in data.keys():
|
||||
if area in data[p]:
|
||||
province = p
|
||||
city = area
|
||||
elif area in data.keys() or area[:-1] in data.keys():
|
||||
province = area if area[-1] != '省' else area[:-1]
|
||||
if len(data[province]) == 1:
|
||||
province_type = "市"
|
||||
city = ""
|
||||
if not province and not city:
|
||||
return "小真寻只支持国内的疫情查询喔..."
|
||||
async with aiohttp.ClientSession(headers=get_user_agent()) as session:
|
||||
|
||||
@ -1,5 +1,18 @@
|
||||
{
|
||||
"update_file": ["plugins/parse_bilibili_json.py", "plugins/super_help", "plugins/weather", "models/pixiv.py"],
|
||||
"add_file": ["services/__init__.py"],
|
||||
"update_file": [
|
||||
"configs/config.py",
|
||||
"plugins/auto_invite",
|
||||
"plugins/ban",
|
||||
"plugins/check_zhenxun_update",
|
||||
"plugins/genshin/material_remind",
|
||||
"plugins/genshin/query_resource_points",
|
||||
"plugins/help",
|
||||
"plugins/russian",
|
||||
"plugins/search_buff_skin_price",
|
||||
"plugins/super_help",
|
||||
"plugins/update_setu",
|
||||
"plugins/yiqing"
|
||||
],
|
||||
"add_file": ["plugins/nbnhhsh.py", "plugins/roll.py"],
|
||||
"delete_file": []
|
||||
}
|
||||
}
|
||||
Loading…
Reference in New Issue
Block a user