From 222e1719a40160cb6ae276b002be2c5f6f313ce9 Mon Sep 17 00:00:00 2001
From: HibiKier <45528451+HibiKier@users.noreply.github.com>
Date: Sun, 27 Feb 2022 17:29:57 +0800
Subject: [PATCH] Delete plugins/draw_card directory
---
plugins/draw_card/__init__.py | 413 ------------------
plugins/draw_card/announcement.py | 395 -----------------
plugins/draw_card/async_update_game_info.py | 63 ---
plugins/draw_card/azur_handle.py | 62 ---
plugins/draw_card/config.py | 163 -------
plugins/draw_card/count_manager.py | 113 -----
plugins/draw_card/fgo_handle.py | 111 -----
plugins/draw_card/genshin_handle.py | 288 ------------
plugins/draw_card/guardian_handle.py | 159 -------
plugins/draw_card/init_card_pool.py | 204 ---------
plugins/draw_card/onmyoji_handle.py | 81 ----
plugins/draw_card/pcr_handle.py | 93 ----
plugins/draw_card/pretty_handle.py | 148 -------
plugins/draw_card/prts_handle.py | 171 --------
plugins/draw_card/rule.py | 29 --
plugins/draw_card/update_game_info.py | 295 -------------
.../draw_card/update_game_requests_info.py | 156 -------
plugins/draw_card/update_game_simple_info.py | 225 ----------
plugins/draw_card/util.py | 356 ---------------
19 files changed, 3525 deletions(-)
delete mode 100755 plugins/draw_card/__init__.py
delete mode 100755 plugins/draw_card/announcement.py
delete mode 100755 plugins/draw_card/async_update_game_info.py
delete mode 100755 plugins/draw_card/azur_handle.py
delete mode 100755 plugins/draw_card/config.py
delete mode 100644 plugins/draw_card/count_manager.py
delete mode 100755 plugins/draw_card/fgo_handle.py
delete mode 100755 plugins/draw_card/genshin_handle.py
delete mode 100755 plugins/draw_card/guardian_handle.py
delete mode 100755 plugins/draw_card/init_card_pool.py
delete mode 100755 plugins/draw_card/onmyoji_handle.py
delete mode 100755 plugins/draw_card/pcr_handle.py
delete mode 100755 plugins/draw_card/pretty_handle.py
delete mode 100755 plugins/draw_card/prts_handle.py
delete mode 100755 plugins/draw_card/rule.py
delete mode 100755 plugins/draw_card/update_game_info.py
delete mode 100755 plugins/draw_card/update_game_requests_info.py
delete mode 100755 plugins/draw_card/update_game_simple_info.py
delete mode 100755 plugins/draw_card/util.py
diff --git a/plugins/draw_card/__init__.py b/plugins/draw_card/__init__.py
deleted file mode 100755
index 41df4d29..00000000
--- a/plugins/draw_card/__init__.py
+++ /dev/null
@@ -1,413 +0,0 @@
-from nonebot import on_regex, on_keyword
-from nonebot.adapters.onebot.v11 import Bot, MessageEvent, Message
-from nonebot.permission import SUPERUSER
-from nonebot.typing import T_State
-from nonebot.params import RegexGroup
-from utils.utils import scheduler
-from .genshin_handle import genshin_draw, update_genshin_info, reset_count, reload_genshin_pool
-from .prts_handle import update_prts_info, prts_draw, reload_prts_pool
-from .pretty_handle import update_pretty_info, pretty_draw, reload_pretty_pool
-from .guardian_handle import update_guardian_info, guardian_draw, reload_guardian_pool
-from .pcr_handle import update_pcr_info, pcr_draw
-from .azur_handle import update_azur_info, azur_draw
-from .fgo_handle import update_fgo_info, fgo_draw
-from .onmyoji_handle import update_onmyoji_info, onmyoji_draw
-from .update_game_info import update_info
-from .util import is_number, check_num
-from .rule import is_switch
-from .config import draw_config
-from .async_update_game_info import async_update_game
-from typing import Tuple, Any
-import re
-import asyncio
-
-
-__zx_plugin_name__ = "游戏抽卡"
-__plugin_usage__ = """
-usage:
- 模拟赛马娘,原神,明日方舟,坎公骑冠剑,公主连结(国/台),碧蓝航线,FGO,阴阳师进行抽卡
- 指令:
- 原神[1-300]抽: 原神常驻池
- 原神角色[1-300]抽: 原神角色UP池子
- 原神武器[1-300]抽: 原神武器UP池子
- 重置原神抽卡: 清空当前卡池的抽卡次数[即从0开始计算UP概率]
- 方舟[1-300]抽: 方舟卡池,当有当期UP时指向UP池
- 赛马娘[1-200]抽: 赛马娘卡池,当有当期UP时指向UP池
- 坎公骑冠剑[1-300]抽: 坎公骑冠剑卡池,当有当期UP时指向UP池
- pcr/公主连接[1-300]抽: 公主连接卡池
- 碧蓝航线/碧蓝[重型/轻型/特型][1-300]抽: 碧蓝航线重型/轻型/特型卡池
- fgo[1-300]抽: fgo卡池
- 阴阳师[1-300]抽: 阴阳师卡池
- * 以上指令可以通过 XX一井 来指定最大抽取数量 *
- * 示例:原神一井 *
-""".strip()
-__plugin_superuser_usage__ = """
-usage:
- 卡池方面的更新
- 指令:
- 更新方舟信息
- 重载方舟卡池
- 更新原神信息
- 重载原神卡池
- 更新赛马娘信息
- 重载赛马娘卡池
- 更新坎公骑冠剑信息
- 更新碧蓝航线信息
- 更新fgo信息
- 更新阴阳师信息
-""".strip()
-__plugin_des__ = "就算是模拟抽卡也不能改变自己是个非酋"
-__plugin_cmd__ = [
- "原神[1-300]抽",
- "原神角色[1-300]抽",
- "原神武器[1-300]抽",
- "重置原神抽卡",
- "方舟[1-300]抽",
- "赛马娘[1-200]抽",
- "坎公骑冠剑[1-300]抽",
- "pcr/公主连接[1-300]抽",
- "fgo[1-300]抽",
- "阴阳师[1-300]抽",
- "更新方舟信息 [_superuser]",
- "重载方舟卡池 [_superuser]",
- "更新原神信息 [_superuser]",
- "重载原神卡池 [_superuser]",
- "更新赛马娘信息 [_superuser]",
- "重载赛马娘卡池 [_superuser]",
- "更新坎公骑冠剑信息 [_superuser]",
- "更新碧蓝航线信息 [_superuser]",
- "更新fgo信息 [_superuser]",
- "更新阴阳师信息 [_superuser]",
-]
-__plugin_type__ = ("抽卡相关", 1)
-__plugin_version__ = 0.1
-__plugin_author__ = "HibiKier"
-__plugin_settings__ = {
- "level": 5,
- "default_status": True,
- "limit_superuser": False,
- "cmd": ["游戏抽卡", "抽卡"],
-}
-
-prts = on_regex(r'.*?方舟([1-9|一][0-9]{0,2}[抽|井|连])', rule=is_switch('prts'), priority=5, block=True)
-prts_update = on_keyword({'更新方舟信息', '更新明日方舟信息'}, permission=SUPERUSER, priority=1, block=True)
-prts_up_reload = on_keyword({'重载方舟卡池'}, priority=1, block=True)
-
-genshin = on_regex(r'.*?原神(武器|角色)?池?[1-9|一][0-9]{0,2}[抽|井|连]', rule=is_switch('genshin'), priority=5, block=True)
-genshin_update = on_keyword({'更新原神信息'}, permission=SUPERUSER, priority=1, block=True)
-genshin_reset = on_keyword({'重置原神抽卡'}, priority=1, block=True)
-genshin_up_reload = on_keyword({'重载原神卡池'}, priority=1, block=True)
-
-pretty = on_regex(r'.*?马娘卡?[1-9|一][0-9]{0,2}[抽|井|连]', rule=is_switch('pretty'), priority=5, block=True)
-pretty_update = on_keyword({'更新马娘信息', '更新赛马娘信息'}, permission=SUPERUSER, priority=1, block=True)
-pretty_up_reload = on_keyword({'重载赛马娘卡池'}, priority=1, block=True)
-
-guardian = on_regex(r'.*?坎公骑冠剑武?器?[1-9|一][0-9]{0,2}[抽|井|连]', rule=is_switch('guardian'), priority=5, block=True)
-guardian_update = on_keyword({'更新坎公骑冠剑信息'}, permission=SUPERUSER, priority=1, block=True)
-guardian_up_reload = on_keyword({'重载坎公骑冠剑卡池'}, priority=1, block=True)
-
-pcr = on_regex(r'.*?(pcr|公主连结|公主连接|公主链接|公主焊接)[1-9|一][0-9]{0,2}[抽|井|连]', rule=is_switch('pcr'), priority=5, block=True)
-pcr_update = on_keyword({'更新pcr信息', '更新公主连结信息'}, permission=SUPERUSER, priority=1, block=True)
-
-azur = on_regex(r'.*?碧蓝航?线?(轻型|重型|特型)池?[1-9|一][0-9]{0,2}[抽|连]', rule=is_switch('azur'), priority=5, block=True)
-azur_update = on_keyword({'更新碧蓝信息', '更新碧蓝航线信息'}, permission=SUPERUSER, priority=1, block=True)
-
-fgo = on_regex(r'.*?fgo[1-9|一][0-9]{0,2}[抽|连]', rule=is_switch('fgo'), priority=5, block=True)
-fgo_update = on_keyword({'更新fgo信息'}, permission=SUPERUSER, priority=1, block=True)
-
-onmyoji = on_regex(r'.*?阴阳师[1-9|一][0-9]{0,2}[抽|连]', rule=is_switch('onmyoji'), priority=5, block=True)
-onmyoji_update = on_keyword({'更新阴阳师信息'}, permission=SUPERUSER, priority=1, block=True)
-
-
-@prts.handle()
-async def _(bot: Bot, event: MessageEvent, state: T_State, reg: Tuple[Any, ...] = RegexGroup()):
- msg = str(event.get_message()).strip()
- if msg in ['方舟一井', '方舟1井']:
- num = 300
- else:
- rmsg = re.search(r'.*?方舟(.*)[抽|连]', msg)
- if rmsg:
- num, flag = check_num(rmsg.group(1), 300)
- if not flag:
- await prts.finish(num, at_sender=True)
- else:
- return
- await prts.send(await prts_draw(int(num)), at_sender=True)
-
-
-@prts_up_reload.handle()
-async def _(bot: Bot, event: MessageEvent, state: T_State):
- text = await reload_prts_pool()
- await prts_up_reload.finish(Message(f'重载完成!\n{text}'))
-
-
-@genshin.handle()
-async def _(bot: Bot, event: MessageEvent, state: T_State):
- msg = str(event.get_message()).strip()
- rmsg = re.search(r'.*?原神(武器|角色)?池?(.*)[抽|井|连]', msg)
- if rmsg:
- pool_name = rmsg.group(1)
- if pool_name == '武器':
- pool_name = 'arms'
- elif pool_name == '角色':
- pool_name = 'char'
- else:
- pool_name = ''
- num = rmsg.group(2)
- if msg.find('一井') != -1 or msg.find('1井') != -1:
- num = 180
- else:
- num, flag = check_num(num, 180)
- if not flag:
- await genshin.finish(num, at_sender=True)
- else:
- return
- await genshin.send(await genshin_draw(event.user_id, int(num), pool_name), at_sender=True)
-
-
-@genshin_up_reload.handle()
-async def _(bot: Bot, event: MessageEvent, state: T_State):
- text = await reload_genshin_pool()
- await genshin_reset.finish(Message(f'重载成功!\n{text}'))
-
-
-@genshin_reset.handle()
-async def _(bot: Bot, event: MessageEvent, state: T_State):
- reset_count(event.user_id)
- await genshin_reset.send('重置了原神抽卡次数', at_sender=True)
-
-
-@pretty.handle()
-async def _(bot: Bot, event: MessageEvent, state: T_State):
- msg = str(event.get_message()).strip()
- if msg.find('1井') != -1 or msg.find('一井') != -1:
- num = 200
- if msg.find("卡") == -1:
- pool_name = 'char'
- else:
- pool_name = 'card'
- else:
- rmsg = re.search(r'.*?马娘(.*)[抽|连]', msg)
- if rmsg:
- num = rmsg.group(1)
- if num[0] == '卡':
- num = num[1:]
- pool_name = 'card'
- else:
- pool_name = 'char'
- num, flag = check_num(num, 200)
- if not flag:
- await pretty.finish(num, at_sender=True)
- else:
- return
- await pretty.send(await pretty_draw(int(num), pool_name), at_sender=True)
-
-
-@pretty_up_reload.handle()
-async def _(bot: Bot, event: MessageEvent, state: T_State):
- text = await reload_pretty_pool()
- await genshin_reset.finish(Message(f'重载成功!\n{text}'))
-
-
-@guardian.handle()
-async def _(bot: Bot, event: MessageEvent, state: T_State):
- msg = str(event.get_message()).strip()
- pool_name = 'char'
- if msg.find('1井') != -1 or msg.find('一井') != -1:
- num = 300
- if msg.find('武器') != -1:
- pool_name = 'arms'
- else:
- rmsg = re.search(r'.*?坎公骑冠剑(.*)[抽|连]', msg)
- if rmsg:
- num = rmsg.group(1)
- if num.find('武器') != -1:
- pool_name = 'arms'
- num = num.replace('武器', '')
- num, flag = check_num(num, 300)
- if not flag:
- await guardian.finish(num, at_sender=True)
- else:
- return
- await guardian.send(await guardian_draw(int(num), pool_name), at_sender=True)
-
-
-@guardian_up_reload.handle()
-async def _(bot: Bot, event: MessageEvent, state: T_State):
- text = await reload_guardian_pool()
- await genshin_reset.finish(Message(f'重载成功!\n{text}'))
-
-
-@pcr.handle()
-async def _(bot: Bot, event: MessageEvent, state: T_State):
- msg = str(event.get_message()).strip()
- if msg.find('1井') != -1 or msg.find('一井') != -1:
- num = 300
- else:
- rmsg = re.search(r'.*?(pcr|公主连结)(.*)[抽|井|连]', msg)
- if rmsg:
- num, flag = check_num(rmsg.group(2), 300)
- if not flag:
- await pcr.finish(num, at_sender=True)
- else:
- return
- await pcr.send(await pcr_draw(int(num)), at_sender=True)
-
-
-@azur.handle()
-async def _(bot: Bot, event: MessageEvent, state: T_State):
- msg = str(event.get_message()).strip()
- rmsg = re.search(r'.*?碧蓝航?线?(轻型|重型|特型)池?(.*)[抽|连]', msg)
- if rmsg:
- pool_name = rmsg.group(1)
- num, flag = check_num(rmsg.group(2), 300)
- if not flag:
- await azur.finish(num, at_sender=True)
- else:
- return
- await azur.send(await azur_draw(int(num), pool_name), at_sender=True)
-
-
-@fgo.handle()
-async def _(bot: Bot, event: MessageEvent, state: T_State):
- msg = str(event.get_message()).strip()
- rmsg = re.search(r'.*?fgo(.*)[抽|连]', msg)
- if rmsg:
- num, flag = check_num(rmsg.group(1), 300)
- if not flag:
- await fgo.finish(num, at_sender=True)
- else:
- return
- await fgo.send(await fgo_draw(int(num)), at_sender=True)
-
-
-@onmyoji.handle()
-async def _(bot: Bot, event: MessageEvent, state: T_State):
- msg = str(event.get_message()).strip()
- rmsg = re.search(r'.*?阴阳师(.*)[抽|连]', msg)
- if rmsg:
- num, flag = check_num(rmsg.group(1), 300)
- if not flag:
- await onmyoji.finish(num, at_sender=True)
- else:
- return
- await onmyoji.send(await onmyoji_draw(int(num)), at_sender=True)
-
-
-@prts_update.handle()
-async def _(bot: Bot, event: MessageEvent, state: T_State):
- await update_prts_info()
- await prts_update.finish('更新完成!')
-
-
-@genshin_update.handle()
-async def _(bot: Bot, event: MessageEvent, state: T_State):
- await update_genshin_info()
- await genshin_update.finish('更新完成!')
-
-
-@pretty_update.handle()
-async def _(bot: Bot, event: MessageEvent, state: T_State):
- await update_pretty_info()
- await genshin_update.finish('更新完成!')
-
-
-@guardian_update.handle()
-async def _(bot: Bot, event: MessageEvent, state: T_State):
- await update_guardian_info()
- await genshin_update.finish('更新完成!')
-
-
-@pcr_update.handle()
-async def _(bot: Bot, event: MessageEvent, state: T_State):
- await update_pcr_info()
- await genshin_update.finish('更新完成!')
-
-
-@azur_update.handle()
-async def _(bot: Bot, event: MessageEvent, state: T_State):
- await update_azur_info()
- await genshin_update.finish('更新完成!')
-
-
-@fgo_update.handle()
-async def _(bot: Bot, event: MessageEvent, state: T_State):
- await update_fgo_info()
- await genshin_update.finish('更新完成!')
-
-
-@onmyoji_update.handle()
-async def _(bot: Bot, event: MessageEvent, state: T_State):
- await update_onmyoji_info()
- await genshin_update.finish('更新完成!')
-
-
-# 更新资源
-@scheduler.scheduled_job(
- 'cron',
- hour=4,
- minute=1,
-)
-async def _():
- tasks = []
- if draw_config.PRTS_FLAG:
- tasks.append(asyncio.ensure_future(update_prts_info()))
- if draw_config.GENSHIN_FLAG:
- tasks.append(asyncio.ensure_future(update_genshin_info()))
- if draw_config.PRETTY_FLAG:
- tasks.append(asyncio.ensure_future(update_pretty_info()))
- if draw_config.GUARDIAN_FLAG:
- tasks.append(asyncio.ensure_future(update_guardian_info()))
- if draw_config.PCR_FLAG:
- tasks.append(asyncio.ensure_future(update_pcr_info()))
- if draw_config.AZUR_FLAG:
- tasks.append(asyncio.ensure_future(update_azur_info()))
- if draw_config.FGO_FLAG:
- tasks.append(asyncio.ensure_future(update_fgo_info()))
- if draw_config.ONMYOJI_FLAG:
- tasks.append(asyncio.ensure_future(update_onmyoji_info()))
- await asyncio.gather(*tasks)
-
-
-# 每天四点重载方舟up卡池
-@scheduler.scheduled_job(
- 'cron',
- hour=4,
- minute=1,
-)
-async def _():
- if draw_config.PRTS_FLAG:
- await reload_prts_pool()
-
-
-# 每天四点重载赛马娘up卡池
-@scheduler.scheduled_job(
- 'cron',
- hour=4,
- minute=1,
-)
-async def _():
- if draw_config.PRETTY_FLAG:
- await reload_pretty_pool()
-
-
-# 每天下午六点点重载原神up卡池
-@scheduler.scheduled_job(
- 'cron',
- hour=18,
- minute=1,
-)
-async def _():
- if draw_config.PRTS_FLAG:
- await reload_genshin_pool()
-
-
-# 重载坎公骑冠剑卡池
-@scheduler.scheduled_job(
- 'cron',
- hour=4,
- minute=1,
-)
-async def _():
- if draw_config.GUARDIAN_FLAG:
- await reload_guardian_pool()
diff --git a/plugins/draw_card/announcement.py b/plugins/draw_card/announcement.py
deleted file mode 100755
index 2bf84da2..00000000
--- a/plugins/draw_card/announcement.py
+++ /dev/null
@@ -1,395 +0,0 @@
-from bs4 import BeautifulSoup
-import re
-from datetime import datetime, timedelta
-from .config import DRAW_DATA_PATH
-from asyncio.exceptions import TimeoutError
-from nonebot.log import logger
-from utils.http_utils import AsyncHttpx
-
-try:
- import ujson as json
-except ModuleNotFoundError:
- import json
-
-headers = {'User-Agent': '"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)"'}
-
-prts_up_char = DRAW_DATA_PATH / "draw_card_up" / "prts_up_char.json"
-genshin_up_char = DRAW_DATA_PATH / "draw_card_up" / "genshin_up_char.json"
-pretty_up_char = DRAW_DATA_PATH / "draw_card_up" / "pretty_up_char.json"
-guardian_up_char = DRAW_DATA_PATH / "draw_card_up" / "guardian_up_char.json"
-
-prts_url = "https://ak.hypergryph.com/news.html"
-genshin_url = "https://wiki.biligame.com/ys/%E7%A5%88%E6%84%BF"
-pretty_url = "https://wiki.biligame.com/umamusume/%E5%85%AC%E5%91%8A"
-guardian_url = "https://wiki.biligame.com/gt/%E9%A6%96%E9%A1%B5"
-
-
-# 是否过时
-def is_expired(data: dict):
- times = data['time'].split('-')
- for i in range(len(times)):
- times[i] = str(datetime.now().year) + '-' + times[i].split('日')[0].strip().replace('月', '-')
- start_date = datetime.strptime(times[0], '%Y-%m-%d').date()
- end_date = datetime.strptime(times[1], '%Y-%m-%d').date()
- now = datetime.now().date()
- return not start_date <= now <= end_date
-
-
-# 检查写入
-def check_write(data: dict, up_char_file):
- try:
- if is_expired(data['char']):
- for x in list(data.keys()):
- data[x]['title'] = ''
- else:
- with open(up_char_file, 'w', encoding='utf8') as f:
- json.dump(data, f, indent=4, ensure_ascii=False)
- if not up_char_file.exists():
- with open(up_char_file, 'w', encoding='utf8') as f:
- json.dump(data, f, indent=4, ensure_ascii=False)
- else:
- with open(up_char_file, 'r', encoding='utf8') as f:
- old_data = json.load(f)
- if is_expired(old_data['char']):
- return old_data
- else:
- with open(up_char_file, 'w', encoding='utf8') as f:
- json.dump(data, f, indent=4, ensure_ascii=False)
- except ValueError:
- pass
- return data
-
-
-class PrtsAnnouncement:
-
- def __init__(self):
- self.game_name = '明日方舟'
-
- async def _get_announcement_text(self):
- res = await AsyncHttpx.get(prts_url, timeout=7)
- soup = BeautifulSoup(res.text, 'lxml')
- ol = soup.find('ol', {'class': 'articleList active', 'data-category-key': 'LATEST'})
- for li in ol:
- type_ = li.find('span', {'class': 'articleItemCate'}).text
- if type_ == '活动':
- a = li.find('a')['href']
- return (await AsyncHttpx.get(f'https://ak.hypergryph.com{a}', timeout=7)).text
-
- async def update_up_char(self):
- prts_up_char.parent.mkdir(parents=True, exist_ok=True)
- if prts_up_char.exists():
- with open(prts_up_char, 'r', encoding='utf8') as f:
- data = json.load(f)
- if not data.get('char'):
- prts_up_char.unlink()
- try:
- data = {'char': {'up_char': {'6': {}, '5': {}, '4': {}}, 'title': '', 'time': '', 'pool_img': ''}}
- text = await self._get_announcement_text()
- soup = BeautifulSoup(text, 'lxml')
- content = soup.find('div', {'class': 'article-content'})
- contents = [x for x in content.contents if x.text or str(x).find('img') != -1]
- start_index = -1
- end_index = -1
- for i in range(len(contents)):
- if str(contents[i]).startswith('
'):
- r = re.search('(.*)(寻访|复刻).*?开启', contents[i].text)
- if r:
- if str(contents[i+3].text).find('★') != -1:
- img = contents[i-1].find('img')
- if img:
- data['char']['pool_img'] = img['src']
- start_index = i
- for j in range(i, len(contents)):
- if str(contents[j]).find('注意') != -1:
- end_index = j
- break
- break
- contents = contents[start_index: end_index]
- title = contents[0].text
- data['char']['title'] = title[title.find('【'): title.find('】') + 1]
- data['char']['time'] = str(contents[1].text).split(':', maxsplit=1)[1]
- for p in contents[2:]:
- p = str(p.text)
- r = None
- if p.find('★') != -1:
- if p.find('权值') == -1:
- r = re.search(r'.*?:(.*)(占(.*)★.*?的(.*)%)', p)
- else:
- r = re.search(r'.*?:(.*)(在(.*)★.*?以(.*)倍权值.*?)', p)
- star = r.group(2)
- if r:
- chars = r.group(1)
- if chars.find('/') != -1:
- chars = chars.strip().split('/')
- elif chars.find('\\') != -1:
- chars = chars.strip().split('\\')
- else:
- chars = chars.split('\n')
- chars = [x.replace('[限定]', '').strip() for x in chars]
- probability = r.group(3)
- probability = probability if int(probability) > 10 else f'权{probability}'
- for char in chars:
- if char.strip():
- data['char']['up_char'][star][char.strip()] = probability
- except TimeoutError:
- logger.warning(f'更新明日方舟UP池信息超时...')
- if prts_up_char.exists():
- with open(prts_up_char, 'r', encoding='utf8') as f:
- data = json.load(f)
- except Exception as e:
- logger.error(f'更新明日方舟未知错误 e:{e}')
- if prts_up_char.exists():
- with open(prts_up_char, 'r', encoding='utf8') as f:
- data = json.load(f)
- return check_write(data, prts_up_char)
-
-
-class GenshinAnnouncement:
-
- def __init__(self):
- self.game_name = '原神'
-
- async def _get_announcement_text(self):
- return (await AsyncHttpx.get(genshin_url, timeout=7)).text
-
- async def update_up_char(self):
- genshin_up_char.parent.mkdir(exist_ok=True, parents=True)
- data = {
- 'char': {'up_char': {'5': {}, '4': {}}, 'title': '', 'time': '', 'pool_img': ''},
- 'arms': {'up_char': {'5': {}, '4': {}}, 'title': '', 'time': '', 'pool_img': ''}
- }
- text = await self._get_announcement_text()
- soup = BeautifulSoup(text, 'lxml')
- try:
- div = soup.find_all('div', {'class': 'row'})[1]
- tables = div.find_all('table', {'class': 'wikitable'})
- for table in tables:
- trs = table.find('tbody').find_all('tr')
- pool_img = trs[0].find('th').find('img')
- if pool_img['title'].find('角色活动') == -1:
- type_ = 'arms'
- else:
- type_ = 'char'
- try:
- data[type_]['pool_img'] = str(pool_img['srcset']).split(' ')[0]
- except KeyError:
- data[type_]['pool_img'] = pool_img['src']
- data[type_]['title'] = str(pool_img['title']).split(f'期{"角色" if type_ == "char" else "武器"}')[0][:-3]
- data[type_]['time'] = trs[1].find('td').text
- if data[type_]['time'][-1] == '\n':
- data[type_]['time'] = data[type_]['time'][:-1]
- if '版本更新后' in data[type_]['time']:
- sp = data[type_]['time'].split('~')
- end_time = datetime.strptime(sp[1].strip(), "%Y/%m/%d %H:%M")
- start_time = end_time - timedelta(days=20)
- data[type_]['time'] = start_time.strftime('%Y/%m/%d') + ' ~ ' + end_time.strftime('%Y/%m/%d')
- tmp = ''
- for tm in data[type_]['time'].split('~'):
- date_time_sp = tm.split('/')
- date_time_sp[2] = date_time_sp[2].strip().replace(' ', '日 ')
- tmp += date_time_sp[1] + '月' + date_time_sp[2] + ' - '
- data[type_]['time'] = tmp[:-2].strip()
- for a in trs[2].find('td').find_all('a'):
- char_name = a['title']
- data[type_]['up_char']['5'][char_name] = "50"
- for a in trs[3].find('td').find_all('a'):
- char_name = a['title']
- data[type_]['up_char']['4'][char_name] = "50"
- except TimeoutError:
- logger.warning(f'更新原神UP池信息超时...')
- if genshin_up_char.exists():
- with open(genshin_up_char, 'r', encoding='utf8') as f:
- data = json.load(f)
- except Exception as e:
- logger.error(f'更新原神UP失败,疑似UP池已结束, e:{e}')
- if genshin_up_char.exists():
- with open(genshin_up_char, 'r', encoding='utf8') as f:
- data = json.load(f)
- data['char']['title'] = ''
- data['arms']['title'] = ''
- with open(genshin_up_char, 'w', encoding='utf8') as wf:
- json.dump(data, wf, ensure_ascii=False, indent=4)
- return data
- return check_write(data, genshin_up_char)
-
-
-class PrettyAnnouncement:
-
- def __init__(self):
- self.game_name = '赛马娘'
-
- async def _get_announcement_text(self):
- res = await AsyncHttpx.get(pretty_url, timeout=7)
- soup = BeautifulSoup(res.text, 'lxml')
- divs = soup.find('div', {'id': 'mw-content-text'}).find('div').find_all('div')
- for div in divs:
- a = div.find('a')
- try:
- title = a['title']
- except (KeyError, TypeError):
- continue
- if title.find('新角色追加') != -1:
- url = a['href']
- break
- return (await AsyncHttpx.get(f'https://wiki.biligame.com/{url}', timeout=7)).text, title[:-2]
-
- async def update_up_char(self):
- data = {
- 'char': {'up_char': {'3': {}, '2': {}, '1': {}}, 'title': '', 'time': '', 'pool_img': ''},
- 'card': {'up_char': {'3': {}, '2': {}, '1': {}}, 'title': '', 'time': '', 'pool_img': ''}
- }
- try:
- text, title = await self._get_announcement_text()
- soup = BeautifulSoup(text, 'lxml')
- context = soup.find('div', {'class': 'toc-sticky'})
- if not context:
- context = soup.find('div', {'class': 'mw-parser-output'})
- data['char']['title'] = title
- data['card']['title'] = title
- for big in context.find_all('big'):
- r = re.search(r'\d{1,2}/\d{1,2} \d{1,2}:\d{1,2}', str(big.text))
- if r:
- time = str(big.text)
- break
- else:
- logger.warning('赛马娘UP无法找到活动日期....取消更新UP池子...')
- return
- time = time.replace('~', '-').replace('/', '月').split(' ')
- time = time[0] + '日 ' + time[1] + ' - ' + time[3] + '日 ' + time[4]
- data['char']['time'] = time
- data['card']['time'] = time
- for p in context.find_all('p'):
- if str(p).find('当期UP赛马娘') != -1 and str(p).find('■') != -1:
- if not data['char']['pool_img']:
- try:
- data['char']['pool_img'] = p.find('img')['src']
- except TypeError:
- for center in context.find_all('center'):
- try:
- img = center.find('img')
- if img and str(img['alt']).find('新马娘') != -1 and str(img['alt']).find('总览') == 1:
- data['char']['pool_img'] = img['src']
- except (TypeError, KeyError):
- pass
- r = re.findall(r'.*?当期UP赛马娘([\s\S]*)<奖励内容>.*?', str(p))
- if r:
- for x in r:
- x = str(x).split('\n')
- for msg in x:
- if msg.find('★') != -1:
- msg = msg.replace('
', '')
- char_name = msg[msg.find('['):].strip()
- if (star := len(msg[:msg.find('[')].strip())) == 3:
- data['char']['up_char']['3'][char_name] = '70'
- elif star == 2:
- data['char']['up_char']['2'][char_name] = '70'
- elif star == 1:
- data['char']['up_char']['1'][char_name] = '70'
- if str(p).find('(当期UP对象)') != -1 and str(p).find('赛马娘') == -1 and str(p).find('■') != -1:
- # data['card']['pool_img'] = p.find('img')['src']
- if not data['char']['pool_img']:
- try:
- data['char']['pool_img'] = p.find('img')['src']
- except TypeError:
- for center in context.find_all('center'):
- try:
- img = center.find('img')
- if img and str(img['alt']).find('新卡') != -1 and str(img['alt']).find('总览') == 1:
- data['card']['pool_img'] = img['src']
- except (TypeError, KeyError):
- pass
- r = re.search(r'■全?新?支援卡(当期UP对象)([\s\S]*)
', str(p))
- if r:
- rmsg = r.group(1).strip()
- rmsg = rmsg.split('
')
- rmsg = [x for x in rmsg if x]
- for x in rmsg:
- x = x.replace('\n', '').replace('・', '')
- star = x[:x.find('[')].strip()
- char_name = x[x.find('['):].strip()
- if star == 'SSR':
- data['card']['up_char']['3'][char_name] = '70'
- if star == 'SR':
- data['card']['up_char']['2'][char_name] = '70'
- if star == 'R':
- data['card']['up_char']['1'][char_name] = '70'
- # 日文->中文
- with open(DRAW_DATA_PATH / 'pretty_card.json', 'r', encoding='utf8') as f:
- all_data = json.load(f)
- for star in data['card']['up_char'].keys():
- for name in list(data['card']['up_char'][star].keys()):
- char_name = name.split(']')[1].strip()
- tp_name = name[name.find('['): name.find(']') + 1].strip().replace('[', '【').replace(']', '】')
- for x in all_data.keys():
- if all_data[x]['名称'].find(tp_name) != -1 and all_data[x]['关联角色'] == char_name:
- data['card']['up_char'][star].pop(name)
- data['card']['up_char'][star][all_data[x]['中文名']] = '70'
- except TimeoutError:
- logger.warning(f'更新赛马娘UP池信息超时...')
- if pretty_up_char.exists():
- with open(pretty_up_char, 'r', encoding='utf8') as f:
- data = json.load(f)
- except Exception as e:
- logger.error(f'赛马娘up更新未知错误 {type(e)}:{e}')
- if pretty_up_char.exists():
- with open(pretty_up_char, 'r', encoding='utf8') as f:
- data = json.load(f)
- return check_write(data, pretty_up_char)
-
-
-class GuardianAnnouncement:
-
- def __init__(self):
- self.game_name = '坎公骑冠剑'
-
- async def _get_announcement_text(self):
- return (await AsyncHttpx.get(guardian_url, timeout=7)).text
-
- async def update_up_char(self):
- data = {
- 'char': {'up_char': {'3': {}}, 'title': '', 'time': '', 'pool_img': ''},
- 'arms': {'up_char': {'5': {}}, 'title': '', 'time': '', 'pool_img': ''}
- }
- try:
- text = await self._get_announcement_text()
- soup = BeautifulSoup(text, 'lxml')
- context = soup.select('div.col-sm-3:nth-child(3) > div:nth-child(2) > div:nth-child(1) '
- '> div:nth-child(2) > div:nth-child(3) > font:nth-child(1)')[0]
- title = context.find('p').find('b').text
- tmp = title.split(',')
- time = ''
- for msg in tmp:
- r = re.search(r'[从|至](.*)(开始|结束)', msg)
- if r:
- time += r.group(1).strip() + ' - '
- time = time[:-3]
- title = time.split(' - ')[0] + 'UP卡池'
- data['char']['title'] = title
- data['arms']['title'] = title
- data['char']['time'] = time
- data['arms']['time'] = time
- start_idx = -1
- end_idx = -1
- index = 0
- divs = context.find_all('div')
- for x in divs:
- if x.text == '角色':
- start_idx = index
- if x.text == '武器':
- end_idx = index
- break
- index += 1
- for x in divs[start_idx + 1: end_idx]:
- name = x.find('p').find_all('a')[-1].text
- data['char']['up_char']['3'][name] = '0'
- for x in divs[end_idx + 1:]:
- name = x.find('p').find_all('a')[-1].text
- data['arms']['up_char']['5'][name] = '0'
- except TimeoutError:
- logger.warning(f'更新坎公骑冠剑UP池信息超时...')
- if guardian_up_char.exists():
- with open(guardian_up_char, 'r', encoding='utf8') as f:
- data = json.load(f)
- except Exception as e:
- logger.error(f'坎公骑冠剑up更新未知错误 {type(e)}:{e}')
- return check_write(data, guardian_up_char)
diff --git a/plugins/draw_card/async_update_game_info.py b/plugins/draw_card/async_update_game_info.py
deleted file mode 100755
index c6dad146..00000000
--- a/plugins/draw_card/async_update_game_info.py
+++ /dev/null
@@ -1,63 +0,0 @@
-import asyncio
-import nonebot
-from nonebot.log import logger
-from .pcr_handle import update_pcr_info, init_pcr_data
-from .azur_handle import update_azur_info, init_azur_data
-from .prts_handle import update_prts_info, init_prts_data
-from .pretty_handle import update_pretty_info, init_pretty_data
-from .guardian_handle import update_guardian_info, init_guardian_data
-from .genshin_handle import update_genshin_info, init_genshin_data
-from .fgo_handle import update_fgo_info, init_fgo_data
-from .onmyoji_handle import update_onmyoji_info, init_onmyoji_data
-from .config import draw_config, DRAW_DATA_PATH
-
-
-driver = nonebot.get_driver()
-
-
-@driver.on_startup
-async def async_update_game():
- tasks = []
- init_lst = [init_pcr_data, init_pretty_data, init_azur_data, init_prts_data, init_genshin_data, init_guardian_data,
- init_fgo_data, init_onmyoji_data]
- if draw_config.PRTS_FLAG and not (DRAW_DATA_PATH / 'prts.json').exists():
- tasks.append(asyncio.ensure_future(update_prts_info()))
- init_lst.remove(init_prts_data)
-
- if draw_config.PRETTY_FLAG and (not (DRAW_DATA_PATH / 'pretty.json').exists() or
- not (DRAW_DATA_PATH / 'pretty_card.json').exists()):
- tasks.append(asyncio.ensure_future(update_pretty_info()))
- init_lst.remove(init_pretty_data)
-
- if draw_config.GUARDIAN_FLAG and not (DRAW_DATA_PATH / 'guardian.json').exists():
- tasks.append(asyncio.ensure_future(update_guardian_info()))
- init_lst.remove(init_guardian_data)
-
- if draw_config.PCR_FLAG and not (DRAW_DATA_PATH / 'pcr.json').exists():
- tasks.append(asyncio.ensure_future(update_pcr_info()))
- init_lst.remove(init_pcr_data)
-
- if draw_config.GENSHIN_FLAG and (not (DRAW_DATA_PATH / 'genshin.json').exists() or
- not (DRAW_DATA_PATH / 'genshin_arms.json').exists()):
- tasks.append(asyncio.ensure_future(update_genshin_info()))
- init_lst.remove(init_genshin_data)
-
- if draw_config.AZUR_FLAG and not (DRAW_DATA_PATH / 'azur.json').exists():
- tasks.append(asyncio.ensure_future(update_azur_info()))
- init_lst.remove(init_azur_data)
-
- if draw_config.FGO_FLAG and (not (DRAW_DATA_PATH / 'fgo.json').exists() or
- not (DRAW_DATA_PATH / 'fgo_card.json').exists()):
- tasks.append(asyncio.ensure_future(update_fgo_info()))
- init_lst.remove(init_fgo_data)
-
- if draw_config.ONMYOJI_FLAG and not (DRAW_DATA_PATH / 'onmyoji.json').exists():
- tasks.append(asyncio.ensure_future(update_onmyoji_info()))
- init_lst.remove(init_onmyoji_data)
- try:
- await asyncio.gather(*tasks)
- for func in init_lst:
- await func()
- except asyncio.exceptions.CancelledError:
- logger.warning('更新异常:CancelledError,再次更新...')
- await async_update_game()
diff --git a/plugins/draw_card/azur_handle.py b/plugins/draw_card/azur_handle.py
deleted file mode 100755
index bf4ce191..00000000
--- a/plugins/draw_card/azur_handle.py
+++ /dev/null
@@ -1,62 +0,0 @@
-from nonebot.adapters.onebot.v11 import MessageSegment
-import random
-from .update_game_simple_info import update_simple_info
-from .util import generate_img, init_star_rst, BaseData, set_list, get_star, max_card, format_card_information
-from .config import draw_config, DRAW_DATA_PATH
-from dataclasses import dataclass
-from .init_card_pool import init_game_pool
-try:
- import ujson as json
-except ModuleNotFoundError:
- import json
-
-ALL_CHAR = []
-
-
-@dataclass
-class AzurChar(BaseData):
- type_: str # 舰娘类型
-
-
-async def azur_draw(count: int, pool_name: str):
- # 0 1 2
- cnlist = ['金', '紫', '蓝', '白']
- star_list = [0, 0, 0, 0]
- char_list, char_dict, max_star_list, star_list, max_star_index_list = \
- format_card_information(count, star_list, _get_azur_card, pool_name, guaranteed=False)
- rst = init_star_rst(star_list, cnlist, max_star_list, max_star_index_list)
- if count > 90:
- char_list = set_list(char_list)
- return MessageSegment.image("base64://" + await generate_img(char_list, 'azur', star_list)) \
- + '\n' + rst[:-1] + '\n' + max_card(char_dict)
-
-
-async def update_azur_info():
- global ALL_CHAR
- url = 'https://wiki.biligame.com/blhx/舰娘图鉴'
- data, code = await update_simple_info(url, 'azur')
- if code == 200:
- ALL_CHAR = init_game_pool('azur', data, AzurChar)
-
-
-async def init_azur_data():
- global ALL_CHAR
- if draw_config.AZUR_FLAG:
- with (DRAW_DATA_PATH / 'azur.json').open('r', encoding='utf8') as f:
- azur_dict = json.load(f)
- ALL_CHAR = init_game_pool('azur', azur_dict, AzurChar)
-
-
-# 抽取卡池
-def _get_azur_card(pool_name: str, mode: int = 1):
- global ALL_CHAR
- azur_config = draw_config.azur
- if pool_name == '轻型':
- type_ = ['驱逐', '轻巡', '维修']
- elif pool_name == '重型':
- type_ = ['重巡', '战列', '战巡', '重炮']
- else:
- type_ = ['维修', '潜艇', '重巡', '轻航', '航母']
- star = get_star([4, 3, 2, 1], [azur_config.AZUR_FOUR_P, azur_config.AZUR_THREE_P, azur_config.AZUR_TWO_P, azur_config.AZUR_ONE_P])
- chars = [x for x in ALL_CHAR if x.star == star and x.type_ in type_ and not x.limited]
- return random.choice(chars), 4 - star
diff --git a/plugins/draw_card/config.py b/plugins/draw_card/config.py
deleted file mode 100755
index 78648f2f..00000000
--- a/plugins/draw_card/config.py
+++ /dev/null
@@ -1,163 +0,0 @@
-import nonebot
-from nonebot.log import logger
-from pydantic import BaseModel, Extra, ValidationError
-from configs.path_config import IMAGE_PATH, DATA_PATH
-from configs.config import Config
-
-try:
- import ujson as json
-except ModuleNotFoundError:
- import json
-
-
-# 原神
-class GenshinConfig(BaseModel, extra=Extra.ignore):
- GENSHIN_FIVE_P: float = 0.006
- GENSHIN_FOUR_P: float = 0.051
- GENSHIN_THREE_P: float = 0.43
- GENSHIN_G_FIVE_P: float = 0.13
- GENSHIN_G_FOUR_P: float = 0.016
- I72_ADD: float = 0.0585
-
-
-# 明日方舟
-class PrtsConfig(BaseModel, extra=Extra.ignore):
- PRTS_SIX_P: float = 0.02
- PRTS_FIVE_P: float = 0.08
- PRTS_FOUR_P: float = 0.48
- PRTS_THREE_P: float = 0.42
-
-
-# 赛马娘
-class PrettyConfig(BaseModel, extra=Extra.ignore):
- PRETTY_THREE_P: float = 0.03
- PRETTY_TWO_P: float = 0.18
- PRETTY_ONE_P: float = 0.79
-
-
-# 坎公骑冠剑
-class GuardianConfig(BaseModel, extra=Extra.ignore):
- GUARDIAN_THREE_CHAR_P: float = 0.0275
- GUARDIAN_TWO_CHAR_P: float = 0.19
- GUARDIAN_ONE_CHAR_P: float = 0.7825
- GUARDIAN_THREE_CHAR_UP_P: float = 0.01375
- GUARDIAN_THREE_CHAR_OTHER_P: float = 0.01375
- GUARDIAN_EXCLUSIVE_ARMS_P: float = 0.03
- GUARDIAN_FIVE_ARMS_P: float = 0.03
- GUARDIAN_FOUR_ARMS_P: float = 0.09
- GUARDIAN_THREE_ARMS_P: float = 0.27
- GUARDIAN_TWO_ARMS_P: float = 0.58
- GUARDIAN_EXCLUSIVE_ARMS_UP_P: float = 0.01
- GUARDIAN_EXCLUSIVE_ARMS_OTHER_P: float = 0.02
-
-
-# 公主连结
-class PcrConfig(BaseModel, extra=Extra.ignore):
- PCR_THREE_P: float = 0.025
- PCR_TWO_P: float = 0.18
- PCR_ONE_P: float = 0.795
- PCR_G_THREE_P: float = 0.025
- PCR_G_TWO_P: float = 0.975
-
-
-# 碧蓝航线
-class AzurConfig(BaseModel, extra=Extra.ignore):
- AZUR_FIVE_P: float = 0.012
- AZUR_FOUR_P: float = 0.07
- AZUR_THREE_P: float = 0.12
- AZUR_TWO_P: float = 0.51
- AZUR_ONE_P: float = 0.3
-
-
-# 命运-冠位指定
-class FgoConfig(BaseModel, extra=Extra.ignore):
- FGO_SERVANT_FIVE_P: float = 0.01
- FGO_SERVANT_FOUR_P: float = 0.03
- FGO_SERVANT_THREE_P: float = 0.4
- FGO_CARD_FIVE_P: float = 0.04
- FGO_CARD_FOUR_P: float = 0.12
- FGO_CARD_THREE_P: float = 0.4
-
-
-# 阴阳师
-class OnmyojiConfig(BaseModel, extra=Extra.ignore):
- ONMYOJI_SP: float = 0.0025
- ONMYOJI_SSR: float = 0.01
- ONMYOJI_SR: float = 0.2
- ONMYOJI_R: float = 0.7875
-
-
-class PathDict(BaseModel, extra=Extra.ignore):
- genshin: str = "原神"
- prts: str = "明日方舟"
- pretty: str = "赛马娘"
- guardian: str = "坎公骑冠剑"
- pcr: str = "公主连结"
- azur: str = "碧蓝航线"
- fgo: str = "命运-冠位指定"
- onmyoji: str = "阴阳师"
-
-
-class DrawConfig(BaseModel, extra=Extra.ignore):
- # 开关
- PRTS_FLAG: bool = Config.get_config("draw_card", "PRTS_FLAG")
- GENSHIN_FLAG: bool = Config.get_config("draw_card", "GENSHIN_FLAG")
- PRETTY_FLAG: bool = Config.get_config("draw_card", "PRETTY_FLAG")
- GUARDIAN_FLAG: bool = Config.get_config("draw_card", "GUARDIAN_FLAG")
- PCR_FLAG: bool = Config.get_config("draw_card", "PCR_FLAG")
- AZUR_FLAG: bool = Config.get_config("draw_card", "AZUR_FLAG")
- FGO_FLAG: bool = Config.get_config("draw_card", "FGO_FLAG")
- ONMYOJI_FLAG: bool = Config.get_config("draw_card", "ONMYOJI_FLAG")
-
- # 其他配置
- PCR_TAI: bool = Config.get_config("draw_card", "PCR_TAI")
- SEMAPHORE: int = Config.get_config("draw_card", "SEMAPHORE")
-
- # 路径
- path_dict: dict = {
- "genshin": "原神",
- "prts": "明日方舟",
- "pretty": "赛马娘",
- "guardian": "坎公骑冠剑",
- "pcr": "公主连结",
- "azur": "碧蓝航线",
- "fgo": "命运-冠位指定",
- "onmyoji": "阴阳师",
- }
-
- # 抽卡概率
- prts: PrtsConfig = PrtsConfig()
- genshin: GenshinConfig = GenshinConfig()
- pretty: PrettyConfig = PrettyConfig()
- guardian: GuardianConfig = GuardianConfig()
- pcr: PcrConfig = PcrConfig()
- azur: AzurConfig = AzurConfig()
- fgo: FgoConfig = FgoConfig()
- onmyoji: OnmyojiConfig = OnmyojiConfig()
-
-
-driver = nonebot.get_driver()
-global_config = driver.config
-DRAW_DATA_PATH = DATA_PATH / "draw_card"
-DRAW_IMAGE_PATH = IMAGE_PATH / "draw_card"
-# DRAW_PATH = Path(draw_path) if draw_path else Path("data/draw_card").absolute()
-config_path = DRAW_DATA_PATH / "draw_card_config" / "draw_card_config.json"
-
-draw_config: Config = DrawConfig()
-
-
-@driver.on_startup
-def check_config():
- global draw_config
-
- if not config_path.exists():
- config_path.parent.mkdir(parents=True, exist_ok=True)
- draw_config = DrawConfig()
- logger.warning("draw_card:配置文件不存在,已重新生成配置文件.....")
-
- json.dump(
- draw_config.dict(),
- config_path.open("w", encoding="utf8"),
- indent=4,
- ensure_ascii=False,
- )
diff --git a/plugins/draw_card/count_manager.py b/plugins/draw_card/count_manager.py
deleted file mode 100644
index 093375ea..00000000
--- a/plugins/draw_card/count_manager.py
+++ /dev/null
@@ -1,113 +0,0 @@
-from typing import Optional, Union
-
-
-class DrawCountManager:
- """
- 抽卡统计保底
- """
-
- def __init__(self, game_draw_count_rule: tuple, star2name: tuple):
- """
- 初始化保底统计
-
- 例如:DrawCountManager((10, 90, 180), ("4", "5", "5"))
-
- 抽卡保底需要的次数和返回的对应名称,例如星级等
-
- """
- # 只有保底
- self._data = {}
- self._guarantee_tuple = game_draw_count_rule
- self._star2name = star2name
-
- def increase(self, key: int, value: int = 1):
- """
- 用户抽卡次数加1
- """
- if self._data.get(key) is None:
- self._data[key] = {
- "count": value,
- }
- for x in range(len(self._guarantee_tuple)):
- self._data[key][f"count_{x}"] = 0
- else:
- self._data[key][f"count"] += value
- if self._data[key][f"count"] > self._guarantee_tuple[-1]:
- self._data[key][f"count"] = self._data[key][f"count"] % self._guarantee_tuple[-1]
-
- def reset(self, key: int):
- """
- 清空记录
- """
- del self._data[key]
-
- def set_count(self, key: int, type_: int, count: int):
- if self._data.get(key):
- self._data[key][f"count_{type_}"] = count
-
- def check(self, key: int, *args) -> Optional[Union[str, int]]:
- """
- 是否保底
- """
- pass
-
- def get_user_count(self, key: int, type_: Optional[int] = None) -> int:
- """
- 获取用户当前抽卡次数
- """
- if self._data.get(key):
- if type_ is None:
- return self._data[key]["count"]
- return self._data[key][f"count_{type_}"]
- return 0
-
- def record_count(self, key: int, type_: int):
- """
- 抽出对应星级后记录当前次数
- """
- if self._data.get(key):
- self._data[key][f"count_{type_}"] = self._data[key]["count"]
-
-
-class GenshinCountManager(DrawCountManager):
-
- def increase(self, key: int, value: int = 1):
- """
- 用户抽卡次数加1
- """
- if self._data.get(key) is None:
- self._data[key] = {
- "is_up": False,
- "count": value,
- }
- for x in range(len(self._guarantee_tuple)):
- self._data[key][f"count_{x}"] = 0
- else:
- self._data[key][f"count"] += value
- if self._data[key][f"count"] > self._guarantee_tuple[-1]:
- self._data[key][f"count"] = self._data[key][f"count"] % 180
-
- def set_is_up(self, key: int, value: bool):
- if self._data.get(key):
- self._data[key]["is_up"] = value
-
- def is_up(self, key: int) -> bool:
- if self._data.get(key):
- return self._data[key]["is_up"]
- return False
-
- def check(self, key: int, *args) -> Optional[Union[str, int]]:
- """
- 是否保底
- """
- # print(self._data)
- if self._data.get(key):
- for i in [1, 0]:
- count = self._data[key]["count"]
- if count - self._data[key][f"count_{i}"] == self._guarantee_tuple[i]:
- if i in [2, 1]:
- # print("clean four count")
- self._data[key][f"count_0"] = self._data[key]['count']
- self._data[key][f"count_{i}"] = self._data[key]['count']
- return self._star2name[i]
- return None
diff --git a/plugins/draw_card/fgo_handle.py b/plugins/draw_card/fgo_handle.py
deleted file mode 100755
index f52583ef..00000000
--- a/plugins/draw_card/fgo_handle.py
+++ /dev/null
@@ -1,111 +0,0 @@
-from nonebot.adapters.onebot.v11 import MessageSegment
-import random
-from .update_game_requests_info import update_requests_info
-from .util import generate_img, init_star_rst, BaseData, set_list, get_star, max_card
-from .config import DRAW_DATA_PATH, draw_config
-from dataclasses import dataclass
-from .init_card_pool import init_game_pool
-
-try:
- import ujson as json
-except ModuleNotFoundError:
- import json
-
-ALL_CHAR = []
-ALL_CARD = []
-
-
-@dataclass
-class FgoChar(BaseData):
- pass
-
-
-async def fgo_draw(count: int):
- # 0 1 2
- cnlist = ['★★★★★', '★★★★', '★★★']
- obj_list, obj_dict, max_star_list, star_list, max_star_index_list = _format_card_information(count)
- rst = init_star_rst(star_list, cnlist, max_star_list, max_star_index_list)
- if count > 90:
- obj_list = set_list(obj_list)
- return MessageSegment.image("base64://" + await generate_img(obj_list, 'fgo', star_list)) \
- + '\n' + rst[:-1] + '\n' + max_card(obj_dict)
-
-
-async def update_fgo_info():
- global ALL_CHAR, ALL_CARD
- data, code = await update_requests_info('fgo')
- if code == 200:
- ALL_CHAR = init_game_pool('fgo', data, FgoChar)
- data, code = await update_requests_info('fgo_card')
- if code == 200:
- ALL_CARD = init_game_pool('fgo_card', data, FgoChar)
-
-
-async def init_fgo_data():
- global ALL_CHAR, ALL_CARD
- if draw_config.FGO_FLAG:
- with (DRAW_DATA_PATH / 'fgo.json').open('r', encoding='utf8') as f:
- fgo_dict = json.load(f)
- ALL_CHAR = init_game_pool('fgo', fgo_dict, FgoChar)
- with (DRAW_DATA_PATH / 'fgo_card.json').open('r', encoding='utf8') as f:
- fgo_dict = json.load(f)
- ALL_CARD = init_game_pool('fgo', fgo_dict, FgoChar)
-
-
-# 抽取卡池
-def _get_fgo_card(mode: int = 1):
- global ALL_CHAR, ALL_CARD
- fgo_config = draw_config.fgo
- if mode == 1:
- star = get_star([8, 7, 6, 5, 4, 3], [fgo_config.FGO_SERVANT_FIVE_P, fgo_config.FGO_SERVANT_FOUR_P, fgo_config.FGO_SERVANT_THREE_P,
- fgo_config.FGO_CARD_FIVE_P, fgo_config.FGO_CARD_FOUR_P, fgo_config.FGO_CARD_THREE_P])
- elif mode == 2:
- star = get_star([5, 4], [fgo_config.FGO_CARD_FIVE_P, fgo_config.FGO_CARD_FOUR_P])
- else:
- star = get_star([8, 7, 6], [fgo_config.FGO_SERVANT_FIVE_P, fgo_config.FGO_SERVANT_FOUR_P, fgo_config.FGO_SERVANT_THREE_P])
- if star > 5:
- type_ = 'servant'
- star -= 3
- chars = [x for x in ALL_CHAR if x.star == star if not x.limited]
- else:
- type_ = 'card'
- chars = [x for x in ALL_CARD if x.star == star if not x.limited]
- return random.choice(chars), 5 - star, type_
-
-
-# 整理数据
-def _format_card_information(count: int):
- max_star_lst = [] # 获取的最高星级角色列表
- max_index_lst = [] # 获取最高星级角色的次数
- star_list = [0, 0, 0]
- obj_list = [] # 获取所有角色
- obj_dict = {} # 获取角色次数字典
- servant_count = 0 # 保底计算
- card_count = 0 # 保底计算
- for i in range(count):
- servant_count += 1
- card_count += 1
- # 四星卡片保底
- if card_count == 9:
- obj, code, type_ = _get_fgo_card(2)
- # 三星从者保底
- elif servant_count == 10:
- obj, code, type_ = _get_fgo_card(3)
- _count = 0
- # 普通抽
- else:
- obj, code, type_ = _get_fgo_card()
- star_list[code] += 1
- if type_ == 'card' and code < 2:
- card_count = 0
- if type_ == 'servant':
- servant_count = 0
- if code == 0:
- max_star_lst.append(obj.name)
- max_index_lst.append(i)
- try:
- obj_dict[obj.name] += 1
- except KeyError:
- obj_dict[obj.name] = 1
- obj_list.append(obj)
- return obj_list, obj_dict, max_star_lst, star_list, max_index_lst
diff --git a/plugins/draw_card/genshin_handle.py b/plugins/draw_card/genshin_handle.py
deleted file mode 100755
index 12bb8eea..00000000
--- a/plugins/draw_card/genshin_handle.py
+++ /dev/null
@@ -1,288 +0,0 @@
-from nonebot.adapters.onebot.v11 import MessageSegment, Message
-import random
-from .update_game_info import update_info
-from .util import (
- generate_img,
- init_rst,
- BaseData,
- set_list,
- get_star,
- init_up_char,
-)
-from .config import DRAW_DATA_PATH, draw_config
-from .count_manager import GenshinCountManager
-from dataclasses import dataclass
-from .init_card_pool import init_game_pool
-from .announcement import GenshinAnnouncement
-
-try:
- import ujson as json
-except ModuleNotFoundError:
- import json
-
-
-announcement = GenshinAnnouncement()
-
-draw_count_manager = GenshinCountManager((10, 90), ("4", "5"))
-
-# genshin_five = {}
-# genshin_count = {}
-# genshin_pl_count = {}
-
-ALL_CHAR = []
-ALL_ARMS = []
-
-UP_CHAR = []
-UP_ARMS = []
-
-
-_CURRENT_CHAR_POOL_TITLE = ""
-_CURRENT_ARMS_POOL_TITLE = ""
-POOL_IMG = ""
-
-
-@dataclass
-class GenshinChar(BaseData):
- pass
-
-
-async def genshin_draw(user_id: int, count: int, pool_name: str):
- # 0 1 2
- star = ["★★★★★", "★★★★", "★★★"]
- (
- char_list,
- five_dict,
- star_num_list,
- ) = _format_card_information(count, user_id, pool_name)
- title = ""
- up_type = []
- up_list = []
- if pool_name == "char" and _CURRENT_CHAR_POOL_TITLE:
- up_type = UP_CHAR
- title = _CURRENT_CHAR_POOL_TITLE
- elif pool_name == "arms" and _CURRENT_ARMS_POOL_TITLE:
- up_type = UP_ARMS
- title = _CURRENT_ARMS_POOL_TITLE
- tmp = ""
- if up_type:
- for x in up_type:
- for operator in x.operators:
- up_list.append(operator)
- if x.star == 5:
- tmp += f'五星UP:{" ".join(x.operators)} \n'
- elif x.star == 4:
- tmp += f'四星UP:{" ".join(x.operators)}'
- rst = init_rst(five_dict, star_num_list, star, up_list)
- pool_info = f"当前up池:{title}\n{tmp}" if title else ""
- if count > 90:
- char_list = set_list(char_list)
- return (
- pool_info
- + "\n"
- + MessageSegment.image(
- "base64://" + await generate_img(char_list, "genshin", star_num_list)
- )
- + rst
- + f'\n距离保底发还剩 {draw_count_manager.get_user_count(user_id, 1) % 90} 抽'
- + "\n【五星:0.6%,四星:5.1%\n第72抽开始五星概率每抽加0.585%】"
- )
-
-
-async def update_genshin_info():
- global ALL_CHAR, ALL_ARMS
- url = "https://wiki.biligame.com/ys/角色筛选"
- data, code = await update_info(url, "genshin")
- if code == 200:
- ALL_CHAR = init_game_pool("genshin", data, GenshinChar)
- url = "https://wiki.biligame.com/ys/武器图鉴"
- data, code = await update_info(
- url,
- "genshin_arms",
- )
- if code == 200:
- ALL_ARMS = init_game_pool("genshin_arms", data, GenshinChar)
- await _genshin_init_up_char()
-
-
-async def init_genshin_data():
- global ALL_CHAR, ALL_ARMS
- if draw_config.GENSHIN_FLAG:
- if not (DRAW_DATA_PATH / "genshin.json").exists() or not (DRAW_DATA_PATH / "genshin_arms.json").exists():
- await update_genshin_info()
- else:
- with (DRAW_DATA_PATH / "genshin.json").open("r", encoding="utf8") as f:
- genshin_dict = json.load(f)
- with (DRAW_DATA_PATH / "genshin_arms.json").open("r", encoding="utf8") as f:
- genshin_ARMS_dict = json.load(f)
- ALL_CHAR = init_game_pool("genshin", genshin_dict, GenshinChar)
- ALL_ARMS = init_game_pool("genshin_arms", genshin_ARMS_dict, GenshinChar)
- await _genshin_init_up_char()
-
-
-# 抽取卡池
-def _get_genshin_card(mode: int = 1, pool_name: str = "", add: float = 0.0, is_up: bool = False):
- """
- mode 1:普通抽 2:四星保底 3:五星保底
- """
- global ALL_ARMS, ALL_CHAR, UP_ARMS, UP_CHAR, _CURRENT_ARMS_POOL_TITLE, _CURRENT_CHAR_POOL_TITLE
- genshin_config = draw_config.genshin
- if mode == 1:
- star = get_star(
- [5, 4, 3], [genshin_config.GENSHIN_FIVE_P + add, genshin_config.GENSHIN_FOUR_P, genshin_config.GENSHIN_THREE_P]
- )
- elif mode == 2:
- star = get_star([5, 4], [genshin_config.GENSHIN_G_FIVE_P + add, genshin_config.GENSHIN_G_FOUR_P])
- else:
- star = 5
- if pool_name == "char":
- data_lst = UP_CHAR
- flag = _CURRENT_CHAR_POOL_TITLE
- type_all_lst = ALL_CHAR + [
- x for x in ALL_ARMS if x.star == star and x.star < 5
- ]
- elif pool_name == "arms":
- data_lst = UP_ARMS
- flag = _CURRENT_ARMS_POOL_TITLE
- type_all_lst = ALL_ARMS + [
- x for x in ALL_CHAR if x.star == star and x.star < 5
- ]
- else:
- data_lst = ""
- flag = ""
- type_all_lst = ""
- all_lst = ALL_ARMS + ALL_CHAR
- # 是否UP
- try:
- if flag and star > 3:
- # 获取up角色列表
- up_char_lst = [x.operators for x in data_lst if x.star == star][0]
- # print(up_char_lst)
- # 成功获取up角色
- if random.random() < 0.5 or is_up:
- up_char_name = random.choice(up_char_lst)
- acquire_char = [x for x in all_lst if x.name == up_char_name][0]
- else:
- # 无up
- all_char_lst = [
- x
- for x in type_all_lst
- if x.star == star and x.name not in up_char_lst and not x.limited
- ]
- acquire_char = random.choice(all_char_lst)
- else:
- chars = [x for x in all_lst if x.star == star and not x.limited]
- acquire_char = random.choice(chars)
- except IndexError:
- chars = [x for x in all_lst if x.star == star and not x.limited]
- acquire_char = random.choice(chars)
- return acquire_char, 5 - star
-
-
-def _format_card_information(_count: int, user_id, pool_name):
- char_list = [] # 获取角色列表
- star_num_list = [0, 0, 0] # 各个星级数量
- five_dict = {} # 五星数量
- add = 0.0
- pool = UP_CHAR if pool_name == 'char' else UP_ARMS
- for _ in range(_count):
- draw_count_manager.increase(user_id)
- star = draw_count_manager.check(user_id)
- if (draw_count_manager.get_user_count(user_id) - draw_count_manager.get_user_count(user_id, 1)) % 90 >= 72:
- add += draw_config.genshin.I72_ADD
- if star:
- star = int(star)
- if star == 4:
- char, code = _get_genshin_card(2, pool_name, add=add)
- draw_count_manager.record_count(user_id, 0)
- else:
- char, code = _get_genshin_card(3, pool_name, add, draw_count_manager.is_up(user_id))
- else:
- char, code = _get_genshin_card(1, pool_name, add, draw_count_manager.is_up(user_id))
- if code == 0:
- add = 0
- if not five_dict.get(char.name):
- five_dict[char.name] = [draw_count_manager.get_user_count(user_id)]
- else:
- five_dict[char.name].append(draw_count_manager.get_user_count(user_id) % 90)
- draw_count_manager.set_count(user_id, 2, draw_count_manager.get_user_count(user_id, 1))
- draw_count_manager.record_count(user_id, 0)
- draw_count_manager.record_count(user_id, 1)
- if char.name not in [x.operators for x in pool if x.star == 5][0]:
- draw_count_manager.set_is_up(user_id, True)
- else:
- draw_count_manager.set_is_up(user_id, False)
- star_num_list[code] += 1
- char_list.append(char)
- return char_list, five_dict, star_num_list
-
-
-
-
-
-
- # if genshin_count.get(user_id) and _count <= 90:
- # f_count = genshin_count[user_id]
- # else:
- # f_count = 0
- # if genshin_pl_count.get(user_id) and _count <= 90:
- # count = genshin_pl_count[user_id]
- # else:
- # count = 0
- # for i in range(_count):
- # count += 1
- # f_count += 1
- # # 十连保底
- # if count == 10 and f_count != 90:
- # if f_count >= 72:
- # add += I72_ADD
- # char, code = _get_genshin_card(2, pool_name, add=add)
- # count = 0
- # # 大保底
- # elif f_count == 90:
- # char, code = _get_genshin_card(3, pool_name)
- # else:
- # if f_count >= 72:
- # add += I72_ADD
- # char, code = _get_genshin_card(pool_name=pool_name, add=add)
- # if code == 1:
- # count = 0
- # star_list[code] += 1
- # if code == 0:
- # if _count <= 90:
- # genshin_five[user_id] = f_count
- # add = 0.0
- # f_count = 0
- # five_list.append(char.name)
- # five_index_list.append(i)
- # try:
- # five_dict[char.name] += 1
- # except KeyError:
- # five_dict[char.name] = 1
- # char_list.append(char)
- # if _count <= 90:
- # genshin_count[user_id] = f_count
- # genshin_pl_count[user_id] = count
- # return char_list, five_list, five_index_list, five_dict, star_list
-
-
-def reset_count(user_id: int):
- draw_count_manager.reset(user_id)
-
-
-# 获取up和概率
-async def _genshin_init_up_char():
- global _CURRENT_CHAR_POOL_TITLE, _CURRENT_ARMS_POOL_TITLE, UP_CHAR, UP_ARMS, POOL_IMG
- (
- _CURRENT_CHAR_POOL_TITLE,
- _CURRENT_ARMS_POOL_TITLE,
- POOL_IMG,
- UP_CHAR,
- UP_ARMS,
- ) = await init_up_char(announcement)
-
-
-async def reload_genshin_pool():
- await _genshin_init_up_char()
- return Message(
- f"当前UP池子:{_CURRENT_CHAR_POOL_TITLE} & {_CURRENT_ARMS_POOL_TITLE} {POOL_IMG}"
- )
diff --git a/plugins/draw_card/guardian_handle.py b/plugins/draw_card/guardian_handle.py
deleted file mode 100755
index 5df7e48f..00000000
--- a/plugins/draw_card/guardian_handle.py
+++ /dev/null
@@ -1,159 +0,0 @@
-from nonebot.adapters.onebot.v11 import MessageSegment, Message
-from .update_game_info import update_info
-from .util import init_star_rst, generate_img, max_card, BaseData,\
- set_list, get_star, format_card_information, init_up_char
-import random
-from .config import DRAW_DATA_PATH, draw_config
-from dataclasses import dataclass
-from .init_card_pool import init_game_pool
-from .announcement import GuardianAnnouncement
-try:
- import ujson as json
-except ModuleNotFoundError:
- import json
-
-
-announcement = GuardianAnnouncement()
-
-ALL_CHAR = []
-ALL_ARMS = []
-
-_CURRENT_CHAR_POOL_TITLE = ''
-_CURRENT_ARMS_POOL_TITLE = ''
-UP_CHAR = []
-UP_ARMS = []
-POOL_IMG = ''
-
-
-@dataclass
-class GuardianChar(BaseData):
- pass
-
-
-@dataclass
-class GuardianArms(BaseData):
- pass
-
-
-async def guardian_draw(count: int, pool_name):
- if pool_name == 'arms':
- cnlist = ['★★★★★', '★★★★', '★★★', '★★']
- star_list = [0, 0, 0, 0]
- else:
- cnlist = ['★★★', '★★', '★']
- star_list = [0, 0, 0]
- title = ''
- up_type = []
- up_list = []
- if pool_name == 'char' and _CURRENT_CHAR_POOL_TITLE:
- up_type = UP_CHAR
- title = _CURRENT_CHAR_POOL_TITLE
- elif pool_name == 'arms' and _CURRENT_ARMS_POOL_TITLE:
- up_type = UP_ARMS
- title = _CURRENT_ARMS_POOL_TITLE
- tmp = ''
- if up_type:
- for x in up_type:
- for operator in x.operators:
- up_list.append(operator)
- if pool_name == 'char':
- if x.star == 3:
- tmp += f'三星UP:{" ".join(x.operators)} \n'
- else:
- if x.star == 5:
- tmp += f'五星UP:{" ".join(x.operators)}'
- obj_list, obj_dict, max_list, star_list, max_index_list = format_card_information(count, star_list,
- _get_guardian_card, pool_name)
- rst = init_star_rst(star_list, cnlist, max_list, max_index_list, up_list)
- pool_info = f'当前up池:{title}\n{tmp}' if title else ''
- if count > 90:
- obj_list = set_list(obj_list)
- return pool_info + '\n' + MessageSegment.image(
- "base64://" + await generate_img(obj_list, 'guardian', star_list)) \
- + '\n' + rst[:-1] + '\n' + max_card(obj_dict)
-
-
-async def update_guardian_info():
- global ALL_CHAR, ALL_ARMS
- url = 'https://wiki.biligame.com/gt/英雄筛选表'
- data, code = await update_info(url, 'guardian')
- if code == 200:
- ALL_CHAR = init_game_pool('guardian', data, GuardianChar)
- url = 'https://wiki.biligame.com/gt/武器'
- tmp, code_1 = await update_info(url, 'guardian_arms')
- url = 'https://wiki.biligame.com/gt/盾牌'
- data, code_2 = await update_info(url, 'guardian_arms')
- if code_1 == 200 and code_2 == 200:
- data.update(tmp)
- ALL_ARMS = init_game_pool('guardian_arms', data, GuardianArms)
- await _guardian_init_up_char()
-
-
-async def init_guardian_data():
- global ALL_CHAR, ALL_ARMS
- if draw_config.GUARDIAN_FLAG:
- if not (DRAW_DATA_PATH / 'guardian.json').exists() or not (DRAW_DATA_PATH / 'guardian_arms.json').exists():
- await update_guardian_info()
- else:
- with (DRAW_DATA_PATH / 'guardian.json').open('r', encoding='utf8') as f:
- guardian_char_dict = json.load(f)
- with (DRAW_DATA_PATH / 'guardian_arms.json').open('r', encoding='utf8') as f:
- guardian_arms_dict = json.load(f)
- ALL_CHAR = init_game_pool('guardian', guardian_char_dict, GuardianChar)
- ALL_ARMS = init_game_pool('guardian_arms', guardian_arms_dict, GuardianArms)
- await _guardian_init_up_char()
-
-
-# 抽取卡池
-def _get_guardian_card(pool_name: str = '', mode: int = 1):
- global ALL_ARMS, ALL_CHAR, UP_ARMS, UP_CHAR, _CURRENT_ARMS_POOL_TITLE, _CURRENT_CHAR_POOL_TITLE
- guardian_config = draw_config.guardian
- if pool_name == 'char':
- if mode == 1:
- star = get_star([3, 2, 1], [guardian_config.GUARDIAN_THREE_CHAR_P, guardian_config.GUARDIAN_TWO_CHAR_P, guardian_config.GUARDIAN_ONE_CHAR_P])
- else:
- star = get_star([3, 2], [guardian_config.GUARDIAN_THREE_CHAR_P, guardian_config.GUARDIAN_TWO_CHAR_P])
- up_lst = UP_CHAR
- flag = _CURRENT_CHAR_POOL_TITLE
- _max_star = 3
- all_data = ALL_CHAR
- else:
- if mode == 1:
- star = get_star([5, 4, 3, 2], [guardian_config.GUARDIAN_FIVE_ARMS_P, guardian_config.GUARDIAN_FOUR_ARMS_P,
- guardian_config.GUARDIAN_THREE_ARMS_P, guardian_config.GUARDIAN_TWO_ARMS_P])
- else:
- star = get_star([5, 4], [guardian_config.GUARDIAN_FIVE_ARMS_P, guardian_config.GUARDIAN_FOUR_ARMS_P])
- up_lst = UP_ARMS
- flag = _CURRENT_ARMS_POOL_TITLE
- _max_star = 5
- all_data = ALL_ARMS
- # 是否UP
- if flag and star == _max_star and pool_name:
- # 获取up角色列表
- up_char_lst = [x.operators for x in up_lst if x.star == star][0]
- # 成功获取up角色
- if random.random() < 0.5:
- up_char_name = random.choice(up_char_lst)
- acquire_char = [x for x in all_data if x.name == up_char_name][0]
- else:
- # 无up
- all_char_lst = [x for x in all_data if x.star == star and x.name not in up_char_lst and not x.limited]
- acquire_char = random.choice(all_char_lst)
- else:
- chars = [x for x in all_data if x.star == star and not x.limited]
- acquire_char = random.choice(chars)
- return acquire_char, _max_star - star
-
-
-# 获取up和概率
-async def _guardian_init_up_char():
- global _CURRENT_CHAR_POOL_TITLE, _CURRENT_ARMS_POOL_TITLE, UP_CHAR, UP_ARMS, POOL_IMG
- _CURRENT_CHAR_POOL_TITLE, _CURRENT_ARMS_POOL_TITLE, POOL_IMG, UP_CHAR, UP_ARMS = await init_up_char(announcement)
-
-
-async def reload_guardian_pool():
- await _guardian_init_up_char()
- return Message(f'当前UP池子:{_CURRENT_CHAR_POOL_TITLE} & {_CURRENT_ARMS_POOL_TITLE}')
-
-
-
diff --git a/plugins/draw_card/init_card_pool.py b/plugins/draw_card/init_card_pool.py
deleted file mode 100755
index 65c73310..00000000
--- a/plugins/draw_card/init_card_pool.py
+++ /dev/null
@@ -1,204 +0,0 @@
-from typing import Any
-from .config import DRAW_DATA_PATH
-from .util import is_number
-from nonebot.log import logger
-
-try:
- import ujson as json
-except ModuleNotFoundError:
- import json
-
-
-def init_game_pool(game: str, data: dict, operator: Any):
- tmp_lst = []
- if game == "prts":
- for key in data.keys():
- limited = False
- recruit_only = False
- event_only = False
- if "限定寻访" in data[key]["获取途径"]:
- limited = True
- if "干员寻访" not in data[key]["获取途径"] and "公开招募" in data[key]["获取途径"]:
- recruit_only = True
- if "活动获取" in data[key]["获取途径"]:
- event_only = True
- if "干员寻访" not in data[key]["获取途径"] and "凭证交易所" == data[key]["获取途径"][0]:
- limited = True
- if "干员寻访" not in data[key]["获取途径"] and "信用累计奖励" == data[key]["获取途径"][0]:
- limited = True
- if key.find("阿米娅") != -1:
- continue
- try:
- tmp_lst.append(
- operator(
- name=key,
- star=int(data[key]["星级"]),
- limited=limited,
- recruit_only=recruit_only,
- event_only=event_only,
- )
- )
- except Exception as e:
- logger.warning(f"明日方舟导入角色 {key} 数据错误:{type(e)}:{e}")
- if game == "genshin":
- for key in data.keys():
- if key.find("旅行者") != -1:
- continue
- limited = False
- if data[key]["常驻/限定"] == "限定UP":
- limited = True
- try:
- tmp_lst.append(
- operator(name=key, star=int(data[key]["稀有度"][:1]), limited=limited)
- )
- except Exception as e:
- logger.warning(f"原神导入角色 {key} 数据错误:{type(e)}:{e}")
- if game == "genshin_arms":
- for key in data.keys():
- if data[key]["获取途径"].find("祈愿") != -1:
- limited = False
- if data[key]["获取途径"].find("限定祈愿") != -1:
- limited = True
- try:
- tmp_lst.append(
- operator(
- name=key, star=int(data[key]["稀有度"][:1]), limited=limited
- )
- )
- except Exception as e:
- logger.warning(f"原神导入武器 {key} 数据错误:{type(e)}:{e}")
- if game == "pretty":
- for key in data.keys():
- try:
- tmp_lst.append(
- operator(name=key, star=data[key]["初始星级"], limited=False)
- )
- except Exception as e:
- logger.warning(f"赛马娘导入角色 {key} 数据错误:{type(e)}:{e}")
- if game == "pretty_card":
- for key in data.keys():
- limited = False
- if "卡池" not in data[key]["获取方式"]:
- limited = True
- if not data[key]["获取方式"]:
- limited = False
- try:
- tmp_lst.append(
- operator(
- name=data[key]["中文名"],
- star=len(data[key]["稀有度"]),
- limited=limited,
- )
- )
- except Exception as e:
- logger.warning(f"赛马娘导入卡片 {key} 数据错误:{type(e)}:{e}")
- if game in ["guardian", "guardian_arms"]:
- for key in data.keys():
- tmp_lst.append(
- operator(name=data[key]["名称"], star=int(data[key]["星级"]), limited=False)
- )
- if game == "pcr":
- for key in data.keys():
- limited = False
- if key.find("(") != -1:
- limited = True
- try:
- tmp_lst.append(
- operator(
- name=data[key]["名称"], star=int(data[key]["星级"]), limited=limited
- )
- )
- except Exception as e:
- logger.warning(f"公主连接导入角色 {key} 数据错误:{type(e)}:{e}")
- if game == "azur":
- for key in data.keys():
- if is_number(data[key]["星级"]):
- limited = False
- if "可以建造" not in data[key]["获取途径"]:
- limited = True
- try:
- tmp_lst.append(
- operator(
- name=data[key]["名称"],
- star=int(data[key]["星级"]),
- limited=limited,
- type_=data[key]["类型"],
- )
- )
- except Exception as e:
- logger.warning(f"碧蓝航线导入角色 {key} 数据错误:{type(e)}:{e}")
- if game in ["fgo", "fgo_card"]:
- for key in data.keys():
- limited = False
- try:
- if (
- "圣晶石召唤" not in data[key]["入手方式"]
- and "圣晶石召唤(Story卡池)" not in data[key]["入手方式"]
- ):
- limited = True
- except KeyError:
- pass
- try:
- tmp_lst.append(
- operator(
- name=data[key]["名称"], star=int(data[key]["星级"]), limited=limited
- )
- )
- except Exception as e:
- logger.warning(f"FGO导入角色 {key} 数据错误:{type(e)}:{e}")
- if game == "onmyoji":
- for key in data.keys():
- limited = False
- if key in [
- "奴良陆生",
- "卖药郎",
- "鬼灯",
- "阿香",
- "蜜桃&芥子",
- "犬夜叉",
- "杀生丸",
- "桔梗",
- "朽木露琪亚",
- "黑崎一护",
- "灶门祢豆子",
- "灶门炭治郎",
- ]:
- limited = True
- try:
- tmp_lst.append(
- operator(
- name=data[key]["名称"], star=data[key]["星级"], limited=limited
- )
- )
- except Exception as e:
- logger.warning(f"阴阳师导入角色 {key} 数据错误:{type(e)}:{e}")
- # print(tmp_lst)
- char_name_lst = [x.name for x in tmp_lst]
- up_char_file = (
- DRAW_DATA_PATH
- / f"draw_card"
- / "draw_card_up"
- / f"{game.split('_')[0]}_up_char.json"
- )
- if up_char_file.exists():
- data = json.load(open(up_char_file, "r", encoding="utf8"))
- if len(game.split("_")) == 1:
- key = "char"
- else:
- key = list(data.keys())[1]
- for x in data[key]["up_char"]:
- for char in data[key]["up_char"][x]:
- if char not in char_name_lst:
- if game.find("prts") != -1:
- tmp_lst.append(
- operator(
- name=char,
- star=int(x),
- recruit_only=False,
- event_only=False,
- limited=False,
- )
- )
- else:
- tmp_lst.append(operator(name=char, star=int(x), limited=False))
- return tmp_lst
diff --git a/plugins/draw_card/onmyoji_handle.py b/plugins/draw_card/onmyoji_handle.py
deleted file mode 100755
index c0f0be9d..00000000
--- a/plugins/draw_card/onmyoji_handle.py
+++ /dev/null
@@ -1,81 +0,0 @@
-from nonebot.adapters.onebot.v11 import MessageSegment
-import random
-from .update_game_requests_info import update_requests_info
-from .util import generate_img, init_star_rst, BaseData, set_list, get_star, max_card
-from .config import DRAW_DATA_PATH, draw_config
-from dataclasses import dataclass
-from .init_card_pool import init_game_pool
-try:
- import ujson as json
-except ModuleNotFoundError:
- import json
-
-ALL_CHAR = []
-
-
-@dataclass
-class OnmyojiChar(BaseData):
- pass
-
-
-async def onmyoji_draw(count: int):
- # 0 1 2
- cnlist = ['SP', 'SSR', 'SR', 'R']
- obj_list, obj_dict, star_list, rst = format_card_information(count)
- rst = init_star_rst(star_list, cnlist, [], []) + rst
- if count > 90:
- obj_list = set_list(obj_list)
- return MessageSegment.image("base64://" + await generate_img(obj_list, 'onmyoji', star_list)) \
- + '\n' + rst[:-1] + '\n' + max_card(obj_dict)
-
-
-async def update_onmyoji_info():
- global ALL_CHAR
- data, code = await update_requests_info('onmyoji')
- if code == 200:
- ALL_CHAR = init_game_pool('onmyoji', data, OnmyojiChar)
-
-
-async def init_onmyoji_data():
- global ALL_CHAR
- if draw_config.ONMYOJI_FLAG:
- with (DRAW_DATA_PATH / 'onmyoji.json').open('r', encoding='utf8') as f:
- azur_dict = json.load(f)
- ALL_CHAR = init_game_pool('onmyoji', azur_dict, OnmyojiChar)
-
-
-onmyoji_star = {
- 5: 'SP',
- 4: 'SSR',
- 3: 'SR',
- 2: 'R',
-}
-
-
-# 抽取卡池
-def _get_onmyoji_card():
- global ALL_CHAR
- onmyoji_config = draw_config.onmyoji
- star = get_star([5, 4, 3, 2], [onmyoji_config.ONMYOJI_SP, onmyoji_config.ONMYOJI_SSR, onmyoji_config.ONMYOJI_SR, onmyoji_config.ONMYOJI_R])
- chars = [x for x in ALL_CHAR if x.star == onmyoji_star[star] and not x.limited]
- return random.choice(chars), 5 - star
-
-
-def format_card_information(count: int):
- star_list = [0, 0, 0, 0]
- obj_list = [] # 获取所有角色
- obj_dict = {} # 获取角色次数字典
- rst = ''
- for i in range(count):
- obj, code = _get_onmyoji_card()
- star_list[code] += 1
- if code == 0:
- rst += f'第 {i+1} 抽获取SP {obj.name}\n'
- elif code == 1:
- rst += f'第 {i+1} 抽获取SSR {obj.name}\n'
- try:
- obj_dict[obj.name] += 1
- except KeyError:
- obj_dict[obj.name] = 1
- obj_list.append(obj)
- return obj_list, obj_dict, star_list, rst
diff --git a/plugins/draw_card/pcr_handle.py b/plugins/draw_card/pcr_handle.py
deleted file mode 100755
index 2612f49f..00000000
--- a/plugins/draw_card/pcr_handle.py
+++ /dev/null
@@ -1,93 +0,0 @@
-from nonebot.adapters.onebot.v11 import MessageSegment
-import random
-from .update_game_info import update_info
-from .update_game_simple_info import update_simple_info
-from .util import generate_img, init_star_rst, BaseData, set_list, get_star, max_card
-from .config import DRAW_DATA_PATH, draw_config
-from dataclasses import dataclass
-from .init_card_pool import init_game_pool
-
-try:
- import ujson as json
-except ModuleNotFoundError:
- import json
-
-ALL_CHAR = []
-
-
-@dataclass
-class PcrChar(BaseData):
- pass
-
-
-async def pcr_draw(count: int):
- # 0 1 2
- cnlist = ['★★★', '★★', '★']
- char_list, three_list, three_index_list, char_dict, star_list = _format_card_information(count)
- rst = init_star_rst(star_list, cnlist, three_list, three_index_list)
- if count > 90:
- char_list = set_list(char_list)
- return MessageSegment.image("base64://" + await generate_img(char_list, 'pcr', star_list)) \
- + '\n' + rst[:-1] + '\n' + max_card(char_dict)
-
-
-async def update_pcr_info():
- global ALL_CHAR
- if draw_config.PCR_TAI:
- url = 'https://wiki.biligame.com/pcr/角色图鉴'
- data, code = await update_simple_info(url, 'pcr')
- else:
- url = 'https://wiki.biligame.com/pcr/角色筛选表'
- data, code = await update_info(url, 'pcr')
- if code == 200:
- ALL_CHAR = init_game_pool('pcr', data, PcrChar)
-
-
-async def init_pcr_data():
- global ALL_CHAR
- if draw_config.PCR_FLAG:
- with (DRAW_DATA_PATH / 'pcr.json').open('r', encoding='utf8') as f:
- pcr_dict = json.load(f)
- ALL_CHAR = init_game_pool('pcr', pcr_dict, PcrChar)
-
-
-# 抽取卡池
-def _get_pcr_card(mode: int = 1):
- global ALL_CHAR
- pcr_config = draw_config.pcr
- if mode == 2:
- star = get_star([3, 2], [pcr_config.PCR_G_THREE_P, pcr_config.PCR_G_TWO_P])
- else:
- star = get_star([3, 2, 1], [pcr_config.PCR_THREE_P, pcr_config.PCR_TWO_P, pcr_config.PCR_ONE_P])
- chars = [x for x in ALL_CHAR if x.star == star and not x.limited]
- return random.choice(chars), 3 - star
-
-
-def _format_card_information(_count: int):
- char_list = []
- star_list = [0, 0, 0]
- three_index_list = []
- three_list = []
- char_dict = {}
- # 保底计算
- count = 0
- for i in range(_count):
- count += 1
- # 十连保底
- if count == 10:
- char, code = _get_pcr_card(2)
- count = 0
- else:
- char, code = _get_pcr_card()
- if code < 2:
- count = 0
- star_list[code] += 1
- if code == 0:
- three_list.append(char.name)
- three_index_list.append(i)
- try:
- char_dict[char.name] += 1
- except KeyError:
- char_dict[char.name] = 1
- char_list.append(char)
- return char_list, three_list, three_index_list, char_dict, star_list
diff --git a/plugins/draw_card/pretty_handle.py b/plugins/draw_card/pretty_handle.py
deleted file mode 100755
index c57635a4..00000000
--- a/plugins/draw_card/pretty_handle.py
+++ /dev/null
@@ -1,148 +0,0 @@
-from nonebot.adapters.onebot.v11 import MessageSegment
-from .announcement import PrettyAnnouncement
-from .update_game_info import update_info
-from .util import init_star_rst, generate_img, max_card, BaseData, \
- set_list, get_star, format_card_information, init_up_char
-import random
-from .config import DRAW_DATA_PATH, draw_config
-from dataclasses import dataclass
-from .init_card_pool import init_game_pool
-
-try:
- import ujson as json
-except ModuleNotFoundError:
- import json
-
-
-announcement = PrettyAnnouncement()
-
-ALL_CHAR = []
-ALL_CARD = []
-
-_CURRENT_CHAR_POOL_TITLE = ""
-_CURRENT_CARD_POOL_TITLE = ""
-UP_CHAR = []
-UP_CARD = []
-POOL_IMG = []
-
-
-@dataclass
-class PrettyChar(BaseData):
- pass
-
-
-async def pretty_draw(count: int, pool_name):
- if pool_name == 'card':
- cnlist = ['SSR', 'SR', 'R']
- else:
- cnlist = ['★★★', '★★', '★']
- star_list = [0, 0, 0]
- obj_list, obj_dict, three_list, star_list, three_olist = format_card_information(count, star_list,
- _get_pretty_card, pool_name)
- up_type = []
- up_list = []
- title = ''
- if pool_name == 'char' and _CURRENT_CHAR_POOL_TITLE:
- up_type = UP_CHAR
- title = _CURRENT_CHAR_POOL_TITLE
- elif pool_name == 'card' and _CURRENT_CARD_POOL_TITLE:
- up_type = UP_CARD
- title = _CURRENT_CARD_POOL_TITLE
- tmp = ''
- if up_type:
- for x in up_type:
- for operator in x.operators:
- up_list.append(operator.split(']')[1] if pool_name == 'char' else operator)
- if x.star == 3:
- if pool_name == 'char':
- tmp += f'三星UP:{" ".join(x.operators)} \n'
- else:
- tmp += f'SSR UP:{" ".join(x.operators)} \n'
- elif x.star == 2:
- if pool_name == 'char':
- tmp += f'二星UP:{" ".join(x.operators)} \n'
- else:
- tmp += f'SR UP:{" ".join(x.operators)} \n'
- elif x.star == 1:
- if pool_name == 'char':
- tmp += f'一星UP:{" ".join(x.operators)} '
- else:
- tmp += f'R UP:{" ".join(x.operators)} '
- tmp = tmp[:-1] if tmp and tmp[-1] == '\n' else tmp
- pool_info = f'当前up池:{title}\n{tmp}' if title else ''
- rst = init_star_rst(star_list, cnlist, three_list, three_olist, up_list)
- if count > 90:
- obj_list = set_list(obj_list)
- return pool_info + MessageSegment.image(
- "base64://" + await generate_img(obj_list, 'pretty', star_list)) \
- + '\n' + rst[:-1] + '\n' + max_card(obj_dict)
-
-
-async def update_pretty_info():
- global ALL_CHAR, ALL_CARD
- url = 'https://wiki.biligame.com/umamusume/赛马娘图鉴'
- data, code = await update_info(url, 'pretty')
- if code == 200:
- ALL_CHAR = init_game_pool('pretty', data, PrettyChar)
- url = 'https://wiki.biligame.com/umamusume/支援卡图鉴'
- data, code = await update_info(url, 'pretty_card')
- if code == 200:
- ALL_CARD = init_game_pool('pretty_card', data, PrettyChar)
- await _pretty_init_up_char()
-
-
-async def init_pretty_data():
- global ALL_CHAR, ALL_CARD
- if draw_config.PRETTY_FLAG:
- with (DRAW_DATA_PATH / 'pretty.json').open('r', encoding='utf8') as f:
- pretty_char_dict = json.load(f)
- with (DRAW_DATA_PATH / 'pretty_card.json').open('r', encoding='utf8') as f:
- pretty_card_dict = json.load(f)
- ALL_CHAR = init_game_pool('pretty', pretty_char_dict, PrettyChar)
- ALL_CARD = init_game_pool('pretty_card', pretty_card_dict, PrettyChar)
- await _pretty_init_up_char()
-
-
-# 抽取卡池
-def _get_pretty_card(pool_name: str, mode: int = 1):
- global ALL_CHAR, ALL_CARD, _CURRENT_CHAR_POOL_TITLE, _CURRENT_CARD_POOL_TITLE
- pretty_config = draw_config.pretty
- if mode == 1:
- star = get_star([3, 2, 1], [pretty_config.PRETTY_THREE_P, pretty_config.PRETTY_TWO_P, pretty_config.PRETTY_ONE_P])
- else:
- star = get_star([3, 2], [pretty_config.PRETTY_THREE_P, pretty_config.PRETTY_TWO_P])
- if pool_name == 'card':
- title = _CURRENT_CARD_POOL_TITLE
- up_data = UP_CARD
- data = ALL_CARD
- else:
- title = _CURRENT_CHAR_POOL_TITLE
- up_data = UP_CHAR
- data = ALL_CHAR
- # 有UP池子
- if title and star in [x.star for x in up_data]:
- all_char_lst = [x for x in data if x.star == star and not x.limited]
- # 抽到UP
- if random.random() < 1 / len(all_char_lst) * (0.7 / 0.1385):
- all_up_star = [x.operators for x in up_data if x.star == star][0]
- acquire_operator = random.choice(all_up_star)
- if pool_name == 'char':
- acquire_operator = acquire_operator.split(']')[1]
- acquire_operator = [x for x in data if x.name == acquire_operator][0]
- else:
- acquire_operator = random.choice([x for x in data if x.star == star and not x.limited])
- else:
- acquire_operator = random.choice([x for x in data if x.star == star and not x.limited])
- return acquire_operator, 3 - star
-
-
-# 获取up和概率
-async def _pretty_init_up_char():
- global _CURRENT_CHAR_POOL_TITLE, _CURRENT_CARD_POOL_TITLE, UP_CHAR, UP_CARD, POOL_IMG
- _CURRENT_CHAR_POOL_TITLE, _CURRENT_CARD_POOL_TITLE, POOL_IMG, UP_CHAR, UP_CARD = await init_up_char(announcement)
-
-
-async def reload_pretty_pool():
- await _pretty_init_up_char()
- return f'当前UP池子:{_CURRENT_CHAR_POOL_TITLE} & {_CURRENT_CARD_POOL_TITLE} {POOL_IMG}'
-
diff --git a/plugins/draw_card/prts_handle.py b/plugins/draw_card/prts_handle.py
deleted file mode 100755
index 48ff8490..00000000
--- a/plugins/draw_card/prts_handle.py
+++ /dev/null
@@ -1,171 +0,0 @@
-from nonebot.adapters.onebot.v11 import MessageSegment, Message
-import random
-from .config import DRAW_DATA_PATH, draw_config
-from .update_game_info import update_info
-from .util import generate_img, init_star_rst, max_card, BaseData, UpEvent, set_list, get_star
-from .init_card_pool import init_game_pool
-from .announcement import PrtsAnnouncement
-from dataclasses import dataclass
-from nonebot.log import logger
-try:
- import ujson as json
-except ModuleNotFoundError:
- import json
-
-
-announcement = PrtsAnnouncement()
-
-prts_dict = {}
-UP_OPERATOR = []
-ALL_OPERATOR = []
-_CURRENT_POOL_TITLE = ''
-POOL_IMG = ''
-
-
-@dataclass
-class Operator(BaseData):
- recruit_only: bool # 公招限定
- event_only: bool # 活动获得干员
- # special_only: bool # 升变/异格干员
-
-
-async def prts_draw(count: int = 300):
- cnlist = ['★★★★★★', '★★★★★', '★★★★', '★★★']
- star_list = [0, 0, 0, 0]
- operator_list, operator_dict, six_list, star_list, six_index_list = format_card_information(count, star_list)
- up_list = []
- tmp = ''
- if _CURRENT_POOL_TITLE:
- for x in UP_OPERATOR:
- for operator in x.operators:
- up_list.append(operator)
- if x.star == 6:
- tmp += f'六星UP:{" ".join(x.operators)} \n'
- elif x.star == 5:
- tmp += f'五星UP:{" ".join(x.operators)} \n'
- elif x.star == 4:
- tmp += f'四星UP:{" ".join(x.operators)}'
- rst = init_star_rst(star_list, cnlist, six_list, six_index_list, up_list)
- if count > 90:
- operator_list = set_list(operator_list)
- pool_info = f"当前up池: {_CURRENT_POOL_TITLE}\n{tmp}" if _CURRENT_POOL_TITLE else ""
- return pool_info + MessageSegment.image(
- "base64://" + await generate_img(operator_list, 'prts', star_list)) \
- + '\n' + rst[:-1] + '\n' + max_card(operator_dict)
-
-
-async def update_prts_info():
- global prts_dict, ALL_OPERATOR
- url = 'https://wiki.biligame.com/arknights/干员数据表'
- data, code = await update_info(url, 'prts', ['头像', '名称', '阵营', '星级', '性别', '是否感染', '获取途径', '初始生命', '初始防御',
- '初始法抗', '再部署', '部署费用', '阻挡数', '攻击速度', '标签'])
- if code == 200:
- prts_dict = data
- ALL_OPERATOR = init_game_pool('prts', prts_dict, Operator)
- await _init_up_char()
-
-
-async def init_prts_data():
- global prts_dict, ALL_OPERATOR
- if draw_config.PRTS_FLAG:
- with (DRAW_DATA_PATH / 'prts.json').open('r', encoding='utf8') as f:
- prts_dict = json.load(f)
- ALL_OPERATOR = init_game_pool('prts', prts_dict, Operator)
- await _init_up_char()
-
-
-# 抽取干员
-def _get_operator_card(add: float):
- prts_config = draw_config.prts
- star = get_star([6, 5, 4, 3], [prts_config.PRTS_SIX_P + add, prts_config.PRTS_FIVE_P, prts_config.PRTS_FOUR_P, prts_config.PRTS_THREE_P])
- if _CURRENT_POOL_TITLE:
- zooms = [x.zoom for x in UP_OPERATOR if x.star == star]
- zoom = 0
- weight = 0
- # 分配概率和权重
- for z in zooms:
- if z < 1:
- zoom = z
- else:
- weight = z
- up_operator_name = ""
- # UPs
- try:
- if 0 < zoom:
- up_operators = [x.operators for x in UP_OPERATOR if x.star == star and x.zoom < 1][0]
- up_operator_name = random.choice(up_operators)
- acquire_operator = [x for x in ALL_OPERATOR if x.name == up_operator_name][0]
- else:
- all_star_operators = [x for x in ALL_OPERATOR if x.star == star
- and not any([x.limited, x.event_only, x.recruit_only])]
- weight_up_operators = [x.operators for x in UP_OPERATOR if x.star == star and x.zoom > 1]
- # 权重
- if weight_up_operators and random.random() < 1.0 / float(len(all_star_operators)) * weight:
- up_operator_name = random.choice(weight_up_operators[0])
- acquire_operator = [x for x in ALL_OPERATOR if x.name == up_operator_name][0]
- else:
- acquire_operator = random.choice(all_star_operators)
- except IndexError:
- acquire_operator = Operator(up_operator_name, star, True, False, False)
- else:
- acquire_operator = random.choice([x for x in ALL_OPERATOR if x.star == star
- and not any([x.limited, x.event_only, x.recruit_only])])
- return acquire_operator, 6 - star
-
-
-# 整理数据
-def format_card_information(count: int, star_list: list):
- max_star_lst = [] # 获取的最高星级角色列表
- max_index_lst = [] # 获取最高星级角色的次数
- obj_list = [] # 获取所有角色
- obj_dict = {} # 获取角色次数字典
- add = 0.0
- count_idx = 0
- for i in range(count):
- count_idx += 1
- obj, code = _get_operator_card(add)
- star_list[code] += 1
- if code == 0:
- max_star_lst.append(obj.name)
- max_index_lst.append(i)
- add = 0.0
- count_idx = 0
- elif count_idx > 50:
- add += 0.02
- try:
- obj_dict[obj.name] += 1
- except KeyError:
- obj_dict[obj.name] = 1
- obj_list.append(obj)
- return obj_list, obj_dict, max_star_lst, star_list, max_index_lst
-
-
-# 获取up干员和概率
-async def _init_up_char():
- global _CURRENT_POOL_TITLE, POOL_IMG, UP_OPERATOR
- UP_OPERATOR = []
- up_char_dict = await announcement.update_up_char()
- _CURRENT_POOL_TITLE = up_char_dict['char']['title']
- if _CURRENT_POOL_TITLE:
- POOL_IMG = MessageSegment.image(up_char_dict['char']['pool_img'])
- up_char_dict = up_char_dict['char']['up_char']
- logger.info(f'成功获取明日方舟当前up信息...当前up池: {_CURRENT_POOL_TITLE}')
- average_dict = {'6': {}, '5': {}, '4': {}}
- for star in up_char_dict.keys():
- for key in up_char_dict[star].keys():
- if average_dict[star].get(up_char_dict[star][key]):
- average_dict[star][up_char_dict[star][key]].append(key)
- else:
- average_dict[star][up_char_dict[star][key]] = [key]
- for star in average_dict.keys():
- for str_zoom in average_dict[star].keys():
- if str_zoom[0] == '权':
- zoom = float(str_zoom[1:])
- else:
- zoom = float(str_zoom) / 100
- UP_OPERATOR.append(UpEvent(star=int(star), operators=average_dict[star][str_zoom], zoom=zoom))
-
-
-async def reload_prts_pool():
- await _init_up_char()
- return Message(f'当前UP池:{_CURRENT_POOL_TITLE} {POOL_IMG}')
diff --git a/plugins/draw_card/rule.py b/plugins/draw_card/rule.py
deleted file mode 100755
index c5ecb0f4..00000000
--- a/plugins/draw_card/rule.py
+++ /dev/null
@@ -1,29 +0,0 @@
-from nonebot.rule import Rule
-from nonebot.adapters.onebot.v11 import Bot, MessageEvent
-from nonebot.typing import T_State
-from .config import draw_config
-
-
-def is_switch(game_name: str) -> Rule:
-
- async def _is_switch(bot: Bot, event: MessageEvent, state: T_State) -> bool:
- if game_name == 'prts':
- return draw_config.PRTS_FLAG
- if game_name == 'genshin':
- return draw_config.GENSHIN_FLAG
- if game_name == 'pretty':
- return draw_config.PRETTY_FLAG
- if game_name == 'guardian':
- return draw_config.GUARDIAN_FLAG
- if game_name == 'pcr':
- return draw_config.PCR_FLAG
- if game_name == 'azur':
- return draw_config.AZUR_FLAG
- if game_name == 'fgo':
- return draw_config.FGO_FLAG
- if game_name == 'onmyoji':
- return draw_config.ONMYOJI_FLAG
- else:
- return False
-
- return Rule(_is_switch)
diff --git a/plugins/draw_card/update_game_info.py b/plugins/draw_card/update_game_info.py
deleted file mode 100755
index 5ce5835c..00000000
--- a/plugins/draw_card/update_game_info.py
+++ /dev/null
@@ -1,295 +0,0 @@
-from typing import Tuple
-from .config import DRAW_DATA_PATH
-from asyncio.exceptions import TimeoutError
-from bs4 import BeautifulSoup
-from .util import download_img
-from urllib.parse import unquote
-from .util import remove_prohibited_str
-from utils.http_utils import AsyncHttpx
-from nonebot.log import logger
-import bs4
-import re
-try:
- import ujson as json
-except ModuleNotFoundError:
- import json
-
-
-headers = {'User-Agent': '"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)"'}
-
-
-async def update_info(url: str, game_name: str, info_list: list = None) -> Tuple[dict, int]:
- info_path = DRAW_DATA_PATH / f"{game_name}.json"
- try:
- with info_path.open('r', encoding='utf8') as f:
- data = json.load(f)
- except (ValueError, FileNotFoundError):
- data = {}
- try:
- response = await AsyncHttpx.get(url, timeout=7)
- soup = BeautifulSoup(response.text, 'lxml')
- _tbody = get_tbody(soup, game_name, url)
- trs = _tbody.find_all('tr')
- att_dict, start_index, index = init_attr(game_name)
- if game_name == 'guardian':
- start_index = 1
- if game_name == 'azur':
- start_index = 0
- for th in trs[0].find_all('th')[start_index:]:
- text = th.text
- if text[-1] == '\n':
- text = text[:-1]
- att_dict[text] = index
- index += 1
- for tr in trs[1:]:
- member_dict = {}
- tds = tr.find_all('td')
- if not info_list:
- info_list = att_dict.keys()
- for key in info_list:
- key, attr = parse_key(key, game_name)
- td = tds[att_dict[key]]
- last_tag = unquote(_find_last_tag(td, attr, game_name), 'utf-8')
- member_dict[key] = last_tag
- member_dict = intermediate_check(member_dict, key, game_name, td)
- avatar_img = await _modify_avatar_url(game_name, member_dict["名称"])
- member_dict['头像'] = avatar_img if avatar_img else member_dict['头像']
- member_dict, name = replace_update_name(member_dict, game_name)
- await download_img(member_dict['头像'], game_name, name)
- data[name] = member_dict
- logger.info(f'{name} is update...')
- data = await _last_check(data, game_name)
- except TimeoutError:
- logger.warning(f'更新 {game_name} 超时...')
- return {}, 999
- with info_path.open('w', encoding='utf8') as wf:
- wf.write(json.dumps(data, ensure_ascii=False, indent=4))
- return data, 200
-
-
-def _find_last_tag(element: bs4.element.Tag, attr: str, game_name: str) -> str:
- last_tag = []
- for des in element.descendants:
- last_tag.append(des)
- if len(last_tag) == 1 and last_tag[0] == '\n':
- last_tag = ''
- elif last_tag[-1] == '\n':
- last_tag = last_tag[-2]
- else:
- last_tag = last_tag[-1]
- if attr and str(last_tag):
- last_tag = last_tag[attr]
- elif str(last_tag).find('
{r.group(1)}')
- if game_name == 'guardian':
- for keys in data.keys():
- for key in data[keys].keys():
- r = re.search(r'.*?-star_(.*).png', str(data[keys][key]))
- if r:
- data[keys][key] = r.group(1)
- logger.info(f'坎公骑士剑额外修改数据...{keys}[{key}] => {r.group(1)}')
- return data
-
-
-# 对抓取每行数据是否需要额外处理?
-def intermediate_check(member_dict: dict, key: str, game_name: str, td: bs4.element.Tag):
- if game_name == "genshin_arms":
- if key == "稀有度":
- member_dict["稀有度"] = td.find("img")["alt"].split('.')[0]
- if game_name == 'prts':
- if key == '获取途径':
- msg = re.search('([\\s\\S]*)', str(td)).group(1).strip()
- msg = msg[:-1] if msg and msg[-1] == '\n' else msg
- if msg.find('')
- if game_name == 'pretty':
- if key == '初始星级':
- member_dict['初始星级'] = len(td.find_all('img'))
- if game_name == 'pretty_card':
- if key == '获取方式':
- obtain = []
- for x in str(td.text).replace('\n', '').strip().split('、'):
- if x:
- obtain.append(x)
- member_dict['获取方式'] = obtain
- if game_name == 'guardian':
- if key == '头像':
- member_dict['星级'] = str(td.find('span').find('img')['alt'])[-5]
- try:
- member_dict['头像'] = str(td.find('img')['srcset']).split(' ')[0]
- except KeyError:
- member_dict['头像'] = str(td.find('img')['src'])
- return member_dict
-
-
-def init_attr(game_name: str):
- att_dict = {'头像': 0, '名称': 1}
- start_index = 2
- index = 2
- if game_name == 'guardian':
- att_dict = {'头像': 0, '名称': 0}
- start_index = 1
- index = 1
- return att_dict, start_index, index
-
-
-# 解析key
-def parse_key(key: str, game_name):
- attr = ''
- if game_name == 'genshin_arms':
- if key.find('.') != -1:
- key = key.split('.')
- attr = key[-1]
- key = key[0]
- return key, attr
-
-
-# 拿到名称
-def replace_update_name(member_dict: dict, game_name: str):
- name = member_dict['名称']
- if game_name == 'pretty_card':
- name = member_dict['中文名']
- name = remove_prohibited_str(name)
- member_dict['中文名'] = name
- else:
- name = remove_prohibited_str(name)
- member_dict['名称'] = name
- return member_dict, name
-
-
-# 拿到tbody,不同游戏tbody可能不同
-def get_tbody(soup: bs4.BeautifulSoup, game_name: str, url: str):
- max_count = 0
- _tbody = None
- if game_name == 'guardian_arms':
- if url[-2:] == '盾牌':
- div = soup.find('div', {'class': 'resp-tabs-container'}).find_all('div', {'class': 'resp-tab-content'})[1]
- _tbody = div.find('tbody')
- else:
- div = soup.find('div', {'class': 'resp-tabs-container'}).find_all('div', {'class': 'resp-tab-content'})[0]
- _tbody = div.find('table', {'id': 'CardSelectTr'}).find('tbody')
- else:
- for tbody in soup.find_all('tbody'):
- if len(tbody.find_all('tr')) > max_count:
- _tbody = tbody
- max_count = len(tbody.find_all('tr'))
- return _tbody
-
-
-# async def _async_update_prts_extra_info(key: str, session: aiohttp.ClientSession):
-# for i in range(10):
-# try:
-# async with session.get(f'https://wiki.biligame.com/arknights/{key}', timeout=7) as res:
-# soup = BeautifulSoup(await res.text(), 'lxml')
-# obtain = str(soup.find('table', {'class': 'wikitable'}).find('tbody').find_all('td')[-1])
-# obtain = re.search(r'([\s\S]*)'):
-# obtain = obtain.split('
')
-# elif obtain.find('
'):
-# obtain = obtain.split('
')
-# for i in range(len(obtain)):
-# if obtain[i].find(''):
-# r = re.search('>(.*)', msg)
-# if r:
-# text += r.group(1) + ' '
-# obtain[i] = obtain[i].split('')[-1]
-# print(f'明日方舟获取额外信息 {key}...{obtain}')
-# x = {key: {}}
-# x[key]['获取途径'] = obtain
-# return x
-# except TimeoutError:
-# print(f'访问 https://wiki.biligame.com/arknights/{key} 第 {i}次 超时...已再次访问')
-# return {}
-
diff --git a/plugins/draw_card/update_game_requests_info.py b/plugins/draw_card/update_game_requests_info.py
deleted file mode 100755
index ceb4b73b..00000000
--- a/plugins/draw_card/update_game_requests_info.py
+++ /dev/null
@@ -1,156 +0,0 @@
-from .config import DRAW_DATA_PATH, draw_config
-from asyncio.exceptions import TimeoutError
-from .util import download_img
-from bs4 import BeautifulSoup
-from .util import remove_prohibited_str
-from utils.http_utils import AsyncHttpx
-from nonebot.log import logger
-import asyncio
-try:
- import ujson as json
-except ModuleNotFoundError:
- import json
-
-
-headers = {'User-Agent': '"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)"'}
-
-
-async def update_requests_info(game_name: str):
- info_path = DRAW_DATA_PATH / f"{game_name}.json"
- try:
- with info_path.open('r', encoding='utf8') as f:
- data = json.load(f)
- except (ValueError, FileNotFoundError):
- data = {}
- try:
- if game_name in ['fgo', 'fgo_card']:
- if game_name == 'fgo':
- url = 'http://fgo.vgtime.com/servant/ajax?card=&wd=&ids=&sort=12777&o=desc&pn='
- else:
- url = 'http://fgo.vgtime.com/equipment/ajax?wd=&ids=&sort=12958&o=desc&pn='
- for i in range(9999):
- response = await AsyncHttpx.get(f'{url}{i}', timeout=7)
- fgo_data = json.loads(response.text)
- if int(fgo_data['nums']) == 0:
- break
- for x in fgo_data['data']:
- x['name'] = remove_prohibited_str(x['name'])
- key = x['name']
- data = add_to_data(data, x, game_name)
- await download_img(data[key]['头像'], game_name, key)
- logger.info(f'{key} is update...')
- if game_name == 'onmyoji':
- url = 'https://yys.res.netease.com/pc/zt/20161108171335/js/app/all_shishen.json?v74='
- response = await AsyncHttpx.get(url, timeout=7)
- onmyoji_data = response.json()
- for x in onmyoji_data:
- x['name'] = remove_prohibited_str(x['name'])
- key = x['name']
- data = add_to_data(data, x, game_name)
- logger.info(f'{key} is update...')
- data = await _last_check(data, game_name)
- except TimeoutError:
- logger.warning(f'更新 {game_name} 超时...')
- return {}, 999
- except Exception as e:
- logger.warning(f'更新 {game_name} 失败 {type(e)}:{e}...')
- return {}, 999
- with info_path.open('w', encoding='utf8') as wf:
- json.dump(data, wf, ensure_ascii=False, indent=4)
- return data, 200
-
-
-# 添加到字典
-def add_to_data(data: dict, x: dict, game_name: str) -> dict:
- member_dict = {}
- if game_name == 'fgo':
- member_dict = {
- 'id': x['id'],
- 'card_id': x['charid'],
- '头像': x['icon'],
- '名称': x['name'],
- '职阶': x['classes'],
- '星级': x['star'],
- 'hp': x['lvmax4hp'],
- 'atk': x['lvmax4atk'],
- 'card_quick': x['cardquick'],
- 'card_arts': x['cardarts'],
- 'card_buster': x['cardbuster'],
- '宝具': x['tprop'],
- }
- if game_name == 'fgo_card':
- member_dict = {
- 'id': x['id'],
- 'card_id': x['equipid'],
- '头像': x['icon'],
- '名称': x['name'],
- '星级': x['star'],
- 'hp': x['lvmax_hp'],
- 'atk': x['lvmax_atk'],
- 'skill_e': x['skill_e'].split('
')[: -1],
- }
- if game_name == 'onmyoji':
- member_dict = {
- 'id': x['id'],
- '名称': x['name'],
- '星级': x['level'],
- }
- data[member_dict['名称']] = member_dict
- return data
-
-
-# 获取额外数据
-async def _last_check(data: dict, game_name: str) -> dict:
- if game_name == 'fgo':
- url = 'http://fgo.vgtime.com/servant/'
- tasks = []
- semaphore = asyncio.Semaphore(draw_config.SEMAPHORE)
- for key in data.keys():
- tasks.append(asyncio.ensure_future(
- _async_update_fgo_extra_info(url, key, data[key]['id'], semaphore)))
- result = await asyncio.gather(*tasks)
- for x in result:
- for key in x.keys():
- data[key]['入手方式'] = x[key]['入手方式']
- if game_name == 'onmyoji':
- url = 'https://yys.163.com/shishen/{}.html'
- for key in data.keys():
- response = await AsyncHttpx.get(f'{url.format(data[key]["id"])}', timeout=7)
- soup = BeautifulSoup(response.text, 'lxml')
- data[key]['头像'] = "https:" + soup.find('div', {'class': 'pic_wrap'}).find('img')['src']
- await download_img(data[key]['头像'], game_name, key)
- return data
-
-
-async def _async_update_fgo_extra_info(url: str, key: str, _id: str, semaphore):
- # 防止访问超时
- async with semaphore:
- for i in range(10):
- try:
- response = await AsyncHttpx.get(f'{url}{_id}', timeout=7)
- soup = BeautifulSoup(response.text, 'lxml')
- obtain = soup.find('table', {'class': 'uk-table uk-codex-table'}).find_all('td')[-1].text
- if obtain.find('限时活动免费获取 活动结束后无法获得') != -1:
- obtain = ['活动获取']
- elif obtain.find('非限时UP无法获得') != -1:
- obtain = ['限时召唤']
- else:
- if obtain.find('&') != -1:
- obtain = obtain.strip().split('&')
- else:
- obtain = obtain.strip().split(' ')
- logger.info(f'Fgo获取额外信息 {key}....{obtain}')
- x = {key: {}}
- x[key]['入手方式'] = obtain
- return x
- except TimeoutError:
- logger.warning(f'访问{url}{_id} 第 {i}次 超时...已再次访问')
- except Exception as e:
- logger.warning(f'访问{url}{_id} 第 {i}次 发生错误:{e}...已再次访问')
- return {}
-
-
-
-
-
-
diff --git a/plugins/draw_card/update_game_simple_info.py b/plugins/draw_card/update_game_simple_info.py
deleted file mode 100755
index f7cdcf45..00000000
--- a/plugins/draw_card/update_game_simple_info.py
+++ /dev/null
@@ -1,225 +0,0 @@
-from typing import Tuple
-from .config import DRAW_DATA_PATH, draw_config
-from asyncio.exceptions import TimeoutError
-from bs4 import BeautifulSoup
-from .util import download_img
-from .util import remove_prohibited_str
-from urllib.parse import unquote
-from utils.http_utils import AsyncHttpx
-from nonebot.log import logger
-import bs4
-import asyncio
-
-try:
- import ujson as json
-except ModuleNotFoundError:
- import json
-
-headers = {
- "User-Agent": '"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)"'
-}
-
-
-async def update_simple_info(url: str, game_name: str) -> Tuple[dict, int]:
- info_path = DRAW_DATA_PATH / f"{game_name}.json"
- try:
- with info_path.open("r", encoding="utf8") as f:
- data = json.load(f)
- except (ValueError, FileNotFoundError):
- data = {}
- try:
- response = await AsyncHttpx.get(url, timeout=7)
- soup = BeautifulSoup(response.text, "lxml")
- divs = get_char_divs(soup, game_name)
- for div in divs:
- type_lst = get_type_lst(div, game_name)
- index = 0
- for char_lst in type_lst:
- try:
- contents = get_char_lst_contents(char_lst, game_name)
- except AttributeError:
- continue
- for char in contents[1:]:
- try:
- data = await retrieve_char_data(
- char, game_name, data, index
- )
- except AttributeError:
- continue
- index += 1
- data = await _last_check(data, game_name)
- except TimeoutError:
- logger.warning(f"更新 {game_name} 超时...")
- return {}, 999
- with info_path.open("w", encoding="utf8") as wf:
- wf.write(json.dumps(data, ensure_ascii=False, indent=4))
- return data, 200
-
-
-# 获取所有包含需要图片的divs
-def get_char_divs(soup: bs4.BeautifulSoup, game_name: str) -> bs4.element.ResultSet:
- # if game_name == "pcr":
- # return soup.find_all("div", {"class": "tabbertab"})
- if game_name in ["azur", "pcr"]:
- return soup.find_all("div", {"class": "resp-tabs"})
-
-
-# 拿到所有类型
-def get_type_lst(div: bs4.element.Tag, game_name: str):
- if game_name in ["pcr", "azur"]:
- return div.find("div", {"class": "resp-tabs-container"}).find_all(
- "div", {"class": "resp-tab-content"}
- )
-
-
-# 获取所有角色div
-def get_char_lst_contents(char_lst: bs4.element.Tag, game_name: str):
- contents = []
- # print(len(char_lst.find_all('tr')))
- if game_name == "pcr":
- contents = char_lst.contents
- if game_name == "azur":
- contents = char_lst.find("table").find("tbody").contents[-1].find("td").contents
- return [x for x in contents if x != "\n"]
-
-
-# 额外数据
-async def _last_check(
- data: dict, game_name: str
-) -> dict:
- if game_name == "azur":
- idx = 1
- for url in [
- "https://patchwiki.biligame.com/images/blhx/thumb/1/15/pxho13xsnkyb546tftvh49etzdh74cf.png/60px"
- "-舰娘头像外框普通.png",
- "https://patchwiki.biligame.com/images/blhx/thumb/a/a9/k8t7nx6c8pan5vyr8z21txp45jxeo66.png/60px"
- "-舰娘头像外框稀有.png",
- "https://patchwiki.biligame.com/images/blhx/thumb/a/a5/5whkzvt200zwhhx0h0iz9qo1kldnidj.png/60px"
- "-舰娘头像外框精锐.png",
- "https://patchwiki.biligame.com/images/blhx/thumb/a/a2/ptog1j220x5q02hytpwc8al7f229qk9.png/60px-"
- "舰娘头像外框超稀有.png",
- ]:
- await download_img(url, "azur", f"{idx}_star")
- idx += 1
- tasks = []
- semaphore = asyncio.Semaphore(draw_config.SEMAPHORE)
- for key in data.keys():
- tasks.append(
- asyncio.ensure_future(
- _async_update_azur_extra_info(key, semaphore)
- )
- )
- result = await asyncio.gather(*tasks)
- for x in result:
- for key in x.keys():
- data[key]["获取途径"] = x[key]["获取途径"]
- return data
-
-
-azur_type = {
- "0": "驱逐",
- "1": "轻巡",
- "2": "重巡",
- "3": "超巡",
- "4": "战巡",
- "5": "战列",
- "6": "航母",
- "7": "航站",
- "8": "轻航",
- "9": "重炮",
- "10": "维修",
- "11": "潜艇",
- "12": "运输",
-}
-
-
-# 整理数据
-async def retrieve_char_data(
- char: bs4.element.Tag,
- game_name: str,
- data: dict,
- index: int = 0,
-) -> dict:
- member_dict = {}
- if game_name == "pcr":
- member_dict = {
- "头像": unquote(char.find("a").find("img")["src"]),
- "名称": remove_prohibited_str(char.find("a")["title"]),
- "星级": 3 - index,
- }
- if game_name == "azur":
- char = char.find("div").find("div").find("div")
- avatar_img = char.find("a").find("img")
- char = char.find("div")
- try:
- member_dict["名称"] = remove_prohibited_str(char.find("a")["title"])
- except TypeError:
- member_dict["名称"] = char.find("a")["title"][:-4]
- try:
- member_dict["头像"] = unquote(str(avatar_img["srcset"]).split(" ")[-2])
- except KeyError:
- member_dict["头像"] = unquote(str(avatar_img["src"]).split(" ")[-2])
- except TypeError:
- member_dict["头像"] = "img link not find..."
- logger.warning(f'{member_dict["名称"]} 图片缺失....')
- star = char.find("img")["alt"]
- if star == "舰娘头像外框普通.png":
- star = 1
- elif star == "舰娘头像外框稀有.png":
- star = 2
- elif star == "舰娘头像外框精锐.png":
- star = 3
- elif star == "舰娘头像外框超稀有.png":
- star = 4
- elif star == "舰娘头像外框海上传奇.png":
- star = 5
- elif star in [
- "舰娘头像外框最高方案.png",
- "舰娘头像外框决战方案.png",
- "舰娘头像外框超稀有META.png",
- "舰娘头像外框精锐META.png",
- ]:
- star = 6
- else:
- star = 6
- member_dict["星级"] = star
- member_dict["类型"] = azur_type[str(index)]
- await download_img(member_dict["头像"], game_name, member_dict["名称"])
- data[member_dict["名称"]] = member_dict
- logger.info(f'{member_dict["名称"]} is update...')
- return data
-
-
-async def _async_update_azur_extra_info(
- key: str, semaphore
-):
- if key[-1] == "改":
- return {key: {"获取途径": ["无法建造"]}}
- async with semaphore:
- for i in range(20):
- try:
- res = await AsyncHttpx.get(f"https://wiki.biligame.com/blhx/{key}", timeout=7)
- soup = BeautifulSoup(res.text, "lxml")
- try:
- construction_time = str(
- soup.find("table", {"class": "wikitable sv-general"}).find(
- "tbody"
- )
- )
- x = {key: {"获取途径": []}}
- if construction_time.find("无法建造") != -1:
- x[key]["获取途径"].append("无法建造")
- elif construction_time.find("活动已关闭") != -1:
- x[key]["获取途径"].append("活动限定")
- else:
- x[key]["获取途径"].append("可以建造")
- logger.info(f'碧蓝航线获取额外信息 {key}...{x[key]["获取途径"]}')
- except AttributeError:
- x = {key: {"获取途径": []}}
- logger.warning(f"碧蓝航线获取额外信息错误 {key}...{[]}")
- return x
- except TimeoutError:
- logger.warning(
- f"访问 https://wiki.biligame.com/blhx/{key} 第 {i}次 超时...已再次访问"
- )
- return {}
diff --git a/plugins/draw_card/util.py b/plugins/draw_card/util.py
deleted file mode 100755
index 6a12a2a0..00000000
--- a/plugins/draw_card/util.py
+++ /dev/null
@@ -1,356 +0,0 @@
-import platform
-from asyncio.exceptions import TimeoutError
-from utils.utils import cn2py
-from utils.http_utils import AsyncHttpx
-from typing import List, Tuple, Union, Set
-from .config import draw_config, DRAW_IMAGE_PATH
-import nonebot
-from PIL import UnidentifiedImageError
-from utils.image_utils import BuildImage
-from nonebot.adapters.onebot.v11 import MessageSegment
-from nonebot.log import logger
-import random
-from dataclasses import dataclass
-import os
-import asyncio
-
-
-driver = nonebot.get_driver()
-
-
-loop = asyncio.get_event_loop()
-
-
-@dataclass
-class BaseData:
- name: str
- star: int
- limited: bool # 限定
-
-
-@dataclass
-class UpEvent:
- star: int # 对应up星级
- operators: List[BaseData] # 干员列表
- zoom: float # up提升倍率
-
-
-async def download_img(url: str, path: str, name: str) -> bool:
- path = path.split("_")[0]
- codename = cn2py(name)
- img_path = DRAW_IMAGE_PATH / f"{path}" / f"{codename}.png"
- if not img_path.exists():
- try:
- if await AsyncHttpx.download_file(url, img_path):
- logger.info(
- f"下载 {draw_config.path_dict[path]} 图片成功,名称:{name},url:{url}"
- )
- return True
- except TimeoutError:
- logger.warning(f"下载 {draw_config.path_dict[path]} 图片超时,名称:{name},url:{url}")
- # logger.info(f'{path_dict[path]} 图片 {name} 已存在')
- return False
-
-
-@driver.on_startup
-def _check_dir():
- for dir_name in draw_config.path_dict.keys():
- dir_path = DRAW_IMAGE_PATH / f"{dir_name}"
- if not dir_path.exists():
- dir_path.mkdir(parents=True, exist_ok=True)
-
-
-async def generate_img(
- card_set: Union[Set[BaseData], List[BaseData]], game_name: str, star_list: list
-) -> str:
- # try:
- img_list = []
- background_list = []
- for x in card_set:
- if game_name == "prts":
- if x.star == 6:
- background_list.append("#FFD700")
- elif x.star == 5:
- background_list.append("#DAA520")
- elif x.star == 4:
- background_list.append("#9370D8")
- else:
- background_list.append("white")
- img_path = DRAW_IMAGE_PATH / f"{game_name}" / f"{x.star}_star.png"
- if game_name == "azur":
- if img_path.exists():
- background_list.append(str(img_path))
- py_name = cn2py(x.name)
- img_list.append(str(DRAW_IMAGE_PATH / f"{game_name}" / f"{py_name}.png"))
- img_len = len(img_list)
- w = 100 * 10
- if img_len <= 10:
- w = 100 * img_len
- h = 100
- elif img_len % 10 == 0:
- h = 100 * int(img_len / 10)
- else:
- h = 100 * int(img_len / 10) + 100
- card_img = await asyncio.get_event_loop().run_in_executor(
- None, _pst, h, img_list, game_name, background_list
- )
- num = 0
- for n in star_list:
- num += n
- A = BuildImage(w, h)
- A.paste(card_img)
- return A.pic2bs4()
-
-
-def _pst(h: int, img_list: list, game_name: str, background_list: list):
- card_img = BuildImage(100 * 10, h, 100, 100)
- idx = 0
- for img in img_list:
- try:
- if game_name == "prts":
- bk = BuildImage(100, 100, color=background_list[idx])
- b = BuildImage(94, 94, background=img)
- bk.paste(b, (3, 3))
- b = bk
- elif game_name == "azur" and background_list:
- bk = BuildImage(100, 100, background=background_list[idx])
- b = BuildImage(98, 90, background=img)
- bk.paste(b, (1, 5))
- b = bk
- else:
- try:
- b = BuildImage(100, 100, background=img)
- except UnidentifiedImageError as e:
- logger.warning(f"无法识别图片 已删除图片,下次更新重新下载... e:{e}")
- if os.path.exists(img):
- os.remove(img)
- b = BuildImage(100, 100, color="black")
- except FileNotFoundError:
- logger.warning(f"{img} not exists")
- b = BuildImage(100, 100, color="black")
- card_img.paste(b)
- idx += 1
- return card_img
-
-
-# 初始化输出数据
-def init_star_rst(
- star_list: list,
- cnlist: list,
- max_star_list: list,
- max_star_index_list: list,
- up_list: list = None,
-) -> str:
- if not up_list:
- up_list = []
- rst = ""
- for i in range(len(star_list)):
- if star_list[i]:
- rst += f"[{cnlist[i]}×{star_list[i]}] "
- rst += "\n"
- for i in range(len(max_star_list)):
- if max_star_list[i] in up_list:
- rst += f"第 {max_star_index_list[i]+1} 抽获取UP {max_star_list[i]}\n"
- else:
- rst += f"第 {max_star_index_list[i]+1} 抽获取 {max_star_list[i]}\n"
- return rst
-
-
-# 更好的初始化
-def init_rst(
- max_star_char_dict: dict,
- star_num_list: List[int],
- star: List[str],
- up_list: list = None,
-):
- # print(max_star_char_dict)
- # print(star_num_list)
- # print(up_list)
- up_list = up_list if up_list else []
- rst = ""
- for i in range(len(star_num_list)):
- if star_num_list[i]:
- rst += f"[{star[i]}×{star_num_list[i]}] "
- rst += "\n"
- _tmp = []
- for name in max_star_char_dict.keys():
- _tmp += max_star_char_dict[name]
- for index in sorted(_tmp):
- for name in max_star_char_dict.keys():
- if index in max_star_char_dict[name]:
- if name in up_list:
- rst += f"第 {index} 抽获取UP {name}\n"
- else:
- rst += f"第 {index} 抽获取 {name}\n"
- return rst[:-1] if rst else ""
-
-
-def max_card(_dict: dict):
- _max_value = max(_dict.values())
- _max_user = list(_dict.keys())[list(_dict.values()).index(_max_value)]
- return f"抽取到最多的是{_max_user},共抽取了{_max_value}次"
- # ThreeHighest = nlargest(3, operator_dict, key=operator_dict.get)
- # rst = '最喜欢你的前三位是干员是:\n'
- # for name in ThreeHighest:
- # rst += f'{name} 共投了 {operator_dict[name]} 份简历\n'
- # return rst[:-1]
-
-
-# 获取up和概率
-async def init_up_char(announcement):
- UP_CHAR = []
- UP_ARMS = []
- tmp = ""
- up_char_dict = await announcement.update_up_char()
- for x in list(up_char_dict.keys()):
- tmp += up_char_dict[x]["title"] + "[\n]"
- tmp = tmp.split("[\n]")
- _CURRENT_CHAR_POOL_TITLE = tmp[0]
- if len(up_char_dict) > 1:
- _CURRENT_ARMS_POOL_TITLE = tmp[1]
- else:
- _CURRENT_ARMS_POOL_TITLE = ""
- POOL_IMG = ""
- x = [x for x in list(up_char_dict.keys())]
- if _CURRENT_CHAR_POOL_TITLE:
- POOL_IMG += MessageSegment.image(up_char_dict[x[0]]["pool_img"])
- try:
- if _CURRENT_ARMS_POOL_TITLE:
- POOL_IMG += MessageSegment.image(up_char_dict[x[1]]["pool_img"])
- except (IndexError, KeyError):
- pass
- logger.info(
- f"成功获取{announcement.game_name}当前up信息...当前up池: {_CURRENT_CHAR_POOL_TITLE} & {_CURRENT_ARMS_POOL_TITLE}"
- )
- for key in up_char_dict.keys():
- for star in up_char_dict[key]["up_char"].keys():
- up_char_lst = []
- for char in up_char_dict[key]["up_char"][star].keys():
- up_char_lst.append(char)
- if up_char_lst:
- if key == "char":
- UP_CHAR.append(
- UpEvent(star=int(star), operators=up_char_lst, zoom=0)
- )
- else:
- UP_ARMS.append(
- UpEvent(star=int(star), operators=up_char_lst, zoom=0)
- )
- return (
- _CURRENT_CHAR_POOL_TITLE,
- _CURRENT_ARMS_POOL_TITLE,
- POOL_IMG,
- UP_CHAR,
- UP_ARMS,
- )
-
-
-def is_number(s) -> bool:
- try:
- float(s)
- return True
- except ValueError:
- pass
- try:
- import unicodedata
-
- unicodedata.numeric(s)
- return True
- except (TypeError, ValueError):
- pass
- return False
-
-
-def set_list(lst: List[BaseData]) -> list:
- tmp = []
- name_lst = []
- for x in lst:
- if x.name not in name_lst:
- tmp.append(x)
- name_lst.append(x.name)
- return tmp
-
-
-# 获取星级
-def get_star(star_lst: List[int], probability_lst: List[float]) -> int:
- rand = random.random()
- add = 0
- tmp_lst = [(0, probability_lst[0])]
- for i in range(1, len(probability_lst) - 1):
- add += probability_lst[i - 1]
- tmp_lst.append((tmp_lst[i - 1][1], probability_lst[i] + add))
- tmp_lst.append((tmp_lst[-1][1], 1))
- for i in range(len(tmp_lst)):
- if tmp_lst[i][0] <= rand <= tmp_lst[i][1]:
- return star_lst[i]
-
-
-# 整理数据
-def format_card_information(
- count: int, star_list: List[int], func, pool_name: str = "", guaranteed: bool = True
-):
- max_star_lst = [] # 获取的最高星级角色列表
- max_index_lst = [] # 获取最高星级角色的次数
- obj_list = [] # 获取所有角色
- obj_dict = {} # 获取角色次数字典
- _count = -1
- if guaranteed:
- _count = 0
- for i in range(count):
- if guaranteed:
- _count += 1
- if pool_name:
- if _count == 10:
- obj, code = func(pool_name, 2)
- _count = 0
- else:
- obj, code = func(pool_name)
- else:
- if _count == 10:
- obj, code = func(mode=2)
- _count = 0
- else:
- obj, code = func()
- star_list[code] += 1
- if code == 0:
- max_star_lst.append(obj.name)
- max_index_lst.append(i)
- if guaranteed:
- _count = 0
- if code == 1:
- if guaranteed:
- _count = 0
- try:
- obj_dict[obj.name] += 1
- except KeyError:
- obj_dict[obj.name] = 1
- obj_list.append(obj)
- return obj_list, obj_dict, max_star_lst, star_list, max_index_lst
-
-
-# 检测次数是否合法
-def check_num(num: str, max_num: int) -> Tuple[str, bool]:
- if is_number(num):
- try:
- num = int(num)
- except ValueError:
- return "必!须!是!数!字!", False
- if num > max_num:
- return "一井都满不足不了你嘛!快爬开!", False
- if num < 1:
- return "虚空抽卡???", False
- else:
- return str(num), True
-
-
-# 移除windows和linux下特殊字符
-def remove_prohibited_str(name: str) -> str:
- if platform.system().lower() == "windows":
- tmp = ""
- for i in name:
- if i not in ["\\", "/", ":", "*", "?", '"', "<", ">", "|"]:
- tmp += i
- name = tmp
- else:
- name = name.replace("/", "\\")
- return name