From 5ec89e7538172c77522bbf51f9666fc2686bfb16 Mon Sep 17 00:00:00 2001 From: hibiki <775757368@qq.com> Date: Tue, 10 Aug 2021 23:03:46 +0800 Subject: [PATCH] fix --- configs/config.py | 5 +- plugins/auto_invite/__init__.py | 79 ++++++------ plugins/ban/__init__.py | 23 ++-- plugins/check_zhenxun_update/__init__.py | 86 +++++++++---- plugins/check_zhenxun_update/data_source.py | 129 ++++++++++++------- plugins/genshin/material_remind/__init__.py | 2 +- plugins/genshin/query_resource_points/map.py | 108 +++++++++++----- plugins/help/config.py | 2 + plugins/nbnhhsh.py | 49 +++++++ plugins/roll.py | 49 +++++++ plugins/russian/__init__.py | 12 +- plugins/search_buff_skin_price/__init__.py | 2 +- plugins/super_help/__init__.py | 5 +- plugins/update_setu/data_source.py | 7 +- plugins/yiqing/__init__.py | 3 +- plugins/yiqing/data_source.py | 12 +- update_info.json | 19 ++- 17 files changed, 422 insertions(+), 170 deletions(-) create mode 100644 plugins/nbnhhsh.py create mode 100644 plugins/roll.py diff --git a/configs/config.py b/configs/config.py index c1e51d89..b898846b 100644 --- a/configs/config.py +++ b/configs/config.py @@ -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 = { diff --git a/plugins/auto_invite/__init__.py b/plugins/auto_invite/__init__.py index 113539af..9ec5e381 100644 --- a/plugins/auto_invite/__init__.py +++ b/plugins/auto_invite/__init__.py @@ -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": {}} diff --git a/plugins/ban/__init__.py b/plugins/ban/__init__.py index 18c56228..b733893a 100644 --- a/plugins/ban/__init__.py +++ b/plugins/ban/__init__.py @@ -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) + + + + diff --git a/plugins/check_zhenxun_update/__init__.py b/plugins/check_zhenxun_update/__init__.py index e2a5ab42..434c10e8 100644 --- a/plugins/check_zhenxun_update/__init__.py +++ b/plugins/check_zhenxun_update/__init__.py @@ -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'更新完毕,请重启真寻....' + ) diff --git a/plugins/check_zhenxun_update/data_source.py b/plugins/check_zhenxun_update/data_source.py index c0ac122d..95fe8cad 100644 --- a/plugins/check_zhenxun_update/data_source.py +++ b/plugins/check_zhenxun_update/data_source.py @@ -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 "" diff --git a/plugins/genshin/material_remind/__init__.py b/plugins/genshin/material_remind/__init__.py index ca7ae13d..20456748 100644 --- a/plugins/genshin/material_remind/__init__.py +++ b/plugins/genshin/material_remind/__init__.py @@ -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" 发送查看今日素材") diff --git a/plugins/genshin/query_resource_points/map.py b/plugins/genshin/query_resource_points/map.py index 75c3272c..c9007983 100644 --- a/plugins/genshin/query_resource_points/map.py +++ b/plugins/genshin/query_resource_points/map.py @@ -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) diff --git a/plugins/help/config.py b/plugins/help/config.py index ca0d7752..aabae177 100644 --- a/plugins/help/config.py +++ b/plugins/help/config.py @@ -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 = [ diff --git a/plugins/nbnhhsh.py b/plugins/nbnhhsh.py new file mode 100644 index 00000000..ada948f5 --- /dev/null +++ b/plugins/nbnhhsh.py @@ -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("网络访问失败了....") diff --git a/plugins/roll.py b/plugins/roll.py new file mode 100644 index 00000000..9aee9ffb --- /dev/null +++ b/plugins/roll.py @@ -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}" + ) diff --git a/plugins/russian/__init__.py b/plugins/russian/__init__.py index f01dfee4..5f24ae28 100644 --- a/plugins/russian/__init__.py +++ b/plugins/russian/__init__.py @@ -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) diff --git a/plugins/search_buff_skin_price/__init__.py b/plugins/search_buff_skin_price/__init__.py index d158e97b..485e1afc 100644 --- a/plugins/search_buff_skin_price/__init__.py +++ b/plugins/search_buff_skin_price/__init__.py @@ -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 ) diff --git a/plugins/super_help/__init__.py b/plugins/super_help/__init__.py index 20cdba98..f41b1fc5 100644 --- a/plugins/super_help/__init__.py +++ b/plugins/super_help/__init__.py @@ -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) diff --git a/plugins/update_setu/data_source.py b/plugins/update_setu/data_source.py index 71fc2457..67f82f0f 100644 --- a/plugins/update_setu/data_source.py +++ b/plugins/update_setu/data_source.py @@ -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), ) diff --git a/plugins/yiqing/__init__.py b/plugins/yiqing/__init__.py index 663310c4..91933607 100644 --- a/plugins/yiqing/__init__.py +++ b/plugins/yiqing/__init__.py @@ -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) diff --git a/plugins/yiqing/data_source.py b/plugins/yiqing/data_source.py index e9be4b32..2274e512 100644 --- a/plugins/yiqing/data_source.py +++ b/plugins/yiqing/data_source.py @@ -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: diff --git a/update_info.json b/update_info.json index 90944b06..65c3bc45 100644 --- a/update_info.json +++ b/update_info.json @@ -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": [] -} +} \ No newline at end of file