From e4d5a230d2f86e207b1f038b5a3f195e0f5993ec Mon Sep 17 00:00:00 2001 From: mouhensama <1365197927wuhen@gmail.com> Date: Wed, 25 May 2022 11:47:08 +0800 Subject: [PATCH] =?UTF-8?q?=E6=8A=8Anonebot=5Fplugin=5Fgamedraw=E7=9A=84ba?= =?UTF-8?q?=E5=8D=A1=E6=B1=A0=E6=90=AC=E8=BF=90=E4=BA=86=E8=BF=87=E6=9D=A5?= =?UTF-8?q?=E5=B9=B6=E4=B8=94=E8=BF=9B=E8=A1=8C=E4=BA=86=E7=9C=9F=E5=AF=BB?= =?UTF-8?q?=E7=9A=84=E9=80=82=E9=85=8D=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- plugins/draw_card/__init__.py | 13 ++- plugins/draw_card/config.py | 11 +- plugins/draw_card/handles/ba_handle.py | 150 +++++++++++++++++++++++++ 3 files changed, 171 insertions(+), 3 deletions(-) create mode 100644 plugins/draw_card/handles/ba_handle.py diff --git a/plugins/draw_card/__init__.py b/plugins/draw_card/__init__.py index 22bae7975..73b4a84ca 100644 --- a/plugins/draw_card/__init__.py +++ b/plugins/draw_card/__init__.py @@ -23,6 +23,7 @@ from .handles.pcr_handle import PcrHandle from .handles.pretty_handle import PrettyHandle from .handles.prts_handle import PrtsHandle +from .handles.ba_handle import BaHandle from .config import draw_config @@ -30,7 +31,7 @@ __zx_plugin_name__ = "游戏抽卡" __plugin_usage__ = """ usage: - 模拟赛马娘,原神,明日方舟,坎公骑冠剑,公主连结(国/台),碧蓝航线,FGO,阴阳师进行抽卡 + 模拟赛马娘,原神,明日方舟,坎公骑冠剑,公主连结(国/台),碧蓝航线,FGO,阴阳师,碧蓝档案进行抽卡 指令: 原神[1-180]抽: 原神常驻池 原神角色[1-180]抽: 原神角色UP池子 @@ -43,6 +44,7 @@ 碧蓝航线/碧蓝[重型/轻型/特型/活动][1-300]抽: 碧蓝航线重型/轻型/特型/活动卡池 fgo[1-300]抽: fgo卡池 阴阳师[1-300]抽: 阴阳师卡池 + ba/碧蓝档案[1-200]抽:碧蓝档案卡池 * 以上指令可以通过 XX一井 来指定最大抽取数量 * * 示例:原神一井 * """.strip() @@ -73,6 +75,7 @@ "pcr/公主连接[1-300]抽", "fgo[1-300]抽", "阴阳师[1-300]抽", + "碧蓝档案[1-200]抽", "更新方舟信息 [_superuser]", "重载方舟卡池 [_superuser]", "更新原神信息 [_superuser]", @@ -83,6 +86,7 @@ "更新碧蓝航线信息 [_superuser]", "更新fgo信息 [_superuser]", "更新阴阳师信息 [_superuser]", + "更新碧蓝档案信息 [_superuser]", ] __plugin_type__ = ("抽卡相关", 1) __plugin_version__ = 0.1 @@ -105,7 +109,7 @@ class Game: games = ( - Game({"azur", "碧蓝", "碧蓝航线"}, AzurHandle(), draw_config.AZUR_FLAG), + Game({"azur", "碧蓝航线"}, AzurHandle(), draw_config.AZUR_FLAG), Game({"fgo", "命运冠位指定"}, FgoHandle(), draw_config.FGO_FLAG), Game( {"genshin", "原神"}, @@ -130,6 +134,11 @@ class Game: reload_time=4, ), Game({"prts", "方舟", "明日方舟"}, PrtsHandle(), draw_config.PRTS_FLAG, reload_time=4), + Game( + {"ba","碧蓝档案"},BaHandle(), + draw_config.BA_FLAG, + max_count=200, + ), ) diff --git a/plugins/draw_card/config.py b/plugins/draw_card/config.py index 71500f8e4..742cc5156 100644 --- a/plugins/draw_card/config.py +++ b/plugins/draw_card/config.py @@ -87,6 +87,12 @@ class OnmyojiConfig(BaseModel, extra=Extra.ignore): ONMYOJI_SR: float = 0.2 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): # 开关 @@ -98,6 +104,7 @@ class Config(BaseModel, extra=Extra.ignore): AZUR_FLAG: bool = AConfig.get_config("draw_card", "AZUR_FLAG") FGO_FLAG: bool = AConfig.get_config("draw_card", "FGO_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") @@ -112,6 +119,7 @@ class Config(BaseModel, extra=Extra.ignore): azur: AzurConfig = AzurConfig() fgo: FgoConfig = FgoConfig() onmyoji: OnmyojiConfig = OnmyojiConfig() + ba: BaConfig = BaConfig() driver = nonebot.get_driver() @@ -133,8 +141,9 @@ class Config(BaseModel, extra=Extra.ignore): "FGO_FLAG", "ONMYOJI_FLAG", "PCR_TAI", + "BA_FLAG" ], - ["明日方舟", "原神", "赛马娘", "坎公骑冠剑", "公主连结", "碧蓝航线", "命运-冠位指定(FGO)", "阴阳师", "pcr台服卡池"], + ["明日方舟", "原神", "赛马娘", "坎公骑冠剑", "公主连结", "碧蓝航线", "命运-冠位指定(FGO)", "阴阳师", "pcr台服卡池","碧蓝档案"], ): AConfig.add_plugin_config( "draw_card", diff --git a/plugins/draw_card/handles/ba_handle.py b/plugins/draw_card/handles/ba_handle.py new file mode 100644 index 000000000..7a1cfb424 --- /dev/null +++ b/plugins/draw_card/handles/ba_handle.py @@ -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" + ) \ No newline at end of file