gold_readbag and russian

This commit is contained in:
hibiki
2021-06-15 10:57:08 +08:00
parent 95209093de
commit ea620fdae9
125 changed files with 2106 additions and 1244 deletions
+3
View File
@@ -20,6 +20,9 @@ import asyncio
from util.utils import scheduler
from services.log import logger
__plugin_name__ = '游戏抽卡'
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)
+1 -1
View File
@@ -26,7 +26,7 @@ def is_expired(data: dict):
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 start_date < now < end_date
return start_date <= now <= end_date
# 检查写入
+16 -9
View File
@@ -2,14 +2,17 @@ import os
from nonebot.adapters.cqhttp import MessageSegment
import nonebot
import random
from configs.path_config import IMAGE_PATH
from .update_game_info import update_info
from .util import generate_img, init_star_rst, BaseData, set_list, get_star, UpEvent
from .util import generate_img, init_star_rst, BaseData, set_list, get_star, UpEvent, download_img
from .config import GENSHIN_FIVE_P, GENSHIN_FOUR_P, GENSHIN_G_FIVE_P, GENSHIN_G_FOUR_P, GENSHIN_THREE_P, I72_ADD, \
DRAW_PATH, GENSHIN_FLAG
from dataclasses import dataclass
from .init_card_pool import init_game_pool
from .announcement import GenshinAnnouncement
from services.log import logger
from util.init_result import image
try:
import ujson as json
except ModuleNotFoundError:
@@ -27,7 +30,6 @@ ALL_ARMS = []
UP_CHAR = []
UP_ARMS = []
_CURRENT_CHAR_POOL_TITLE = ''
_CURRENT_ARMS_POOL_TITLE = ''
POOL_IMG = ''
@@ -65,7 +67,8 @@ async def genshin_draw(user_id: int, count: int, pool_name: str):
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_list)) + '\n' + rst[:-1] + \
return pool_info + '\n' + MessageSegment.image(
"base64://" + await generate_img(char_list, 'genshin', star_list)) + '\n' + rst[:-1] + \
temp[:-1] + f'\n距离保底发还剩 {90 - genshin_count[user_id] if genshin_count.get(user_id) else "^"} 抽' \
+ "\n【五星:0.6%,四星:5.1%\n第72抽开始五星概率每抽加0.585%】"
@@ -205,9 +208,17 @@ async def _init_up_char():
up_char_dict = await GenshinAnnouncement.update_up_char()
_CURRENT_CHAR_POOL_TITLE = up_char_dict['char']['title']
_CURRENT_ARMS_POOL_TITLE = up_char_dict['arms']['title']
if _CURRENT_CHAR_POOL_TITLE and _CURRENT_ARMS_POOL_TITLE:
POOL_IMG = MessageSegment.image(up_char_dict['char']['pool_img']) + \
MessageSegment.image(up_char_dict['arms']['pool_img'])
await download_img(up_char_dict['char']['pool_img'], 'genshin', 'up_char_pool_img')
await download_img(up_char_dict['arms']['pool_img'], 'genshin', 'up_arms_pool_img')
POOL_IMG = image('up_char_pool_img.png', '/draw_card/genshin/') + \
image('up_arms_pool_img.png', '/draw_card/genshin/')
else:
if os.path.exists(IMAGE_PATH + '/draw_card/genshin/up_char_pool_img.png'):
os.remove(IMAGE_PATH + '/draw_card/genshin/up_char_pool_img.png')
if os.path.exists(IMAGE_PATH + '/draw_card/genshin/up_arms_pool_img.png'):
os.remove(IMAGE_PATH + '/draw_card/genshin/up_arms_pool_img.png')
logger.info(f'成功获取原神当前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():
@@ -223,7 +234,3 @@ async def _init_up_char():
async def reload_genshin_pool():
await _init_up_char()
return f'当前UP池子:{_CURRENT_CHAR_POOL_TITLE} & {_CURRENT_ARMS_POOL_TITLE} {POOL_IMG}'
+1 -1
View File
@@ -86,7 +86,7 @@ def _get_guardian_card(pool_name: str):
if pool_name != 'arms':
star = get_star([3, 2, 1], [GUARDIAN_THREE_CHAR_P, GUARDIAN_TWO_CHAR_P, GUARDIAN_ONE_CHAR_P])
chars = [x for x in ALL_CHAR if x.star == star]
return random.choice(chars), 3- star
return random.choice(chars), 3 - star
else:
star = get_star([5, 4, 3, 2], [GUARDIAN_FIVE_ARMS_P, GUARDIAN_FOUR_ARMS_P,
GUARDIAN_THREE_ARMS_P, GUARDIAN_TWO_ARMS_P])
+4 -2
View File
@@ -10,11 +10,13 @@ def init_game_pool(game: str, data: dict, Operator: Any):
event_only = False
if '限定寻访' in data[key]['获取途径']:
limited = True
if len(data[key]['获取途径']) == 1 and data[key]['获取途径'][0] == '公开招募':
if '干员寻访' not in data[key]['获取途径'] and '公开招募' in data[key]['获取途径']:
recruit_only = True
if '活动获取' in data[key]['获取途径']:
event_only = True
if len(data[key]['获取途径']) == 1 and '凭证交易所' == data[key]['获取途径'][0]:
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
+31 -5
View File
@@ -4,7 +4,7 @@ import nonebot
import random
from .config import PRTS_FIVE_P, PRTS_FOUR_P, PRTS_SIX_P, PRTS_THREE_P, DRAW_PATH, PRTS_FLAG
from .update_game_info import update_info
from .util import generate_img, init_star_rst, max_card, BaseData, UpEvent, set_list, get_star, format_card_information
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 pathlib import Path
from .announcement import PrtsAnnouncement
@@ -36,8 +36,7 @@ class Operator(BaseData):
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,
_get_operator_card)
operator_list, operator_dict, six_list, star_list, six_index_list = format_card_information(count, star_list)
up_list = []
if _CURRENT_POOL_TITLE:
for x in UP_OPERATOR:
@@ -73,8 +72,8 @@ async def init_prts_data():
# 抽取干员
def _get_operator_card():
star = get_star([6, 5, 4, 3], [PRTS_SIX_P, PRTS_FIVE_P, PRTS_FOUR_P, PRTS_THREE_P])
def _get_operator_card(add: float):
star = get_star([6, 5, 4, 3], [PRTS_SIX_P + add, PRTS_FIVE_P, PRTS_FOUR_P, PRTS_THREE_P])
if _CURRENT_POOL_TITLE:
zooms = [x.zoom for x in UP_OPERATOR if x.star == star]
zoom = 0
@@ -107,6 +106,33 @@ def _get_operator_card():
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
+17 -9
View File
@@ -131,15 +131,15 @@ async def _modify_avatar_url(session: aiohttp.ClientSession, game_name: str, cha
# 数据最后处理(是否需要额外数据或处理数据)
async def _last_check(data: dict, game_name: str, session: aiohttp.ClientSession):
if game_name == 'prts':
url = 'https://wiki.biligame.com/arknights/'
tasks = []
for key in data.keys():
tasks.append(asyncio.ensure_future(_async_update_prts_extra_info(url, key, session)))
asyResult = await asyncio.gather(*tasks)
for x in asyResult:
for key in x.keys():
data[key]['获取途径'] = x[key]['获取途径']
# if game_name == 'prts':
# url = 'https://wiki.biligame.com/arknights/'
# tasks = []
# for key in data.keys():
# tasks.append(asyncio.ensure_future(_async_update_prts_extra_info(url, key, session)))
# asyResult = await asyncio.gather(*tasks)
# for x in asyResult:
# for key in x.keys():
# data[key]['获取途径'] = x[key]['获取途径']
if game_name == 'genshin':
for key in data.keys():
async with session.get(f'https://wiki.biligame.com/ys/{key}', timeout=7) as res:
@@ -177,6 +177,14 @@ async def _last_check(data: dict, game_name: str, session: aiohttp.ClientSession
# 对抓取每行数据是否需要额外处理?
def intermediate_check(member_dict: dict, key: str, game_name: str, td: bs4.element.Tag):
if game_name == 'prts':
if key == '获取途径':
msg = re.search('<td.*?>([\\s\\S]*)</td>', str(td)).group(1).strip()
msg = msg[:-1] if msg[-1] == '\n' else msg
if msg.find('<a') != -1:
for a in td.find_all('a'):
msg = msg.replace(str(a), a.text)
member_dict['获取途径'] = msg.split('<br/>')
if game_name == 'pretty':
if key == '初始星级':
member_dict['初始星级'] = len(td.find_all('img'))
+33 -3
View File
@@ -7,6 +7,7 @@ from .util import remove_prohibited_str
from urllib.parse import unquote
from services.log import logger
import bs4
import asyncio
try:
import ujson as json
@@ -35,7 +36,7 @@ async def update_simple_info(url: str, game_name: str) -> 'dict, int':
for char in contents:
data = await retrieve_char_data(char, game_name, data, index)
index += 1
data = await _last_check(data, game_name)
data = await _last_check(data, game_name, session)
except TimeoutError:
logger.warning(f'更新 {game_name} 超时...')
return {}, 999
@@ -70,7 +71,7 @@ def get_char_lst_contents(char_lst: bs4.element.Tag, game_name: str):
# 额外数据
async def _last_check(data: dict, game_name: str) -> dict:
async def _last_check(data: dict, game_name: str, session: aiohttp.ClientSession) -> dict:
if game_name == 'azur':
idx = 1
for url in [
@@ -85,7 +86,13 @@ async def _last_check(data: dict, game_name: str) -> dict:
]:
await download_img(url, 'azur', f'{idx}_star')
idx += 1
tasks = []
for key in data.keys():
tasks.append(asyncio.ensure_future(_async_update_azur_extra_info(key, session)))
asyResult = await asyncio.gather(*tasks)
for x in asyResult:
for key in x.keys():
data[key]['获取途径'] = x[key]['获取途径']
return data
@@ -141,3 +148,26 @@ async def retrieve_char_data(char: bs4.element.Tag, game_name: str, data: dict,
data[member_dict['名称']] = member_dict
logger.info(f'{member_dict["名称"]} is update...')
return data
async def _async_update_azur_extra_info(key: str, session: aiohttp.ClientSession):
if key[-1] == '改':
return {key: {'获取途径': ['无法建造']}}
for i in range(20):
try:
async with session.get(f'https://wiki.biligame.com/blhx/{key}', timeout=7) as res:
soup = BeautifulSoup(await res.text(), 'lxml')
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]["获取途径"]}')
return x
except TimeoutError:
logger.warning(f'访问 https://wiki.biligame.com/blhx/{key} 第 {i}次 超时...已再次访问')
return {}