This commit is contained in:
hibiki 2021-08-10 23:03:46 +08:00
parent 96dc1d9851
commit 5ec89e7538
17 changed files with 422 additions and 170 deletions

View File

@ -67,6 +67,7 @@ SEMAPHORE = 5 # 限制碧蓝航线和FGO并发数
ADMIN_DEFAULT_AUTH: int = 5 # 默认群管理员权限 ADMIN_DEFAULT_AUTH: int = 5 # 默认群管理员权限
MAX_SIGN_GOLD: int = 200 # 签到好感度加成额外获得的最大金币数 MAX_SIGN_GOLD: int = 200 # 签到好感度加成额外获得的最大金币数
MAX_RUSSIAN_BET_GOLD: int = 1000 # 俄罗斯轮盘最大赌注金额
INITIAL_SETU_PROBABILITY: float = 0.7 # 色图概率 INITIAL_SETU_PROBABILITY: float = 0.7 # 色图概率
FUDU_PROBABILITY: float = 0.7 # 复读概率 FUDU_PROBABILITY: float = 0.7 # 复读概率
@ -97,7 +98,7 @@ HIBIAPI_BOOKMARKS: int = 5000
# 需要为哪些群更新最新版gocq吗上传最新版gocq # 需要为哪些群更新最新版gocq吗上传最新版gocq
# 示例:[434995955, 239483248] # 示例:[434995955, 239483248]
UPDATE_GOCQ_GROUP: List[int] = [774261838] UPDATE_GOCQ_GROUP: List[int] = []
# 是否存储色图 # 是否存储色图
DOWNLOAD_SETU: bool = True DOWNLOAD_SETU: bool = True
@ -109,6 +110,8 @@ AUTO_ADD_FRIEND: bool = True
ALAPI_AI_CHECK: bool = True ALAPI_AI_CHECK: bool = True
# 导入商店自带的三个商品 # 导入商店自带的三个商品
IMPORT_DEFAULT_SHOP_GOODS: bool = True IMPORT_DEFAULT_SHOP_GOODS: bool = True
# 真寻是否自动更新
AUTO_UPDATE_ZHENXUN: bool = True
# 群管理员功能 与 对应权限 # 群管理员功能 与 对应权限
admin_plugins_auth = { admin_plugins_auth = {

View File

@ -5,33 +5,36 @@ from datetime import datetime
from configs.config import AUTO_ADD_FRIEND from configs.config import AUTO_ADD_FRIEND
from nonebot.adapters.cqhttp.exception import ActionFailed from nonebot.adapters.cqhttp.exception import ActionFailed
from utils.utils import scheduler from utils.utils import scheduler
import time
__plugin_name__ = "好友群聊处理请求 [Hidden]" __plugin_name__ = "好友群聊处理请求 [Hidden]"
friend_req = on_request(priority=5) friend_req = on_request(priority=5)
exists_list = [] exists_data = {"private": {}, "group": {}}
@friend_req.handle() @friend_req.handle()
async def _(bot: Bot, event: FriendRequestEvent, state: dict): async def _(bot: Bot, event: FriendRequestEvent, state: dict):
global exists_list global exists_data
if f"{event.user_id}" not in exists_list: if exists_data["private"].get(event.user_id):
exists_list.append(f"{event.user_id}") if time.time() - exists_data["private"][event.user_id] < 60 * 5:
user = await bot.get_stranger_info(user_id=event.user_id) return
nickname = user["nickname"] exists_data["private"][event.user_id] = time.time()
await bot.send_private_msg( user = await bot.get_stranger_info(user_id=event.user_id)
user_id=int(list(bot.config.superusers)[0]), nickname = user["nickname"]
message=f"*****一份好友申请*****\n" await bot.send_private_msg(
f"昵称:{nickname}({event.user_id})\n" user_id=int(list(bot.config.superusers)[0]),
f"自动同意:{'' if AUTO_ADD_FRIEND else '×'}\n" message=f"*****一份好友申请*****\n"
f"日期:{str(datetime.now()).split('.')[0]}\n" f"昵称:{nickname}({event.user_id})\n"
f"备注:{event.comment}", f"自动同意:{'' if AUTO_ADD_FRIEND else '×'}\n"
) f"日期:{str(datetime.now()).split('.')[0]}\n"
if AUTO_ADD_FRIEND: f"备注:{event.comment}",
await bot.set_friend_add_request(flag=event.flag, approve=True) )
await FriendUser.add_friend_info(user["user_id"], user["nickname"]) 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) group_req = on_request(priority=5, block=True)
@ -39,7 +42,7 @@ group_req = on_request(priority=5, block=True)
@group_req.handle() @group_req.handle()
async def _(bot: Bot, event: GroupRequestEvent, state: dict): async def _(bot: Bot, event: GroupRequestEvent, state: dict):
global exists_list global exists_data
if event.sub_type == "invite": if event.sub_type == "invite":
if str(event.user_id) in bot.config.superusers: if str(event.user_id) in bot.config.superusers:
try: try:
@ -49,22 +52,26 @@ async def _(bot: Bot, event: GroupRequestEvent, state: dict):
except ActionFailed: except ActionFailed:
pass pass
else: else:
if f"{event.user_id}:{event.group_id}" not in exists_list: if exists_data["group"].get(f"{event.user_id}:{event.group_id}"):
exists_list.append(f"{event.user_id}:{event.group_id}") if (
nickname = await FriendUser.get_user_name(event.user_id) time.time()
await bot.send_private_msg( - exists_data["group"][f"{event.user_id}:{event.group_id}"]
user_id=int(list(bot.config.superusers)[0]), < 60 * 5
message=f"*****一份入群申请*****\n" ):
f"申请人:{nickname}({event.user_id})\n" return
f"群聊:{event.group_id}\n" exists_data["group"][f"{event.user_id}:{event.group_id}"] = time.time()
f"邀请日期:{str(datetime.now()).split('.')[0]}", nickname = await FriendUser.get_user_name(event.user_id)
) await bot.send_private_msg(
await bot.send_private_msg( user_id=int(list(bot.config.superusers)[0]),
user_id=event.user_id, message=f"*****一份入群申请*****\n"
message="想要邀请我偷偷入群嘛~已经提醒真寻的管理员大人了\n" f"申请人:{nickname}({event.user_id})\n"
"请确保已经群主或群管理沟通过!\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( @scheduler.scheduled_job(
@ -72,5 +79,5 @@ async def _(bot: Bot, event: GroupRequestEvent, state: dict):
minutes=5, minutes=5,
) )
async def _(): async def _():
global exists_list global exists_data
exists_list = [] exists_data = {"private": {}, "group": {}}

View File

@ -33,8 +33,9 @@ ban = on_command(
@ban.handle() @ban.handle()
async def _(bot: Bot, event: GroupMessageEvent, state: T_State): async def _(bot: Bot, event: GroupMessageEvent, state: T_State):
result = "" result = ""
qq = get_message_at(event.json())[0] qq = get_message_at(event.json())
if qq: if qq:
qq = qq[0]
user_name = await bot.get_group_member_info(group_id=event.group_id, user_id=qq) 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'] user_name = user_name['card'] if user_name['card'] else user_name['nickname']
msg = get_message_text(event.json()) msg = get_message_text(event.json())
@ -52,16 +53,16 @@ async def _(bot: Bot, event: GroupMessageEvent, state: T_State):
time = -1 time = -1
if state["_prefix"]["raw_command"] in [".ban", "/ban"]: if state["_prefix"]["raw_command"] in [".ban", "/ban"]:
if ( if (
await LevelUser.get_user_level(event.user_id, event.group_id) await LevelUser.get_user_level(event.user_id, event.group_id)
<= await LevelUser.get_user_level(qq, event.group_id) <= await LevelUser.get_user_level(qq, event.group_id)
and str(event.user_id) not in bot.config.superusers and str(event.user_id) not in bot.config.superusers
): ):
await ban.finish( await ban.finish(
f"您的权限等级比对方低或相等, {list(bot.config.nickname)[0]}不能为您使用此功能!", f"您的权限等级比对方低或相等, {list(bot.config.nickname)[0]}不能为您使用此功能!",
at_sender=True, at_sender=True,
) )
if await BanUser.ban( 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( logger.info(
f"USER {event.user_id} GROUP {event.group_id} 将 USER {qq} 封禁 时长 {time/60} 分钟" 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}后解封" result = f"{user_name} 已在黑名单!预计 {time}后解封"
else: else:
if ( if (
await BanUser.check_ban_level( await BanUser.check_ban_level(
qq, await LevelUser.get_user_level(event.user_id, event.group_id) qq, await LevelUser.get_user_level(event.user_id, event.group_id)
) )
and str(event.user_id) not in bot.config.superusers and str(event.user_id) not in bot.config.superusers
): ):
await ban.finish( await ban.finish(
f"ban掉 {user_name} 的管理员权限比您高无法进行unban", at_sender=True f"ban掉 {user_name} 的管理员权限比您高无法进行unban", at_sender=True
@ -100,3 +101,7 @@ async def _(bot: Bot, event: GroupMessageEvent, state: T_State):
else: else:
await ban.finish("艾特人了吗??", at_sender=True) await ban.finish("艾特人了吗??", at_sender=True)
await ban.finish(result, at_sender=True) await ban.finish(result, at_sender=True)

View File

@ -6,15 +6,21 @@ from .data_source import check_update, get_latest_version
from services.log import logger from services.log import logger
from utils.utils import scheduler, get_bot from utils.utils import scheduler, get_bot
from pathlib import Path 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) 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() @update_zhenxun.handle()
async def _(bot: Bot, event: MessageEvent, state: T_State): async def _(bot: Bot, event: MessageEvent, state: T_State):
try: try:
await check_update(bot) code = await check_update(bot)
except Exception as e: except Exception as e:
logger.error(f'更新真寻未知错误 {type(e)}{e}') logger.error(f'更新真寻未知错误 {type(e)}{e}')
await bot.send_private_msg( await bot.send_private_msg(
@ -22,41 +28,67 @@ async def _(bot: Bot, event: MessageEvent, state: T_State):
message=f'更新真寻未知错误 {type(e)}{e}' message=f'更新真寻未知错误 {type(e)}{e}'
) )
else: else:
await bot.send_private_msg( if code == 200:
user_id=int(list(bot.config.superusers)[0]), await bot.send_private_msg(
message=f'更新完毕,请重启真寻....' 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( @scheduler.scheduled_job(
"interval", "cron",
hours=24, hour=12,
minute=0,
) )
async def _(): async def _():
_version = "v0.0.0" if AUTO_UPDATE_ZHENXUN:
_version_file = Path() / "__version__" _version = "v0.0.0"
if _version_file.exists(): _version_file = Path() / "__version__"
_version = ( if _version_file.exists():
open(_version_file, "r", encoding="utf8").readline().split(":")[-1].strip() _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'尝试自动更新...'
) )
try: latest_version, tar_gz_url = await get_latest_version()
await check_update(bot) if latest_version and tar_gz_url:
except Exception as e: if _version != latest_version:
logger.error(f'更新真寻未知错误 {type(e)}{e}') bot = get_bot()
await bot.send_private_msg( await bot.send_private_msg(
user_id=int(list(bot.config.superusers)[0]), 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'更新完毕,请重启真寻....'
)

View File

@ -1,13 +1,14 @@
from aiohttp.client_exceptions import ClientConnectorError from aiohttp.client_exceptions import ClientConnectorError
from nonebot.adapters.cqhttp import Bot from nonebot.adapters.cqhttp import Bot
from utils.user_agent import get_user_agent 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 typing import List
from bs4.element import Tag from bs4.element import Tag
from services.log import logger from services.log import logger
from bs4 import BeautifulSoup from bs4 import BeautifulSoup
from pathlib import Path from pathlib import Path
import ujson as json import ujson as json
import nonebot
import asyncio import asyncio
import aiofiles import aiofiles
import aiohttp import aiohttp
@ -16,11 +17,13 @@ import tarfile
import shutil import shutil
import os import os
if str(platform.system()).lower() == 'windows': if str(platform.system()).lower() == "windows":
policy = asyncio.WindowsSelectorEventLoopPolicy() policy = asyncio.WindowsSelectorEventLoopPolicy()
asyncio.set_event_loop_policy(policy) asyncio.set_event_loop_policy(policy)
driver = nonebot.get_driver()
version_url = "https://github.com/HibiKier/zhenxun_bot/releases" version_url = "https://github.com/HibiKier/zhenxun_bot/releases"
main_url = "https://github.com/HibiKier/zhenxun_bot" main_url = "https://github.com/HibiKier/zhenxun_bot"
@ -30,7 +33,39 @@ temp_dir = Path() / "temp"
backup_dir = Path() / "backup" 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("开始检查更新真寻酱....") logger.info("开始检查更新真寻酱....")
_version = "v0.0.0" _version = "v0.0.0"
if _version_file.exists(): if _version_file.exists():
@ -43,43 +78,51 @@ async def check_update(bot: Bot):
logger.info(f"检测真寻已更新,当前版本:{_version},最新版本:{latest_version}") logger.info(f"检测真寻已更新,当前版本:{_version},最新版本:{latest_version}")
await bot.send_private_msg( await bot.send_private_msg(
user_id=int(list(bot.config.superusers)[0]), user_id=int(list(bot.config.superusers)[0]),
message=f"检测真寻已更新,当前版本:{_version},最新版本:{latest_version}\n" message=f"检测真寻已更新,当前版本:{_version},最新版本:{latest_version}\n" f"开始更新.....",
f"开始更新.....") )
logger.info(f"开始下载真寻最新版文件....") logger.info(f"开始下载真寻最新版文件....")
if await download_latest_file(tar_gz_url): if await download_latest_file(tar_gz_url):
logger.info("下载真寻最新版文件完成....") 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('开始获取真寻更新日志.....') logger.info("开始获取真寻更新日志.....")
update_info = await get_updated_info() update_info = await get_updated_info()
if update_info: if update_info:
logger.info('获取真寻更新日志成功...开始发送日志...') logger.info("获取真寻更新日志成功...开始发送日志...")
await bot.send_private_msg( await bot.send_private_msg(
user_id=int(list(bot.config.superusers)[0]), user_id=int(list(bot.config.superusers)[0]),
message=f'真寻更新完成,版本:{_version} -> {latest_version}\n' message=f"真寻更新完成,版本:{_version} -> {latest_version}\n"
f'更新日志:\n' f"更新日志:\n"
f'{update_info}') f"{update_info}",
)
else: else:
logger.warning('获取真寻更新日志失败...') logger.warning("获取真寻更新日志失败...")
await bot.send_private_msg( await bot.send_private_msg(
user_id=int(list(bot.config.superusers)[0]), user_id=int(list(bot.config.superusers)[0]),
message=f'真寻更新完成,版本:{_version} -> {latest_version}\n' message=f"真寻更新完成,版本:{_version} -> {latest_version}\n"
f'获取真寻更新日志失败...') f"获取真寻更新日志失败...",
)
return 200
else: else:
logger.warning(f'下载真寻最新版本失败...版本号:{latest_version}') logger.warning(f"下载真寻最新版本失败...版本号:{latest_version}")
await bot.send_private_msg( await bot.send_private_msg(
user_id=int(list(bot.config.superusers)[0]), user_id=int(list(bot.config.superusers)[0]),
message=f'下载真寻最新版本失败...版本号:{latest_version}.') message=f"下载真寻最新版本失败...版本号:{latest_version}.",
)
else: else:
logger.info(f"自动获取真寻版本成功:{latest_version},当前版本为最新版,无需更新...") logger.info(f"自动获取真寻版本成功:{latest_version},当前版本为最新版,无需更新...")
await bot.send_private_msg( await bot.send_private_msg(
user_id=int(list(bot.config.superusers)[0]), user_id=int(list(bot.config.superusers)[0]),
message=f'自动获取真寻版本成功:{latest_version},当前版本为最新版,无需更新...') message=f"自动获取真寻版本成功:{latest_version},当前版本为最新版,无需更新...",
)
else: else:
logger.warning("自动获取真寻版本失败....") logger.warning("自动获取真寻版本失败....")
await bot.send_private_msg( await bot.send_private_msg(
user_id=int(list(bot.config.superusers)[0]), user_id=int(list(bot.config.superusers)[0]), message=f"自动获取真寻版本失败...."
message=f'自动获取真寻版本失败....') )
return 999
def _file_handle(latest_version: str): def _file_handle(latest_version: str):
@ -98,8 +141,8 @@ def _file_handle(latest_version: str):
update_file = update_info["update_file"] update_file = update_info["update_file"]
add_file = update_info["add_file"] add_file = update_info["add_file"]
delete_file = update_info["delete_file"] delete_file = update_info["delete_file"]
config_file = Path() / 'configs' / 'config.py' config_file = Path() / "configs" / "config.py"
config_path_file = Path() / 'configs' / 'config_path.py' config_path_file = Path() / "configs" / "config_path.py"
for file in delete_file + update_file: for file in delete_file + update_file:
file = Path() / file file = Path() / file
backup_file = Path(backup_dir) / 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]: if file not in [config_file, config_path_file]:
os.rename(file.absolute(), backup_file.absolute()) os.rename(file.absolute(), backup_file.absolute())
else: else:
with open(file, 'r', encoding='utf8') as rf: with open(file, "r", encoding="utf8") as rf:
data = rf.read() data = rf.read()
with open(backup_file, 'w', encoding='utf8') as wf: with open(backup_file, "w", encoding="utf8") as wf:
wf.write(data) wf.write(data)
logger.info(f"已备份文件:{file}") logger.info(f"已备份文件:{file}")
for file in add_file + update_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() old_lines = open(old_file, "r", encoding="utf8").readlines()
for nl in new_lines: for nl in new_lines:
tmp += check_old_lines(old_lines, nl) 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) f.write(tmp)
if tf: if tf:
tf.close() tf.close()
@ -156,8 +199,8 @@ async def get_latest_version() -> "str, str":
div.find( div.find(
"div", {"class": "f1 flex-auto min-width-0 text-normal"} "div", {"class": "f1 flex-auto min-width-0 text-normal"}
) )
.find("a") .find("a")
.text .text
) )
tar_gz_url = div.find_all( tar_gz_url = div.find_all(
"a", {"class": "d-flex flex-items-center"} "a", {"class": "d-flex flex-items-center"}
@ -176,9 +219,7 @@ async def download_latest_file(url_: str) -> bool:
try: try:
async with session.get(url_, proxy=get_local_proxy()) as res: async with session.get(url_, proxy=get_local_proxy()) as res:
if res.status == 200: if res.status == 200:
async with aiofiles.open( async with aiofiles.open(zhenxun_latest_tar_gz, "wb") as f:
zhenxun_latest_tar_gz, "wb"
) as f:
await f.write(await res.read()) await f.write(await res.read())
return True return True
except (TimeoutError, ClientConnectorError): except (TimeoutError, ClientConnectorError):
@ -202,24 +243,26 @@ async def get_updated_info() -> str:
for _ in range(3): for _ in range(3):
try: try:
async with session.get(main_url, proxy=get_local_proxy()) as res: async with session.get(main_url, proxy=get_local_proxy()) as res:
soup = BeautifulSoup(await res.text(), 'lxml') soup = BeautifulSoup(await res.text(), "lxml")
children_list = list(soup.find('article').children) children_list = list(soup.find("article").children)
children_list = [x for x in children_list if x != '\n'] children_list = [x for x in children_list if x != "\n"]
for i, children in enumerate(children_list): for i, children in enumerate(children_list):
a = children.find('a') a = children.find("a")
if a and isinstance(a, Tag) and a.get('href') == '#更新': if a and isinstance(a, Tag) and a.get("href") == "#更新":
update_info = '' update_info = ""
tmp_children_list = children_list[i:] 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): for j, chi in enumerate(tmp_children_list):
if 'ul' in str(chi): if "ul" in str(chi):
update_time = children_list[i:][j+1].text update_time = children_list[i:][j + 1].text
update_info += f'更新日期:{update_time}\n' update_info += f"更新日期:{update_time}\n"
ul = children_list[i:][j+2] ul = children_list[i:][j + 2]
break break
for li in ul.find_all('li'): for li in ul.find_all("li"):
update_info += f'\t{li.text}\n' update_info += f"\t{li.text}\n"
return update_info return update_info
except (TimeoutError, ClientConnectorError): except (TimeoutError, ClientConnectorError):
pass pass
return '' return ""

View File

@ -27,7 +27,7 @@ async def _(bot: Bot, event: MessageEvent, state: T_State):
if time.strftime("%w") == "0": if time.strftime("%w") == "0":
await material.send("今天是周日,所有材料副本都开放了。") await material.send("今天是周日,所有材料副本都开放了。")
return 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( logger.info(
f"(USER {event.user_id}, GROUP {event.group_id if event.message_type != 'private' else 'private'})" f"(USER {event.user_id}, GROUP {event.group_id if event.message_type != 'private' else 'private'})"
f" 发送查看今日素材") f" 发送查看今日素材")

View File

@ -146,41 +146,81 @@ class Map:
# 生成最优路线(说是最优其实就是直线最短) # 生成最优路线(说是最优其实就是直线最短)
def _generate_best_route(self): def _generate_best_route(self):
resources_route = [] line_points = []
# 先连上最近的资源路径
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 teleport_list = self.teleport_anchor_point + self.teleport_god_point
for res1, res2 in resources_route: for teleport in teleport_list:
point_list = [x for x in resources_route if res1 in x or res2 in x] current_res, res_min_distance = teleport.get_resource_distance(self.resource_point)
if not list(set(point_list).intersection(set(teleport_list))): current_teleport, teleport_min_distance = current_res.get_resource_distance(teleport_list)
if res1 not in teleport_list and res2 not in teleport_list: if current_teleport == teleport:
# while True: self.map.line(
# tmp = [x for x in point_list] (current_teleport.x, current_teleport.y, current_res.x, current_res.y), (255, 0, 0), width=1
# break )
teleport1, distance1 = res1.get_resource_distance(teleport_list) is_used_res_points = []
teleport2, distance2 = res2.get_resource_distance(teleport_list) for res in self.resource_point:
if distance1 > distance2: if res in is_used_res_points:
self.map.line( continue
(teleport1.x, teleport1.y, res1.x, res1.y), current_teleport, teleport_min_distance = res.get_resource_distance(teleport_list)
(255, 0, 0), current_res, res_min_distance = res.get_resource_distance(self.resource_point)
width=1, if teleport_min_distance < res_min_distance:
) self.map.line(
else: (current_teleport.x, current_teleport.y, res.x, res.y), (255, 0, 0), width=1
self.map.line( )
(teleport2.x, teleport2.y, res2.x, res2.y), else:
(255, 0, 0), is_used_res_points.append(current_res)
width=1, 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) # self.map.line(xy, (255, 0, 0), width=3)

View File

@ -50,6 +50,8 @@ entertainment_help = {
"poetry": "突然文艺的真寻是否搞错了什么 --> 指令:念诗/来首诗/念首诗", "poetry": "突然文艺的真寻是否搞错了什么 --> 指令:念诗/来首诗/念首诗",
"comments_163": "生了个人,我很抱歉 --> 指令:到点了/12点了/网易云热评/网易云评论", "comments_163": "生了个人,我很抱歉 --> 指令:到点了/12点了/网易云热评/网易云评论",
"pix_gallery": "偶尔也想看看美图? --> 指令:PIX [关键词/uid/pid:pid] [num]/查看pix图库 [关键词]/显示pix关键词", "pix_gallery": "偶尔也想看看美图? --> 指令:PIX [关键词/uid/pid:pid] [num]/查看pix图库 [关键词]/显示pix关键词",
'nbnhhsh': "会说话就多说点! --> 指令:nbnhhsh/能不能好好说话 [文本](空格划分)",
"roll": "让真寻来帮你决定吧! --> 指令:roll/ roll [文本](空格划分)"
} }
# 其他 # 其他
other_help = [ other_help = [

49
plugins/nbnhhsh.py Normal file
View 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
View 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}"
)

View File

@ -11,6 +11,7 @@ from models.bag_user import BagUser
from services.log import logger from services.log import logger
import time import time
from .data_source import rank from .data_source import rank
from configs.config import MAX_RUSSIAN_BET_GOLD
__plugin_name__ = '俄罗斯轮盘' __plugin_name__ = '俄罗斯轮盘'
@ -158,7 +159,7 @@ async def _(bot: Bot, event: GroupMessageEvent, state: T_State):
except KeyError: except KeyError:
pass pass
if msg: if msg:
msg = msg.split(' ') msg = msg.split()
if len(msg) == 1: if len(msg) == 1:
msg = msg[0] msg = msg[0]
if is_number(msg) and not (int(msg) < 1 or int(msg) > 6): 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() msg = msg[0].strip()
if is_number(msg) and not (int(msg) < 1 or int(msg) > 6): if is_number(msg) and not (int(msg) < 1 or int(msg) > 6):
state['bullet_num'] = int(msg) 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) state['money'] = int(money)
else:
state['money'] = 200
await rssian.send(f'赌注金额超过限制MAX_RUSSIAN_BET_GOLD已改为200默认')
state['at'] = get_message_at(event.json()) 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) user_money = await BagUser.get_gold(event.user_id, event.group_id)
if bullet_num < 0 or bullet_num > 6: if bullet_num < 0 or bullet_num > 6:
await rssian.reject('子弹数量必须大于0小于7速速重新装弹') await rssian.reject('子弹数量必须大于0小于7速速重新装弹')
if money > 1000: if money > MAX_RUSSIAN_BET_GOLD:
await rssian.finish('太多了!单次金额不能超过1000', at_sender=True) await rssian.finish(f'太多了!单次金额不能超过{MAX_RUSSIAN_BET_GOLD}', at_sender=True)
if money > user_money: if money > user_money:
await rssian.finish('你没有足够的钱支撑起这场挑战', at_sender=True) await rssian.finish('你没有足够的钱支撑起这场挑战', at_sender=True)

View File

@ -73,7 +73,7 @@ async def arg_handle(bot: Bot, event: MessageEvent, state: T_State):
update_buff_session = on_command( update_buff_session = on_command(
"更新cookie", rule=to_me(), permission=SUPERUSER, priority=1 "更新cookie", aliases={'设置cookie'}, rule=to_me(), permission=SUPERUSER, priority=1
) )

View File

@ -18,7 +18,7 @@ async def _(bot: Bot, event: Event, state: T_State):
3.广播 --> 指令:广播- [msg] 3.广播 --> 指令:广播- [msg]
4.更新色图 4.更新色图
5.回复 --> 指令:/t命令帮助 5.回复 --> 指令:/t命令帮助
6.更新cookie --> 指令:更新cookie [cookie] 6.更新/设置cookie --> 指令:更新/设置cookie [cookie]
7.开启广播通知 --> 指令:开启广播通知 [群号] 7.开启广播通知 --> 指令:开启广播通知 [群号]
8.退群 --> 指令:退群 [群号] 8.退群 --> 指令:退群 [群号]
9.自检 9.自检
@ -39,5 +39,6 @@ async def _(bot: Bot, event: Event, state: T_State):
24.删除pix图片 *[pid] [-b](同时加入黑名单)? 24.删除pix图片 *[pid] [-b](同时加入黑名单)?
25.查看pix图库 [keyword] 25.查看pix图库 [keyword]
26.pix检测更新 [update] 26.pix检测更新 [update]
27.检查更新真寻""" 27.检查更新真寻
28.真寻重启"""
await super_help.finish(result, at_sender=True) await super_help.finish(result, at_sender=True)

View File

@ -88,12 +88,14 @@ async def update_setu_img():
_success = 0 _success = 0
error_info = [] error_info = []
error_type = [] error_type = []
count = 0
async with aiohttp.ClientSession(headers=headers) as session: async with aiohttp.ClientSession(headers=headers) as session:
for image in image_list: for image in image_list:
count += 1
path = _path / "_r18" if image.is_r18 else _path / "_setu" path = _path / "_r18" if image.is_r18 else _path / "_setu"
rar_path = "r18_rar" if image.is_r18 else "rar" rar_path = "r18_rar" if image.is_r18 else "rar"
local_image = path / f"{image.local_id}.jpg" 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): for _ in range(3):
try: try:
async with session.get( async with session.get(
@ -153,9 +155,10 @@ async def update_setu_img():
) )
else: else:
logger.info(f'更新色图 {image.local_id}.jpg 已存在') logger.info(f'更新色图 {image.local_id}.jpg 已存在')
error_info = ['无报错..'] if not error_info else error_info
await get_bot().send_private_msg( await get_bot().send_private_msg(
user_id=int(list(get_bot().config.superusers)[0]), 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), + "\n".join(error_info),
) )

View File

@ -3,6 +3,7 @@ from .data_source import get_yiqing_data
from services.log import logger from services.log import logger
from nonebot.adapters.cqhttp import Bot, MessageEvent, GroupMessageEvent from nonebot.adapters.cqhttp import Bot, MessageEvent, GroupMessageEvent
from nonebot.typing import T_State from nonebot.typing import T_State
from utils.utils import get_message_text
__plugin_name__ = "疫情查询" __plugin_name__ = "疫情查询"
__plugin_usage__ = "查询疫情帮助:\n\t对我说 查询疫情 省份/城市,我会回复疫情的实时数据\n\t示例: 查询疫情 温州" __plugin_usage__ = "查询疫情帮助:\n\t对我说 查询疫情 省份/城市,我会回复疫情的实时数据\n\t示例: 查询疫情 温州"
@ -13,7 +14,7 @@ yiqing = on_command("疫情", aliases={"查询疫情", "疫情查询"}, priority
@yiqing.handle() @yiqing.handle()
async def _(bot: Bot, event: MessageEvent, state: T_State): 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) result = await get_yiqing_data(msg)
if result: if result:
await yiqing.send(result) await yiqing.send(result)

View File

@ -25,16 +25,16 @@ async def get_yiqing_data(area: str):
if area == '中国': if area == '中国':
province = area province = area
province_type = "" province_type = ""
elif area in data.keys(): elif area[-1] != '':
province = area
if len(data[area]) == 1:
province_type = ""
city = ""
else:
for p in data.keys(): for p in data.keys():
if area in data[p]: if area in data[p]:
province = p province = p
city = area 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: if not province and not city:
return "小真寻只支持国内的疫情查询喔..." return "小真寻只支持国内的疫情查询喔..."
async with aiohttp.ClientSession(headers=get_user_agent()) as session: async with aiohttp.ClientSession(headers=get_user_agent()) as session:

View File

@ -1,5 +1,18 @@
{ {
"update_file": ["plugins/parse_bilibili_json.py", "plugins/super_help", "plugins/weather", "models/pixiv.py"], "update_file": [
"add_file": ["services/__init__.py"], "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": [] "delete_file": []
} }