mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2026-10-03 02:30:01 +08:00
gold_readbag and russian
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
# 检查写入
|
||||
|
||||
@@ -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}'
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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])
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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'))
|
||||
|
||||
@@ -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 {}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user