mirror of
https://github.com/zhenxun-org/zhenxun_bot.git
synced 2025-12-15 14:22:55 +08:00
把nonebot_plugin_gamedraw的ba卡池搬运了过来并且进行了真寻的适配。
This commit is contained in:
parent
fedf44b9fa
commit
e4d5a230d2
@ -23,6 +23,7 @@ from .handles.onmyoji_handle import OnmyojiHandle
|
|||||||
from .handles.pcr_handle import PcrHandle
|
from .handles.pcr_handle import PcrHandle
|
||||||
from .handles.pretty_handle import PrettyHandle
|
from .handles.pretty_handle import PrettyHandle
|
||||||
from .handles.prts_handle import PrtsHandle
|
from .handles.prts_handle import PrtsHandle
|
||||||
|
from .handles.ba_handle import BaHandle
|
||||||
|
|
||||||
from .config import draw_config
|
from .config import draw_config
|
||||||
|
|
||||||
@ -30,7 +31,7 @@ from .config import draw_config
|
|||||||
__zx_plugin_name__ = "游戏抽卡"
|
__zx_plugin_name__ = "游戏抽卡"
|
||||||
__plugin_usage__ = """
|
__plugin_usage__ = """
|
||||||
usage:
|
usage:
|
||||||
模拟赛马娘,原神,明日方舟,坎公骑冠剑,公主连结(国/台),碧蓝航线,FGO,阴阳师进行抽卡
|
模拟赛马娘,原神,明日方舟,坎公骑冠剑,公主连结(国/台),碧蓝航线,FGO,阴阳师,碧蓝档案进行抽卡
|
||||||
指令:
|
指令:
|
||||||
原神[1-180]抽: 原神常驻池
|
原神[1-180]抽: 原神常驻池
|
||||||
原神角色[1-180]抽: 原神角色UP池子
|
原神角色[1-180]抽: 原神角色UP池子
|
||||||
@ -43,6 +44,7 @@ usage:
|
|||||||
碧蓝航线/碧蓝[重型/轻型/特型/活动][1-300]抽: 碧蓝航线重型/轻型/特型/活动卡池
|
碧蓝航线/碧蓝[重型/轻型/特型/活动][1-300]抽: 碧蓝航线重型/轻型/特型/活动卡池
|
||||||
fgo[1-300]抽: fgo卡池
|
fgo[1-300]抽: fgo卡池
|
||||||
阴阳师[1-300]抽: 阴阳师卡池
|
阴阳师[1-300]抽: 阴阳师卡池
|
||||||
|
ba/碧蓝档案[1-200]抽:碧蓝档案卡池
|
||||||
* 以上指令可以通过 XX一井 来指定最大抽取数量 *
|
* 以上指令可以通过 XX一井 来指定最大抽取数量 *
|
||||||
* 示例:原神一井 *
|
* 示例:原神一井 *
|
||||||
""".strip()
|
""".strip()
|
||||||
@ -73,6 +75,7 @@ __plugin_cmd__ = [
|
|||||||
"pcr/公主连接[1-300]抽",
|
"pcr/公主连接[1-300]抽",
|
||||||
"fgo[1-300]抽",
|
"fgo[1-300]抽",
|
||||||
"阴阳师[1-300]抽",
|
"阴阳师[1-300]抽",
|
||||||
|
"碧蓝档案[1-200]抽",
|
||||||
"更新方舟信息 [_superuser]",
|
"更新方舟信息 [_superuser]",
|
||||||
"重载方舟卡池 [_superuser]",
|
"重载方舟卡池 [_superuser]",
|
||||||
"更新原神信息 [_superuser]",
|
"更新原神信息 [_superuser]",
|
||||||
@ -83,6 +86,7 @@ __plugin_cmd__ = [
|
|||||||
"更新碧蓝航线信息 [_superuser]",
|
"更新碧蓝航线信息 [_superuser]",
|
||||||
"更新fgo信息 [_superuser]",
|
"更新fgo信息 [_superuser]",
|
||||||
"更新阴阳师信息 [_superuser]",
|
"更新阴阳师信息 [_superuser]",
|
||||||
|
"更新碧蓝档案信息 [_superuser]",
|
||||||
]
|
]
|
||||||
__plugin_type__ = ("抽卡相关", 1)
|
__plugin_type__ = ("抽卡相关", 1)
|
||||||
__plugin_version__ = 0.1
|
__plugin_version__ = 0.1
|
||||||
@ -105,7 +109,7 @@ class Game:
|
|||||||
|
|
||||||
|
|
||||||
games = (
|
games = (
|
||||||
Game({"azur", "碧蓝", "碧蓝航线"}, AzurHandle(), draw_config.AZUR_FLAG),
|
Game({"azur", "碧蓝航线"}, AzurHandle(), draw_config.AZUR_FLAG),
|
||||||
Game({"fgo", "命运冠位指定"}, FgoHandle(), draw_config.FGO_FLAG),
|
Game({"fgo", "命运冠位指定"}, FgoHandle(), draw_config.FGO_FLAG),
|
||||||
Game(
|
Game(
|
||||||
{"genshin", "原神"},
|
{"genshin", "原神"},
|
||||||
@ -130,6 +134,11 @@ games = (
|
|||||||
reload_time=4,
|
reload_time=4,
|
||||||
),
|
),
|
||||||
Game({"prts", "方舟", "明日方舟"}, PrtsHandle(), draw_config.PRTS_FLAG, reload_time=4),
|
Game({"prts", "方舟", "明日方舟"}, PrtsHandle(), draw_config.PRTS_FLAG, reload_time=4),
|
||||||
|
Game(
|
||||||
|
{"ba","碧蓝档案"},BaHandle(),
|
||||||
|
draw_config.BA_FLAG,
|
||||||
|
max_count=200,
|
||||||
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -87,6 +87,12 @@ class OnmyojiConfig(BaseModel, extra=Extra.ignore):
|
|||||||
ONMYOJI_SR: float = 0.2
|
ONMYOJI_SR: float = 0.2
|
||||||
ONMYOJI_R: float = 0.7875
|
ONMYOJI_R: float = 0.7875
|
||||||
|
|
||||||
|
#碧蓝档案
|
||||||
|
class BaConfig(BaseModel, extra=Extra.ignore):
|
||||||
|
BA_THREE_P: float = 0.025
|
||||||
|
BA_TWO_P: float = 0.185
|
||||||
|
BA_ONE_P: float = 0.79
|
||||||
|
BA_G_TWO_P: float = 0.975
|
||||||
|
|
||||||
class Config(BaseModel, extra=Extra.ignore):
|
class Config(BaseModel, extra=Extra.ignore):
|
||||||
# 开关
|
# 开关
|
||||||
@ -98,6 +104,7 @@ class Config(BaseModel, extra=Extra.ignore):
|
|||||||
AZUR_FLAG: bool = AConfig.get_config("draw_card", "AZUR_FLAG")
|
AZUR_FLAG: bool = AConfig.get_config("draw_card", "AZUR_FLAG")
|
||||||
FGO_FLAG: bool = AConfig.get_config("draw_card", "FGO_FLAG")
|
FGO_FLAG: bool = AConfig.get_config("draw_card", "FGO_FLAG")
|
||||||
ONMYOJI_FLAG: bool = AConfig.get_config("draw_card", "ONMYOJI_FLAG")
|
ONMYOJI_FLAG: bool = AConfig.get_config("draw_card", "ONMYOJI_FLAG")
|
||||||
|
BA_FLAG: bool = AConfig.get_config("draw_card", "BA_FLAG")
|
||||||
|
|
||||||
# 其他配置
|
# 其他配置
|
||||||
PCR_TAI: bool = AConfig.get_config("draw_card", "PCR_TAI")
|
PCR_TAI: bool = AConfig.get_config("draw_card", "PCR_TAI")
|
||||||
@ -112,6 +119,7 @@ class Config(BaseModel, extra=Extra.ignore):
|
|||||||
azur: AzurConfig = AzurConfig()
|
azur: AzurConfig = AzurConfig()
|
||||||
fgo: FgoConfig = FgoConfig()
|
fgo: FgoConfig = FgoConfig()
|
||||||
onmyoji: OnmyojiConfig = OnmyojiConfig()
|
onmyoji: OnmyojiConfig = OnmyojiConfig()
|
||||||
|
ba: BaConfig = BaConfig()
|
||||||
|
|
||||||
|
|
||||||
driver = nonebot.get_driver()
|
driver = nonebot.get_driver()
|
||||||
@ -133,8 +141,9 @@ for game_flag, game_name in zip(
|
|||||||
"FGO_FLAG",
|
"FGO_FLAG",
|
||||||
"ONMYOJI_FLAG",
|
"ONMYOJI_FLAG",
|
||||||
"PCR_TAI",
|
"PCR_TAI",
|
||||||
|
"BA_FLAG"
|
||||||
],
|
],
|
||||||
["明日方舟", "原神", "赛马娘", "坎公骑冠剑", "公主连结", "碧蓝航线", "命运-冠位指定(FGO)", "阴阳师", "pcr台服卡池"],
|
["明日方舟", "原神", "赛马娘", "坎公骑冠剑", "公主连结", "碧蓝航线", "命运-冠位指定(FGO)", "阴阳师", "pcr台服卡池","碧蓝档案"],
|
||||||
):
|
):
|
||||||
AConfig.add_plugin_config(
|
AConfig.add_plugin_config(
|
||||||
"draw_card",
|
"draw_card",
|
||||||
|
|||||||
150
plugins/draw_card/handles/ba_handle.py
Normal file
150
plugins/draw_card/handles/ba_handle.py
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
import random
|
||||||
|
from lxml import etree
|
||||||
|
from typing import List, Tuple
|
||||||
|
from PIL import ImageDraw
|
||||||
|
from urllib.parse import unquote
|
||||||
|
from nonebot.log import logger
|
||||||
|
|
||||||
|
from .base_handle import BaseHandle, BaseData
|
||||||
|
from ..config import draw_config
|
||||||
|
from ..util import remove_prohibited_str, cn2py, load_font
|
||||||
|
from utils.image_utils import BuildImage
|
||||||
|
|
||||||
|
|
||||||
|
class BaChar(BaseData):
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
class BaHandle(BaseHandle[BaChar]):
|
||||||
|
def __init__(self):
|
||||||
|
super().__init__("ba", "碧蓝档案")
|
||||||
|
self.max_star = 3
|
||||||
|
self.config = draw_config.ba
|
||||||
|
self.ALL_CHAR: List[BaChar] = []
|
||||||
|
|
||||||
|
def get_card(self, mode: int = 1) -> BaChar:
|
||||||
|
if mode == 2:
|
||||||
|
star = self.get_star(
|
||||||
|
[3, 2], [self.config.BA_THREE_P, self.config.BA_G_TWO_P]
|
||||||
|
)
|
||||||
|
else:
|
||||||
|
star = self.get_star(
|
||||||
|
[3, 2, 1],
|
||||||
|
[self.config.BA_THREE_P, self.config.BA_TWO_P, self.config.BA_ONE_P],
|
||||||
|
)
|
||||||
|
chars = [x for x in self.ALL_CHAR if x.star == star and not x.limited]
|
||||||
|
return random.choice(chars)
|
||||||
|
|
||||||
|
def get_cards(self, count: int, **kwargs) -> List[Tuple[BaChar, int]]:
|
||||||
|
card_list = []
|
||||||
|
card_count = 0 # 保底计算
|
||||||
|
for i in range(count):
|
||||||
|
card_count += 1
|
||||||
|
# 十连保底
|
||||||
|
if card_count == 10:
|
||||||
|
card = self.get_card(2)
|
||||||
|
card_count = 0
|
||||||
|
else:
|
||||||
|
card = self.get_card(1)
|
||||||
|
if card.star > self.max_star - 2:
|
||||||
|
card_count = 0
|
||||||
|
card_list.append((card, i + 1))
|
||||||
|
return card_list
|
||||||
|
|
||||||
|
def generate_card_img(self, card: BaChar) -> BuildImage:
|
||||||
|
sep_w = 5
|
||||||
|
sep_h = 5
|
||||||
|
star_h = 15
|
||||||
|
img_w = 90
|
||||||
|
img_h = 100
|
||||||
|
font_h = 20
|
||||||
|
bar_h = 20
|
||||||
|
bar_w = 90
|
||||||
|
bg = BuildImage(img_w + sep_w * 2, img_h + font_h + sep_h * 2, color="#EFF2F5")
|
||||||
|
img_path = str(self.img_path / f"{cn2py(card.name)}.png")
|
||||||
|
img = BuildImage(img_w, img_h, background=img_path)
|
||||||
|
bar = BuildImage(bar_w, bar_h, color="#6495ED")
|
||||||
|
bg.paste(img, (sep_w, sep_h), alpha=True)
|
||||||
|
bg.paste(bar, (sep_w, img_h - bar_h + sep_h), alpha=True)
|
||||||
|
if (card.star == 1):
|
||||||
|
star_path = str(self.img_path / "star-1.png")
|
||||||
|
star_w = 15
|
||||||
|
elif (card.star == 2):
|
||||||
|
star_path = str(self.img_path / "star-2.png")
|
||||||
|
star_w = 30
|
||||||
|
else:
|
||||||
|
star_path = str(self.img_path / "star-3.png")
|
||||||
|
star_w = 45
|
||||||
|
star = BuildImage(star_w, star_h, background=star_path)
|
||||||
|
bg.paste(star, (img_w // 2 - 15 * (card.star - 1) // 2, img_h - star_h), alpha=True)
|
||||||
|
text = card.name[:5] + "..." if len(card.name) > 6 else card.name
|
||||||
|
font = load_font(fontsize=14)
|
||||||
|
text_w, text_h = font.getsize(text)
|
||||||
|
draw = ImageDraw.Draw(bg.markImg)
|
||||||
|
draw.text(
|
||||||
|
(sep_w + (img_w - text_w) / 2, sep_h + img_h + (font_h - text_h) / 2),
|
||||||
|
text,
|
||||||
|
font=font,
|
||||||
|
fill="gray",
|
||||||
|
)
|
||||||
|
return bg
|
||||||
|
|
||||||
|
def _init_data(self):
|
||||||
|
self.ALL_CHAR = [
|
||||||
|
BaChar(
|
||||||
|
name=value["名称"],
|
||||||
|
star=int(value["星级"]),
|
||||||
|
limited=True if "(" in key else False,
|
||||||
|
)
|
||||||
|
for key, value in self.load_data().items()
|
||||||
|
]
|
||||||
|
|
||||||
|
def title2star(self, title: int):
|
||||||
|
if title == 'Star-3.png':
|
||||||
|
return 3
|
||||||
|
elif title == 'Star-2.png':
|
||||||
|
return 2
|
||||||
|
else:
|
||||||
|
return 1
|
||||||
|
|
||||||
|
async def _update_info(self):
|
||||||
|
info = {}
|
||||||
|
url = "https://wiki.biligame.com/bluearchive/学生筛选"
|
||||||
|
result = await self.get_url(url)
|
||||||
|
if not result:
|
||||||
|
logger.warning(f"更新 {self.game_name_cn} 出错")
|
||||||
|
return
|
||||||
|
else:
|
||||||
|
dom = etree.HTML(result, etree.HTMLParser())
|
||||||
|
char_list = dom.xpath("//div[@class='filters']/table[2]/tbody/tr")
|
||||||
|
for char in char_list:
|
||||||
|
try:
|
||||||
|
name = char.xpath("./td[2]/a/div/text()")[0]
|
||||||
|
avatar = char.xpath("./td[1]/div/div/a/img/@data-src")[0]
|
||||||
|
star_pic = char.xpath("./td[4]/img/@alt")[0]
|
||||||
|
except IndexError:
|
||||||
|
continue
|
||||||
|
member_dict = {
|
||||||
|
"头像": unquote(str(avatar)),
|
||||||
|
"名称": remove_prohibited_str(name),
|
||||||
|
"星级": self.title2star(star_pic),
|
||||||
|
}
|
||||||
|
info[member_dict["名称"]] = member_dict
|
||||||
|
self.dump_data(info)
|
||||||
|
logger.info(f"{self.game_name_cn} 更新成功")
|
||||||
|
# 下载头像
|
||||||
|
for value in info.values():
|
||||||
|
await self.download_img(value["头像"], value["名称"])
|
||||||
|
# 下载星星
|
||||||
|
await self.download_img(
|
||||||
|
"https://patchwiki.biligame.com/images/bluearchive/thumb/e/e0/82nj2x9sxko473g7782r14fztd4zyky.png/15px-Star-1.png",
|
||||||
|
"star-1",
|
||||||
|
)
|
||||||
|
await self.download_img(
|
||||||
|
"https://patchwiki.biligame.com/images/bluearchive/thumb/0/0b/msaff2g0zk6nlyl1rrn7n1ri4yobcqc.png/30px-Star-2.png",
|
||||||
|
"star-2",
|
||||||
|
)
|
||||||
|
await self.download_img(
|
||||||
|
"https://patchwiki.biligame.com/images/bluearchive/thumb/8/8a/577yv79x1rwxk8efdccpblo0lozl158.png/46px-Star-3.png",
|
||||||
|
"star-3"
|
||||||
|
)
|
||||||
Loading…
Reference in New Issue
Block a user