diff --git a/getImg.py b/getImg.py deleted file mode 100644 index 5b73c0f3..00000000 --- a/getImg.py +++ /dev/null @@ -1,1348 +0,0 @@ -import time,re -from base64 import b64encode -from io import BytesIO - -import urllib -import math -import threading -import requests -from wordcloud import WordCloud -import numpy as np - -from PIL import Image, ImageDraw, ImageFont, ImageFilter - -from .getDB import GetInfo,GetCharacter,GetSpiralAbyssInfo,GetMysInfo,errorDB,cacheDB,OwnerCookies,GetGenshinEvent - -import os -import json -import random - -FILE_PATH = os.path.dirname(__file__) -FILE2_PATH = os.path.join(FILE_PATH,'mys') -CHAR_PATH = os.path.join(FILE2_PATH,'chars') -CHAR_DONE_PATH = os.path.join(FILE2_PATH,'char_done') -CHAR_IMG_PATH = os.path.join(FILE2_PATH,'char_img') -REL_PATH = os.path.join(FILE2_PATH,'reliquaries') -CHAR_WEAPON_PATH = os.path.join(FILE2_PATH,'char_weapon') -TEXT_PATH = os.path.join(FILE2_PATH,'texture2d') -WEAPON_PATH = os.path.join(FILE2_PATH,'weapon') -BG_PATH = os.path.join(FILE2_PATH,'bg') - -def ys_font(size): - return ImageFont.truetype(os.path.join(FILE2_PATH,"yuanshen.ttf"), size=size) - -def get_char_pic(id,url): - urllib.request.urlretrieve(f'{url}', os.path.join(CHAR_PATH,f'{id}.png')) - -def get_chardone_pic(id,url,star): - urllib.request.urlretrieve(f'{url}', os.path.join(CHAR_DONE_PATH,f'{id}.png')) - char_path = os.path.join(CHAR_DONE_PATH,f'{id}.png') - if star == 4: - star4_1_path = os.path.join(TEXT_PATH,'4star_1.png') - star4_2_path = os.path.join(TEXT_PATH,'4star_2.png') - star4_1 = Image.open(star4_1_path) - star4_2 = Image.open(star4_2_path) - char_path = os.path.join(CHAR_DONE_PATH,str(id) + '.png') - char_img = Image.open(char_path) - char_img = char_img.resize((104,104),Image.ANTIALIAS) - star4_1.paste(char_img,(12,15),char_img) - star4_1.paste(star4_2,(0,0),star4_2) - star4_1.save(os.path.join(CHAR_DONE_PATH,str(id) + '.png')) - else: - star5_1_path = os.path.join(TEXT_PATH,'5star_1.png') - star5_2_path = os.path.join(TEXT_PATH,'5star_2.png') - star5_1 = Image.open(star5_1_path) - star5_2 = Image.open(star5_2_path) - char_path = os.path.join(CHAR_DONE_PATH,str(id) + '.png') - char_img = Image.open(char_path) - char_img = char_img.resize((104,104),Image.ANTIALIAS) - star5_1.paste(char_img,(12,15),char_img) - star5_1.paste(star5_2,(0,0),star5_2) - star5_1.save(os.path.join(CHAR_DONE_PATH,str(id) + '.png')) - -def get_weapon_pic(url): - urllib.request.urlretrieve(url, os.path.join(WEAPON_PATH, url.split('/')[-1])) - -def get_charimg_pic(url): - urllib.request.urlretrieve(url, os.path.join(CHAR_IMG_PATH, url.split('/')[-1])) - -def get_rel_pic(url): - urllib.request.urlretrieve(url, os.path.join(REL_PATH, url.split('/')[-1])) - -async def draw_wordcloud(uid,image = None,mode = 2): - while 1: - use_cookies = cacheDB(uid,mode-1) - if use_cookies == '': - return "绑定记录不存在。" - elif use_cookies == "没有可以使用的Cookies!": - return "没有可以使用的Cookies!" - - if mode == 3: - mys_data = await GetMysInfo(uid,use_cookies) - mysid_data = uid - for i in mys_data['data']['list']: - if i['game_id'] != 2: - mys_data['data']['list'].remove(i) - uid = mys_data['data']['list'][0]['game_role_id'] - nickname = mys_data['data']['list'][0]['nickname'] - role_level = mys_data['data']['list'][0]['level'] - raw_data = await GetInfo(uid,use_cookies) - raw_Abyss_data = await GetSpiralAbyssInfo(uid,use_cookies) - else: - raw_Abyss_data = await GetSpiralAbyssInfo(uid,use_cookies) - raw_data = await GetInfo(uid,use_cookies) - - if (raw_data["retcode"] != 0): - if (raw_data["retcode"] == 10001): - #return ("Cookie错误/过期,请重置Cookie") - errorDB(use_cookies,"error") - elif (raw_data["retcode"] == 10101): - #return ("当前cookies已达到30人上限!") - errorDB(use_cookies,"limit30") - elif (raw_data["retcode"] == 10102): - return ("当前查询id已经设置了隐私,无法查询!") - else: - return ( - "Api报错,返回内容为:\r\n" - + str(raw_data) + "\r\n出现这种情况可能的UID输入错误 or 不存在" - ) - else: - break - - raw_Abyss_data = raw_Abyss_data['data'] - raw_data = raw_data['data'] - - char_data = raw_data["avatars"] - char_num = len(raw_data["avatars"]) - - char_datas = [] - def get_charid(start,end): - for i in range(start,end): - char_rawdata = GetCharacter(uid,[i],use_cookies) - - if char_rawdata["retcode"] == -1: - pass - else: - char_datas.append(char_rawdata["data"]['avatars'][0]) - - thread_list = [] - st = 8 - for i in range(0,8): - thread = threading.Thread(target = get_charid,args = (10000002+i*st,10000002+(i+1)*st)) - thread_list.append(thread) - - for t in thread_list: - t.setDaemon(True) - t.start() - - for t in thread_list: - t.join() - - weapons_datas = [] - for i in char_datas: - weapons_datas.append(i['weapon']) - - l1_size = 2 - l2_size = 4 - l3_size = 6 - l4_size = 7 - l5_size = 10 - - word_str = {} - - star4weapon = 0 - star5weapon = 0 - star5weaponcon = 0 - star3weapon = 0 - for i in weapons_datas: - if i['rarity'] == 5: - star5weapon += 1 - star5weaponcon += i['affix_level'] - elif i['rarity'] == 4: - star4weapon += 1 - elif i['rarity'] == 3: - star4weapon += 1 - - g3d1 = 0 - ly3c = 0 - star5num = 0 - star5numcon = 0 - - for i in char_datas: - if i["name"] in ['雷电将军','温迪','钟离','枫原万叶']: - g3d1 += 1 - if i["name"] in ['甘雨','魈','胡桃']: - ly3c += 1 - if i['rarity'] == 5: - star5num += 1 - if i['name'] != '旅行者': - star5numcon += 1 + i['actived_constellation_num'] - - if i["level"] >= 80: - if i['name'] == "迪卢克": - word_str["落魄了家人们"] = l3_size - if i['name'] == "刻晴": - word_str["斩尽牛杂"] = l3_size - if i['name'] == "旅行者": - word_str["旅行者真爱党"] = l3_size - - if i['actived_constellation_num'] == 6: - if i['rarity'] == 5: - if i['name'] == "旅行者": - word_str["满命{}".format(i['name'])] = l1_size - if i['name'] == "魈": - word_str['魈深氪的救赎'] = l5_size - if i['name'] == "甘雨": - word_str['璃月自走归终机'] = l5_size - if i['name'] == "胡桃": - word_str['一波送走全送走'] = l5_size - else: - word_str["满命{}".format(i['name'])] = l5_size - else: - word_str["满命{}".format(i['name'])] = l2_size - - game_time = time.mktime(time.strptime('20200915','%Y%m%d')) - now_time = time.time() - total_s = now_time - game_time - total_d = (((total_s)/60)/60)/24 - - if math.floor(total_d) - 5 <= raw_data['stats']['active_day_number']: - word_str["开服玩家"] = l4_size - - if g3d1 >= 4: - word_str["三神一帝"] = l3_size - if ly3c >= 3: - word_str["璃月3C"] = l3_size - if star5num >= 16: - word_str["五星众多"] = l3_size - - if len(weapons_datas) - star4weapon <= 3: - word_str["武器基本四星"] = l3_size - - if raw_data['stats']['achievement_number'] // (star5weaponcon + star5numcon) >= 23: - word_str["平民玩家"] = l2_size - elif raw_data['stats']['achievement_number'] // (star5weaponcon + star5numcon) <= 15: - word_str["氪金玩家"] = l3_size - - if raw_data['stats']['anemoculus_number'] + raw_data['stats']['geoculus_number'] + raw_data['stats']['electroculus_number'] == 378: - word_str["全神瞳"] = l2_size - if raw_data['world_explorations'][3]['exploration_percentage']+raw_data['world_explorations'][2]['exploration_percentage']+raw_data['world_explorations'][1]['exploration_percentage']+raw_data['world_explorations'][0]['exploration_percentage'] >= 3950: - word_str["全探索"] = l4_size - if raw_data['stats']['achievement_number'] >= 510: - word_str["全成就"] = l5_size - elif raw_data['stats']['achievement_number'] >= 490: - word_str["成就达人"] = l3_size - if raw_data['stats']['spiral_abyss'] == '12-3': - word_str["深境的探究者"] = l2_size - if len(raw_data['avatars']) >= 42: - word_str["全角色"] = l3_size - - if raw_data['stats']['active_day_number'] <= 40: - word_str["刚入坑"] = l1_size - elif raw_data['stats']['active_day_number'] <= 100: - word_str["初心者"] = l2_size - elif raw_data['stats']['active_day_number'] <= 300: - word_str["老玩家"] = l2_size - if raw_data['stats']['active_day_number'] >=365 and raw_data['stats']['magic_chest_number'] + raw_data['stats']['common_chest_number']+raw_data['stats']['exquisite_chest_number']+raw_data['stats']['precious_chest_number']+raw_data['stats']['luxurious_chest_number'] <=2500: - word_str["老咸鱼"] = l3_size - if raw_data['stats']['magic_chest_number'] >= 46: - word_str["迷失在黑夜里"] = l2_size - if raw_data['homes'][0]['comfort_num'] >= 25000: - word_str["团雀附体"] = l2_size - - if raw_Abyss_data["reveal_rank"] != []: - if raw_Abyss_data['total_battle_times'] <= 12 and raw_Abyss_data['max_floor'] == '12-3': - word_str["PVP资格证"] = l4_size - if raw_Abyss_data["damage_rank"][0]["value"] >= 150000: - word_str["这一击,贯穿星辰"] = l4_size - else: - pass - - bg_list = random.choice([x for x in os.listdir(BG_PATH) - if os.path.isfile(os.path.join(BG_PATH, x))]) - - bg2_path = os.path.join(BG_PATH,bg_list) - - based_w = 900 - based_h = 1000 - based_scale = '%.3f' % (based_w/based_h) - - is_edit = False - if image: - image_file= image.group(1) - image_data = image.group(2) - urllib.request.urlretrieve(f'{image_data}', os.path.join(TEXT_PATH,nickname + '.png')) - is_edit = True - - if is_edit == True: - bg_path_edit = os.path.join(TEXT_PATH,f"{nickname}.png") - else: - bg_path_edit = bg2_path - - edit_bg = Image.open(bg_path_edit) - w, h = edit_bg.size - scale_f = '%.3f' % (w / h) - new_w = math.ceil(based_h*float(scale_f)) - new_h = math.ceil(based_w/float(scale_f)) - if scale_f > based_scale: - bg_img2 = edit_bg.resize((new_w, based_h),Image.ANTIALIAS) - else: - bg_img2 = edit_bg.resize((based_w, new_h),Image.ANTIALIAS) - - bg_img = bg_img2.crop((0, 0, based_w, based_h)) - - x, y = 50, 153 - radius = 50 - cropped_img = bg_img.crop((x, y, x+800, y+800)) - blurred_img = cropped_img.filter(ImageFilter.GaussianBlur(5),).convert("RGBA") - bg_img.paste(blurred_img, (x, y), create_rounded_rectangle_mask(cropped_img,radius)) - - panle = Image.open(os.path.join(TEXT_PATH,'wordcloud_0.png')) - - mask = np.array(Image.open(os.path.join(TEXT_PATH,'wordcloudmask.png'))) - - wc = WordCloud( - font_path = os.path.join(FILE2_PATH,"yuanshen.ttf"), - mask = mask, - background_color="rgba(255, 255, 255, 0)", - mode="RGBA", - max_words=200, - max_font_size=80 - #color_func=multi_color_func - #color_func=similar_color_func - ).generate_from_frequencies(word_str, max_font_size=100) - - image_produce = wc.to_image() - - bg_img.paste(panle,(0,0),panle) - bg_img.paste(image_produce,(0,0),image_produce) - bg_img = bg_img.convert('RGB') - - text_draw = ImageDraw.Draw(bg_img) - text_draw.text((450, 105), 'UID ' + f"{uid}", (40,136,168), ys_font(26), anchor="mm") - - result_buffer = BytesIO() - bg_img.save(result_buffer, format='JPEG', subsampling=0, quality=90) - imgmes = 'base64://' + b64encode(result_buffer.getvalue()).decode() - resultmes = f"[CQ:image,file={imgmes}]" - return resultmes - -def similar_color_func(word=None, font_size=None, - position=None, orientation=None, - font_path=None, random_state=None): - h = 40 # 0 - 360 - s = 100 # 0 - 100 - l = random_state.randint(30, 70) # 0 - 100 - return "hsl({}, {}%, {}%)".format(h, s, l) - -def multi_color_func(word=None, font_size=None, - position=None, orientation=None, - font_path=None, random_state=None): - colors = [[4, 77, 82], - [25, 74, 85], - [82, 43, 84], - [158, 48, 79]] - rand = random_state.randint(0, len(colors) - 1) - return "hsl({}, {}%, {}%)".format(colors[rand][0], colors[rand][1], colors[rand][2]) - -async def draw_abyss0_pic(uid,nickname,image = None,mode = 2,date = "1"): - while 1: - use_cookies = cacheDB(uid,mode-1) - if use_cookies == '': - return "绑定记录不存在。" - elif use_cookies == "没有可以使用的Cookies!": - return "没有可以使用的Cookies!" - - if mode == 3: - mys_data = await GetMysInfo(uid,use_cookies) - mysid_data = uid - for i in mys_data['data']['list']: - if i['game_id'] != 2: - mys_data['data']['list'].remove(i) - uid = mys_data['data']['list'][0]['game_role_id'] - nickname = mys_data['data']['list'][0]['nickname'] - #role_region = mys_data['data']['list'][0]['region'] - role_level = mys_data['data']['list'][0]['level'] - - raw_data = await GetSpiralAbyssInfo(uid,use_cookies,date) - raw_char_data = await GetInfo(uid,use_cookies) - - if (raw_data["retcode"] != 0): - if (raw_data["retcode"] == 10001): - #return ("Cookie错误/过期,请重置Cookie") - errorDB(use_cookies,"error") - elif (raw_data["retcode"] == 10101): - #return ("当前cookies已达到30人上限!") - errorDB(use_cookies,"limit30") - elif (raw_data["retcode"] == 10102): - return ("当前查询id已经设置了隐私,无法查询!") - else: - return ( - "Api报错,返回内容为:\r\n" - + str(raw_data) + "\r\n出现这种情况可能的UID输入错误 or 不存在" - ) - else: - break - - raw_data = raw_data["data"] - raw_char_data = raw_char_data['data']["avatars"] - - is_edit = False - if image != None: - image_file= image.group(1) - image_data = image.group(2) - urllib.request.urlretrieve(f'{image_data}', os.path.join(TEXT_PATH,nickname + '.png')) - is_edit = True - - bg_list = random.choice([x for x in os.listdir(BG_PATH) - if os.path.isfile(os.path.join(BG_PATH, x))]) - - bg2_path = os.path.join(BG_PATH,bg_list) - - abyss0_path = os.path.join(TEXT_PATH,"abyss_0.png") - abyss2_path = os.path.join(TEXT_PATH,"abyss_2.png") - abyss3_path = os.path.join(TEXT_PATH,"abyss_3.png") - abyss_star0_path = os.path.join(TEXT_PATH,"abyss_star0.png") - abyss_star1_path = os.path.join(TEXT_PATH,"abyss_star1.png") - - floors_data = raw_data['floors'][-1] - levels_num = len(floors_data['levels']) - - based_w = 900 - based_h = 660+levels_num*315 - based_scale = '%.3f' % (based_w/based_h) - - if is_edit == True: - bg_path_edit = os.path.join(TEXT_PATH,f"{nickname}.png") - else: - bg_path_edit = bg2_path - - edit_bg = Image.open(bg_path_edit) - w, h = edit_bg.size - scale_f = '%.3f' % (w / h) - new_w = math.ceil(based_h*float(scale_f)) - new_h = math.ceil(based_w/float(scale_f)) - if scale_f > based_scale: - bg_img2 = edit_bg.resize((new_w, based_h),Image.ANTIALIAS) - else: - bg_img2 = edit_bg.resize((based_w, new_h),Image.ANTIALIAS) - - bg_img = bg_img2.crop((0, 0, based_w, based_h)) - - x1, y1 = 65, 276 - radius = 15 - cropped_img1 = bg_img.crop((x1, y1, 836, 607)) - blurred_img1 = cropped_img1.filter(ImageFilter.GaussianBlur(5),).convert("RGBA") - bg_img.paste(blurred_img1, (x1, y1), create_rounded_rectangle_mask(cropped_img1,radius)) - - for i in range(0,len(floors_data['levels'])): - x2, y2 = 65, 630 + 315*i - radius = 15 - cropped_img2 = bg_img.crop((x2, y2, 836, 925+315*i)) - blurred_img2 = cropped_img2.filter(ImageFilter.GaussianBlur(5),).convert("RGBA") - bg_img.paste(blurred_img2, (x2, y2), create_rounded_rectangle_mask(cropped_img2,radius)) - - abyss0 = Image.open(abyss0_path) - abyss3 = Image.open(abyss3_path) - abyss_star0 = Image.open(abyss_star0_path) - abyss_star1 = Image.open(abyss_star1_path) - - for i in range(0,4): - if not os.path.exists(os.path.join(CHAR_DONE_PATH,str(raw_data["reveal_rank"][i]["avatar_id"]) + ".png")): - get_chardone_pic(raw_data["reveal_rank"][i]["avatar_id"],raw_data["reveal_rank"][i]["avatar_icon"],raw_data["reveal_rank"][i]["rarity"]) - char = os.path.join(CHAR_DONE_PATH,str(raw_data["reveal_rank"][i]["avatar_id"]) + ".png") - char_img = Image.open(char) - char_draw = ImageDraw.Draw(char_img) - for k in raw_char_data: - if k['id'] == raw_data["reveal_rank"][i]["avatar_id"]: - char_draw.text((63.5,117),f'{str(raw_data["reveal_rank"][i]["value"])}次',(21,21,21),ys_font(18), anchor="mm") - char_draw.text((95.3,19),f'{str(k["actived_constellation_num"])}','white',ys_font(18)) - if str(k["fetter"]) == "10" or str(k["name"]) == "旅行者": - char_draw.text((93,41.5),"♥",(21,21,21),ys_font(15)) - else: - char_draw.text((95.3,40.5),f'{str(k["fetter"])}',(21,21,21),ys_font(18)) - char_crop = (82 + 130*i,300) - abyss0.paste(char_img,char_crop,char_img) - - for i in range(0,1): - if not os.path.exists(os.path.join(CHAR_DONE_PATH,str(raw_data["damage_rank"][i]["avatar_id"]) + ".png")): - get_chardone_pic(raw_data["damage_rank"][i]["avatar_id"],raw_data["damage_rank"][i]["avatar_icon"],raw_data["reveal_rank"][i]["rarity"]) - char = os.path.join(CHAR_DONE_PATH,str(raw_data["damage_rank"][i]["avatar_id"]) + ".png") - char_img = Image.open(char) - char_draw = ImageDraw.Draw(char_img) - for k in raw_char_data: - if k['id'] == raw_data["damage_rank"][i]["avatar_id"]: - char_draw.text((63.5,117),f'{str(raw_data["damage_rank"][i]["value"])}',(21,21,21),ys_font(18), anchor="mm") - char_draw.text((95.3,19),f'{str(k["actived_constellation_num"])}','white',ys_font(18)) - if str(k["fetter"]) == "10" or str(k["name"]) == "旅行者": - char_draw.text((93,41.5),"♥",(21,21,21),ys_font(15)) - else: - char_draw.text((95.3,40.5),f'{str(k["fetter"])}',(21,21,21),ys_font(18)) - char_crop = (685,470) - abyss0.paste(char_img,char_crop,char_img) - - for i in range(0,1): - if not os.path.exists(os.path.join(CHAR_DONE_PATH,str(raw_data["defeat_rank"][i]["avatar_id"]) + ".png")): - get_chardone_pic(raw_data["defeat_rank"][i]["avatar_id"],raw_data["defeat_rank"][i]["avatar_icon"],raw_data["reveal_rank"][i]["rarity"]) - char = os.path.join(CHAR_DONE_PATH,str(raw_data["defeat_rank"][i]["avatar_id"]) + ".png") - char_img = Image.open(char) - char_draw = ImageDraw.Draw(char_img) - for k in raw_char_data: - if k['id'] == raw_data["defeat_rank"][i]["avatar_id"]: - char_draw.text((63.5,117),f'{str(raw_data["defeat_rank"][i]["value"])}',(21,21,21),ys_font(18), anchor="mm") - char_draw.text((95.3,19),f'{str(k["actived_constellation_num"])}','white',ys_font(18)) - if str(k["fetter"]) == "10" or str(k["name"]) == "旅行者": - char_draw.text((93,41.5),"♥",(21,21,21),ys_font(15)) - else: - char_draw.text((95.3,40.5),f'{str(k["fetter"])}',(21,21,21),ys_font(18)) - char_crop = (82 + 123*i,470) - abyss0.paste(char_img,char_crop,char_img) - - for i in range(0,1): - if not os.path.exists(os.path.join(CHAR_DONE_PATH,str(raw_data["take_damage_rank"][i]["avatar_id"]) + ".png")): - get_chardone_pic(raw_data["take_damage_rank"][i]["avatar_id"],raw_data["take_damage_rank"][i]["avatar_icon"],raw_data["reveal_rank"][i]["rarity"]) - char = os.path.join(CHAR_DONE_PATH,str(raw_data["take_damage_rank"][i]["avatar_id"]) + ".png") - char_img = Image.open(char) - char_draw = ImageDraw.Draw(char_img) - for k in raw_char_data: - if k['id'] == raw_data["take_damage_rank"][i]["avatar_id"]: - char_draw.text((63.5,117),f'{str(raw_data["take_damage_rank"][i]["value"])}',(21,21,21),ys_font(18), anchor="mm") - char_draw.text((95.3,19),f'{str(k["actived_constellation_num"])}','white',ys_font(18)) - if str(k["fetter"]) == "10" or str(k["name"]) == "旅行者": - char_draw.text((93,41.5),"♥",(21,21,21),ys_font(15)) - else: - char_draw.text((95.3,40.5),f'{str(k["fetter"])}',(21,21,21),ys_font(18)) - char_crop = (232 + 123*i,470) - abyss0.paste(char_img,char_crop,char_img) - - for i in range(0,1): - if not os.path.exists(os.path.join(CHAR_DONE_PATH,str(raw_data["normal_skill_rank"][i]["avatar_id"]) + ".png")): - get_chardone_pic(raw_data["normal_skill_rank"][i]["avatar_id"],raw_data["normal_skill_rank"][i]["avatar_icon"],raw_data["reveal_rank"][i]["rarity"]) - char = os.path.join(CHAR_DONE_PATH,str(raw_data["normal_skill_rank"][i]["avatar_id"]) + ".png") - char_img = Image.open(char) - char_draw = ImageDraw.Draw(char_img) - for k in raw_char_data: - if k['id'] == raw_data["normal_skill_rank"][i]["avatar_id"]: - char_draw.text((63.5,117),f'{str(raw_data["normal_skill_rank"][i]["value"])}',(21,21,21),ys_font(18), anchor="mm") - char_draw.text((95.3,19),f'{str(k["actived_constellation_num"])}','white',ys_font(18)) - if str(k["fetter"]) == "10" or str(k["name"]) == "旅行者": - char_draw.text((93,41.5),"♥",(21,21,21),ys_font(15)) - else: - char_draw.text((95.3,40.5),f'{str(k["fetter"])}',(21,21,21),ys_font(18)) - char_crop = (382 + 123*i,470) - abyss0.paste(char_img,char_crop,char_img) - - for i in range(0,1): - if not os.path.exists(os.path.join(CHAR_DONE_PATH,str(raw_data["energy_skill_rank"][i]["avatar_id"]) + ".png")): - get_chardone_pic(raw_data["energy_skill_rank"][i]["avatar_id"],raw_data["energy_skill_rank"][i]["avatar_icon"],raw_data["reveal_rank"][i]["rarity"]) - char = os.path.join(CHAR_DONE_PATH,str(raw_data["energy_skill_rank"][i]["avatar_id"]) + ".png") - char_img = Image.open(char) - char_draw = ImageDraw.Draw(char_img) - for k in raw_char_data: - if k['id'] == raw_data["energy_skill_rank"][i]["avatar_id"]: - char_draw.text((63.5,118),f'{str(raw_data["energy_skill_rank"][i]["value"])}',(21,21,21),ys_font(18), anchor="mm") - char_draw.text((95.3,19),f'{str(k["actived_constellation_num"])}','white',ys_font(18)) - if str(k["fetter"]) == "10" or str(k["name"]) == "旅行者": - char_draw.text((93,41.5),"♥",(21,21,21),ys_font(15)) - else: - char_draw.text((95.3,40.5),f'{str(k["fetter"])}',(21,21,21),ys_font(18)) - char_crop = (532 + 123*i,470) - abyss0.paste(char_img,char_crop,char_img) - - bg_img.paste(abyss0,(0,0),abyss0) - - for j in range(0,len(floors_data["levels"])): - abyss2 = Image.open(abyss2_path) - num_1 = 0 - for i in floors_data['levels'][j]['battles'][0]['avatars']: - if not os.path.exists(os.path.join(CHAR_DONE_PATH,str(i['id']) + ".png")): - get_chardone_pic(i['id'],i['icon'],i['rarity']) - char = os.path.join(CHAR_DONE_PATH,str(i['id']) + ".png") - char_img = Image.open(char) - char_draw = ImageDraw.Draw(char_img) - for k in raw_char_data: - if k['id'] == i['id']: - char_draw.text((40,108),f'Lv.{str(k["level"])}',(21,21,21),ys_font(18)) - char_draw.text((95.3,19),f'{str(k["actived_constellation_num"])}','white',ys_font(18)) - if str(k["fetter"]) == "10" or str(k["name"]) == "旅行者": - char_draw.text((93,41.5),"♥",(21,21,21),ys_font(15)) - else: - char_draw.text((95.3,40.5),f'{str(k["fetter"])}',(21,21,21),ys_font(18)) - char_crop = (70 + 125*(num_1%4),46) - abyss2.paste(char_img,char_crop,char_img) - num_1 = num_1 + 1 - num_2 = 0 - for i in floors_data['levels'][j]['battles'][1]['avatars']: - if not os.path.exists(os.path.join(CHAR_DONE_PATH,str(i['id']) + ".png")): - get_chardone_pic(i['id'],i['icon'],i['rarity']) - char = os.path.join(CHAR_DONE_PATH,str(i['id']) + ".png") - char_img = Image.open(char) - char_draw = ImageDraw.Draw(char_img) - for k in raw_char_data: - if k['id'] == i['id']: - char_draw.text((40,108),f'Lv.{str(k["level"])}',(21,21,21),ys_font(18)) - char_draw.text((95.3,19),f'{str(k["actived_constellation_num"])}','white',ys_font(18)) - if str(k["fetter"]) == "10" or str(k["name"]) == "旅行者": - char_draw.text((93,41.5),"♥",(21,21,21),ys_font(15)) - else: - char_draw.text((95.3,40.5),f'{str(k["fetter"])}',(21,21,21),ys_font(18)) - char_crop = (70 + 125*(num_2%4),180) - abyss2.paste(char_img,char_crop,char_img) - num_2 = num_2 + 1 - star_num = floors_data['levels'][j]['star'] - if star_num == 1: - abyss2.paste(abyss_star1,(640,155),abyss_star1) - abyss2.paste(abyss_star0,(685,155),abyss_star0) - abyss2.paste(abyss_star0,(730,155),abyss_star0) - elif star_num == 0: - abyss2.paste(abyss_star0,(640,155),abyss_star0) - abyss2.paste(abyss_star0,(685,155),abyss_star0) - abyss2.paste(abyss_star0,(730,155),abyss_star0) - elif star_num == 2: - abyss2.paste(abyss_star1,(640,155),abyss_star1) - abyss2.paste(abyss_star1,(685,155),abyss_star1) - abyss2.paste(abyss_star0,(730,155),abyss_star0) - else: - abyss2.paste(abyss_star1,(640,155),abyss_star1) - abyss2.paste(abyss_star1,(685,155),abyss_star1) - abyss2.paste(abyss_star1,(730,155),abyss_star1) - abyss2_text_draw = ImageDraw.Draw(abyss2) - abyss2_text_draw.text((87,30),f"第{j+1}间", (20,20,20), ys_font(21)) - timeStamp1 = int(floors_data['levels'][j]['battles'][0]['timestamp']) - timeStamp2 = int(floors_data['levels'][j]['battles'][1]['timestamp']) - timeArray1 = time.localtime(timeStamp1) - timeArray2 = time.localtime(timeStamp2) - otherStyleTime1 = time.strftime("%Y--%m--%d %H:%M:%S", timeArray1) - otherStyleTime2 = time.strftime("%Y--%m--%d %H:%M:%S", timeArray2) - abyss2_text_draw.text((167,33), f"{otherStyleTime1}/{otherStyleTime2}", (40,40,40), ys_font(19)) - bg_img.paste(abyss2,(0,605+j*315),abyss2) - - bg_img.paste(abyss3,(0,len(floors_data["levels"])*315+610),abyss3) - - text_draw = ImageDraw.Draw(bg_img) - - text_draw.text((250, 115), f"{nickname}", (217,217,217), ys_font(32)) - text_draw.text((260, 155), 'UID ' + f"{uid}", (217,217,217), ys_font(14)) - - text_draw.text((690, 82),raw_data['max_floor'], (65, 65, 65), ys_font(26)) - text_draw.text((690, 127),str(raw_data['total_battle_times']), (65, 65, 65), ys_font(26)) - text_draw.text((690, 172),str(raw_data['total_star']), (65, 65, 65), ys_font(26)) - - bg_img = bg_img.convert('RGB') - result_buffer = BytesIO() - bg_img.save(result_buffer, format='JPEG', subsampling=0, quality=90) - #bg_img.save(result_buffer, format='PNG') - imgmes = 'base64://' + b64encode(result_buffer.getvalue()).decode() - resultmes = f"[CQ:image,file={imgmes}]" - return resultmes - -async def draw_abyss_pic(uid,nickname,floor_num,image = None,mode = 2,date = "1"): - while 1: - use_cookies = cacheDB(uid,mode-1) - if use_cookies == '': - return "绑定记录不存在。" - elif use_cookies == "没有可以使用的Cookies!": - return "没有可以使用的Cookies!" - - if mode == 3: - mys_data = await GetMysInfo(uid,use_cookies) - mysid_data = uid - for i in mys_data['data']['list']: - if i['game_id'] != 2: - mys_data['data']['list'].remove(i) - uid = mys_data['data']['list'][0]['game_role_id'] - nickname = mys_data['data']['list'][0]['nickname'] - #role_region = mys_data['data']['list'][0]['region'] - role_level = mys_data['data']['list'][0]['level'] - - raw_data = await GetSpiralAbyssInfo(uid,use_cookies,date) - raw_char_data = await GetInfo(uid,use_cookies) - - if (raw_data["retcode"] != 0): - if (raw_data["retcode"] == 10001): - #return ("Cookie错误/过期,请重置Cookie") - errorDB(use_cookies,"error") - elif (raw_data["retcode"] == 10101): - #return ("当前cookies已达到30人上限!") - errorDB(use_cookies,"limit30") - elif (raw_data["retcode"] == 10102): - return ("当前查询id已经设置了隐私,无法查询!") - else: - return ( - "Api报错,返回内容为:\r\n" - + str(raw_data) + "\r\n出现这种情况可能的UID输入错误 or 不存在" - ) - else: - break - - - is_edit = False - if image != None: - image_file= image.group(1) - image_data = image.group(2) - urllib.request.urlretrieve(f'{image_data}', os.path.join(TEXT_PATH,nickname + '.png')) - is_edit = True - - raw_data = raw_data["data"] - raw_char_data = raw_char_data['data']["avatars"] - - floors_data = raw_data['floors'] - - based_data = [] - for i in floors_data: - if str(i['index']) == floor_num: - based_data = i - - #floor_star = based_data['star'] - #floors1_star = based_data['levels'][0]['star'] - #floors2_star = based_data['levels'][1]['star'] - #floors3_star = based_data['levels'][2]['star'] - #start_time1 = based_data['levels'][0]['battles'][0]['timestamp'] - #start_time2 = based_data['levels'][0]['battles'][1]['timestamp'] - - bg_list = random.choice([x for x in os.listdir(BG_PATH) - if os.path.isfile(os.path.join(BG_PATH, x))]) - - bg2_path = os.path.join(BG_PATH,bg_list) - - abyss1_path = os.path.join(TEXT_PATH,"abyss_1.png") - abyss2_path = os.path.join(TEXT_PATH,"abyss_2.png") - abyss3_path = os.path.join(TEXT_PATH,"abyss_3.png") - abyss_star0_path = os.path.join(TEXT_PATH,"abyss_star0.png") - abyss_star1_path = os.path.join(TEXT_PATH,"abyss_star1.png") - - levels_num = len(based_data['levels']) - - based_w = 900 - based_h = 240+levels_num*340 - based_scale = '%.3f' % (based_w/based_h) - - if is_edit == True: - bg_path_edit = os.path.join(TEXT_PATH,f"{nickname}.png") - else: - bg_path_edit = bg2_path - - edit_bg = Image.open(bg_path_edit) - w, h = edit_bg.size - scale_f = '%.3f' % (w / h) - new_w = math.ceil(based_h*float(scale_f)) - new_h = math.ceil(based_w/float(scale_f)) - if scale_f > based_scale: - bg_img2 = edit_bg.resize((new_w, based_h),Image.ANTIALIAS) - else: - bg_img2 = edit_bg.resize((based_w, new_h),Image.ANTIALIAS) - - bg_img = bg_img2.crop((0, 0, based_w, based_h)) - - for i in range(0,len(based_data['levels'])): - x, y = 65, 220 + 340*i - radius = 10 - cropped_img = bg_img.crop((x, y, 836, 517+340*i)) - blurred_img = cropped_img.filter(ImageFilter.GaussianBlur(5),).convert("RGBA") - bg_img.paste(blurred_img, (x, y), create_rounded_rectangle_mask(cropped_img,radius)) - - abyss1 = Image.open(abyss1_path) - abyss3 = Image.open(abyss3_path) - abyss_star0 = Image.open(abyss_star0_path) - abyss_star1 = Image.open(abyss_star1_path) - - bg_img.paste(abyss1,(0,0),abyss1) - - for j in range(0,len(based_data['levels'])): - abyss2 = Image.open(abyss2_path) - num_1 = 0 - avatars = based_data['levels'][j]['battles'][0]['avatars'] + based_data['levels'][j]['battles'][1]['avatars'] - for i in based_data['levels'][j]['battles'][0]['avatars']: - if not os.path.exists(os.path.join(CHAR_DONE_PATH,str(i['id']) + ".png")): - get_chardone_pic(i['id'],i['icon'],i['rarity']) - char = os.path.join(CHAR_DONE_PATH,str(i['id']) + ".png") - char_img = Image.open(char) - char_draw = ImageDraw.Draw(char_img) - for k in raw_char_data: - if k['id'] == i['id']: - char_draw.text((40,108),f'Lv.{str(k["level"])}',(21,21,21),ys_font(18)) - char_draw.text((95.3,19),f'{str(k["actived_constellation_num"])}','white',ys_font(18)) - if str(k["fetter"]) == "10" or str(k["name"]) == "旅行者": - char_draw.text((93,41.5),"♥",(21,21,21),ys_font(15)) - else: - char_draw.text((95.3,40.5),f'{str(k["fetter"])}',(21,21,21),ys_font(18)) - char_crop = (70 + 125*(num_1%4),46) - abyss2.paste(char_img,char_crop,char_img) - num_1 = num_1 + 1 - num_2 = 0 - for i in based_data['levels'][j]['battles'][1]['avatars']: - if not os.path.exists(os.path.join(CHAR_DONE_PATH,str(i['id']) + ".png")): - get_chardone_pic(i['id'],i['icon'],i['rarity']) - char = os.path.join(CHAR_DONE_PATH,str(i['id']) + ".png") - char_img = Image.open(char) - char_draw = ImageDraw.Draw(char_img) - for k in raw_char_data: - if k['id'] == i['id']: - char_draw.text((40,108),f'Lv.{str(k["level"])}',(21,21,21),ys_font(18)) - char_draw.text((95.3,19),f'{str(k["actived_constellation_num"])}','white',ys_font(18)) - if str(k["fetter"]) == "10" or str(k["name"]) == "旅行者": - char_draw.text((93,41.5),"♥",(21,21,21),ys_font(15)) - else: - char_draw.text((95.3,40.5),f'{str(k["fetter"])}',(21,21,21),ys_font(18)) - char_crop = (70 + 125*(num_2%4),180) - abyss2.paste(char_img,char_crop,char_img) - num_2 = num_2 + 1 - star_num = based_data['levels'][j]['star'] - if star_num == 1: - abyss2.paste(abyss_star1,(640,155),abyss_star1) - abyss2.paste(abyss_star0,(685,155),abyss_star0) - abyss2.paste(abyss_star0,(730,155),abyss_star0) - elif star_num == 0: - abyss2.paste(abyss_star0,(640,155),abyss_star0) - abyss2.paste(abyss_star0,(685,155),abyss_star0) - abyss2.paste(abyss_star0,(730,155),abyss_star0) - elif star_num == 2: - abyss2.paste(abyss_star1,(640,155),abyss_star1) - abyss2.paste(abyss_star1,(685,155),abyss_star1) - abyss2.paste(abyss_star0,(730,155),abyss_star0) - else: - abyss2.paste(abyss_star1,(640,155),abyss_star1) - abyss2.paste(abyss_star1,(685,155),abyss_star1) - abyss2.paste(abyss_star1,(730,155),abyss_star1) - abyss2_text_draw = ImageDraw.Draw(abyss2) - abyss2_text_draw.text((87,30),f"第{j+1}间", (20,20,20), ys_font(21)) - timeStamp1 = int(based_data['levels'][j]['battles'][0]['timestamp']) - timeStamp2 = int(based_data['levels'][j]['battles'][1]['timestamp']) - timeArray1 = time.localtime(timeStamp1) - timeArray2 = time.localtime(timeStamp2) - otherStyleTime1 = time.strftime("%Y--%m--%d %H:%M:%S", timeArray1) - otherStyleTime2 = time.strftime("%Y--%m--%d %H:%M:%S", timeArray2) - abyss2_text_draw.text((167,33), f"{otherStyleTime1}/{otherStyleTime2}", (40,40,40), ys_font(19)) - bg_img.paste(abyss2,(0,200+j*340),abyss2) - - bg_img.paste(abyss3,(0,len(based_data['levels'])*340+200),abyss3) - - text_draw = ImageDraw.Draw(bg_img) - - text_draw.text((210,77), f"{nickname}", (217,217,217), ys_font(32)) - text_draw.text((228, 110), 'UID ' + f"{uid}", (217,217,217), ys_font(14)) - if floor_num == "9": - text_draw.text((687, 67), f"{floor_num}", (29,30,63), ys_font(50)) - else: - text_draw.text((670, 67), f"{floor_num}", (29,30,63), ys_font(50)) - - bg_img = bg_img.convert('RGB') - result_buffer = BytesIO() - bg_img.save(result_buffer, format='JPEG', subsampling=0, quality=90) - #bg_img.save(result_buffer, format='PNG') - imgmes = 'base64://' + b64encode(result_buffer.getvalue()).decode() - resultmes = f"[CQ:image,file={imgmes}]" - return resultmes - -async def draw_pic(uid,nickname,image = None,mode = 2,role_level = None): - #获取Cookies,如果没有能使用的则return - while 1: - use_cookies = cacheDB(uid,mode-1) - if use_cookies == '': - return "绑定记录不存在。" - elif use_cookies == "没有可以使用的Cookies!": - return "没有可以使用的Cookies!" - - if mode == 3: - mys_data = await GetMysInfo(uid,use_cookies) - mysid_data = uid - for i in mys_data['data']['list']: - if i['game_id'] != 2: - mys_data['data']['list'].remove(i) - uid = mys_data['data']['list'][0]['game_role_id'] - nickname = mys_data['data']['list'][0]['nickname'] - role_level = mys_data['data']['list'][0]['level'] - - raw_data = await GetInfo(uid,use_cookies) - - if raw_data["retcode"] != 0: - if raw_data["retcode"] == 10001: - #return ("Cookie错误/过期,请重置Cookie") - errorDB(use_cookies,"error") - elif raw_data["retcode"] == 10101: - #return ("当前cookies已达到30人上限!") - errorDB(use_cookies,"limit30") - elif raw_data["retcode"] == 10102: - return ("当前查询id已经设置了隐私,无法查询!") - else: - return ( - "Api报错,返回内容为:\r\n" - + str(raw_data) + "\r\n出现这种情况可能的UID输入错误 or 不存在" - ) - else: - break - - #获取背景图片 - bg2_path = os.path.join(BG_PATH,random.choice([x for x in os.listdir(BG_PATH) - if os.path.isfile(os.path.join(BG_PATH, x))])) - - if image: - image_data = image.group(2) - edit_bg = Image.open(BytesIO(requests.get(image_data).content)) - else: - edit_bg = Image.open(bg2_path) - - #获取背景主色 - q = edit_bg.quantize(colors=3,method=2) - bg_num_temp = 0 - for i in range(0,3): - bg = tuple(q.getpalette()[i*3:(i*3)+3]) - bg_num = bg[0] + bg[1] + bg[2] - if bg_num >= bg_num_temp: - bg_num_temp = bg_num - bg_color = (bg[0],bg[1],bg[2]) - - #通过背景主色(bg_color)确定文字主色 - r = 140 - if max(*bg_color) > 255 - r: - r *= -1 - new_color = (math.floor(bg_color[0] + r if bg_color[0] + r <= 255 else 255), - math.floor(bg_color[1] + r if bg_color[1] + r <= 255 else 255), - math.floor(bg_color[2] + r if bg_color[2] + r <= 255 else 255)) - - #确定texture2D路径 - panle1_path = os.path.join(TEXT_PATH,"panle_1.png") - panle3_path = os.path.join(TEXT_PATH,"panle_3.png") - - avatar_bg_path = os.path.join(TEXT_PATH,"avatar_bg.png") - avatar_fg_path = os.path.join(TEXT_PATH,"avatar_fg.png") - - all_mask_path = os.path.join(TEXT_PATH,"All_Mask.png") - - #记录数据 - raw_data = raw_data['data'] - char_data = raw_data["avatars"] - - char_datas = [] - char_ids = [] - char_rawdata = [] - - for i in char_data: - char_ids.append(i["id"]) - - char_rawdata = GetCharacter(uid,char_ids,use_cookies) - char_datas = char_rawdata["data"]["avatars"] - - #确定角色占用行数 - char_num = len(char_datas) - char_hang = 1 + (char_num-1)//6 if char_num > 8 else char_num - - #确定整体图片的长宽 - based_w = 900 - based_h = 890+char_hang*130 if char_num > 8 else 890+char_hang*110 - based_scale = '%.3f' % (based_w/based_h) - - #通过确定的长宽比,缩放背景图片 - w, h = edit_bg.size - scale_f = '%.3f' % (w / h) - new_w = math.ceil(based_h*float(scale_f)) - new_h = math.ceil(based_w/float(scale_f)) - if scale_f > based_scale: - bg_img2 = edit_bg.resize((new_w, based_h),Image.ANTIALIAS) - else: - bg_img2 = edit_bg.resize((based_w, new_h),Image.ANTIALIAS) - bg_img = bg_img2.crop((0, 0, 900, based_h)) - - #转换遮罩的颜色、大小匹配,并paste上去 - all_mask = Image.open(all_mask_path).resize(bg_img.size,Image.ANTIALIAS) - all_mask_img = Image.new("RGBA",(based_w,based_h),bg_color) - bg_img.paste(all_mask_img,(0,0),all_mask) - - #操作图片 - panle1 = Image.open(panle1_path) - panle3 = Image.open(panle3_path) - avatar_bg = Image.open(avatar_bg_path) - avatar_fg = Image.open(avatar_fg_path) - - #确定主体框架 - avatar_bg_color = Image.new("RGBA",(316,100),bg_color) - panle1_color = Image.new("RGBA",(900,800),new_color) - bg_img.paste(panle1_color,(0,0),panle1) - bg_img.paste(panle3,(0,char_hang*130+800) if char_num > 8 else (0,char_hang*110+800),panle3) - bg_img.paste(avatar_bg_color,(113,98),avatar_bg) - bg_img.paste(avatar_fg,(114,95),avatar_fg) - - #绘制基础信息文字 - text_draw = ImageDraw.Draw(bg_img) - - if role_level: - text_draw.text((140,200), "冒险等级:" + f"{role_level}", new_color, ys_font(20)) - - text_draw.text((220,123), f"{nickname}", new_color, ys_font(32)) - text_draw.text((235, 163), 'UID ' + f"{uid}", new_color, ys_font(14)) - - #活跃天数/成就数量/深渊信息 - text_draw.text((640, 94.8),str(raw_data['stats']['active_day_number']), new_color, ys_font(26)) - text_draw.text((640, 139.3),str(raw_data['stats']['achievement_number']), new_color, ys_font(26)) - text_draw.text((640, 183.9),raw_data['stats']['spiral_abyss'], new_color, ys_font(26)) - - #宝箱 - text_draw.text((258, 375.4),str(raw_data['stats']['magic_chest_number']), new_color, ys_font(24)) - text_draw.text((258, 425.4),str(raw_data['stats']['common_chest_number']),new_color, ys_font(24)) - text_draw.text((258, 475.4),str(raw_data['stats']['exquisite_chest_number']),new_color, ys_font(24)) - text_draw.text((258, 525.4),str(raw_data['stats']['precious_chest_number']), new_color, ys_font(24)) - text_draw.text((258, 575.4),str(raw_data['stats']['luxurious_chest_number']), new_color, ys_font(24)) - - #已获角色 - text_draw.text((740, 547),str(raw_data['stats']['avatar_number']),new_color, ys_font(24)) - - #开启锚点和秘境数量 - text_draw.text((258, 625.4),str(raw_data['stats']['way_point_number']),new_color, ys_font(24)) - text_draw.text((258, 675.4),str(raw_data['stats']['domain_number']),new_color, ys_font(24)) - - #蒙德 - text_draw.text((490, 370),str(raw_data['world_explorations'][4]['exploration_percentage']/10) + '%',new_color, ys_font(22)) - text_draw.text((490, 400),'lv.' + str(raw_data['world_explorations'][4]['level']),new_color, ys_font(22)) - text_draw.text((513, 430), str(raw_data['stats']['anemoculus_number']), new_color, ys_font(22)) - - #璃月 - text_draw.text((490, 490),str(raw_data['world_explorations'][3]['exploration_percentage']/10) + '%',new_color, ys_font(22)) - text_draw.text((490, 520),'lv.' + str(raw_data['world_explorations'][3]['level']),new_color, ys_font(22)) - text_draw.text((513, 550), str(raw_data['stats']['geoculus_number']), new_color, ys_font(22)) - - #雪山 - text_draw.text((745, 373.5),str(raw_data['world_explorations'][2]['exploration_percentage']/10) + '%',new_color, ys_font(22)) - text_draw.text((745, 407.1),'lv.' + str(raw_data['world_explorations'][2]['level']),new_color, ys_font(22)) - - #稻妻 - text_draw.text((490, 608),str(raw_data['world_explorations'][1]['exploration_percentage']/10) + '%',new_color, ys_font(22)) - text_draw.text((490, 635),'lv.' + str(raw_data['world_explorations'][1]['level']),new_color, ys_font(22)) - text_draw.text((490, 662),'lv.' + str(raw_data['world_explorations'][1]['offerings'][0]['level']),new_color, ys_font(22)) - text_draw.text((513, 689), str(raw_data['stats']['electroculus_number']), new_color, ys_font(22)) - - #渊下宫 - text_draw.text((745, 480),str(raw_data['world_explorations'][0]['exploration_percentage']/10) + '%',new_color, ys_font(22)) - - #家园 - if len(raw_data['homes']): - text_draw.text((693, 582.4),'lv.' + str(raw_data['homes'][0]['level']),new_color, ys_font(22)) - text_draw.text((693, 620.4),str(raw_data['homes'][0]['visit_num']),new_color, ys_font(22)) - text_draw.text((693, 658.4),str(raw_data['homes'][0]['item_num']),new_color, ys_font(22)) - text_draw.text((693, 696.4),str(raw_data['homes'][0]['comfort_num']),new_color, ys_font(22)) - else: - text_draw.text((693, 582.4),"未开",new_color, ys_font(22)) - text_draw.text((693, 620.4),"未开",new_color, ys_font(22)) - text_draw.text((693, 658.4),"未开",new_color, ys_font(22)) - text_draw.text((693, 696.4),"未开",new_color, ys_font(22)) - - #确定texture2D路径 - charpic_mask_path = os.path.join(TEXT_PATH,"charpic_mask.png") - weaponpic_mask_path = os.path.join(TEXT_PATH,"weaponpic_mask.png") - - def getText(star,step): - return os.path.join(TEXT_PATH,"{}s_{}.png".format(str(star),str(step))) - - charpic_mask = Image.open(charpic_mask_path) - weaponpic_mask = Image.open(weaponpic_mask_path) - s5s1=Image.open(getText(5,1)) - s5s2=Image.open(getText(5,2)) - s5s3=Image.open(getText(5,3)) - s5s4=Image.open(getText(5,4)) - s4s1=Image.open(getText(4,1)) - s4s2=Image.open(getText(4,2)) - s4s3=Image.open(getText(4,3)) - s4s4=Image.open(getText(4,4)) - s3s3=Image.open(getText(3,3)) - s2s3=Image.open(getText(2,3)) - s1s3=Image.open(getText(1,3)) - - char_bg_path = os.path.join(TEXT_PATH, "char_bg.png") - char_fg_path = os.path.join(TEXT_PATH, "char_fg.png") - - char_bg = Image.open(char_bg_path) - char_fg = Image.open(char_fg_path) - - char_color = (math.floor(bg_color[0] + 10 if bg_color[0] + r <= 255 else 255), - math.floor(bg_color[1] + 10 if bg_color[1] + r <= 255 else 255), - math.floor(bg_color[2] + 10 if bg_color[2] + r <= 255 else 255)) - - charset_mask = Image.new("RGBA",(900,130),char_color) - - num = 0 - char_datas.sort(key=lambda x: (-x['rarity'],-x['level'],-x['fetter'])) - - if char_num > 8 : - for i in char_datas: - char_mingzuo = 0 - for k in i['constellations']: - if k['is_actived'] == True: - char_mingzuo += 1 - - char_name = i["name"] - char_id = i["id"] - char_level = i["level"] - char_fetter = i['fetter'] - char_rarity = i['rarity'] - - char_weapon_star = i['weapon']['rarity'] - char_weapon_jinglian = i['weapon']['affix_level'] - char_weapon_icon = i['weapon']['icon'] - - if not os.path.exists(os.path.join(WEAPON_PATH, str(char_weapon_icon.split('/')[-1]))): - get_weapon_pic(char_weapon_icon) - if not os.path.exists(os.path.join(CHAR_PATH,str(i['id']) + ".png")): - get_char_pic(i['id'],i['icon']) - - char = os.path.join(CHAR_PATH,str(char_id) + ".png") - weapon = os.path.join(WEAPON_PATH, str(char_weapon_icon.split('/')[-1])) - - char_img = Image.open(char) - char_img = char_img.resize((100,100),Image.ANTIALIAS) - weapon_img = Image.open(weapon) - weapon_img = weapon_img.resize((47,47),Image.ANTIALIAS) - - charpic = Image.new("RGBA", (125, 140)) - - if char_rarity == 5: - charpic.paste(s5s1,(0,0),s5s1) - baseda = Image.new("RGBA", (100, 100)) - cc = Image.composite(char_img, baseda, charpic_mask) - charpic.paste(cc,(6,15),cc) - charpic.paste(s5s2,(0,0),s5s2) - if char_weapon_star == 5: - charpic.paste(s5s3,(0,0),s5s3) - elif char_weapon_star == 4: - charpic.paste(s4s3,(0,0),s4s3) - elif char_weapon_star == 3: - charpic.paste(s3s3,(0,0),s3s3) - elif char_weapon_star == 2: - charpic.paste(s2s3,(0,0),s2s3) - elif char_weapon_star == 1: - charpic.paste(s1s3,(0,0),s1s3) - basedb = Image.new("RGBA", (47, 47)) - dd = Image.composite(weapon_img, basedb, weaponpic_mask) - charpic.paste(dd,(69,62),dd) - charpic.paste(s5s4,(0,0),s5s4) - - else: - charpic.paste(s4s1,(0,0),s4s1) - baseda = Image.new("RGBA", (100, 100)) - cc = Image.composite(char_img, baseda, charpic_mask) - charpic.paste(cc,(6,15),cc) - charpic.paste(s4s2,(0,0),s4s2) - if char_weapon_star == 5: - charpic.paste(s5s3,(0,0),s5s3) - elif char_weapon_star == 4: - charpic.paste(s4s3,(0,0),s4s3) - elif char_weapon_star == 3: - charpic.paste(s3s3,(0,0),s3s3) - elif char_weapon_star == 2: - charpic.paste(s2s3,(0,0),s2s3) - elif char_weapon_star == 1: - charpic.paste(s1s3,(0,0),s1s3) - basedb = Image.new("RGBA", (47, 47)) - dd = Image.composite(weapon_img, basedb, weaponpic_mask) - charpic.paste(dd,(69,62),dd) - charpic.paste(s4s4,(0,0),s4s4) - - char_draw = ImageDraw.Draw(charpic) - char_draw.text((38,106),f'Lv.{str(char_level)}',(21,21,21),ys_font(18)) - char_draw.text((104.5,91.5),f'{str(char_weapon_jinglian)}','white',ys_font(10)) - char_draw.text((99,19.5),f'{str(char_mingzuo)}','white',ys_font(18)) - if str(i["fetter"]) == "10" or str(char_name) == "旅行者": - char_draw.text((98,42),"♥",(21,21,21),ys_font(14)) - else: - char_draw.text((100,41),f'{str(char_fetter)}',(21,21,21),ys_font(16)) - - char_crop = (68+129*(num%6),800+130*(num//6)) - bg_img.paste(charpic,char_crop,charpic) - num = num+1 - else: - for i in char_datas: - char_mingzuo = 0 - for k in i['constellations']: - if k['is_actived'] == True: - char_mingzuo += 1 - - char_name = i["name"] - char_id = i["id"] - char_level = i["level"] - char_fetter = i['fetter'] - char_rarity = i['rarity'] - char_img_icon = i["image"] - - char_weapon_star = i['weapon']['rarity'] - char_weapon_level = i['weapon']['level'] - char_weapon_jinglian = i['weapon']['affix_level'] - char_weapon_icon = i['weapon']['icon'] - - if not os.path.exists(os.path.join(WEAPON_PATH, str(char_weapon_icon.split('/')[-1]))): - get_weapon_pic(char_weapon_icon) - if not os.path.exists(os.path.join(CHAR_IMG_PATH, str(char_img_icon.split('/')[-1]))): - get_charimg_pic(char_img_icon) - if not os.path.exists(os.path.join(CHAR_PATH,str(i['id']) + ".png")): - get_char_pic(i['id'],i['icon']) - - char = os.path.join(CHAR_PATH,str(char_id) + ".png") - weapon = os.path.join(WEAPON_PATH, str(char_weapon_icon.split('/')[-1])) - char_stand_img = os.path.join(CHAR_IMG_PATH,str(char_img_icon.split('/')[-1])) - char_stand_mask = Image.open(os.path.join(TEXT_PATH,"stand_mask.png")) - - char_stand = Image.open(char_stand_img) - char_img = Image.open(char) - char_img = char_img.resize((100,100),Image.ANTIALIAS) - weapon_img = Image.open(weapon) - weapon_img = weapon_img.resize((47,47),Image.ANTIALIAS) - - charpic = Image.new("RGBA", (900, 130)) - charpic_temp = Image.new("RGBA", (900, 130)) - - charpic.paste(charset_mask,(0,0),char_bg) - - weapon_bg = Image.open(getText(char_weapon_star,3)) - charpic.paste(weapon_bg,(72,10),weapon_bg) - charpic_temp.paste(char_img,(81,13),charpic_mask) - charpic_temp.paste(char_stand,(395,-99),char_stand_mask) - charpic_temp.paste(char_fg,(0,0),char_fg) - charpic_temp.paste(weapon_img,(141,72),weaponpic_mask) - #temp = Image.composite(weapon_img, basedb, weaponpic_mask) - charpic.paste(charpic_temp,(0,0),charpic_temp) - - - for _,k in enumerate(i["reliquaries"]): - if not os.path.exists(os.path.join(REL_PATH, str(k["icon"].split('/')[-1]))): - get_rel_pic(k["icon"]) - rel = os.path.join(REL_PATH,str(k["icon"].split('/')[-1])) - rel_img = Image.open(rel).resize((43,43),Image.ANTIALIAS) - rel_bg = Image.open(getText(k["rarity"],3)) - - if k["pos_name"] == "生之花": - charpic.paste(rel_bg,(287 + 55 * 0,-14),rel_bg) - charpic.paste(rel_img,(360 + 55 * 0,49),rel_img) - elif k["pos_name"] == "死之羽": - charpic.paste(rel_bg,(287 + 55 * 1,-14),rel_bg) - charpic.paste(rel_img,(360 + 55 * 1,49),rel_img) - elif k["pos_name"] == "时之沙": - charpic.paste(rel_bg,(287 + 55 * 2,-14),rel_bg) - charpic.paste(rel_img,(360 + 55 * 2,49),rel_img) - elif k["pos_name"] == "空之杯": - charpic.paste(rel_bg,(287 + 55 * 3,-14),rel_bg) - charpic.paste(rel_img,(360 + 55 * 3,49),rel_img) - elif k["pos_name"] == "理之冠": - charpic.paste(rel_bg,(287 + 55 * 4,-14),rel_bg) - charpic.paste(rel_img,(360 + 55 * 4,49),rel_img) - - char_draw = ImageDraw.Draw(charpic) - - char_draw.text((188,30),i["name"] + " " + f'Lv.{str(char_level)}',new_color,ys_font(22)) - #char_draw.text((272,45),f'Lv.{str(char_level)}',new_color,ys_font(18)) - - #char_draw.text((104.5,91.5),f'{str(char_weapon_jinglian)}',new_color,ys_font(10)) - - char_draw.text((222,87),f'{str(i["fetter"])}' if str(char_name) != "旅行者" else "10",new_color,ys_font(15),anchor = "mm") - char_draw.text((255,87),f'{str(char_mingzuo)}',new_color,ys_font(15),anchor = "mm") - char_draw.text((218,67),f'{str(char_weapon_level)}级{str(char_weapon_jinglian)}精',new_color,ys_font(15),anchor = "lm") - char_crop = (0,800+110*num) - num += 1 - bg_img.paste(charpic,char_crop,charpic) - - #转换之后发送 - bg_img = bg_img.convert('RGB') - result_buffer = BytesIO() - bg_img.save(result_buffer, format='JPEG', subsampling=0, quality=90) - imgmes = 'base64://' + b64encode(result_buffer.getvalue()).decode() - resultmes = f"[CQ:image,file={imgmes}]" - return resultmes - -def create_rounded_rectangle_mask(rectangle, radius): - solid_fill = (50,50,50,255) - i = Image.new("RGBA",rectangle.size,(0,0,0,0)) - - corner = Image.new('RGBA', (radius, radius), (0, 0, 0, 0)) - draw = ImageDraw.Draw(corner) - draw.pieslice((0, 0, radius * 2, radius * 2), 180, 270, fill = solid_fill) - - mx,my = rectangle.size - - i.paste(corner, (0, 0), corner) - i.paste(corner.rotate(90), (0, my - radius),corner.rotate(90)) - i.paste(corner.rotate(180), (mx - radius, my - radius),corner.rotate(180)) - i.paste(corner.rotate(270), (mx - radius, 0),corner.rotate(270)) - - draw = ImageDraw.Draw(i) - draw.rectangle( [(radius,0),(mx-radius,my)],fill=solid_fill) - draw.rectangle( [(0,radius),(mx,my-radius)],fill=solid_fill) - - return i - -async def draw_event_pic(): - raw_data = await GetGenshinEvent("List") - raw_time_data = await GetGenshinEvent("Content") - #raw_time_data = await GetGenshinEvent("Calendar") - - data = raw_data["data"]["list"][1]["list"] - - event_data = {"gacha_event":[],"normal_event":[],"other_event":[]} - for k in data: - for i in raw_time_data["data"]["list"]: - if k["title"] in i["title"]: - time_data = re.findall(r"[0-9]{4}/[0-9]{2}/[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}", i["content"]) - time_limit_end = re.findall(r"起至[0-9]{1}.[0-9]{1}版本结束", i["content"]) - time_limit_start = re.findall(r"[0-9]{1}.[0-9]{1}版本更新后 ~", i["content"]) - if len(time_data) == 2: - k["act_begin_time"] = time_data[0] - k["act_end_time"] = time_data[1] - elif len(time_data) == 1 and len(time_limit_end) == 1: - k["act_begin_time"] = time_data[0] - k["act_end_time"] = time_limit_end[0] - elif len(time_data) == 1 and len(time_limit_start) == 1: - k["act_begin_time"] = time_limit_start[0][:-2] - k["act_end_time"] = time_data[0] - elif len(time_data) == 1: - k["act_begin_time"] = time_data[0] - k["act_end_time"] = "永久开放" - elif len(time_data) > 2: - k["act_begin_time"] = time_data[0] - k["act_end_time"] = k["end_time"] - elif len(time_data) == 0: - k["act_begin_time"] = k["start_time"] + "(?)" - k["act_end_time"] = k["end_time"] + "(?)" - - if "冒险助力礼包" in k["title"] or "纪行" in k["title"]: - continue - #if "角色试用" in k["title"] or "传说任务" in k["title"]: - # event_data['other_event'].append(k) - elif k["tag_label"] == "扭蛋": - event_data['gacha_event'].append(k) - elif k["tag_label"] == "活动": - event_data['normal_event'].append(k) - - #base_h = 900 + ((1 + (len(event_data['normal_event'])+len(event_data['other_event'])))//2)*390 + ((1 + len(event_data['gacha_event']))//2)*533 - base_h = 600 + len(event_data['normal_event'])*(390+90) + len(event_data['gacha_event'])*(533+90) - base_img = Image.new(mode="RGB",size=(1080,base_h),color=(237,217,195)) - - event1_path = os.path.join(TEXT_PATH,"event_1.png") - event2_path = os.path.join(TEXT_PATH,"event_2.png") - #event3_path = os.path.join(TEXT_PATH,"event_3.png") - event1 = Image.open(event1_path) - event2 = Image.open(event2_path) - #event3 = Image.open(event3_path) - - base_img.paste(event1,(0,0),event1) - #base_img.paste(event2,(0,300+((1+len(event_data['normal_event']))//2)*390),event2) - base_img.paste(event2,(0,len(event_data['normal_event'])*(390+90) + 300),event2) - #base_img.paste(event3,(0,600+((1+len(event_data['normal_event']))//2)*390 + ((1 + len(event_data['gacha_event']))//2)*533),event3) - - time_img1 = Image.new(mode="RGB",size=(1080,len(event_data['normal_event'])*(390+90)),color=(237,130,116)) - time_img2 = Image.new(mode="RGB",size=(1080,len(event_data['gacha_event'])*(533+90)),color=(237,130,116)) - base_img.paste(time_img1,(0,300)) - base_img.paste(time_img2,(0,600+len(event_data['normal_event'])*(390+90))) - base_draw = ImageDraw.Draw(base_img) - for index,value in enumerate(event_data['normal_event']): - img = Image.open(BytesIO(requests.get(value["banner"]).content)) - base_draw.text((540, 300 + 45 + 390 + (390+90)*index+1), value["act_begin_time"] + " —— " + value["act_end_time"], (255,255,255), ys_font(42), anchor="mm") - #base_img.paste(img,((index%2)*1080,300 + 390*(index//2))) - base_img.paste(img,(0,300 + (390+90)*index)) - - for index,value in enumerate(event_data['gacha_event']): - img = Image.open(BytesIO(requests.get(value["banner"]).content)) - base_draw.text((540,600 + 45 + (390+90)*len(event_data['normal_event']) + 533 + index * (533 + 90)), value["act_begin_time"] + " —— " + value["act_end_time"], (255,255,255), ys_font(42), anchor="mm") - #base_img.paste(img,((index%2)*1080,600 + ((1 + len(event_data['normal_event']))//2)*390 + 533*(index//2))) - base_img.paste(img,(0,600 + (390+90) * len(event_data['normal_event']) + index * (533 + 90))) - #for index,value in enumerate(event_data['other_event']): - # img = Image.open(BytesIO(requests.get(value["banner"]).content)) - # base_img.paste(img,((index%2)*1080,900 + ((1 + len(event_data['normal_event']))//2)*390 + ((1 + len(event_data['gacha_event']))//2)*533 + 390*(index//2))) - - base_img = base_img.convert('RGB') - base_img.save(os.path.join(FILE2_PATH,'event.jpg'), format='JPEG', subsampling=0, quality=90) - return diff --git a/getDB.py b/get_data.py similarity index 56% rename from getDB.py rename to get_data.py index 92bed0d3..6a058707 100644 --- a/getDB.py +++ b/get_data.py @@ -1,740 +1,860 @@ -from httpx import AsyncClient -from shutil import copyfile - -import sqlite3 -import requests,random,os,json,re -import time,datetime,urllib -import string -import hashlib - -mhyVersion = "2.11.1" - -FILE_PATH = os.path.abspath(os.path.join(os.getcwd(), "hoshino")) -BASE_PATH = os.path.dirname(__file__) -BASE2_PATH = os.path.join(BASE_PATH,'mys') -INDEX_PATH = os.path.join(BASE2_PATH,'index') - -async def config_check(func,mode = "CHECK"): - conn = sqlite3.connect('ID_DATA.db') - c = conn.cursor() - c.execute('''CREATE TABLE IF NOT EXISTS Config - (Name TEXT PRIMARY KEY NOT NULL, - Status TEXT, - GroupList TEXT, - Extra TEXT);''') - c.execute("INSERT OR IGNORE INTO Config (Name,Status) \ - VALUES (?, ?)",(func,"on")) - if mode == "CHECK": - cursor = c.execute("SELECT * from Config WHERE Name = ?",(func,)) - c_data = cursor.fetchall() - conn.close() - if c_data[0][1] != "off": - return True - else: - return False - elif mode == "OPEN": - c.execute("UPDATE Config SET Status = ? WHERE Name=?",("on",func)) - conn.commit() - conn.close() - return True - elif mode == "CLOSED": - c.execute("UPDATE Config SET Status = ? WHERE Name=?",("off",func)) - conn.commit() - conn.close() - return True - -async def get_alots(qid): - conn = sqlite3.connect('ID_DATA.db') - c = conn.cursor() - c.execute('''CREATE TABLE IF NOT EXISTS UseridDict - (QID INT PRIMARY KEY NOT NULL, - lots TEXT, - cache TEXT, - permission TEXT, - Status TEXT, - Subscribe TEXT, - Extra TEXT);''') - cursor = c.execute("SELECT * from UseridDict WHERE QID = ?",(qid,)) - c_data = cursor.fetchall() - with open(os.path.join(INDEX_PATH,'lots.txt'),"r") as f: - raw_data = f.read() - raw_data = raw_data.replace(' ', "").split('-') - - if len(c_data) == 0: - num = random.randint(1,len(raw_data)-1) - data = raw_data[num] - c.execute("INSERT OR IGNORE INTO UseridDict (QID,lots) \ - VALUES (?, ?)",(qid,str(num))) - else: - if c_data[0][1] == None: - num = random.randint(0,len(raw_data)-1) - data = raw_data[num] - c.execute("UPDATE UseridDict SET lots = ? WHERE QID=?",(str(num),qid)) - else: - num = int(c_data[0][1]) - data = raw_data[num] - conn.commit() - conn.close() - return data - -async def OpenPush(uid,qid,status,mode): - conn = sqlite3.connect('ID_DATA.db') - c = conn.cursor() - cursor = c.execute("SELECT * from NewCookiesTable WHERE UID = ?",(uid,)) - c_data = cursor.fetchall() - if len(c_data) != 0: - try: - c.execute("UPDATE NewCookiesTable SET {s} = ?,QID = ? WHERE UID=?".format(s = mode),(status,qid,uid)) - conn.commit() - conn.close() - return "成功!" - except: - return "未找到Ck绑定记录。" - else: - return "未找到Ck绑定记录。" - -async def CheckDB(): - str = '' - invalidlist = [] - conn = sqlite3.connect('ID_DATA.db') - c = conn.cursor() - cursor = c.execute("SELECT UID,Cookies,QID from NewCookiesTable") - c_data = cursor.fetchall() - for row in c_data: - try: - aid = re.search(r"account_id=(\d*)",row[1]) - mysid_data = aid.group(0).split('=') - mysid = mysid_data[1] - mys_data = await GetMysInfo(mysid,row[1]) - for i in mys_data['data']['list']: - if i['game_id'] != 2: - mys_data['data']['list'].remove(i) - uid = mys_data['data']['list'][0]['game_role_id'] - str = str + f"uid{row[0]}/mysid{mysid}的Cookies是正常的!\n" - except: - str = str + f"uid{row[0]}的Cookies是异常的!已删除该条Cookies!\n" - invalidlist.append([row[2],row[0]]) - c.execute("DELETE from NewCookiesTable where UID=?",(row[0],)) - try: - c.execute("DELETE from CookiesCache where Cookies=?",(row[1],)) - except: - pass - conn.commit() - conn.close() - return [str,invalidlist] - -async def connectDB(userid,uid = None,mys = None): - conn = sqlite3.connect('ID_DATA.db') - c = conn.cursor() - c.execute('''CREATE TABLE IF NOT EXISTS UIDDATA - (USERID INT PRIMARY KEY NOT NULL, - UID TEXT, - MYSID TEXT);''') - - c.execute("INSERT OR IGNORE INTO UIDDATA (USERID,UID,MYSID) \ - VALUES (?, ?,?)",(userid,uid,mys)) - - if uid: - c.execute("UPDATE UIDDATA SET UID = ? WHERE USERID=?",(uid,userid)) - if mys: - c.execute("UPDATE UIDDATA SET MYSID = ? WHERE USERID=?",(mys,userid)) - - conn.commit() - conn.close() - -async def selectDB(userid,mode = "auto"): - conn = sqlite3.connect('ID_DATA.db') - c = conn.cursor() - cursor = c.execute("SELECT * FROM UIDDATA WHERE USERID = ?",(userid,)) - for row in cursor: - if mode == "auto": - if row[0]: - if row[2]: - return [row[2],3] - elif row[1]: - return [row[1],2] - else: - return None - else: - return None - elif mode == "uid": - return [row[1],2] - elif mode == "mys": - return [row[2],3] - -async def deletecache(): - try: - copyfile("ID_DATA.db", "ID_DATA_bak.db") - print("————数据库成功备份————") - except: - print("————数据库备份失败————") - - try: - conn = sqlite3.connect('ID_DATA.db') - c = conn.cursor() - c.execute("DROP TABLE CookiesCache") - c.execute("UPDATE NewCookiesTable SET Extra = ? WHERE Extra=?",(None,"limit30")) - c.execute('''CREATE TABLE IF NOT EXISTS CookiesCache - (UID TEXT PRIMARY KEY, - MYSID TEXT, - Cookies TEXT);''') - conn.commit() - conn.close() - print("————UID查询缓存已清空————") - except: - print("\nerror\n") - - try: - conn = sqlite3.connect('ID_DATA.db') - c = conn.cursor() - c.execute("UPDATE UseridDict SET lots=NULL") - conn.commit() - conn.close() - print("————御神签缓存已清空————") - except: - print("\nerror\n") - -def errorDB(ck,err): - conn = sqlite3.connect('ID_DATA.db') - c = conn.cursor() - if err == "error": - c.execute("UPDATE NewCookiesTable SET Extra = ? WHERE Cookies=?",("error",ck)) - elif err == "limit30": - c.execute("UPDATE NewCookiesTable SET Extra = ? WHERE Cookies=?",("limit30",ck)) - -def cacheDB(uid,mode = 1,mys = None): - use = '' - conn = sqlite3.connect('ID_DATA.db') - c = conn.cursor() - c.execute('''CREATE TABLE IF NOT EXISTS CookiesCache - (UID TEXT PRIMARY KEY, - MYSID TEXT, - Cookies TEXT);''') - - if mode == 1: - if mys: - cursor = c.execute("SELECT * FROM CookiesCache WHERE MYSID = ?",(mys,)) - c_data = cursor.fetchall() - else: - cursor = c.execute("SELECT * FROM CookiesCache WHERE UID = ?",(uid,)) - c_data = cursor.fetchall() - elif mode == 2: - cursor = c.execute("SELECT * FROM CookiesCache WHERE MYSID = ?",(uid,)) - c_data = cursor.fetchall() - - if len(c_data)==0: - if mode == 2: - conn.create_function("REGEXP", 2, functionRegex) - cursor = c.execute("SELECT * FROM NewCookiesTable WHERE REGEXP(Cookies, ?)",(uid,)) - d_data = cursor.fetchall() - - elif mode == 1: - cursor = c.execute("SELECT * FROM NewCookiesTable WHERE UID = ?",(uid,)) - d_data = cursor.fetchall() - - if len(d_data) !=0 : - if d_data[0][7] != "error": - use = d_data[0][1] - if mode == 1: - c.execute("INSERT OR IGNORE INTO CookiesCache (Cookies,UID) \ - VALUES (?, ?)",(use,uid)) - elif mode == 2: - c.execute("INSERT OR IGNORE INTO CookiesCache (Cookies,MYSID) \ - VALUES (?, ?)",(use,uid)) - else: - cookiesrow = c.execute("SELECT * FROM NewCookiesTable WHERE Extra IS NULL ORDER BY RANDOM() LIMIT 1") - e_data = cookiesrow.fetchall() - if len(e_data) != 0: - if mode == 1: - c.execute("INSERT OR IGNORE INTO CookiesCache (Cookies,UID) \ - VALUES (?, ?)",(e_data[0][1],uid)) - elif mode == 2: - c.execute("INSERT OR IGNORE INTO CookiesCache (Cookies,MYSID) \ - VALUES (?, ?)",(e_data[0][1],uid)) - use = e_data[0][1] - else: - return "没有可以使用的Cookies!" - else: - cookiesrow = c.execute("SELECT * FROM NewCookiesTable WHERE Extra IS NULL ORDER BY RANDOM() LIMIT 1") - e_data = cookiesrow.fetchall() - if len(e_data) != 0: - if mode == 1: - c.execute("INSERT OR IGNORE INTO CookiesCache (Cookies,UID) \ - VALUES (?, ?)",(e_data[0][1],uid)) - elif mode == 2: - c.execute("INSERT OR IGNORE INTO CookiesCache (Cookies,MYSID) \ - VALUES (?, ?)",(e_data[0][1],uid)) - use = e_data[0][1] - else: - return "没有可以使用的Cookies!" - else: - use = c_data[0][2] - if mys: - try: - c.execute("UPDATE CookiesCache SET UID = ? WHERE MYSID=?",(uid,mys)) - except: - c.execute("UPDATE CookiesCache SET MYSID = ? WHERE UID=?",(mys,uid)) - - conn.commit() - conn.close() - return use - -def functionRegex(value,patter): - c_pattern = re.compile(r"account_id={}".format(patter)) - return c_pattern.search(value) is not None - -async def cookiesDB(uid,Cookies,qid): - conn = sqlite3.connect('ID_DATA.db') - c = conn.cursor() - - c.execute('''CREATE TABLE IF NOT EXISTS NewCookiesTable - (UID INT PRIMARY KEY NOT NULL, - Cookies TEXT, - QID INT, - StatusA TEXT, - StatusB TEXT, - StatusC TEXT, - NUM INT, - Extra TEXT);''') - - cursor = c.execute("SELECT * from NewCookiesTable WHERE UID = ?",(uid,)) - c_data = cursor.fetchall() - if len(c_data) == 0 : - c.execute("INSERT OR IGNORE INTO NewCookiesTable (Cookies,UID,StatusA,StatusB,StatusC,NUM,QID) \ - VALUES (?, ?,?,?,?,?,?)",(Cookies,uid,"off","off","off",140,qid)) - else: - c.execute("UPDATE NewCookiesTable SET Cookies = ? WHERE UID=?",(Cookies,uid)) - - conn.commit() - conn.close() - -async def OwnerCookies(uid): - conn = sqlite3.connect('ID_DATA.db') - c = conn.cursor() - try: - cursor = c.execute("SELECT * FROM NewCookiesTable WHERE UID = ?",(uid,)) - c_data = cursor.fetchall() - cookies = c_data[0][1] - except: - return - - return cookies - - - - - - - - - - -def random_hex(length): - result = hex(random.randint(0,16**length)).replace('0x','').upper() - if len(result)object: - s = s.replace("stats: [Function (anonymous)]","").replace("(","(").replace(")",")") - #此函数将不带双引号的json的key标准化 - obj = eval(s, type('js', (dict,), dict(__getitem__=lambda s, n: n))()) - return obj -''' +import datetime +import hashlib +import json +import os +import random +import re +import sqlite3 +import string +import time +from shutil import copyfile + +import requests +from httpx import AsyncClient + +mhyVersion = "2.11.1" + +BASE_PATH = os.path.dirname(__file__) +BASE2_PATH = os.path.join(BASE_PATH, 'mihoyo_bbs') +INDEX_PATH = os.path.join(BASE2_PATH, 'index') + + +async def config_check(func, mode="CHECK"): + conn = sqlite3.connect('ID_DATA.db') + c = conn.cursor() + c.execute('''CREATE TABLE IF NOT EXISTS Config + (Name TEXT PRIMARY KEY NOT NULL, + Status TEXT, + GroupList TEXT, + Extra TEXT);''') + c.execute("INSERT OR IGNORE INTO Config (Name,Status) \ + VALUES (?, ?)", (func, "on")) + if mode == "CHECK": + cursor = c.execute("SELECT * from Config WHERE Name = ?", (func,)) + c_data = cursor.fetchall() + conn.close() + if c_data[0][1] != "off": + return True + else: + return False + elif mode == "OPEN": + c.execute("UPDATE Config SET Status = ? WHERE Name=?", ("on", func)) + conn.commit() + conn.close() + return True + elif mode == "CLOSED": + c.execute("UPDATE Config SET Status = ? WHERE Name=?", ("off", func)) + conn.commit() + conn.close() + return True + + +async def get_a_lots(qid): + conn = sqlite3.connect('ID_DATA.db') + c = conn.cursor() + c.execute('''CREATE TABLE IF NOT EXISTS UseridDict + (QID INT PRIMARY KEY NOT NULL, + lots TEXT, + cache TEXT, + permission TEXT, + Status TEXT, + Subscribe TEXT, + Extra TEXT);''') + cursor = c.execute("SELECT * from UseridDict WHERE QID = ?", (qid,)) + c_data = cursor.fetchall() + with open(os.path.join(INDEX_PATH, 'lots.txt'), "r") as f: + raw_data = f.read() + raw_data = raw_data.replace(' ', "").split('-') + + if len(c_data) == 0: + num = random.randint(1, len(raw_data) - 1) + data = raw_data[num] + c.execute("INSERT OR IGNORE INTO UseridDict (QID,lots) \ + VALUES (?, ?)", (qid, str(num))) + else: + if c_data[0][1] is None: + num = random.randint(0, len(raw_data) - 1) + data = raw_data[num] + c.execute("UPDATE UseridDict SET lots = ? WHERE QID=?", (str(num), qid)) + else: + num = int(c_data[0][1]) + data = raw_data[num] + conn.commit() + conn.close() + return data + + +async def open_push(uid, qid, status, mode): + conn = sqlite3.connect('ID_DATA.db') + c = conn.cursor() + cursor = c.execute("SELECT * from NewCookiesTable WHERE UID = ?", (uid,)) + c_data = cursor.fetchall() + if len(c_data) != 0: + try: + c.execute("UPDATE NewCookiesTable SET {s} = ?,QID = ? WHERE UID=?".format(s=mode), (status, qid, uid)) + conn.commit() + conn.close() + return "成功!" + except: + return "未找到Ck绑定记录。" + else: + return "未找到Ck绑定记录。" + + +async def check_db(): + return_str = str() + invalid_list = [] + conn = sqlite3.connect('ID_DATA.db') + c = conn.cursor() + cursor = c.execute("SELECT UID,Cookies,QID from NewCookiesTable") + c_data = cursor.fetchall() + for row in c_data: + try: + aid = re.search(r"account_id=(\d*)", row[1]) + mihoyo_id_data = aid.group(0).split('=') + mihoyo_id = mihoyo_id_data[1] + mys_data = await get_mihoyo_bbs_info(mihoyo_id, row[1]) + for i in mys_data['data']['list']: + if i['game_id'] != 2: + mys_data['data']['list'].remove(i) + return_str = return_str + f"uid{row[0]}/mys{mihoyo_id}的Cookies是正常的!\n" + except: + return_str = return_str + f"uid{row[0]}的Cookies是异常的!已删除该条Cookies!\n" + invalid_list.append([row[2], row[0]]) + c.execute("DELETE from NewCookiesTable where UID=?", (row[0],)) + try: + c.execute("DELETE from CookiesCache where Cookies=?", (row[1],)) + except: + pass + conn.commit() + conn.close() + return [return_str, invalid_list] + + +async def connect_db(userid, uid=None, mys=None): + conn = sqlite3.connect('ID_DATA.db') + c = conn.cursor() + c.execute('''CREATE TABLE IF NOT EXISTS UIDDATA + (USERID INT PRIMARY KEY NOT NULL, + UID TEXT, + MYSID TEXT);''') + + c.execute("INSERT OR IGNORE INTO UIDDATA (USERID,UID,MYSID) \ + VALUES (?, ?,?)", (userid, uid, mys)) + + if uid: + c.execute("UPDATE UIDDATA SET UID = ? WHERE USERID=?", (uid, userid)) + if mys: + c.execute("UPDATE UIDDATA SET MYSID = ? WHERE USERID=?", (mys, userid)) + + conn.commit() + conn.close() + + +async def select_db(userid, mode="auto"): + conn = sqlite3.connect('ID_DATA.db') + c = conn.cursor() + cursor = c.execute("SELECT * FROM UIDDATA WHERE USERID = ?", (userid,)) + for row in cursor: + if mode == "auto": + if row[0]: + if row[2]: + return [row[2], 3] + elif row[1]: + return [row[1], 2] + else: + return None + else: + return None + elif mode == "uid": + return [row[1], 2] + elif mode == "mys": + return [row[2], 3] + + +async def delete_cache(): + try: + copyfile("ID_DATA.db", "ID_DATA_bak.db") + print("————数据库成功备份————") + except: + print("————数据库备份失败————") + + try: + conn = sqlite3.connect('ID_DATA.db') + c = conn.cursor() + c.execute("DROP TABLE CookiesCache") + c.execute("UPDATE NewCookiesTable SET Extra = ? WHERE Extra=?", (None, "limit30")) + c.execute('''CREATE TABLE IF NOT EXISTS CookiesCache + (UID TEXT PRIMARY KEY, + MYSID TEXT, + Cookies TEXT);''') + conn.commit() + conn.close() + print("————UID查询缓存已清空————") + except: + print("\nerror\n") + + try: + conn = sqlite3.connect('ID_DATA.db') + c = conn.cursor() + c.execute("UPDATE UseridDict SET lots=NULL") + conn.commit() + conn.close() + print("————御神签缓存已清空————") + except: + print("\nerror\n") + + +def error_db(ck, err): + conn = sqlite3.connect('ID_DATA.db') + c = conn.cursor() + if err == "error": + c.execute("UPDATE NewCookiesTable SET Extra = ? WHERE Cookies=?", ("error", ck)) + elif err == "limit30": + c.execute("UPDATE NewCookiesTable SET Extra = ? WHERE Cookies=?", ("limit30", ck)) + + +def cache_db(uid, mode=1, mys=None): + conn = sqlite3.connect('ID_DATA.db') + c = conn.cursor() + c.execute('''CREATE TABLE IF NOT EXISTS CookiesCache + (UID TEXT PRIMARY KEY, + MYSID TEXT, + Cookies TEXT);''') + + if mode == 1: + if mys: + cursor = c.execute("SELECT * FROM CookiesCache WHERE MYSID = ?", (mys,)) + else: + cursor = c.execute("SELECT * FROM CookiesCache WHERE UID = ?", (uid,)) + else: + cursor = c.execute("SELECT * FROM CookiesCache WHERE MYSID = ?", (uid,)) + c_data = cursor.fetchall() + + if len(c_data) == 0: + if mode == 2: + conn.create_function("REGEXP", 2, regex_func) + cursor = c.execute("SELECT * FROM NewCookiesTable WHERE REGEXP(Cookies, ?)", (uid,)) + d_data = cursor.fetchall() + + else: + cursor = c.execute("SELECT * FROM NewCookiesTable WHERE UID = ?", (uid,)) + d_data = cursor.fetchall() + + if len(d_data) != 0: + if d_data[0][7] != "error": + use = d_data[0][1] + if mode == 1: + c.execute("INSERT OR IGNORE INTO CookiesCache (Cookies,UID) \ + VALUES (?, ?)", (use, uid)) + elif mode == 2: + c.execute("INSERT OR IGNORE INTO CookiesCache (Cookies,MYSID) \ + VALUES (?, ?)", (use, uid)) + else: + cookies_row = c.execute("SELECT * FROM NewCookiesTable WHERE Extra IS NULL ORDER BY RANDOM() LIMIT 1") + e_data = cookies_row.fetchall() + if len(e_data) != 0: + if mode == 1: + c.execute("INSERT OR IGNORE INTO CookiesCache (Cookies,UID) \ + VALUES (?, ?)", (e_data[0][1], uid)) + elif mode == 2: + c.execute("INSERT OR IGNORE INTO CookiesCache (Cookies,MYSID) \ + VALUES (?, ?)", (e_data[0][1], uid)) + use = e_data[0][1] + else: + return "没有可以使用的Cookies!" + else: + cookies_row = c.execute("SELECT * FROM NewCookiesTable WHERE Extra IS NULL ORDER BY RANDOM() LIMIT 1") + e_data = cookies_row.fetchall() + if len(e_data) != 0: + if mode == 1: + c.execute("INSERT OR IGNORE INTO CookiesCache (Cookies,UID) \ + VALUES (?, ?)", (e_data[0][1], uid)) + elif mode == 2: + c.execute("INSERT OR IGNORE INTO CookiesCache (Cookies,MYSID) \ + VALUES (?, ?)", (e_data[0][1], uid)) + use = e_data[0][1] + else: + return "没有可以使用的Cookies!" + else: + use = c_data[0][2] + if mys: + try: + c.execute("UPDATE CookiesCache SET UID = ? WHERE MYSID=?", (uid, mys)) + except: + c.execute("UPDATE CookiesCache SET MYSID = ? WHERE UID=?", (mys, uid)) + + conn.commit() + conn.close() + return use + + +def regex_func(value, patter): + c_pattern = re.compile(r"account_id={}".format(patter)) + return c_pattern.search(value) is not None + + +async def cookies_db(uid, cookies, qid): + conn = sqlite3.connect('ID_DATA.db') + c = conn.cursor() + + c.execute('''CREATE TABLE IF NOT EXISTS NewCookiesTable + (UID INT PRIMARY KEY NOT NULL, + Cookies TEXT, + QID INT, + StatusA TEXT, + StatusB TEXT, + StatusC TEXT, + NUM INT, + Extra TEXT);''') + + cursor = c.execute("SELECT * from NewCookiesTable WHERE UID = ?", (uid,)) + c_data = cursor.fetchall() + if len(c_data) == 0: + c.execute("INSERT OR IGNORE INTO NewCookiesTable (Cookies,UID,StatusA,StatusB,StatusC,NUM,QID) \ + VALUES (?, ?,?,?,?,?,?)", (cookies, uid, "off", "off", "off", 140, qid)) + else: + c.execute("UPDATE NewCookiesTable SET Cookies = ? WHERE UID=?", (cookies, uid)) + + conn.commit() + conn.close() + + +async def owner_cookies(uid): + conn = sqlite3.connect('ID_DATA.db') + c = conn.cursor() + try: + cursor = c.execute("SELECT * FROM NewCookiesTable WHERE UID = ?", (uid,)) + c_data = cursor.fetchall() + cookies = c_data[0][1] + except: + return + + return cookies + + +def random_hex(length): + result = hex(random.randint(0, 16 ** length)).replace('0x', '').upper() + if len(result) < length: + result = "0" * (length - len(result)) + result + return result + + +def md5(text): + md5_func = hashlib.md5() + md5_func.update(text.encode()) + return md5_func.hexdigest() + + +def old_version_get_ds_token(): + n = "h8w582wxwgqvahcdkpvdhbh2w9casgfl" + i = str(int(time.time())) + r = ''.join(random.sample(string.ascii_lowercase + string.digits, 6)) + c = md5("salt=" + n + "&t=" + i + "&r=" + r) + return i + "," + r + "," + c + + +def get_ds_token(q="", b=None): + if b: + br = json.dumps(b) + else: + br = "" + s = "xV8v4Qu54lUKrEYFZkJhB8cuOh9Asafs" + t = str(int(time.time())) + r = str(random.randint(100000, 200000)) + c = md5("salt=" + s + "&t=" + t + "&r=" + r + "&b=" + br + "&q=" + q) + return t + "," + r + "," + c + + +async def get_daily_data(uid, server_id="cn_gf01"): + if uid[0] == '5': + server_id = "cn_qd01" + try: + async with AsyncClient() as client: + req = await client.get( + url="https://api-takumi.mihoyo.com/game_record/app/genshin/api/dailyNote", + headers={ + 'DS': get_ds_token("role_id=" + uid + "&server=" + server_id), + 'x-rpc-app_version': mhyVersion, + 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (' + 'KHTML, like Gecko) miHoYoBBS/2.11.1', + 'x-rpc-client_type': '5', + 'Referer': 'https://webstatic.mihoyo.com/', + "Cookie": await owner_cookies(uid)}, + params={ + "server": server_id, + "role_id": uid + } + ) + data = json.loads(req.text) + # print(data) + return data + except requests.exceptions.SSLError: + try: + async with AsyncClient() as client: + req = await client.get( + url="https://api-takumi-record.mihoyo.com/game_record/app/genshin/api/dailyNote", + headers={ + 'DS': get_ds_token("role_id=" + uid + "&server=" + server_id), + 'x-rpc-app_version': mhyVersion, + 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 ' + '(KHTML, like Gecko) miHoYoBBS/2.11.1', + 'x-rpc-client_type': '5', + 'Referer': 'https://webstatic.mihoyo.com/', + "Cookie": await owner_cookies(uid)}, + params={ + "server": server_id, + "role_id": uid + } + ) + data = json.loads(req.text) + return data + except json.decoder.JSONDecodeError: + print("当前状态读取Api失败!") + except Exception as e: + print("访问每日信息失败,请重试!") + print(e.with_traceback) + + +async def get_sign_list(): + try: + async with AsyncClient() as client: + req = await client.get( + url="https://api-takumi.mihoyo.com/event/bbs_sign_reward/home", + headers={ + 'x-rpc-app_version': mhyVersion, + 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (' + 'KHTML, like Gecko) miHoYoBBS/2.11.1', + 'x-rpc-client_type': '5', + 'Referer': 'https://webstatic.mihoyo.com/'}, + params={ + "act_id": "e202009291139501" + } + ) + data = json.loads(req.text) + return data + except: + print("获取签到奖励列表失败,请重试") + + +async def get_sign_info(uid, server_id="cn_gf01"): + if uid[0] == '5': + server_id = "cn_qd01" + try: + async with AsyncClient() as client: + req = await client.get( + url="https://api-takumi.mihoyo.com/event/bbs_sign_reward/info", + headers={ + 'x-rpc-app_version': mhyVersion, + "Cookie": await owner_cookies(uid), + 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (' + 'KHTML, like Gecko) miHoYoBBS/2.11.1', + 'x-rpc-client_type': '5', + 'Referer': 'https://webstatic.mihoyo.com/'}, + params={ + "act_id": "e202009291139501", + "region": server_id, + "uid": uid + } + ) + data = json.loads(req.text) + return data + except: + print("获取签到信息失败,请重试") + + +async def mihoyo_bbs_sign(uid, server_id="cn_gf01"): + if uid[0] == '5': + server_id = "cn_qd01" + try: + req = requests.post( + url="https://api-takumi.mihoyo.com/event/bbs_sign_reward/sign", + headers={ + 'User_Agent': 'Mozilla/5.0 (Linux; Android 10; MIX 2 Build/QKQ1.190825.002; wv) AppleWebKit/537.36 (' + 'KHTML, like Gecko) Version/4.0 Chrome/83.0.4103.101 Mobile Safari/537.36 ' + 'miHoYoBBS/2.3.0', + "Cookie": await owner_cookies(uid), + "x-rpc-device_id": random_hex(32), + 'Origin': 'https://webstatic.mihoyo.com', + 'X_Requested_With': 'com.mihoyo.hyperion', + 'DS': old_version_get_ds_token(), + 'x-rpc-client_type': '5', + 'Referer': 'https://webstatic.mihoyo.com/bbs/event/signin-ys/index.html?bbs_auth_required=true&act_id' + '=e202009291139501&utm_source=bbs&utm_medium=mys&utm_campaign=icon', + 'x-rpc-app_version': '2.3.0' + }, + json={"act_id": "e202009291139501", "uid": uid, "region": server_id} + ) + data2 = json.loads(req.text) + return data2 + except: + print("签到失败,请重试") + + +async def get_award(uid, server_id="cn_gf01"): + if uid[0] == '5': + server_id = "cn_qd01" + try: + async with AsyncClient() as client: + req = await client.get( + url="https://hk4e-api.mihoyo.com/event/ys_ledger/monthInfo", + headers={ + 'x-rpc-app_version': mhyVersion, + "Cookie": await owner_cookies(uid), + 'DS': old_version_get_ds_token(), + "x-rpc-device_id": random_hex(32), + 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (' + 'KHTML, like Gecko) miHoYoBBS/2.11.1', + 'x-rpc-client_type': '5', + 'Referer': 'https://webstatic.mihoyo.com/'}, + params={ + "act_id": "e202009291139501", + "bind_region": server_id, + "bind_uid": uid, + "month": "0", + "bbs_presentation_style": "fullscreen", + "bbs_auth_required": True, + "utm_source": "bbs", + "utm_medium": "mys", + "utm_campaign": "icon" + } + ) + data = json.loads(req.text) + return data + except: + print("访问失败,请重试!") + # sys.exit(1) + + +async def get_info(uid, ck, server_id="cn_gf01"): + if uid[0] == '5': + server_id = "cn_qd01" + try: + async with AsyncClient() as client: + req = await client.get( + url="https://api-takumi.mihoyo.com/game_record/app/genshin/api/index", + headers={ + 'DS': get_ds_token("role_id=" + uid + "&server=" + server_id), + 'x-rpc-app_version': mhyVersion, + 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (' + 'KHTML, like Gecko) miHoYoBBS/2.11.1', + 'x-rpc-client_type': '5', + 'Referer': 'https://webstatic.mihoyo.com/', + "Cookie": ck}, + params={ + "role_id": uid, + "server": server_id + } + ) + data = json.loads(req.text) + return data + except requests.exceptions.SSLError: + try: + async with AsyncClient() as client: + req = await client.get( + url="https://api-takumi-record.mihoyo.com/game_record/app/genshin/api/index", + headers={ + 'DS': get_ds_token("role_id=" + uid + "&server=" + server_id), + 'x-rpc-app_version': mhyVersion, + 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 ' + '(KHTML, like Gecko) miHoYoBBS/2.11.1', + 'x-rpc-client_type': '5', + 'Referer': 'https://webstatic.mihoyo.com/', + "Cookie": ck}, + params={ + "role_id": uid, + "server": server_id + } + ) + data = json.loads(req.text) + return data + except json.decoder.JSONDecodeError: + print("米游社基础信息读取新Api失败!") + except Exception as e: + print("米游社基础信息读取旧Api失败!") + print(e.with_traceback) + + +async def get_spiral_abyss_info(uid, ck, schedule_type="1", server_id="cn_gf01"): + if uid[0] == '5': + server_id = "cn_qd01" + try: + async with AsyncClient() as client: + req = await client.get( + url="https://api-takumi.mihoyo.com/game_record/app/genshin/api/spiralAbyss", + headers={ + 'DS': get_ds_token("role_id=" + uid + "&schedule_type=" + schedule_type + "&server=" + server_id), + 'Origin': 'https://webstatic.mihoyo.com', + 'Cookie': ck, + 'x-rpc-app_version': mhyVersion, + 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS ' + 'X) AppleWebKit/605.1.15 (KHTML, like Gecko) miHoYoBBS/2.11.1', + 'x-rpc-client_type': '5', + 'Referer': 'https://webstatic.mihoyo.com/' + }, + parmas={ + "schedule_type": schedule_type, + "role_id": uid, + "server": server_id + } + ) + data = json.loads(req.text) + return data + except requests.exceptions.SSLError: + try: + async with AsyncClient() as client: + req = await client.get( + url="https://api-takumi-record.mihoyo.com/game_record/app/genshin/api/spiralAbyss", + headers={ + 'DS': get_ds_token( + "role_id=" + uid + "&schedule_type=" + schedule_type + "&server=" + server_id), + 'Origin': 'https://webstatic.mihoyo.com', + 'Cookie': ck, + 'x-rpc-app_version': mhyVersion, + 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 ' + '(KHTML, like Gecko) miHoYoBBS/2.11.1', + 'x-rpc-client_type': '5', + 'Referer': 'https://webstatic.mihoyo.com/' + }, + params={ + "role_id": uid, + "server": server_id, + "bbs_presentation_style": "fullscreen", + "bbs_auth_required": "true", + "utm_source": "bbs", + "utm_medium": "mys", + "utm_campaign": "icon" + } + ) + data = json.loads(req.text) + return data + except json.decoder.JSONDecodeError: + print("深渊信息读取新Api失败!") + except Exception as e: + print("深渊信息读取老Api失败!") + print(e.with_traceback) + + +def get_character(uid, character_ids, ck, server_id="cn_gf01"): + if uid[0] == '5': + server_id = "cn_qd01" + try: + req = requests.post( + url="https://api-takumi.mihoyo.com/game_record/app/genshin/api/character", + headers={ + 'DS': get_ds_token('', {"character_ids": character_ids, "role_id": uid, "server": server_id}), + 'Origin': 'https://webstatic.mihoyo.com', + 'Cookie': ck, + 'x-rpc-app_version': mhyVersion, + 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (KHTML, ' + 'like Gecko) miHoYoBBS/2.11.1', + 'x-rpc-client_type': '5', + 'Referer': 'https://webstatic.mihoyo.com/' + }, + json={"character_ids": character_ids, "role_id": uid, "server": server_id} + ) + data2 = json.loads(req.text) + return data2 + except requests.exceptions.SSLError: + try: + req = requests.post( + url="https://api-takumi-record.mihoyo.com/game_record/app/genshin/api/character", + headers={ + 'DS': get_ds_token('', {"character_ids": character_ids, "role_id": uid, "server": server_id}), + 'Origin': 'https://webstatic.mihoyo.com', + 'Cookie': ck, + 'x-rpc-app_version': mhyVersion, + 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (' + 'KHTML, like Gecko) miHoYoBBS/2.11.1', + 'x-rpc-client_type': '5', + 'Referer': 'https://webstatic.mihoyo.com/' + }, + json={"character_ids": character_ids, "role_id": uid, "server": server_id} + ) + data = json.loads(req.text) + return data + except json.decoder.JSONDecodeError: + print("深渊信息读取新Api失败!") + except Exception as e: + print("深渊信息读取老Api失败!") + print(e.with_traceback) + + +async def get_mihoyo_bbs_info(mysid, ck): + try: + async with AsyncClient() as client: + req = await client.get( + url="https://api-takumi.mihoyo.com/game_record/card/wapi/getGameRecordCard", + headers={ + 'DS': get_ds_token("uid=" + mysid), + 'x-rpc-app_version': mhyVersion, + 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 (' + 'KHTML, like Gecko) miHoYoBBS/2.11.1', + 'x-rpc-client_type': '5', + 'Referer': 'https://webstatic.mihoyo.com/', + "Cookie": ck}, + params={"uid": mysid} + ) + data = json.loads(req.text) + return data + except requests.exceptions.SSLError: + try: + async with AsyncClient() as client: + req = await client.get( + url="https://api-takumi-record.mihoyo.com/game_record/card/wapi/getGameRecordCard?uid=" + mysid, + headers={ + 'DS': get_ds_token("uid=" + mysid), + 'x-rpc-app_version': mhyVersion, + 'User-Agent': 'Mozilla/5.0 (iPhone; CPU iPhone OS 13_2_3 like Mac OS X) AppleWebKit/605.1.15 ' + '(KHTML, like Gecko) miHoYoBBS/2.11.1', + 'x-rpc-client_type': '5', + 'Referer': 'https://webstatic.mihoyo.com/', + "Cookie": ck}, + params={"uid": mysid} + ) + data = json.loads(req.text) + return data + except json.decoder.JSONDecodeError: + print("米游社信息读取新Api失败!") + except Exception as e: + print("米游社信息读取老Api失败!") + print(e.with_traceback) + + +async def get_audio_info(name, audioid, language="cn"): + url = "https://genshin.minigg.cn/?characters=" + name + "&audioid=" + audioid + "&language=" + language + async with AsyncClient() as client: + req = await client.get( + url=url, + headers={ + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ' + 'Chrome/95.0.4638.69 Safari/537.36', + 'Referer': 'https://genshin.minigg.cn/index.html'}, + params={"characters": name, "audioid": audioid, "language": language} + ) + return req.text + + +async def get_weapon_info(name, level=None): + if level: + params = {"query": name, "stats": level} + else: + params = {"query": name} + async with AsyncClient() as client: + req = await client.get( + url="https://info.minigg.cn/weapons", + headers={ + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ' + 'Chrome/95.0.4638.69 Safari/537.36'}, + params=params + ) + data = json.loads(req.text) + return data + + +async def get_misc_info(mode, name): + url = "https://info.minigg.cn/{}".format(mode) + async with AsyncClient() as client: + req = await client.get( + url=url, + headers={ + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ' + 'Chrome/97.0.4692.71 Safari/537.36'}, + params={"query": name} + ) + data = json.loads(req.text) + return data + + +async def get_char_info(name, mode="char", level=None): + url2 = None + data2 = None + baseurl = "https://info.minigg.cn/characters?query=" + if mode == "talents": + url = "https://info.minigg.cn/talents?query=" + name + elif mode == "constellations": + url = "https://info.minigg.cn/constellations?query=" + name + elif mode == "costs": + url = baseurl + name + "&costs=1" + url2 = "https://info.minigg.cn/talents?query=" + name + "&costs=1" + url3 = "https://info.minigg.cn/talents?query=" + name + "&matchCategories=true" + elif level: + url = baseurl + name + "&stats=" + level + else: + url = baseurl + name + + if url2: + async with AsyncClient() as client: + req = await client.get( + url=url2, + headers={ + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ' + 'Chrome/95.0.4638.69 Safari/537.36', + 'Referer': 'https://genshin.minigg.cn/index.html'}) + data2 = json.loads(req.text) + if "errcode" in data2: + async with AsyncClient() as client_: + req = await client_.get( + url=url3, + headers={ + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, ' + 'like Gecko) Chrome/95.0.4638.69 Safari/537.36', + 'Referer': 'https://genshin.minigg.cn/index.html'}) + data2 = json.loads(req.text) + + async with AsyncClient() as client: + req = await client.get( + url=url, + headers={ + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ' + 'Chrome/95.0.4638.69 Safari/537.36', + 'Referer': 'https://genshin.minigg.cn/index.html'}) + try: + data = json.loads(req.text) + if "errcode" in data: + async with AsyncClient() as client_: + req = await client_.get( + url=url + "&matchCategories=true", + headers={ + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, ' + 'like Gecko) Chrome/95.0.4638.69 Safari/537.36', + 'Referer': 'https://genshin.minigg.cn/index.html'}) + data = json.loads(req.text) + except: + data = None + return data if data2 is None else [data, data2] + + +async def get_genshin_events(mode="List"): + if mode == "Calendar": + now_time = datetime.datetime.now().strftime('%Y-%m-%d') + base_url = "https://api-takumi.mihoyo.com/event/bbs_activity_calendar/getActList" + params = { + "time": now_time, + "game_biz": "ys_cn", + "page": 1, + "tag_id": 0 + } + else: + base_url = "https://hk4e-api.mihoyo.com/common/hk4e_cn/announcement/api/getAnn{}".format(mode) + params = { + "game": "hk4e", + "game_biz": "hk4e_cn", + "lang": "zh-cn", + "bundle_id": "hk4e_cn", + "platform": "pc", + "region": "cn_gf01", + "level": 55, + "uid": 100000000 + } + + async with AsyncClient() as client: + req = await client.get( + url=base_url, + headers={ + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) ' + 'Chrome/95.0.4638.69 Safari/537.36'}, + params=params + ) + data = json.loads(req.text) + return data diff --git a/get_image.py b/get_image.py new file mode 100644 index 00000000..2c767fc1 --- /dev/null +++ b/get_image.py @@ -0,0 +1,1380 @@ +import math +import os +import random +import threading +import time +from base64 import b64encode +from io import BytesIO +from re import findall + +import numpy as np +from PIL import Image, ImageDraw, ImageFont, ImageFilter +from httpx import get +from nonebot.adapters.onebot.v11 import Message +from wordcloud import WordCloud + +from .get_data import get_info, get_character, get_spiral_abyss_info, get_mihoyo_bbs_info, \ + error_db, cache_db, get_genshin_events + +FILE_PATH = os.path.dirname(__file__) +FILE2_PATH = os.path.join(FILE_PATH, 'mihoyo_bbs') +CHAR_PATH = os.path.join(FILE2_PATH, 'chars') +CHAR_DONE_PATH = os.path.join(FILE2_PATH, 'char_done') +CHAR_IMG_PATH = os.path.join(FILE2_PATH, 'char_img') +REL_PATH = os.path.join(FILE2_PATH, 'reliquaries') +CHAR_WEAPON_PATH = os.path.join(FILE2_PATH, 'char_weapon') +TEXT_PATH = os.path.join(FILE2_PATH, 'texture2d') +WEAPON_PATH = os.path.join(FILE2_PATH, 'weapon') +BG_PATH = os.path.join(FILE2_PATH, 'bg') + + +def genshin_font(size): + return ImageFont.truetype(os.path.join(FILE2_PATH, "yuanshen.ttf"), size=size) + + +def get_char_pic(_id, url): + with open(os.path.join(CHAR_PATH, f'{_id}.png'), 'wb') as f: + f.write(get(url).content) + + +def get_char_done_pic(_id, url, star): + char_data = get(url).content + if star == 4: + star1_path = os.path.join(TEXT_PATH, '4star_1.png') + star2_path = os.path.join(TEXT_PATH, '4star_2.png') + else: + star1_path = os.path.join(TEXT_PATH, '5star_1.png') + star2_path = os.path.join(TEXT_PATH, '5star_2.png') + star_1 = Image.open(star1_path) + star_2 = Image.open(star2_path) + char_img = Image.open(BytesIO(char_data)).resize((104, 104), Image.ANTIALIAS) + star_1.paste(char_img, (12, 15), char_img) + star_1.paste(star_2, (0, 0), star_2) + star_1.save(os.path.join(CHAR_DONE_PATH, str(_id) + '.png')) + + +def get_weapon_pic(url): + with open(os.path.join(WEAPON_PATH, url.split('/')[-1]), 'wb') as f: + f.write(get(url).content) + + +def get_char_img_pic(url): + with open(os.path.join(CHAR_IMG_PATH, url.split('/')[-1]), 'wb') as f: + f.write(get(url).content) + + +def get_rel_pic(url): + with open(os.path.join(REL_PATH, url.split('/')[-1]), 'wb') as f: + f.write(get(url).content) + + +async def draw_word_cloud(uid, image=None, mode=2): + while True: + use_cookies = cache_db(uid, mode - 1) + if use_cookies == '': + return "绑定记录不存在。" + elif use_cookies == "没有可以使用的Cookies!": + return "没有可以使用的Cookies!" + + if mode == 3: + mys_data = await get_mihoyo_bbs_info(uid, use_cookies) + for i in mys_data['data']['list']: + if i['game_id'] != 2: + mys_data['data']['list'].remove(i) + uid = mys_data['data']['list'][0]['game_role_id'] + nickname = mys_data['data']['list'][0]['nickname'] + # role_level = mys_data['data']['list'][0]['level'] + raw_data = await get_info(uid, use_cookies) + raw_abyss_data = await get_spiral_abyss_info(uid, use_cookies) + else: + raw_abyss_data = await get_spiral_abyss_info(uid, use_cookies) + raw_data = await get_info(uid, use_cookies) + + if raw_data["retcode"] != 0: + if raw_data["retcode"] == 10001: + # return ("Cookie错误/过期,请重置Cookie") + error_db(use_cookies, "error") + elif raw_data["retcode"] == 10101: + # return ("当前cookies已达到30人上限!") + error_db(use_cookies, "limit30") + elif raw_data["retcode"] == 10102: + return "当前查询id已经设置了隐私,无法查询!" + else: + return ( + "Api报错,返回内容为:\r\n" + + str(raw_data) + "\r\n出现这种情况可能的UID输入错误 or 不存在" + ) + else: + break + + raw_abyss_data = raw_abyss_data['data'] + raw_data = raw_data['data'] + + # char_data = raw_data["avatars"] + # char_num = len(raw_data["avatars"]) + + char_datas = [] + + def get_char_id(start, end): + for char in range(start, end): + char_rawdata = get_character(uid, [char], use_cookies) + + if char_rawdata["retcode"] != -1: + char_datas.append(char_rawdata["data"]['avatars'][0]) + + thread_list = [] + st = 8 + for i in range(0, 8): + thread = threading.Thread(target=get_char_id, args=(10000002 + i * st, 10000002 + (i + 1) * st)) + thread_list.append(thread) + + for t in thread_list: + t.setDaemon(True) + t.start() + + for t in thread_list: + t.join() + + weapons_datas = [] + for i in char_datas: + weapons_datas.append(i['weapon']) + + l1_size = 2 + l2_size = 4 + l3_size = 6 + l4_size = 7 + l5_size = 10 + + word_str = {} + + star4weapon = 0 + star5weapon = 0 + star5weapon_con = 0 + # star3weapon = 0 + for i in weapons_datas: + if i['rarity'] == 5: + star5weapon += 1 + star5weapon_con += i['affix_level'] + elif i['rarity'] == 4: + star4weapon += 1 + elif i['rarity'] == 3: + star4weapon += 1 + + g3d1 = 0 + ly3c = 0 + star5num = 0 + star5num_con = 0 + + for i in char_datas: + if i["name"] in ['雷电将军', '温迪', '钟离', '枫原万叶']: + g3d1 += 1 + if i["name"] in ['甘雨', '魈', '胡桃']: + ly3c += 1 + if i['rarity'] == 5: + star5num += 1 + if i['name'] != '旅行者': + star5num_con += 1 + i['actived_constellation_num'] + + if i["level"] >= 80: + if i['name'] == "迪卢克": + word_str["落魄了家人们"] = l3_size + if i['name'] == "刻晴": + word_str["斩尽牛杂"] = l3_size + if i['name'] == "旅行者": + word_str["旅行者真爱党"] = l3_size + + if i['actived_constellation_num'] == 6: + if i['rarity'] == 5: + if i['name'] == "旅行者": + word_str["满命{}".format(i['name'])] = l1_size + if i['name'] == "魈": + word_str['魈深氪的救赎'] = l5_size + if i['name'] == "甘雨": + word_str['璃月自走归终机'] = l5_size + if i['name'] == "胡桃": + word_str['一波送走全送走'] = l5_size + else: + word_str["满命{}".format(i['name'])] = l5_size + else: + word_str["满命{}".format(i['name'])] = l2_size + + game_time = time.mktime(time.strptime('20200915', '%Y%m%d')) + now_time = time.time() + total_s = now_time - game_time + total_d = ((total_s / 60) / 60) / 24 + + if math.floor(total_d) - 5 <= raw_data['stats']['active_day_number']: + word_str["开服玩家"] = l4_size + + if g3d1 >= 4: + word_str["三神一帝"] = l3_size + if ly3c >= 3: + word_str["璃月3C"] = l3_size + if star5num >= 16: + word_str["五星众多"] = l3_size + + if len(weapons_datas) - star4weapon <= 3: + word_str["武器基本四星"] = l3_size + + if raw_data['stats']['achievement_number'] // (star5weapon_con + star5num_con) >= 23: + word_str["平民玩家"] = l2_size + elif raw_data['stats']['achievement_number'] // (star5weapon_con + star5num_con) <= 15: + word_str["氪金玩家"] = l3_size + + if raw_data['stats']['anemoculus_number'] + raw_data['stats']['geoculus_number'] + \ + raw_data['stats']['electroculus_number'] == 378: + word_str["全神瞳"] = l2_size + if raw_data['world_explorations'][3]['exploration_percentage'] + raw_data['world_explorations'][2][ + 'exploration_percentage'] + raw_data['world_explorations'][1]['exploration_percentage'] + \ + raw_data['world_explorations'][0]['exploration_percentage'] >= 3950: + word_str["全探索"] = l4_size + if raw_data['stats']['achievement_number'] >= 510: + word_str["全成就"] = l5_size + elif raw_data['stats']['achievement_number'] >= 490: + word_str["成就达人"] = l3_size + if raw_data['stats']['spiral_abyss'] == '12-3': + word_str["深境的探究者"] = l2_size + if len(raw_data['avatars']) >= 42: + word_str["全角色"] = l3_size + + if raw_data['stats']['active_day_number'] <= 40: + word_str["刚入坑"] = l1_size + elif raw_data['stats']['active_day_number'] <= 100: + word_str["初心者"] = l2_size + elif raw_data['stats']['active_day_number'] <= 300: + word_str["老玩家"] = l2_size + if raw_data['stats']['active_day_number'] >= 365 and raw_data['stats']['magic_chest_number'] + raw_data['stats'][ + 'common_chest_number'] + raw_data['stats']['exquisite_chest_number'] + \ + raw_data['stats']['precious_chest_number'] + raw_data['stats']['luxurious_chest_number'] <= 2500: + word_str["老咸鱼"] = l3_size + if raw_data['stats']['magic_chest_number'] >= 46: + word_str["迷失在黑夜里"] = l2_size + if raw_data['homes'][0]['comfort_num'] >= 25000: + word_str["团雀附体"] = l2_size + + if raw_abyss_data["reveal_rank"]: + if raw_abyss_data['total_battle_times'] <= 12 and raw_abyss_data['max_floor'] == '12-3': + word_str["PVP资格证"] = l4_size + if raw_abyss_data["damage_rank"][0]["value"] >= 150000: + word_str["这一击,贯穿星辰"] = l4_size + else: + pass + + bg_list = random.choice([x for x in os.listdir(BG_PATH) + if os.path.isfile(os.path.join(BG_PATH, x))]) + + bg2_path = os.path.join(BG_PATH, bg_list) + + based_w = 900 + based_h = 1000 + based_scale = '%.3f' % (based_w / based_h) + + is_edit = False + if image: + image_data = image.group(2) + with open(os.path.join(TEXT_PATH, nickname + '.png'), "wb") as f: + f.write(get(image_data).content) + is_edit = True + + if is_edit: + bg_path_edit = os.path.join(TEXT_PATH, f"{nickname}.png") + else: + bg_path_edit = bg2_path + + edit_bg = Image.open(bg_path_edit) + w, h = edit_bg.size + scale_f = '%.3f' % (w / h) + new_w = math.ceil(based_h * float(scale_f)) + new_h = math.ceil(based_w / float(scale_f)) + if scale_f > based_scale: + bg_img2 = edit_bg.resize((new_w, based_h), Image.ANTIALIAS) + else: + bg_img2 = edit_bg.resize((based_w, new_h), Image.ANTIALIAS) + + bg_img = bg_img2.crop((0, 0, based_w, based_h)) + + x, y = 50, 153 + radius = 50 + cropped_img = bg_img.crop((x, y, x + 800, y + 800)) + blurred_img = cropped_img.filter(ImageFilter.GaussianBlur(5), ).convert("RGBA") + bg_img.paste(blurred_img, (x, y), create_rounded_rectangle_mask(cropped_img, radius)) + + panle = Image.open(os.path.join(TEXT_PATH, 'wordcloud_0.png')) + + mask = np.array(Image.open(os.path.join(TEXT_PATH, 'wordcloudmask.png'))) + + wc = WordCloud( + font_path=os.path.join(FILE2_PATH, "yuanshen.ttf"), + mask=mask, + background_color="rgba(255, 255, 255, 0)", + mode="RGBA", + max_words=200, + max_font_size=80 + # color_func=multi_color_func + # color_func=similar_color_func + ).generate_from_frequencies(word_str, max_font_size=100) + + image_produce = wc.to_image() + + bg_img.paste(panle, (0, 0), panle) + bg_img.paste(image_produce, (0, 0), image_produce) + bg_img = bg_img.convert('RGB') + + text_draw = ImageDraw.Draw(bg_img) + text_draw.text((450, 105), 'UID ' + f"{uid}", (40, 136, 168), genshin_font(26), anchor="mm") + + result_buffer = BytesIO() + bg_img.save(result_buffer, format='JPEG', subsampling=0, quality=90) + imgmes = 'base64://' + b64encode(result_buffer.getvalue()).decode() + resultmes = f"[CQ:image,file={imgmes}]" + return resultmes + + +def similar_color_func(random_state=None): + # word=None, font_size=None, position=None, orientation=None, font_path=None + h = 40 # 0 - 360 + s = 100 # 0 - 100 + random_list_index = random_state.randint(30, 70) # 0 - 100 + return "hsl({}, {}%, {}%)".format(h, s, random_list_index) + + +def multi_color_func(random_state=None): + # word=None, font_size=None, position=None, orientation=None, font_path=None + colors = [[4, 77, 82], + [25, 74, 85], + [82, 43, 84], + [158, 48, 79]] + rand = random_state.randint(0, len(colors) - 1) + return "hsl({}, {}%, {}%)".format(colors[rand][0], colors[rand][1], colors[rand][2]) + + +async def draw_abyss0_pic(uid, nickname, image=None, mode=2, date="1"): + while 1: + use_cookies = cache_db(uid, mode - 1) + if use_cookies == '': + return "绑定记录不存在。" + elif use_cookies == "没有可以使用的Cookies!": + return "没有可以使用的Cookies!" + + if mode == 3: + mys_data = await get_mihoyo_bbs_info(uid, use_cookies) + for i in mys_data['data']['list']: + if i['game_id'] != 2: + mys_data['data']['list'].remove(i) + uid = mys_data['data']['list'][0]['game_role_id'] + nickname = mys_data['data']['list'][0]['nickname'] + # role_region = mys_data['data']['list'][0]['region'] + # role_level = mys_data['data']['list'][0]['level'] + + raw_data = await get_spiral_abyss_info(uid, use_cookies, date) + raw_char_data = await get_info(uid, use_cookies) + + if raw_data["retcode"] != 0: + if raw_data["retcode"] == 10001: + # return ("Cookie错误/过期,请重置Cookie") + error_db(use_cookies, "error") + elif raw_data["retcode"] == 10101: + # return ("当前cookies已达到30人上限!") + error_db(use_cookies, "limit30") + elif raw_data["retcode"] == 10102: + return "当前查询id已经设置了隐私,无法查询!" + else: + return ( + "Api报错,返回内容为:\r\n" + + str(raw_data) + "\r\n出现这种情况可能的UID输入错误 or 不存在" + ) + else: + break + + raw_data = raw_data["data"] + raw_char_data = raw_char_data['data']["avatars"] + + is_edit = False + if image is not None: + image_data = image.group(2) + with open(os.path.join(TEXT_PATH, nickname + '.png'), 'wb') as f: + f.write(get(image_data).content) + is_edit = True + + bg_list = random.choice([x for x in os.listdir(BG_PATH) + if os.path.isfile(os.path.join(BG_PATH, x))]) + + bg2_path = os.path.join(BG_PATH, bg_list) + + abyss0_path = os.path.join(TEXT_PATH, "abyss_0.png") + abyss2_path = os.path.join(TEXT_PATH, "abyss_2.png") + abyss3_path = os.path.join(TEXT_PATH, "abyss_3.png") + abyss_star0_path = os.path.join(TEXT_PATH, "abyss_star0.png") + abyss_star1_path = os.path.join(TEXT_PATH, "abyss_star1.png") + + floors_data = raw_data['floors'][-1] + levels_num = len(floors_data['levels']) + + based_w = 900 + based_h = 660 + levels_num * 315 + based_scale = '%.3f' % (based_w / based_h) + + if is_edit: + bg_path_edit = os.path.join(TEXT_PATH, f"{nickname}.png") + else: + bg_path_edit = bg2_path + + edit_bg = Image.open(bg_path_edit) + w, h = edit_bg.size + scale_f = '%.3f' % (w / h) + new_w = math.ceil(based_h * float(scale_f)) + new_h = math.ceil(based_w / float(scale_f)) + if scale_f > based_scale: + bg_img2 = edit_bg.resize((new_w, based_h), Image.ANTIALIAS) + else: + bg_img2 = edit_bg.resize((based_w, new_h), Image.ANTIALIAS) + + bg_img = bg_img2.crop((0, 0, based_w, based_h)) + + x1, y1 = 65, 276 + radius = 15 + cropped_img1 = bg_img.crop((x1, y1, 836, 607)) + blurred_img1 = cropped_img1.filter(ImageFilter.GaussianBlur(5), ).convert("RGBA") + bg_img.paste(blurred_img1, (x1, y1), create_rounded_rectangle_mask(cropped_img1, radius)) + + for i in range(0, len(floors_data['levels'])): + x2, y2 = 65, 630 + 315 * i + radius = 15 + cropped_img2 = bg_img.crop((x2, y2, 836, 925 + 315 * i)) + blurred_img2 = cropped_img2.filter(ImageFilter.GaussianBlur(5), ).convert("RGBA") + bg_img.paste(blurred_img2, (x2, y2), create_rounded_rectangle_mask(cropped_img2, radius)) + + abyss0 = Image.open(abyss0_path) + abyss3 = Image.open(abyss3_path) + abyss_star0 = Image.open(abyss_star0_path) + abyss_star1 = Image.open(abyss_star1_path) + + for i in range(0, 4): + if not os.path.exists(os.path.join(CHAR_DONE_PATH, str(raw_data["reveal_rank"][i]["avatar_id"]) + ".png")): + get_char_done_pic(raw_data["reveal_rank"][i]["avatar_id"], raw_data["reveal_rank"][i]["avatar_icon"], + raw_data["reveal_rank"][i]["rarity"]) + char = os.path.join(CHAR_DONE_PATH, str(raw_data["reveal_rank"][i]["avatar_id"]) + ".png") + char_img = Image.open(char) + char_draw = ImageDraw.Draw(char_img) + for k in raw_char_data: + if k['id'] == raw_data["reveal_rank"][i]["avatar_id"]: + char_draw.text((63.5, 117), f'{str(raw_data["reveal_rank"][i]["value"])}次', (21, 21, 21), + genshin_font(18), + anchor="mm") + char_draw.text((95.3, 19), f'{str(k["actived_constellation_num"])}', 'white', genshin_font(18)) + if str(k["fetter"]) == "10" or str(k["name"]) == "旅行者": + char_draw.text((93, 41.5), "♥", (21, 21, 21), genshin_font(15)) + else: + char_draw.text((95.3, 40.5), f'{str(k["fetter"])}', (21, 21, 21), genshin_font(18)) + char_crop = (82 + 130 * i, 300) + abyss0.paste(char_img, char_crop, char_img) + + for i in range(0, 1): + if not os.path.exists(os.path.join(CHAR_DONE_PATH, str(raw_data["damage_rank"][i]["avatar_id"]) + ".png")): + get_char_done_pic(raw_data["damage_rank"][i]["avatar_id"], raw_data["damage_rank"][i]["avatar_icon"], + raw_data["reveal_rank"][i]["rarity"]) + char = os.path.join(CHAR_DONE_PATH, str(raw_data["damage_rank"][i]["avatar_id"]) + ".png") + char_img = Image.open(char) + char_draw = ImageDraw.Draw(char_img) + for k in raw_char_data: + if k['id'] == raw_data["damage_rank"][i]["avatar_id"]: + char_draw.text((63.5, 117), f'{str(raw_data["damage_rank"][i]["value"])}', (21, 21, 21), + genshin_font(18), + anchor="mm") + char_draw.text((95.3, 19), f'{str(k["actived_constellation_num"])}', 'white', genshin_font(18)) + if str(k["fetter"]) == "10" or str(k["name"]) == "旅行者": + char_draw.text((93, 41.5), "♥", (21, 21, 21), genshin_font(15)) + else: + char_draw.text((95.3, 40.5), f'{str(k["fetter"])}', (21, 21, 21), genshin_font(18)) + char_crop = (685, 470) + abyss0.paste(char_img, char_crop, char_img) + + for i in range(0, 1): + if not os.path.exists(os.path.join(CHAR_DONE_PATH, str(raw_data["defeat_rank"][i]["avatar_id"]) + ".png")): + get_char_done_pic(raw_data["defeat_rank"][i]["avatar_id"], raw_data["defeat_rank"][i]["avatar_icon"], + raw_data["reveal_rank"][i]["rarity"]) + char = os.path.join(CHAR_DONE_PATH, str(raw_data["defeat_rank"][i]["avatar_id"]) + ".png") + char_img = Image.open(char) + char_draw = ImageDraw.Draw(char_img) + for k in raw_char_data: + if k['id'] == raw_data["defeat_rank"][i]["avatar_id"]: + char_draw.text((63.5, 117), f'{str(raw_data["defeat_rank"][i]["value"])}', (21, 21, 21), + genshin_font(18), + anchor="mm") + char_draw.text((95.3, 19), f'{str(k["actived_constellation_num"])}', 'white', genshin_font(18)) + if str(k["fetter"]) == "10" or str(k["name"]) == "旅行者": + char_draw.text((93, 41.5), "♥", (21, 21, 21), genshin_font(15)) + else: + char_draw.text((95.3, 40.5), f'{str(k["fetter"])}', (21, 21, 21), genshin_font(18)) + char_crop = (82 + 123 * i, 470) + abyss0.paste(char_img, char_crop, char_img) + + for i in range(0, 1): + if not os.path.exists(os.path.join(CHAR_DONE_PATH, str(raw_data["take_damage_rank"][i]["avatar_id"]) + ".png")): + get_char_done_pic(raw_data["take_damage_rank"][i]["avatar_id"], + raw_data["take_damage_rank"][i]["avatar_icon"], raw_data["reveal_rank"][i]["rarity"]) + char = os.path.join(CHAR_DONE_PATH, str(raw_data["take_damage_rank"][i]["avatar_id"]) + ".png") + char_img = Image.open(char) + char_draw = ImageDraw.Draw(char_img) + for k in raw_char_data: + if k['id'] == raw_data["take_damage_rank"][i]["avatar_id"]: + char_draw.text((63.5, 117), f'{str(raw_data["take_damage_rank"][i]["value"])}', (21, 21, 21), + genshin_font(18), anchor="mm") + char_draw.text((95.3, 19), f'{str(k["actived_constellation_num"])}', 'white', genshin_font(18)) + if str(k["fetter"]) == "10" or str(k["name"]) == "旅行者": + char_draw.text((93, 41.5), "♥", (21, 21, 21), genshin_font(15)) + else: + char_draw.text((95.3, 40.5), f'{str(k["fetter"])}', (21, 21, 21), genshin_font(18)) + char_crop = (232 + 123 * i, 470) + abyss0.paste(char_img, char_crop, char_img) + + for i in range(0, 1): + if not os.path.exists( + os.path.join(CHAR_DONE_PATH, str(raw_data["normal_skill_rank"][i]["avatar_id"]) + ".png")): + get_char_done_pic(raw_data["normal_skill_rank"][i]["avatar_id"], + raw_data["normal_skill_rank"][i]["avatar_icon"], raw_data["reveal_rank"][i]["rarity"]) + char = os.path.join(CHAR_DONE_PATH, str(raw_data["normal_skill_rank"][i]["avatar_id"]) + ".png") + char_img = Image.open(char) + char_draw = ImageDraw.Draw(char_img) + for k in raw_char_data: + if k['id'] == raw_data["normal_skill_rank"][i]["avatar_id"]: + char_draw.text((63.5, 117), f'{str(raw_data["normal_skill_rank"][i]["value"])}', (21, 21, 21), + genshin_font(18), anchor="mm") + char_draw.text((95.3, 19), f'{str(k["actived_constellation_num"])}', 'white', genshin_font(18)) + if str(k["fetter"]) == "10" or str(k["name"]) == "旅行者": + char_draw.text((93, 41.5), "♥", (21, 21, 21), genshin_font(15)) + else: + char_draw.text((95.3, 40.5), f'{str(k["fetter"])}', (21, 21, 21), genshin_font(18)) + char_crop = (382 + 123 * i, 470) + abyss0.paste(char_img, char_crop, char_img) + + for i in range(0, 1): + if not os.path.exists( + os.path.join(CHAR_DONE_PATH, str(raw_data["energy_skill_rank"][i]["avatar_id"]) + ".png")): + get_char_done_pic(raw_data["energy_skill_rank"][i]["avatar_id"], + raw_data["energy_skill_rank"][i]["avatar_icon"], raw_data["reveal_rank"][i]["rarity"]) + char = os.path.join(CHAR_DONE_PATH, str(raw_data["energy_skill_rank"][i]["avatar_id"]) + ".png") + char_img = Image.open(char) + char_draw = ImageDraw.Draw(char_img) + for k in raw_char_data: + if k['id'] == raw_data["energy_skill_rank"][i]["avatar_id"]: + char_draw.text((63.5, 118), f'{str(raw_data["energy_skill_rank"][i]["value"])}', (21, 21, 21), + genshin_font(18), anchor="mm") + char_draw.text((95.3, 19), f'{str(k["actived_constellation_num"])}', 'white', genshin_font(18)) + if str(k["fetter"]) == "10" or str(k["name"]) == "旅行者": + char_draw.text((93, 41.5), "♥", (21, 21, 21), genshin_font(15)) + else: + char_draw.text((95.3, 40.5), f'{str(k["fetter"])}', (21, 21, 21), genshin_font(18)) + char_crop = (532 + 123 * i, 470) + abyss0.paste(char_img, char_crop, char_img) + + bg_img.paste(abyss0, (0, 0), abyss0) + + for j in range(0, len(floors_data["levels"])): + abyss2 = Image.open(abyss2_path) + num_1 = 0 + for i in floors_data['levels'][j]['battles'][0]['avatars']: + if not os.path.exists(os.path.join(CHAR_DONE_PATH, str(i['id']) + ".png")): + get_char_done_pic(i['id'], i['icon'], i['rarity']) + char = os.path.join(CHAR_DONE_PATH, str(i['id']) + ".png") + char_img = Image.open(char) + char_draw = ImageDraw.Draw(char_img) + for k in raw_char_data: + if k['id'] == i['id']: + char_draw.text((40, 108), f'Lv.{str(k["level"])}', (21, 21, 21), genshin_font(18)) + char_draw.text((95.3, 19), f'{str(k["actived_constellation_num"])}', 'white', genshin_font(18)) + if str(k["fetter"]) == "10" or str(k["name"]) == "旅行者": + char_draw.text((93, 41.5), "♥", (21, 21, 21), genshin_font(15)) + else: + char_draw.text((95.3, 40.5), f'{str(k["fetter"])}', (21, 21, 21), genshin_font(18)) + char_crop = (70 + 125 * (num_1 % 4), 46) + abyss2.paste(char_img, char_crop, char_img) + num_1 = num_1 + 1 + num_2 = 0 + for i in floors_data['levels'][j]['battles'][1]['avatars']: + if not os.path.exists(os.path.join(CHAR_DONE_PATH, str(i['id']) + ".png")): + get_char_done_pic(i['id'], i['icon'], i['rarity']) + char = os.path.join(CHAR_DONE_PATH, str(i['id']) + ".png") + char_img = Image.open(char) + char_draw = ImageDraw.Draw(char_img) + for k in raw_char_data: + if k['id'] == i['id']: + char_draw.text((40, 108), f'Lv.{str(k["level"])}', (21, 21, 21), genshin_font(18)) + char_draw.text((95.3, 19), f'{str(k["actived_constellation_num"])}', 'white', genshin_font(18)) + if str(k["fetter"]) == "10" or str(k["name"]) == "旅行者": + char_draw.text((93, 41.5), "♥", (21, 21, 21), genshin_font(15)) + else: + char_draw.text((95.3, 40.5), f'{str(k["fetter"])}', (21, 21, 21), genshin_font(18)) + char_crop = (70 + 125 * (num_2 % 4), 180) + abyss2.paste(char_img, char_crop, char_img) + num_2 = num_2 + 1 + star_num = floors_data['levels'][j]['star'] + if star_num == 1: + abyss2.paste(abyss_star1, (640, 155), abyss_star1) + abyss2.paste(abyss_star0, (685, 155), abyss_star0) + abyss2.paste(abyss_star0, (730, 155), abyss_star0) + elif star_num == 0: + abyss2.paste(abyss_star0, (640, 155), abyss_star0) + abyss2.paste(abyss_star0, (685, 155), abyss_star0) + abyss2.paste(abyss_star0, (730, 155), abyss_star0) + elif star_num == 2: + abyss2.paste(abyss_star1, (640, 155), abyss_star1) + abyss2.paste(abyss_star1, (685, 155), abyss_star1) + abyss2.paste(abyss_star0, (730, 155), abyss_star0) + else: + abyss2.paste(abyss_star1, (640, 155), abyss_star1) + abyss2.paste(abyss_star1, (685, 155), abyss_star1) + abyss2.paste(abyss_star1, (730, 155), abyss_star1) + abyss2_text_draw = ImageDraw.Draw(abyss2) + abyss2_text_draw.text((87, 30), f"第{j + 1}间", (20, 20, 20), genshin_font(21)) + time_stamp1 = int(floors_data['levels'][j]['battles'][0]['timestamp']) + time_stamp2 = int(floors_data['levels'][j]['battles'][1]['timestamp']) + time_array1 = time.localtime(time_stamp1) + time_array2 = time.localtime(time_stamp2) + other_style_time1 = time.strftime("%Y--%m--%d %H:%M:%S", time_array1) + other_style_time2 = time.strftime("%Y--%m--%d %H:%M:%S", time_array2) + abyss2_text_draw.text((167, 33), f"{other_style_time1}/{other_style_time2}", (40, 40, 40), genshin_font(19)) + bg_img.paste(abyss2, (0, 605 + j * 315), abyss2) + + bg_img.paste(abyss3, (0, len(floors_data["levels"]) * 315 + 610), abyss3) + + text_draw = ImageDraw.Draw(bg_img) + + text_draw.text((250, 115), f"{nickname}", (217, 217, 217), genshin_font(32)) + text_draw.text((260, 155), 'UID ' + f"{uid}", (217, 217, 217), genshin_font(14)) + + text_draw.text((690, 82), raw_data['max_floor'], (65, 65, 65), genshin_font(26)) + text_draw.text((690, 127), str(raw_data['total_battle_times']), (65, 65, 65), genshin_font(26)) + text_draw.text((690, 172), str(raw_data['total_star']), (65, 65, 65), genshin_font(26)) + + bg_img = bg_img.convert('RGB') + result_buffer = BytesIO() + bg_img.save(result_buffer, format='JPEG', subsampling=0, quality=90) + # bg_img.save(result_buffer, format='PNG') + imgmes = 'base64://' + b64encode(result_buffer.getvalue()).decode() + resultmes = Message(f"[CQ:image,file={imgmes}]") + return resultmes + + +async def draw_abyss_pic(uid, nickname, floor_num, image=None, mode=2, date="1"): + while True: + use_cookies = cache_db(uid, mode - 1) + if use_cookies == '': + return "绑定记录不存在。" + elif use_cookies == "没有可以使用的Cookies!": + return "没有可以使用的Cookies!" + + if mode == 3: + mys_data = await get_mihoyo_bbs_info(uid, use_cookies) + for i in mys_data['data']['list']: + if i['game_id'] != 2: + mys_data['data']['list'].remove(i) + uid = mys_data['data']['list'][0]['game_role_id'] + nickname = mys_data['data']['list'][0]['nickname'] + # role_region = mys_data['data']['list'][0]['region'] + # role_level = mys_data['data']['list'][0]['level'] + + raw_data = await get_spiral_abyss_info(uid, use_cookies, date) + raw_char_data = await get_info(uid, use_cookies) + + if raw_data["retcode"] != 0: + if raw_data["retcode"] == 10001: + # return ("Cookie错误/过期,请重置Cookie") + error_db(use_cookies, "error") + elif raw_data["retcode"] == 10101: + # return ("当前cookies已达到30人上限!") + error_db(use_cookies, "limit30") + elif raw_data["retcode"] == 10102: + return "当前查询id已经设置了隐私,无法查询!" + else: + return ( + "Api报错,返回内容为:\r\n" + + str(raw_data) + "\r\n出现这种情况可能的UID输入错误 or 不存在" + ) + else: + break + + is_edit = False + if image is not None: + image_data = image.group(2) + with open(os.path.join(TEXT_PATH, nickname + '.png'), 'wb') as f: + f.write(get(image_data).content) + is_edit = True + + raw_data = raw_data["data"] + raw_char_data = raw_char_data['data']["avatars"] + + floors_data = raw_data['floors'] + + for i in floors_data: + if str(i['index']) == floor_num: + based_data = i + + # floor_star = based_data['star'] + # floors1_star = based_data['levels'][0]['star'] + # floors2_star = based_data['levels'][1]['star'] + # floors3_star = based_data['levels'][2]['star'] + # start_time1 = based_data['levels'][0]['battles'][0]['timestamp'] + # start_time2 = based_data['levels'][0]['battles'][1]['timestamp'] + + bg_list = random.choice([x for x in os.listdir(BG_PATH) + if os.path.isfile(os.path.join(BG_PATH, x))]) + + bg2_path = os.path.join(BG_PATH, bg_list) + + abyss1_path = os.path.join(TEXT_PATH, "abyss_1.png") + abyss2_path = os.path.join(TEXT_PATH, "abyss_2.png") + abyss3_path = os.path.join(TEXT_PATH, "abyss_3.png") + abyss_star0_path = os.path.join(TEXT_PATH, "abyss_star0.png") + abyss_star1_path = os.path.join(TEXT_PATH, "abyss_star1.png") + + levels_num = len(based_data['levels']) + + based_w = 900 + based_h = 240 + levels_num * 340 + based_scale = '%.3f' % (based_w / based_h) + + if is_edit: + bg_path_edit = os.path.join(TEXT_PATH, f"{nickname}.png") + else: + bg_path_edit = bg2_path + + edit_bg = Image.open(bg_path_edit) + w, h = edit_bg.size + scale_f = '%.3f' % (w / h) + new_w = math.ceil(based_h * float(scale_f)) + new_h = math.ceil(based_w / float(scale_f)) + if scale_f > based_scale: + bg_img2 = edit_bg.resize((new_w, based_h), Image.ANTIALIAS) + else: + bg_img2 = edit_bg.resize((based_w, new_h), Image.ANTIALIAS) + + bg_img = bg_img2.crop((0, 0, based_w, based_h)) + + for i in range(0, len(based_data['levels'])): + x, y = 65, 220 + 340 * i + radius = 10 + cropped_img = bg_img.crop((x, y, 836, 517 + 340 * i)) + blurred_img = cropped_img.filter(ImageFilter.GaussianBlur(5), ).convert("RGBA") + bg_img.paste(blurred_img, (x, y), create_rounded_rectangle_mask(cropped_img, radius)) + + abyss1 = Image.open(abyss1_path) + abyss3 = Image.open(abyss3_path) + abyss_star0 = Image.open(abyss_star0_path) + abyss_star1 = Image.open(abyss_star1_path) + + bg_img.paste(abyss1, (0, 0), abyss1) + + for j in range(0, len(based_data['levels'])): + abyss2 = Image.open(abyss2_path) + num_1 = 0 + # avatars = based_data['levels'][j]['battles'][0]['avatars'] + based_data['levels'][j]['battles'][1]['avatars'] + for i in based_data['levels'][j]['battles'][0]['avatars']: + if not os.path.exists(os.path.join(CHAR_DONE_PATH, str(i['id']) + ".png")): + get_char_done_pic(i['id'], i['icon'], i['rarity']) + char = os.path.join(CHAR_DONE_PATH, str(i['id']) + ".png") + char_img = Image.open(char) + char_draw = ImageDraw.Draw(char_img) + for k in raw_char_data: + if k['id'] == i['id']: + char_draw.text((40, 108), f'Lv.{str(k["level"])}', (21, 21, 21), genshin_font(18)) + char_draw.text((95.3, 19), f'{str(k["actived_constellation_num"])}', 'white', genshin_font(18)) + if str(k["fetter"]) == "10" or str(k["name"]) == "旅行者": + char_draw.text((93, 41.5), "♥", (21, 21, 21), genshin_font(15)) + else: + char_draw.text((95.3, 40.5), f'{str(k["fetter"])}', (21, 21, 21), genshin_font(18)) + char_crop = (70 + 125 * (num_1 % 4), 46) + abyss2.paste(char_img, char_crop, char_img) + num_1 = num_1 + 1 + num_2 = 0 + for i in based_data['levels'][j]['battles'][1]['avatars']: + if not os.path.exists(os.path.join(CHAR_DONE_PATH, str(i['id']) + ".png")): + get_char_done_pic(i['id'], i['icon'], i['rarity']) + char = os.path.join(CHAR_DONE_PATH, str(i['id']) + ".png") + char_img = Image.open(char) + char_draw = ImageDraw.Draw(char_img) + for k in raw_char_data: + if k['id'] == i['id']: + char_draw.text((40, 108), f'Lv.{str(k["level"])}', (21, 21, 21), genshin_font(18)) + char_draw.text((95.3, 19), f'{str(k["actived_constellation_num"])}', 'white', genshin_font(18)) + if str(k["fetter"]) == "10" or str(k["name"]) == "旅行者": + char_draw.text((93, 41.5), "♥", (21, 21, 21), genshin_font(15)) + else: + char_draw.text((95.3, 40.5), f'{str(k["fetter"])}', (21, 21, 21), genshin_font(18)) + char_crop = (70 + 125 * (num_2 % 4), 180) + abyss2.paste(char_img, char_crop, char_img) + num_2 = num_2 + 1 + star_num = based_data['levels'][j]['star'] + if star_num == 1: + abyss2.paste(abyss_star1, (640, 155), abyss_star1) + abyss2.paste(abyss_star0, (685, 155), abyss_star0) + abyss2.paste(abyss_star0, (730, 155), abyss_star0) + elif star_num == 0: + abyss2.paste(abyss_star0, (640, 155), abyss_star0) + abyss2.paste(abyss_star0, (685, 155), abyss_star0) + abyss2.paste(abyss_star0, (730, 155), abyss_star0) + elif star_num == 2: + abyss2.paste(abyss_star1, (640, 155), abyss_star1) + abyss2.paste(abyss_star1, (685, 155), abyss_star1) + abyss2.paste(abyss_star0, (730, 155), abyss_star0) + else: + abyss2.paste(abyss_star1, (640, 155), abyss_star1) + abyss2.paste(abyss_star1, (685, 155), abyss_star1) + abyss2.paste(abyss_star1, (730, 155), abyss_star1) + abyss2_text_draw = ImageDraw.Draw(abyss2) + abyss2_text_draw.text((87, 30), f"第{j + 1}间", (20, 20, 20), genshin_font(21)) + time_stamp1 = int(based_data['levels'][j]['battles'][0]['timestamp']) + time_stamp2 = int(based_data['levels'][j]['battles'][1]['timestamp']) + time_array1 = time.localtime(time_stamp1) + time_array2 = time.localtime(time_stamp2) + other_style_time1 = time.strftime("%Y--%m--%d %H:%M:%S", time_array1) + other_style_time2 = time.strftime("%Y--%m--%d %H:%M:%S", time_array2) + abyss2_text_draw.text((167, 33), f"{other_style_time1}/{other_style_time2}", (40, 40, 40), genshin_font(19)) + bg_img.paste(abyss2, (0, 200 + j * 340), abyss2) + + bg_img.paste(abyss3, (0, len(based_data['levels']) * 340 + 200), abyss3) + + text_draw = ImageDraw.Draw(bg_img) + + text_draw.text((210, 77), f"{nickname}", (217, 217, 217), genshin_font(32)) + text_draw.text((228, 110), 'UID ' + f"{uid}", (217, 217, 217), genshin_font(14)) + if floor_num == "9": + text_draw.text((687, 67), f"{floor_num}", (29, 30, 63), genshin_font(50)) + else: + text_draw.text((670, 67), f"{floor_num}", (29, 30, 63), genshin_font(50)) + + bg_img = bg_img.convert('RGB') + result_buffer = BytesIO() + bg_img.save(result_buffer, format='JPEG', subsampling=0, quality=90) + # bg_img.save(result_buffer, format='PNG') + imgmes = 'base64://' + b64encode(result_buffer.getvalue()).decode() + resultmes = Message(f"[CQ:image,file={imgmes}]") + return resultmes + + +async def draw_pic(uid, nickname, image=None, mode=2, role_level=None): + # 获取Cookies,如果没有能使用的则return + while 1: + use_cookies = cache_db(uid, mode - 1) + if use_cookies == '': + return "绑定记录不存在。" + elif use_cookies == "没有可以使用的Cookies!": + return "没有可以使用的Cookies!" + + if mode == 3: + mys_data = await get_mihoyo_bbs_info(uid, use_cookies) + for i in mys_data['data']['list']: + if i['game_id'] != 2: + mys_data['data']['list'].remove(i) + uid = mys_data['data']['list'][0]['game_role_id'] + nickname = mys_data['data']['list'][0]['nickname'] + role_level = mys_data['data']['list'][0]['level'] + + raw_data = await get_info(uid, use_cookies) + + if raw_data["retcode"] != 0: + if raw_data["retcode"] == 10001: + # return ("Cookie错误/过期,请重置Cookie") + error_db(use_cookies, "error") + elif raw_data["retcode"] == 10101: + # return ("当前cookies已达到30人上限!") + error_db(use_cookies, "limit30") + elif raw_data["retcode"] == 10102: + return "当前查询id已经设置了隐私,无法查询!" + else: + return ( + "Api报错,返回内容为:\r\n" + + str(raw_data) + "\r\n出现这种情况可能的UID输入错误 or 不存在" + ) + else: + break + + # 获取背景图片 + bg2_path = os.path.join(BG_PATH, random.choice([x for x in os.listdir(BG_PATH) + if os.path.isfile(os.path.join(BG_PATH, x))])) + + if image: + image_data = image.group(2) + edit_bg = Image.open(BytesIO(get(image_data).content)) + else: + edit_bg = Image.open(bg2_path) + + # 获取背景主色 + q = edit_bg.quantize(colors=3, method=2) + bg_num_temp = 0 + for i in range(0, 3): + bg = tuple(q.getpalette()[i * 3:(i * 3) + 3]) + bg_num = bg[0] + bg[1] + bg[2] + if bg_num >= bg_num_temp: + bg_num_temp = bg_num + bg_color = (bg[0], bg[1], bg[2]) + + # 通过背景主色(bg_color)确定文字主色 + r = 140 + if max(bg_color) > 255 - r: + r *= -1 + new_color = (math.floor(bg_color[0] + r if bg_color[0] + r <= 255 else 255), + math.floor(bg_color[1] + r if bg_color[1] + r <= 255 else 255), + math.floor(bg_color[2] + r if bg_color[2] + r <= 255 else 255)) + + # 确定texture2D路径 + panle1_path = os.path.join(TEXT_PATH, "panle_1.png") + panle3_path = os.path.join(TEXT_PATH, "panle_3.png") + + avatar_bg_path = os.path.join(TEXT_PATH, "avatar_bg.png") + avatar_fg_path = os.path.join(TEXT_PATH, "avatar_fg.png") + + all_mask_path = os.path.join(TEXT_PATH, "All_Mask.png") + + # 记录数据 + raw_data = raw_data['data'] + char_data = raw_data["avatars"] + + char_ids = [] + + for i in char_data: + char_ids.append(i["id"]) + + char_rawdata = get_character(uid, char_ids, use_cookies) + char_datas = char_rawdata["data"]["avatars"] + + # 确定角色占用行数 + char_num = len(char_datas) + char_hang = 1 + (char_num - 1) // 6 if char_num > 8 else char_num + + # 确定整体图片的长宽 + based_w = 900 + based_h = 890 + char_hang * 130 if char_num > 8 else 890 + char_hang * 110 + based_scale = '%.3f' % (based_w / based_h) + + # 通过确定的长宽比,缩放背景图片 + w, h = edit_bg.size + scale_f = '%.3f' % (w / h) + new_w = math.ceil(based_h * float(scale_f)) + new_h = math.ceil(based_w / float(scale_f)) + if scale_f > based_scale: + bg_img2 = edit_bg.resize((new_w, based_h), Image.ANTIALIAS) + else: + bg_img2 = edit_bg.resize((based_w, new_h), Image.ANTIALIAS) + bg_img = bg_img2.crop((0, 0, 900, based_h)) + + # 转换遮罩的颜色、大小匹配,并paste上去 + all_mask = Image.open(all_mask_path).resize(bg_img.size, Image.ANTIALIAS) + all_mask_img = Image.new("RGBA", (based_w, based_h), bg_color) + bg_img.paste(all_mask_img, (0, 0), all_mask) + + # 操作图片 + panle1 = Image.open(panle1_path) + panle3 = Image.open(panle3_path) + avatar_bg = Image.open(avatar_bg_path) + avatar_fg = Image.open(avatar_fg_path) + + # 确定主体框架 + avatar_bg_color = Image.new("RGBA", (316, 100), bg_color) + panle1_color = Image.new("RGBA", (900, 800), new_color) + bg_img.paste(panle1_color, (0, 0), panle1) + bg_img.paste(panle3, (0, char_hang * 130 + 800) if char_num > 8 else (0, char_hang * 110 + 800), panle3) + bg_img.paste(avatar_bg_color, (113, 98), avatar_bg) + bg_img.paste(avatar_fg, (114, 95), avatar_fg) + + # 绘制基础信息文字 + text_draw = ImageDraw.Draw(bg_img) + + if role_level: + text_draw.text((140, 200), "冒险等级:" + f"{role_level}", new_color, genshin_font(20)) + + text_draw.text((220, 123), f"{nickname}", new_color, genshin_font(32)) + text_draw.text((235, 163), 'UID ' + f"{uid}", new_color, genshin_font(14)) + + # 活跃天数/成就数量/深渊信息 + text_draw.text((640, 94.8), str(raw_data['stats']['active_day_number']), new_color, genshin_font(26)) + text_draw.text((640, 139.3), str(raw_data['stats']['achievement_number']), new_color, genshin_font(26)) + text_draw.text((640, 183.9), raw_data['stats']['spiral_abyss'], new_color, genshin_font(26)) + + # 宝箱 + text_draw.text((258, 375.4), str(raw_data['stats']['magic_chest_number']), new_color, genshin_font(24)) + text_draw.text((258, 425.4), str(raw_data['stats']['common_chest_number']), new_color, genshin_font(24)) + text_draw.text((258, 475.4), str(raw_data['stats']['exquisite_chest_number']), new_color, genshin_font(24)) + text_draw.text((258, 525.4), str(raw_data['stats']['precious_chest_number']), new_color, genshin_font(24)) + text_draw.text((258, 575.4), str(raw_data['stats']['luxurious_chest_number']), new_color, genshin_font(24)) + + # 已获角色 + text_draw.text((740, 547), str(raw_data['stats']['avatar_number']), new_color, genshin_font(24)) + + # 开启锚点和秘境数量 + text_draw.text((258, 625.4), str(raw_data['stats']['way_point_number']), new_color, genshin_font(24)) + text_draw.text((258, 675.4), str(raw_data['stats']['domain_number']), new_color, genshin_font(24)) + + # 蒙德 + text_draw.text((490, 370), str(raw_data['world_explorations'][4]['exploration_percentage'] / 10) + '%', new_color, + genshin_font(22)) + text_draw.text((490, 400), 'lv.' + str(raw_data['world_explorations'][4]['level']), new_color, genshin_font(22)) + text_draw.text((513, 430), str(raw_data['stats']['anemoculus_number']), new_color, genshin_font(22)) + + # 璃月 + text_draw.text((490, 490), str(raw_data['world_explorations'][3]['exploration_percentage'] / 10) + '%', new_color, + genshin_font(22)) + text_draw.text((490, 520), 'lv.' + str(raw_data['world_explorations'][3]['level']), new_color, genshin_font(22)) + text_draw.text((513, 550), str(raw_data['stats']['geoculus_number']), new_color, genshin_font(22)) + + # 雪山 + text_draw.text((745, 373.5), str(raw_data['world_explorations'][2]['exploration_percentage'] / 10) + '%', new_color, + genshin_font(22)) + text_draw.text((745, 407.1), 'lv.' + str(raw_data['world_explorations'][2]['level']), new_color, genshin_font(22)) + + # 稻妻 + text_draw.text((490, 608), str(raw_data['world_explorations'][1]['exploration_percentage'] / 10) + '%', new_color, + genshin_font(22)) + text_draw.text((490, 635), 'lv.' + str(raw_data['world_explorations'][1]['level']), new_color, genshin_font(22)) + text_draw.text((490, 662), 'lv.' + str(raw_data['world_explorations'][1]['offerings'][0]['level']), new_color, + genshin_font(22)) + text_draw.text((513, 689), str(raw_data['stats']['electroculus_number']), new_color, genshin_font(22)) + + # 渊下宫 + text_draw.text((745, 480), str(raw_data['world_explorations'][0]['exploration_percentage'] / 10) + '%', new_color, + genshin_font(22)) + + # 家园 + if len(raw_data['homes']): + text_draw.text((693, 582.4), 'lv.' + str(raw_data['homes'][0]['level']), new_color, genshin_font(22)) + text_draw.text((693, 620.4), str(raw_data['homes'][0]['visit_num']), new_color, genshin_font(22)) + text_draw.text((693, 658.4), str(raw_data['homes'][0]['item_num']), new_color, genshin_font(22)) + text_draw.text((693, 696.4), str(raw_data['homes'][0]['comfort_num']), new_color, genshin_font(22)) + else: + text_draw.text((693, 582.4), "未开", new_color, genshin_font(22)) + text_draw.text((693, 620.4), "未开", new_color, genshin_font(22)) + text_draw.text((693, 658.4), "未开", new_color, genshin_font(22)) + text_draw.text((693, 696.4), "未开", new_color, genshin_font(22)) + + # 确定texture2D路径 + charpic_mask_path = os.path.join(TEXT_PATH, "charpic_mask.png") + weaponpic_mask_path = os.path.join(TEXT_PATH, "weaponpic_mask.png") + + def get_text(star, step): + return os.path.join(TEXT_PATH, "{}s_{}.png".format(str(star), str(step))) + + charpic_mask = Image.open(charpic_mask_path) + weaponpic_mask = Image.open(weaponpic_mask_path) + s5s1 = Image.open(get_text(5, 1)) + s5s2 = Image.open(get_text(5, 2)) + s5s3 = Image.open(get_text(5, 3)) + s5s4 = Image.open(get_text(5, 4)) + s4s1 = Image.open(get_text(4, 1)) + s4s2 = Image.open(get_text(4, 2)) + s4s3 = Image.open(get_text(4, 3)) + s4s4 = Image.open(get_text(4, 4)) + s3s3 = Image.open(get_text(3, 3)) + s2s3 = Image.open(get_text(2, 3)) + s1s3 = Image.open(get_text(1, 3)) + + char_bg_path = os.path.join(TEXT_PATH, "char_bg.png") + char_fg_path = os.path.join(TEXT_PATH, "char_fg.png") + + char_bg = Image.open(char_bg_path) + char_fg = Image.open(char_fg_path) + + char_color = (math.floor(bg_color[0] + 10 if bg_color[0] + r <= 255 else 255), + math.floor(bg_color[1] + 10 if bg_color[1] + r <= 255 else 255), + math.floor(bg_color[2] + 10 if bg_color[2] + r <= 255 else 255)) + + charset_mask = Image.new("RGBA", (900, 130), char_color) + + num = 0 + char_datas.sort(key=lambda x: (-x['rarity'], -x['level'], -x['fetter'])) + + if char_num > 8: + for i in char_datas: + char_mingzuo = 0 + for k in i['constellations']: + if k['is_actived']: + char_mingzuo += 1 + + char_name = i["name"] + char_id = i["id"] + char_level = i["level"] + char_fetter = i['fetter'] + char_rarity = i['rarity'] + + char_weapon_star = i['weapon']['rarity'] + char_weapon_jinglian = i['weapon']['affix_level'] + char_weapon_icon = i['weapon']['icon'] + + if not os.path.exists(os.path.join(WEAPON_PATH, str(char_weapon_icon.split('/')[-1]))): + get_weapon_pic(char_weapon_icon) + if not os.path.exists(os.path.join(CHAR_PATH, str(i['id']) + ".png")): + get_char_pic(i['id'], i['icon']) + + char = os.path.join(CHAR_PATH, str(char_id) + ".png") + weapon = os.path.join(WEAPON_PATH, str(char_weapon_icon.split('/')[-1])) + + char_img = Image.open(char) + char_img = char_img.resize((100, 100), Image.ANTIALIAS) + weapon_img = Image.open(weapon) + weapon_img = weapon_img.resize((47, 47), Image.ANTIALIAS) + + charpic = Image.new("RGBA", (125, 140)) + + if char_rarity == 5: + charpic.paste(s5s1, (0, 0), s5s1) + baseda = Image.new("RGBA", (100, 100)) + cc = Image.composite(char_img, baseda, charpic_mask) + charpic.paste(cc, (6, 15), cc) + charpic.paste(s5s2, (0, 0), s5s2) + if char_weapon_star == 5: + charpic.paste(s5s3, (0, 0), s5s3) + elif char_weapon_star == 4: + charpic.paste(s4s3, (0, 0), s4s3) + elif char_weapon_star == 3: + charpic.paste(s3s3, (0, 0), s3s3) + elif char_weapon_star == 2: + charpic.paste(s2s3, (0, 0), s2s3) + elif char_weapon_star == 1: + charpic.paste(s1s3, (0, 0), s1s3) + basedb = Image.new("RGBA", (47, 47)) + dd = Image.composite(weapon_img, basedb, weaponpic_mask) + charpic.paste(dd, (69, 62), dd) + charpic.paste(s5s4, (0, 0), s5s4) + + else: + charpic.paste(s4s1, (0, 0), s4s1) + baseda = Image.new("RGBA", (100, 100)) + cc = Image.composite(char_img, baseda, charpic_mask) + charpic.paste(cc, (6, 15), cc) + charpic.paste(s4s2, (0, 0), s4s2) + if char_weapon_star == 5: + charpic.paste(s5s3, (0, 0), s5s3) + elif char_weapon_star == 4: + charpic.paste(s4s3, (0, 0), s4s3) + elif char_weapon_star == 3: + charpic.paste(s3s3, (0, 0), s3s3) + elif char_weapon_star == 2: + charpic.paste(s2s3, (0, 0), s2s3) + elif char_weapon_star == 1: + charpic.paste(s1s3, (0, 0), s1s3) + basedb = Image.new("RGBA", (47, 47)) + dd = Image.composite(weapon_img, basedb, weaponpic_mask) + charpic.paste(dd, (69, 62), dd) + charpic.paste(s4s4, (0, 0), s4s4) + + char_draw = ImageDraw.Draw(charpic) + char_draw.text((38, 106), f'Lv.{str(char_level)}', (21, 21, 21), genshin_font(18)) + char_draw.text((104.5, 91.5), f'{str(char_weapon_jinglian)}', 'white', genshin_font(10)) + char_draw.text((99, 19.5), f'{str(char_mingzuo)}', 'white', genshin_font(18)) + if str(i["fetter"]) == "10" or str(char_name) == "旅行者": + char_draw.text((98, 42), "♥", (21, 21, 21), genshin_font(14)) + else: + char_draw.text((100, 41), f'{str(char_fetter)}', (21, 21, 21), genshin_font(16)) + + char_crop = (68 + 129 * (num % 6), 800 + 130 * (num // 6)) + bg_img.paste(charpic, char_crop, charpic) + num = num + 1 + else: + for i in char_datas: + char_mingzuo = 0 + for k in i['constellations']: + if k['is_actived']: + char_mingzuo += 1 + + char_name = i["name"] + char_id = i["id"] + char_level = i["level"] + # char_fetter = i['fetter'] + # char_rarity = i['rarity'] + char_img_icon = i["image"] + + char_weapon_star = i['weapon']['rarity'] + char_weapon_level = i['weapon']['level'] + char_weapon_jinglian = i['weapon']['affix_level'] + char_weapon_icon = i['weapon']['icon'] + + if not os.path.exists(os.path.join(WEAPON_PATH, str(char_weapon_icon.split('/')[-1]))): + get_weapon_pic(char_weapon_icon) + if not os.path.exists(os.path.join(CHAR_IMG_PATH, str(char_img_icon.split('/')[-1]))): + get_char_img_pic(char_img_icon) + if not os.path.exists(os.path.join(CHAR_PATH, str(i['id']) + ".png")): + get_char_pic(i['id'], i['icon']) + + char = os.path.join(CHAR_PATH, str(char_id) + ".png") + weapon = os.path.join(WEAPON_PATH, str(char_weapon_icon.split('/')[-1])) + char_stand_img = os.path.join(CHAR_IMG_PATH, str(char_img_icon.split('/')[-1])) + char_stand_mask = Image.open(os.path.join(TEXT_PATH, "stand_mask.png")) + + char_stand = Image.open(char_stand_img) + char_img = Image.open(char) + char_img = char_img.resize((100, 100), Image.ANTIALIAS) + weapon_img = Image.open(weapon) + weapon_img = weapon_img.resize((47, 47), Image.ANTIALIAS) + + charpic = Image.new("RGBA", (900, 130)) + charpic_temp = Image.new("RGBA", (900, 130)) + + charpic.paste(charset_mask, (0, 0), char_bg) + + weapon_bg = Image.open(get_text(char_weapon_star, 3)) + charpic.paste(weapon_bg, (72, 10), weapon_bg) + charpic_temp.paste(char_img, (81, 13), charpic_mask) + charpic_temp.paste(char_stand, (395, -99), char_stand_mask) + charpic_temp.paste(char_fg, (0, 0), char_fg) + charpic_temp.paste(weapon_img, (141, 72), weaponpic_mask) + # temp = Image.composite(weapon_img, basedb, weaponpic_mask) + charpic.paste(charpic_temp, (0, 0), charpic_temp) + + for _, k in enumerate(i["reliquaries"]): + if not os.path.exists(os.path.join(REL_PATH, str(k["icon"].split('/')[-1]))): + get_rel_pic(k["icon"]) + rel = os.path.join(REL_PATH, str(k["icon"].split('/')[-1])) + rel_img = Image.open(rel).resize((43, 43), Image.ANTIALIAS) + rel_bg = Image.open(get_text(k["rarity"], 3)) + + if k["pos_name"] == "生之花": + charpic.paste(rel_bg, (287 + 55 * 0, -14), rel_bg) + charpic.paste(rel_img, (360 + 55 * 0, 49), rel_img) + elif k["pos_name"] == "死之羽": + charpic.paste(rel_bg, (287 + 55 * 1, -14), rel_bg) + charpic.paste(rel_img, (360 + 55 * 1, 49), rel_img) + elif k["pos_name"] == "时之沙": + charpic.paste(rel_bg, (287 + 55 * 2, -14), rel_bg) + charpic.paste(rel_img, (360 + 55 * 2, 49), rel_img) + elif k["pos_name"] == "空之杯": + charpic.paste(rel_bg, (287 + 55 * 3, -14), rel_bg) + charpic.paste(rel_img, (360 + 55 * 3, 49), rel_img) + elif k["pos_name"] == "理之冠": + charpic.paste(rel_bg, (287 + 55 * 4, -14), rel_bg) + charpic.paste(rel_img, (360 + 55 * 4, 49), rel_img) + + char_draw = ImageDraw.Draw(charpic) + + char_draw.text((188, 30), i["name"] + " " + f'Lv.{str(char_level)}', new_color, genshin_font(22)) + # char_draw.text((272,45),f'Lv.{str(char_level)}',new_color,ys_font(18)) + + # char_draw.text((104.5,91.5),f'{str(char_weapon_jinglian)}',new_color,ys_font(10)) + + char_draw.text((222, 87), f'{str(i["fetter"])}' if str(char_name) != "旅行者" else "10", new_color, + genshin_font(15), anchor="mm") + char_draw.text((255, 87), f'{str(char_mingzuo)}', new_color, genshin_font(15), anchor="mm") + char_draw.text((218, 67), f'{str(char_weapon_level)}级{str(char_weapon_jinglian)}精', new_color, + genshin_font(15), + anchor="lm") + char_crop = (0, 800 + 110 * num) + num += 1 + bg_img.paste(charpic, char_crop, charpic) + + # 转换之后发送 + bg_img = bg_img.convert('RGB') + result_buffer = BytesIO() + bg_img.save(result_buffer, format='JPEG', subsampling=0, quality=90) + imgmes = 'base64://' + b64encode(result_buffer.getvalue()).decode() + resultmes = f"[CQ:image,file={imgmes}]" + return resultmes + + +def create_rounded_rectangle_mask(rectangle, radius): + solid_fill = (50, 50, 50, 255) + i = Image.new("RGBA", rectangle.size, (0, 0, 0, 0)) + + corner = Image.new('RGBA', (radius, radius), (0, 0, 0, 0)) + draw = ImageDraw.Draw(corner) + draw.pieslice((0, 0, radius * 2, radius * 2), 180, 270, fill=solid_fill) + + mx, my = rectangle.size + + i.paste(corner, (0, 0), corner) + i.paste(corner.rotate(90), (0, my - radius), corner.rotate(90)) + i.paste(corner.rotate(180), (mx - radius, my - radius), corner.rotate(180)) + i.paste(corner.rotate(270), (mx - radius, 0), corner.rotate(270)) + + draw = ImageDraw.Draw(i) + draw.rectangle([(radius, 0), (mx - radius, my)], fill=solid_fill) + draw.rectangle([(0, radius), (mx, my - radius)], fill=solid_fill) + + return i + + +async def draw_event_pic(): + raw_data = await get_genshin_events("List") + # raw_time_data = await get_genshin_events("Calendar") + raw_time_data = await get_genshin_events("Content") + + data = raw_data["data"]["list"][1]["list"] + + event_data = {"gacha_event": [], "normal_event": [], "other_event": []} + for k in data: + for i in raw_time_data["data"]["list"]: + if k["title"] in i["title"]: + time_data = findall(r"[0-9]{4}/[0-9]{2}/[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}", i["content"]) + time_limit_end = findall(r"起至[0-9].[0-9]版本结束", i["content"]) + time_limit_start = findall(r"[0-9].[0-9]版本更新后 ~", i["content"]) + if len(time_data) == 2: + k["act_begin_time"] = time_data[0] + k["act_end_time"] = time_data[1] + elif len(time_data) == 1 and len(time_limit_end) == 1: + k["act_begin_time"] = time_data[0] + k["act_end_time"] = time_limit_end[0] + elif len(time_data) == 1 and len(time_limit_start) == 1: + k["act_begin_time"] = time_limit_start[0][:-2] + k["act_end_time"] = time_data[0] + elif len(time_data) == 1: + k["act_begin_time"] = time_data[0] + k["act_end_time"] = "永久开放" + elif len(time_data) > 2: + k["act_begin_time"] = time_data[0] + k["act_end_time"] = k["end_time"] + elif len(time_data) == 0: + k["act_begin_time"] = k["start_time"] + "(?)" + k["act_end_time"] = k["end_time"] + "(?)" + + if "冒险助力礼包" in k["title"] or "纪行" in k["title"]: + continue + # if "角色试用" in k["title"] or "传说任务" in k["title"]: + # event_data['other_event'].append(k) + elif k["tag_label"] == "扭蛋": + event_data['gacha_event'].append(k) + elif k["tag_label"] == "活动": + event_data['normal_event'].append(k) + + # base_h = 900 + ((1 + (len(event_data['normal_event'])+len(event_data['other_event'])))//2)*390 + ((1 + len( + # event_data['gacha_event']))//2)*533 + base_h = 600 + len(event_data['normal_event']) * (390 + 90) + len(event_data['gacha_event']) * (533 + 90) + base_img = Image.new(mode="RGB", size=(1080, base_h), color=(237, 217, 195)) + + event1_path = os.path.join(TEXT_PATH, "event_1.png") + event2_path = os.path.join(TEXT_PATH, "event_2.png") + # event3_path = os.path.join(TEXT_PATH,"event_3.png") + event1 = Image.open(event1_path) + event2 = Image.open(event2_path) + # event3 = Image.open(event3_path) + + base_img.paste(event1, (0, 0), event1) + # base_img.paste(event2,(0,300+((1+len(event_data['normal_event']))//2)*390),event2) + base_img.paste(event2, (0, len(event_data['normal_event']) * (390 + 90) + 300), event2) + # base_img.paste(event3,(0,600+((1+len(event_data['normal_event']))//2)*390 + ((1 + len(event_data[ + # 'gacha_event']))//2)*533),event3) + + time_img1 = Image.new(mode="RGB", size=(1080, len(event_data['normal_event']) * (390 + 90)), color=(237, 130, 116)) + time_img2 = Image.new(mode="RGB", size=(1080, len(event_data['gacha_event']) * (533 + 90)), color=(237, 130, 116)) + base_img.paste(time_img1, (0, 300)) + base_img.paste(time_img2, (0, 600 + len(event_data['normal_event']) * (390 + 90))) + base_draw = ImageDraw.Draw(base_img) + for index, value in enumerate(event_data['normal_event']): + img = Image.open(BytesIO(get(value["banner"]).content)) + base_draw.text((540, 300 + 45 + 390 + (390 + 90) * index + 1), + value["act_begin_time"] + " —— " + value["act_end_time"], (255, 255, 255), genshin_font(42), + anchor="mm") + # base_img.paste(img,((index%2)*1080,300 + 390*(index//2))) + base_img.paste(img, (0, 300 + (390 + 90) * index)) + + for index, value in enumerate(event_data['gacha_event']): + img = Image.open(BytesIO(get(value["banner"]).content)) + base_draw.text((540, 600 + 45 + (390 + 90) * len(event_data['normal_event']) + 533 + index * (533 + 90)), + value["act_begin_time"] + " —— " + value["act_end_time"], (255, 255, 255), genshin_font(42), + anchor="mm") + # base_img.paste(img,((index%2)*1080,600 + ((1 + len(event_data['normal_event']))//2)*390 + 533*(index//2))) + base_img.paste(img, (0, 600 + (390 + 90) * len(event_data['normal_event']) + index * (533 + 90))) + # for index,value in enumerate(event_data['other_event']): img = Image.open(BytesIO(requests.get(value[ + # "banner"]).content)) base_img.paste(img,((index%2)*1080,900 + ((1 + len(event_data['normal_event']))//2)*390 + + # ((1 + len(event_data['gacha_event']))//2)*533 + 390*(index//2))) + + base_img = base_img.convert('RGB') + base_img.save(os.path.join(FILE2_PATH, 'event.jpg'), format='JPEG', subsampling=0, quality=90) + + return diff --git a/getMes.py b/get_mihoyo_bbs_data.py similarity index 73% rename from getMes.py rename to get_mihoyo_bbs_data.py index 76596e21..f8be8053 100644 --- a/getMes.py +++ b/get_mihoyo_bbs_data.py @@ -1,535 +1,561 @@ -import math,sqlite3,re,os,random,requests,json -from base64 import b64encode -from io import BytesIO - -from .getDB import ( GetAward, GetCharInfo, GetDaily, GetMysInfo, GetAudioInfo, - GetSignInfo, GetSignList, GetWeaponInfo, MysSign, - cookiesDB, GetMiscInfo) - -FILE_PATH = os.path.dirname(__file__) -FILE2_PATH = os.path.join(FILE_PATH, 'mys') -INDEX_PATH = os.path.join(FILE2_PATH, 'index') -Texture_PATH = os.path.join(FILE2_PATH, 'texture2d') - -avatar_json = { - "Albedo": "阿贝多", - "Ambor": "安柏", - "Barbara": "芭芭拉", - "Beidou": "北斗", - "Bennett": "班尼特", - "Chongyun": "重云", - "Diluc": "迪卢克", - "Diona": "迪奥娜", - "Eula": "优菈", - "Fischl": "菲谢尔", - "Ganyu": "甘雨", - "Hutao": "胡桃", - "Jean": "琴", - "Kazuha": "枫原万叶", - "Kaeya": "凯亚", - "Ayaka": "神里绫华", - "Keqing": "刻晴", - "Klee": "可莉", - "Lisa": "丽莎", - "Mona": "莫娜", - "Ningguang": "凝光", - "Noel": "诺艾尔", - "Qiqi": "七七", - "Razor": "雷泽", - "Rosaria": "罗莎莉亚", - "Sucrose": "砂糖", - "Tartaglia": "达达利亚", - "Venti": "温迪", - "Xiangling": "香菱", - "Xiao": "魈", - "Xingqiu": "行秋", - "Xinyan": "辛焱", - "Yanfei": "烟绯", - "Zhongli": "钟离", - "Yoimiya": "宵宫", - "Sayu": "早柚", - "Shogun": "雷电将军", - "Aloy": "埃洛伊", - "Sara": "九条裟罗", - "Kokomi": "珊瑚宫心海", - "Shenhe":"申鹤" -} - -daily_im = ''' -*数据刷新可能存在一定延迟,请以当前游戏实际数据为准{} -============== -原粹树脂:{}/{}{} -每日委托:{}/{} 奖励{}领取 -周本减半:{}/{} -洞天宝钱:{} -探索派遣: -总数/完成/上限:{}/{}/{} -{}''' - -month_im = ''' -============== -{} -UID:{} -============== -本日获取原石:{} -本日获取摩拉:{} -============== -昨日获取原石:{} -昨日获取摩拉:{} -============== -本月获取原石:{} -本月获取摩拉:{} -============== -上月获取原石:{} -上月获取摩拉:{} -============== -原石收入组成: -{}==============''' - -weapon_im = '''【名称】:{} -【类型】:{} -【稀有度】:{} -【介绍】:{} -【攻击力】:{}{}{}''' - -char_info_im = '''{} -【稀有度】:{} -【武器】:{} -【元素】:{} -【突破加成】:{} -【生日】:{} -【命之座】:{} -【cv】:{} -【介绍】:{}''' - -artifacts_im = '''【{}】 -【稀有度】:{} -【2件套】:{} -【4件套】:{} -【{}】:{} -【{}】:{} -【{}】:{} -【{}】:{} -【{}】:{}''' - -food_im = '''【{}】 -【稀有度】:{} -【食物类型】:{} -【食物类别】:{} -【效果】:{} -【介绍】:{} -【材料】: -{}''' - -audio_json = '''{ - "357":["357_01","357_02","357_03"], - "1000000":["1000000_01","1000000_02","1000000_03","1000000_04","1000000_05","1000000_06","1000000_07"], - "1000001":["1000001_01","1000001_02","1000001_03"], - "1000002":["1000002_01","1000002_02","1000002_03"], - "1000100":["1000100_01","1000100_02","1000100_03","1000100_04","1000100_05"], - "1000101":["1000101_01","1000101_02","1000101_03","1000101_04","1000101_05","1000101_06"], - "1000200":["1000200_01","1000200_02","1000200_03"], - "1010201":["1010201_01"], - "1000300":["1000300_01","1000300_02"], - "1000400":["1000400_01","1000400_02","1000400_03"], - "1000500":["1000500_01","1000500_02","1000500_03"], - "1010000":["1010000_01","1010000_02","1010000_03","1010000_04","1010000_05"], - "1010001":["1010001_01","1010001_02"], - "1010100":["1010100_01","1010100_02","1010100_03","1010100_04","1010100_05"], - "1010200":["1010200_01","1010200_02","1010200_03","1010200_04","1010200_05"], - "1010300":["1010300_01","1010300_02","1010300_03","1010300_04","1010300_05"], - "1010301":["1010301_01","1010301_02","1010301_03","1010301_04","1010301_05"], - "1010400":["1010400_01","1010400_02","1010400_03"], - "1020000":["1020000_01"] -}''' - -async def deal_ck(mes,qid): - aid = re.search(r"account_id=(\d*)", mes) - mysid_data = aid.group(0).split('=') - mysid = mysid_data[1] - cookie = ';'.join(filter(lambda x: x.split('=')[0] in [ - "cookie_token", "account_id"], [i.strip() for i in mes.split(';')])) - mys_data = await GetMysInfo(mysid, cookie) - for i in mys_data['data']['list']: - if i['game_id'] != 2: - mys_data['data']['list'].remove(i) - uid = mys_data['data']['list'][0]['game_role_id'] - - conn = sqlite3.connect('ID_DATA.db') - c = conn.cursor() - - try: - c.execute("DELETE from CookiesCache where uid=? or mysid = ?",(uid,mysid)) - except: - pass - - conn.commit() - conn.close() - - await cookiesDB(uid, cookie, qid) - -async def award(uid): - data = await GetAward(uid) - nickname = data['data']['nickname'] - day_stone = data['data']['day_data']['current_primogems'] - day_mora = data['data']['day_data']['current_mora'] - lastday_stone = data['data']['day_data']['last_primogems'] - lastday_mora = data['data']['day_data']['last_mora'] - month_stone = data['data']['month_data']['current_primogems'] - month_mora = data['data']['month_data']['current_mora'] - lastmonth_stone = data['data']['month_data']['last_primogems'] - lastmonth_mora = data['data']['month_data']['last_mora'] - group_str = '' - for i in data['data']['month_data']['group_by']: - group_str = group_str + \ - i['action'] + ":" + str(i['num']) + \ - "(" + str(i['percent']) + "%)" + '\n' - - im = month_im.format(nickname, uid, day_stone, day_mora, lastday_stone, lastday_mora, - month_stone, month_mora, lastmonth_stone, lastmonth_mora, group_str) - return im - -async def audio_wiki(name,message): - async def get(audioid): - tmp_json=json.loads(audio_json) - for _ in range(3):#重试3次 - if audioid in tmp_json: - if not tmp_json[audioid]: - return - audioid1 = random.choice(tmp_json[audioid]) - else: - audioid1=audioid - url = await GetAudioInfo(name,audioid1) - req=requests.get(url) - if req.headers["Content-Type"].startswith("audio"): - return BytesIO(req.content) - else: - if audioid in tmp_json: - tmp_json[audioid].remove(audioid1) - if name == "列表": - im = f'[CQ:image,file=file://{os.path.join(INDEX_PATH,"语音.png")}]' - return im - elif name == "": - return "角色名不正确。" - else: - audioid = re.findall(r"[0-9]+", message)[0] - try: - audio=await get(audioid) - except: - return "语音获取失败" - if audio: - audios = 'base64://' + b64encode(audio.getvalue()).decode() - return (f"[CQ:record,file={audios}]") - -async def artifacts_wiki(name): - data = await GetMiscInfo("artifacts",name) - if "errcode" in data: - im = "该圣遗物不存在。" - else: - star = "" - for i in data["rarity"]: - star = star + i + "星、" - star = star[:-1] - im = artifacts_im.format(data["name"],star,data["2pc"],data["4pc"],data["flower"]["name"],data["flower"]["description"], - data["plume"]["name"],data["plume"]["description"],data["sands"]["name"],data["sands"]["description"], - data["goblet"]["name"],data["goblet"]["description"],data["circlet"]["name"],data["circlet"]["description"]) - return im - -async def foods_wiki(name): - data = await GetMiscInfo("foods",name) - if "errcode" in data: - im = "该食物不存在。" - else: - ingredients = "" - food_temp = {} - for i in data["ingredients"]: - if i["name"] not in food_temp: - food_temp[i["name"]] = i["count"] - else: - food_temp[i["name"]] = food_temp[i["name"]] + i["count"] - for i in food_temp: - ingredients += i + ":" + str(food_temp[i]) + "\n" - ingredients = ingredients[:-1] - im = food_im.format(data["name"],data["rarity"],data["foodtype"],data["foodfilter"],data["effect"],data["description"],ingredients) - return im - -async def enemies_wiki(name): - raw_data = await GetMiscInfo("enemies",name) - if "errcode" in raw_data: - im = "该原魔不存在。" - else: - reward = "" - for i in raw_data["rewardpreview"]: - reward += i["name"] + ":" + str(i["count"]) if "count" in i.keys() else i["name"] + ":" + "可能" - reward += "\n" - im = "【{}】\n——{}——\n类型:{}\n信息:{}\n掉落物:\n{}".format(raw_data["name"],raw_data["specialname"], - raw_data["category"],raw_data["description"],reward) - return im - -# 签到函数 -async def sign(uid): - try: - sign_data = await MysSign(uid) - sign_info = await GetSignInfo(uid) - sign_info = sign_info['data'] - sign_list = await GetSignList() - status = sign_data['message'] - getitem = sign_list['data']['awards'][int( - sign_info['total_sign_day'])-1]['name'] - getnum = sign_list['data']['awards'][int( - sign_info['total_sign_day'])-1]['cnt'] - get_im = f"本次签到获得{getitem}x{getnum}" - if status == "OK" and sign_info['is_sign'] == True: - mes_im = "签到成功" - else: - mes_im = status - sign_missed = sign_info['sign_cnt_missed'] - im = mes_im + "!" + "\n" + get_im + "\n" + f"本月漏签次数:{sign_missed}" - except: - im = "签到失败,请检查Cookies是否失效。" - return im - -# 统计状态函数 -async def daily(mode="push", uid=None): - - def seconds2hours(seconds: int) -> str: - m, s = divmod(int(seconds), 60) - h, m = divmod(m, 60) - return "%02d:%02d:%02d" % (h, m, s) - - temp_list = [] - conn = sqlite3.connect('ID_DATA.db') - c = conn.cursor() - if mode == "push": - cursor = c.execute( - "SELECT * FROM NewCookiesTable WHERE StatusA != ?", ("off",)) - c_data = cursor.fetchall() - elif mode == "ask": - c_data = ([uid, 0, 0, 0, 0, 0, 0],) - - for row in c_data: - raw_data = await GetDaily(str(row[0])) - if raw_data["retcode"] != 0: - temp_list.append( - {"qid": row[2], "gid": row[3], "message": "你的推送状态有误;可能是uid绑定错误或没有在米游社打开“实时便筏”功能。"}) - else: - dailydata = raw_data["data"] - current_resin = dailydata['current_resin'] - - current_expedition_num = dailydata['current_expedition_num'] - max_expedition_num = dailydata['max_expedition_num'] - finished_expedition_num = 0 - expedition_info: list[str] = [] - for expedition in dailydata['expeditions']: - avatar: str = expedition['avatar_side_icon'][89:-4] - try: - avatar_name: str = avatar_json[avatar] - except KeyError: - avatar_name: str = avatar - - if expedition['status'] == 'Finished': - expedition_info.append(f"{avatar_name} 探索完成") - finished_expedition_num += 1 - else: - remained_timed: str = seconds2hours( - expedition['remained_time']) - expedition_info.append( - f"{avatar_name} 剩余时间{remained_timed}") - - if current_resin >= row[6] or dailydata["max_home_coin"] - dailydata["current_home_coin"] <= 100: - tip = '' - - if current_resin >= row[6] and row[6] != 0: - tip += "\n==============\n你的树脂快满了!" - if dailydata["max_home_coin"] - dailydata["current_home_coin"] <= 100: - tip += "\n==============\n你的洞天宝钱快满了!" - #if finished_expedition_num >0: - # tip += "\n==============\n你有探索派遣完成了!" - max_resin = dailydata['max_resin'] - rec_time = '' - # print(dailydata) - if current_resin < 160: - resin_recovery_time = seconds2hours( - dailydata['resin_recovery_time']) - next_resin_rec_time = seconds2hours( - 8 * 60 - ((dailydata['max_resin'] - dailydata['current_resin']) * 8 * 60 - int(dailydata['resin_recovery_time']))) - rec_time = f' ({next_resin_rec_time}/{resin_recovery_time})' - - finished_task_num = dailydata['finished_task_num'] - total_task_num = dailydata['total_task_num'] - is_extra_got = '已' if dailydata['is_extra_task_reward_received'] else '未' - - resin_discount_num_limit = dailydata['resin_discount_num_limit'] - used_resin_discount_num = resin_discount_num_limit - \ - dailydata['remain_resin_discount_num'] - - coin = f'{dailydata["current_home_coin"]}/{dailydata["max_home_coin"]}' - if dailydata["current_home_coin"] 0: - if int(level) <= 3 : - if level == "1": - data = data["combat1"] - elif level == "2": - data = data["combat2"] - elif level == "3": - data = data["combat3"] - skill_name = data["name"] - skill_info = data["info"] - skill_detail = "" - - for i in data["attributes"]["parameters"]: - temp = "" - for k in data["attributes"]["parameters"][i]: - temp += "%.2f%%" % (k * 100) + "/" - data["attributes"]["parameters"][i] = temp[:-1] - - for i in data["attributes"]["labels"]: - #i = i.replace("{","{{") - i = re.sub(r':[a-zA-Z0-9]+}', "}", i) - #i.replace(r':[a-zA-Z0-9]+}','}') - skill_detail += i + "\n" - - skill_detail = skill_detail.format(**data["attributes"]["parameters"]) - - im = "【{}】\n{}\n————\n{}".format(skill_name,skill_info,skill_detail) - - else: - if level == "4": - data = data["passive1"] - elif level == "5": - data = data["passive2"] - elif level == "6": - data = data["passive3"] - elif level == "7": - data = data["passive4"] - skill_name = data["name"] - skill_info = data["info"] - im = "【{}】\n{}".format(skill_name,skill_info) - else: - im = "不存在该天赋。" - return im \ No newline at end of file +import json +import math +import os +import random +import re +import sqlite3 +from base64 import b64encode +from io import BytesIO + +import requests + +from .get_data import (get_award, get_char_info, get_daily_data, get_mihoyo_bbs_info, get_audio_info, + get_sign_info, get_sign_list, get_weapon_info, mihoyo_bbs_sign, + cookies_db, get_misc_info) + +FILE_PATH = os.path.dirname(__file__) +FILE2_PATH = os.path.join(FILE_PATH, 'mihoyo_bbs') +INDEX_PATH = os.path.join(FILE2_PATH, 'index') +Texture_PATH = os.path.join(FILE2_PATH, 'texture2d') + +avatar_json = { + "Albedo": "阿贝多", + "Ambor": "安柏", + "Barbara": "芭芭拉", + "Beidou": "北斗", + "Bennett": "班尼特", + "Chongyun": "重云", + "Diluc": "迪卢克", + "Diona": "迪奥娜", + "Eula": "优菈", + "Fischl": "菲谢尔", + "Ganyu": "甘雨", + "Hutao": "胡桃", + "Jean": "琴", + "Kazuha": "枫原万叶", + "Kaeya": "凯亚", + "Ayaka": "神里绫华", + "Keqing": "刻晴", + "Klee": "可莉", + "Lisa": "丽莎", + "Mona": "莫娜", + "Ningguang": "凝光", + "Noel": "诺艾尔", + "Qiqi": "七七", + "Razor": "雷泽", + "Rosaria": "罗莎莉亚", + "Sucrose": "砂糖", + "Tartaglia": "达达利亚", + "Venti": "温迪", + "Xiangling": "香菱", + "Xiao": "魈", + "Xingqiu": "行秋", + "Xinyan": "辛焱", + "Yanfei": "烟绯", + "Zhongli": "钟离", + "Yoimiya": "宵宫", + "Sayu": "早柚", + "Shogun": "雷电将军", + "Aloy": "埃洛伊", + "Sara": "九条裟罗", + "Kokomi": "珊瑚宫心海", + "Shenhe": "申鹤" +} + +daily_im = ''' +*数据刷新可能存在一定延迟,请以当前游戏实际数据为准{} +============== +原粹树脂:{}/{}{} +每日委托:{}/{} 奖励{}领取 +周本减半:{}/{} +洞天宝钱:{} +探索派遣: +总数/完成/上限:{}/{}/{} +{}''' + +month_im = ''' +============== +{} +UID:{} +============== +本日获取原石:{} +本日获取摩拉:{} +============== +昨日获取原石:{} +昨日获取摩拉:{} +============== +本月获取原石:{} +本月获取摩拉:{} +============== +上月获取原石:{} +上月获取摩拉:{} +============== +原石收入组成: +{}==============''' + +weapon_im = '''【名称】:{} +【类型】:{} +【稀有度】:{} +【介绍】:{} +【攻击力】:{}{}{}''' + +char_info_im = '''{} +【稀有度】:{} +【武器】:{} +【元素】:{} +【突破加成】:{} +【生日】:{} +【命之座】:{} +【cv】:{} +【介绍】:{}''' + +artifacts_im = '''【{}】 +【稀有度】:{} +【2件套】:{} +【4件套】:{} +【{}】:{} +【{}】:{} +【{}】:{} +【{}】:{} +【{}】:{}''' + +food_im = '''【{}】 +【稀有度】:{} +【食物类型】:{} +【食物类别】:{} +【效果】:{} +【介绍】:{} +【材料】: +{}''' + +audio_json = '''{ + "357":["357_01","357_02","357_03"], + "1000000":["1000000_01","1000000_02","1000000_03","1000000_04","1000000_05","1000000_06","1000000_07"], + "1000001":["1000001_01","1000001_02","1000001_03"], + "1000002":["1000002_01","1000002_02","1000002_03"], + "1000100":["1000100_01","1000100_02","1000100_03","1000100_04","1000100_05"], + "1000101":["1000101_01","1000101_02","1000101_03","1000101_04","1000101_05","1000101_06"], + "1000200":["1000200_01","1000200_02","1000200_03"], + "1010201":["1010201_01"], + "1000300":["1000300_01","1000300_02"], + "1000400":["1000400_01","1000400_02","1000400_03"], + "1000500":["1000500_01","1000500_02","1000500_03"], + "1010000":["1010000_01","1010000_02","1010000_03","1010000_04","1010000_05"], + "1010001":["1010001_01","1010001_02"], + "1010100":["1010100_01","1010100_02","1010100_03","1010100_04","1010100_05"], + "1010200":["1010200_01","1010200_02","1010200_03","1010200_04","1010200_05"], + "1010300":["1010300_01","1010300_02","1010300_03","1010300_04","1010300_05"], + "1010301":["1010301_01","1010301_02","1010301_03","1010301_04","1010301_05"], + "1010400":["1010400_01","1010400_02","1010400_03"], + "1020000":["1020000_01"] +}''' + + +async def deal_ck(mes, qid): + aid = re.search(r"account_id=(\d*)", mes) + mysid_data = aid.group(0).split('=') + mysid = mysid_data[1] + cookie = ';'.join(filter(lambda x: x.split('=')[0] in [ + "cookie_token", "account_id"], [i.strip() for i in mes.split(';')])) + mys_data = await get_mihoyo_bbs_info(mysid, cookie) + for i in mys_data['data']['list']: + if i['game_id'] != 2: + mys_data['data']['list'].remove(i) + uid = mys_data['data']['list'][0]['game_role_id'] + + conn = sqlite3.connect('ID_DATA.db') + c = conn.cursor() + + try: + c.execute("DELETE from CookiesCache where uid=? or mysid = ?", (uid, mysid)) + except: + pass + + conn.commit() + conn.close() + + await cookies_db(uid, cookie, qid) + + +async def award(uid): + data = await get_award(uid) + nickname = data['data']['nickname'] + day_stone = data['data']['day_data']['current_primogems'] + day_mora = data['data']['day_data']['current_mora'] + lastday_stone = data['data']['day_data']['last_primogems'] + lastday_mora = data['data']['day_data']['last_mora'] + month_stone = data['data']['month_data']['current_primogems'] + month_mora = data['data']['month_data']['current_mora'] + lastmonth_stone = data['data']['month_data']['last_primogems'] + lastmonth_mora = data['data']['month_data']['last_mora'] + group_str = '' + for i in data['data']['month_data']['group_by']: + group_str = group_str + \ + i['action'] + ":" + str(i['num']) + \ + "(" + str(i['percent']) + "%)" + '\n' + + im = month_im.format(nickname, uid, day_stone, day_mora, lastday_stone, lastday_mora, + month_stone, month_mora, lastmonth_stone, lastmonth_mora, group_str) + return im + + +async def audio_wiki(name, message): + async def get(_audioid): + tmp_json = json.loads(audio_json) + for _ in range(3): # 重试3次 + if _audioid in tmp_json: + if not tmp_json[_audioid]: + return + audioid1 = random.choice(tmp_json[_audioid]) + else: + audioid1 = _audioid + url = await get_audio_info(name, audioid1) + req = requests.get(url) + if req.headers["Content-Type"].startswith("audio"): + return BytesIO(req.content) + else: + if _audioid in tmp_json: + tmp_json[_audioid].remove(audioid1) + + if name == "列表": + im = f'[CQ:image,file=file://{os.path.join(INDEX_PATH, "语音.png")}]' + return im + elif name == "": + return "角色名不正确。" + else: + audioid = re.findall(r"[0-9]+", message)[0] + try: + audio = await get(audioid) + except: + return "语音获取失败" + if audio: + audios = 'base64://' + b64encode(audio.getvalue()).decode() + return f"[CQ:record,file={audios}]" + + +async def artifacts_wiki(name): + data = await get_misc_info("artifacts", name) + if "errcode" in data: + im = "该圣遗物不存在。" + else: + star = "" + for i in data["rarity"]: + star = star + i + "星、" + star = star[:-1] + im = artifacts_im.format(data["name"], star, data["2pc"], data["4pc"], data["flower"]["name"], + data["flower"]["description"], + data["plume"]["name"], data["plume"]["description"], data["sands"]["name"], + data["sands"]["description"], + data["goblet"]["name"], data["goblet"]["description"], data["circlet"]["name"], + data["circlet"]["description"]) + return im + + +async def foods_wiki(name): + data = await get_misc_info("foods", name) + if "errcode" in data: + im = "该食物不存在。" + else: + ingredients = "" + food_temp = {} + for i in data["ingredients"]: + if i["name"] not in food_temp: + food_temp[i["name"]] = i["count"] + else: + food_temp[i["name"]] = food_temp[i["name"]] + i["count"] + for i in food_temp: + ingredients += i + ":" + str(food_temp[i]) + "\n" + ingredients = ingredients[:-1] + im = food_im.format(data["name"], data["rarity"], data["foodtype"], data["foodfilter"], data["effect"], + data["description"], ingredients) + return im + + +async def enemies_wiki(name): + raw_data = await get_misc_info("enemies", name) + if "errcode" in raw_data: + im = "该原魔不存在。" + else: + reward = "" + for i in raw_data["rewardpreview"]: + reward += i["name"] + ":" + str(i["count"]) if "count" in i.keys() else i["name"] + ":" + "可能" + reward += "\n" + im = "【{}】\n——{}——\n类型:{}\n信息:{}\n掉落物:\n{}".format(raw_data["name"], raw_data["specialname"], + raw_data["category"], raw_data["description"], reward) + return im + + +# 签到函数 +async def sign(uid): + try: + sign_data = await mihoyo_bbs_sign(uid) + sign_info = await get_sign_info(uid) + sign_info = sign_info['data'] + sign_list = await get_sign_list() + status = sign_data['message'] + getitem = sign_list['data']['awards'][int( + sign_info['total_sign_day']) - 1]['name'] + getnum = sign_list['data']['awards'][int( + sign_info['total_sign_day']) - 1]['cnt'] + get_im = f"本次签到获得{getitem}x{getnum}" + if status == "OK" and sign_info['is_sign'] == True: + mes_im = "签到成功" + else: + mes_im = status + sign_missed = sign_info['sign_cnt_missed'] + im = mes_im + "!" + "\n" + get_im + "\n" + f"本月漏签次数:{sign_missed}" + except: + im = "签到失败,请检查Cookies是否失效。" + return im + + +# 统计状态函数 +async def daily(mode="push", uid=None): + def seconds2hours(seconds: int) -> str: + m, s = divmod(int(seconds), 60) + h, m = divmod(m, 60) + return "%02d:%02d:%02d" % (h, m, s) + + temp_list = [] + conn = sqlite3.connect('ID_DATA.db') + c = conn.cursor() + if mode == "push": + cursor = c.execute( + "SELECT * FROM NewCookiesTable WHERE StatusA != ?", ("off",)) + c_data = cursor.fetchall() + elif mode == "ask": + c_data = ([uid, 0, 0, 0, 0, 0, 0],) + + for row in c_data: + raw_data = await get_daily_data(str(row[0])) + if raw_data["retcode"] != 0: + temp_list.append( + {"qid": row[2], "gid": row[3], "message": "你的推送状态有误;可能是uid绑定错误或没有在米游社打开“实时便筏”功能。"}) + else: + dailydata = raw_data["data"] + current_resin = dailydata['current_resin'] + + current_expedition_num = dailydata['current_expedition_num'] + max_expedition_num = dailydata['max_expedition_num'] + finished_expedition_num = 0 + expedition_info: list[str] = [] + for expedition in dailydata['expeditions']: + avatar: str = expedition['avatar_side_icon'][89:-4] + try: + avatar_name: str = avatar_json[avatar] + except KeyError: + avatar_name: str = avatar + + if expedition['status'] == 'Finished': + expedition_info.append(f"{avatar_name} 探索完成") + finished_expedition_num += 1 + else: + remained_timed: str = seconds2hours( + expedition['remained_time']) + expedition_info.append( + f"{avatar_name} 剩余时间{remained_timed}") + + if current_resin >= row[6] or dailydata["max_home_coin"] - dailydata["current_home_coin"] <= 100: + tip = '' + + if current_resin >= row[6] != 0: + tip += "\n==============\n你的树脂快满了!" + if dailydata["max_home_coin"] - dailydata["current_home_coin"] <= 100: + tip += "\n==============\n你的洞天宝钱快满了!" + # if finished_expedition_num >0: + # tip += "\n==============\n你有探索派遣完成了!" + max_resin = dailydata['max_resin'] + rec_time = '' + # print(dailydata) + if current_resin < 160: + resin_recovery_time = seconds2hours( + dailydata['resin_recovery_time']) + next_resin_rec_time = seconds2hours( + 8 * 60 - ((dailydata['max_resin'] - dailydata['current_resin']) * 8 * 60 - int( + dailydata['resin_recovery_time']))) + rec_time = f' ({next_resin_rec_time}/{resin_recovery_time})' + + finished_task_num = dailydata['finished_task_num'] + total_task_num = dailydata['total_task_num'] + is_extra_got = '已' if dailydata['is_extra_task_reward_received'] else '未' + + resin_discount_num_limit = dailydata['resin_discount_num_limit'] + used_resin_discount_num = resin_discount_num_limit - \ + dailydata['remain_resin_discount_num'] + + coin = f'{dailydata["current_home_coin"]}/{dailydata["max_home_coin"]}' + if dailydata["current_home_coin"] < dailydata["max_home_coin"]: + coin_rec_time = seconds2hours(int(dailydata["home_coin_recovery_time"])) + coin_add_speed = math.ceil((dailydata["max_home_coin"] - dailydata["current_home_coin"]) / ( + int(dailydata["home_coin_recovery_time"]) / 60 / 60)) + coin += f'({coin_rec_time} 约{coin_add_speed}/h)' + + expedition_data = "\n".join(expedition_info) + send_mes = daily_im.format(tip, current_resin, max_resin, rec_time, finished_task_num, total_task_num, + is_extra_got, used_resin_discount_num, + resin_discount_num_limit, coin, current_expedition_num, + finished_expedition_num, max_expedition_num, expedition_data) + + temp_list.append( + {"qid": row[2], "gid": row[3], "message": send_mes}) + return temp_list + + +async def weapon_wiki(name, level=None): + data = await get_weapon_info(name) + if "errcode" in data: + im = "武器不存在。" + elif level: + data2 = await get_weapon_info(name, level) + if data["substat"] != "": + sp = data["substat"] + ":" + '%.1f%%' % (data2["specialized"] * 100) \ + if data["substat"] != "元素精通" else data["substat"] + ":" + str(math.floor(data2["specialized"])) + else: + sp = "" + im = (data["name"] + "\n等级:" + str(data2["level"]) + "(突破" + str(data2["ascension"]) + ")" + + "\n攻击力:" + str(round(data2["attack"])) + "\n" + sp) + else: + name = data['name'] + _type = data['weapontype'] + star = data['rarity'] + "星" + info = data['description'] + atk = str(data['baseatk']) + sub_name = data['substat'] + if data['subvalue'] != "": + sub_val = (data['subvalue'] + + '%') if sub_name != '元素精通' else data['subvalue'] + sub = "\n" + "【" + sub_name + "】" + sub_val + else: + sub = "" + + if data['effectname'] != "": + raw_effect = data['effect'] + rw_ef = [] + for i in range(len(data['r1'])): + now = '' + for j in range(1, 6): + now = now + data['r{}'.format(j)][i] + "/" + now = now[:-1] + rw_ef.append(now) + raw_effect = raw_effect.format(*rw_ef) + effect = "\n" + "【" + data['effectname'] + "】" + ":" + raw_effect + else: + effect = "" + im = weapon_im.format(name, _type, star, info, atk, + sub, effect) + return im + + +async def char_wiki(name, mode="char", level=None): + data = await get_char_info(name, mode, level if mode == "char" else None) + if mode == "char": + if isinstance(data, list): + im = ','.join(data) + elif "errcode" in data: + im = "不存在该角色或类型。" + elif level: + data2 = await get_char_info(name, mode) + sp = data2["substat"] + ":" + '%.1f%%' % (data["specialized"] * 100) if data2["substat"] != "元素精通" else \ + data2["substat"] + ":" + str(math.floor(data["specialized"])) + im = (data2["name"] + "\n等级:" + str(data["level"]) + "\n血量:" + str(math.floor(data["hp"])) + + "\n攻击力:" + str(math.floor(data["attack"])) + "\n防御力:" + str(math.floor(data["defense"])) + + "\n" + sp) + else: + name = data['title'] + ' — ' + data['name'] + star = data['rarity'] + _type = data["weapontype"] + element = data['element'] + up_val = data['substat'] + bdday = data['birthday'] + polar = data['constellation'] + cv = data['cv']['chinese'] + info = data['description'] + im = char_info_im.format( + name, star, _type, element, up_val, bdday, polar, cv, info) + elif mode == "costs": + if isinstance(data[1], list): + im = ','.join(data[1]) + elif "errcode" in data[1]: + im = "不存在该角色或类型。" + else: + im = "【天赋材料(一份)】\n{}\n【突破材料】\n{}" + im1 = "" + im2 = "" + + talent_temp = {} + talent_cost = data[1] + for i in talent_cost.values(): + for j in i: + if j["name"] not in talent_temp: + talent_temp[j["name"]] = j["count"] + else: + talent_temp[j["name"]] = talent_temp[j["name"]] + j["count"] + for k in talent_temp: + im1 = im1 + k + ":" + str(talent_temp[k]) + "\n" + + temp = {} + cost = data[0] + for i in range(1, 7): + for j in cost["ascend{}".format(i)]: + if j["name"] not in temp: + temp[j["name"]] = j["count"] + else: + temp[j["name"]] = temp[j["name"]] + j["count"] + + for k in temp: + im2 = im2 + k + ":" + str(temp[k]) + "\n" + + im = im.format(im1, im2) + elif mode == "constellations": + if "errcode" in data: + im = "不存在该角色或命座数量。" + else: + im = "【" + data["c{}".format(level)]['name'] + "】" + ":" + \ + "\n" + data["c{}".format(level)]['effect'].replace("*", "") + elif mode == "talents": + if "errcode" in data: + im = "不存在该角色。" + else: + if 6 >= int(level) > 0: + if int(level) <= 3: + if level == "1": + data = data["combat1"] + elif level == "2": + data = data["combat2"] + elif level == "3": + data = data["combat3"] + skill_name = data["name"] + skill_info = data["info"] + skill_detail = "" + + for i in data["attributes"]["parameters"]: + temp = "" + for k in data["attributes"]["parameters"][i]: + temp += "%.2f%%" % (k * 100) + "/" + data["attributes"]["parameters"][i] = temp[:-1] + + for i in data["attributes"]["labels"]: + # i = i.replace("{","{{") + i = re.sub(r':[a-zA-Z0-9]+}', "}", i) + # i.replace(r':[a-zA-Z0-9]+}','}') + skill_detail += i + "\n" + + skill_detail = skill_detail.format(**data["attributes"]["parameters"]) + + im = "【{}】\n{}\n————\n{}".format(skill_name, skill_info, skill_detail) + + else: + if level == "4": + data = data["passive1"] + elif level == "5": + data = data["passive2"] + elif level == "6": + data = data["passive3"] + elif level == "7": + data = data["passive4"] + skill_name = data["name"] + skill_info = data["info"] + im = "【{}】\n{}".format(skill_name, skill_info) + else: + im = "不存在该天赋。" + return im diff --git a/mys/bg/default1.jpg b/mihoyo_bbs/bg/default1.jpg similarity index 100% rename from mys/bg/default1.jpg rename to mihoyo_bbs/bg/default1.jpg diff --git a/mys/bg/default2.jpg b/mihoyo_bbs/bg/default2.jpg similarity index 100% rename from mys/bg/default2.jpg rename to mihoyo_bbs/bg/default2.jpg diff --git a/mys/char_done/10000002.png b/mihoyo_bbs/char_done/10000002.png similarity index 100% rename from mys/char_done/10000002.png rename to mihoyo_bbs/char_done/10000002.png diff --git a/mys/char_done/10000003.png b/mihoyo_bbs/char_done/10000003.png similarity index 100% rename from mys/char_done/10000003.png rename to mihoyo_bbs/char_done/10000003.png diff --git a/mys/char_done/10000005.png b/mihoyo_bbs/char_done/10000005.png similarity index 100% rename from mys/char_done/10000005.png rename to mihoyo_bbs/char_done/10000005.png diff --git a/mys/char_done/10000006.png b/mihoyo_bbs/char_done/10000006.png similarity index 100% rename from mys/char_done/10000006.png rename to mihoyo_bbs/char_done/10000006.png diff --git a/mys/char_done/10000007.png b/mihoyo_bbs/char_done/10000007.png similarity index 100% rename from mys/char_done/10000007.png rename to mihoyo_bbs/char_done/10000007.png diff --git a/mys/char_done/10000014.png b/mihoyo_bbs/char_done/10000014.png similarity index 100% rename from mys/char_done/10000014.png rename to mihoyo_bbs/char_done/10000014.png diff --git a/mys/char_done/10000015.png b/mihoyo_bbs/char_done/10000015.png similarity index 100% rename from mys/char_done/10000015.png rename to mihoyo_bbs/char_done/10000015.png diff --git a/mys/char_done/10000016.png b/mihoyo_bbs/char_done/10000016.png similarity index 100% rename from mys/char_done/10000016.png rename to mihoyo_bbs/char_done/10000016.png diff --git a/mys/char_done/10000020.png b/mihoyo_bbs/char_done/10000020.png similarity index 100% rename from mys/char_done/10000020.png rename to mihoyo_bbs/char_done/10000020.png diff --git a/mys/char_done/10000021.png b/mihoyo_bbs/char_done/10000021.png similarity index 100% rename from mys/char_done/10000021.png rename to mihoyo_bbs/char_done/10000021.png diff --git a/mys/char_done/10000022.png b/mihoyo_bbs/char_done/10000022.png similarity index 100% rename from mys/char_done/10000022.png rename to mihoyo_bbs/char_done/10000022.png diff --git a/mys/char_done/10000023.png b/mihoyo_bbs/char_done/10000023.png similarity index 100% rename from mys/char_done/10000023.png rename to mihoyo_bbs/char_done/10000023.png diff --git a/mys/char_done/10000024.png b/mihoyo_bbs/char_done/10000024.png similarity index 100% rename from mys/char_done/10000024.png rename to mihoyo_bbs/char_done/10000024.png diff --git a/mys/char_done/10000025.png b/mihoyo_bbs/char_done/10000025.png similarity index 100% rename from mys/char_done/10000025.png rename to mihoyo_bbs/char_done/10000025.png diff --git a/mys/char_done/10000026.png b/mihoyo_bbs/char_done/10000026.png similarity index 100% rename from mys/char_done/10000026.png rename to mihoyo_bbs/char_done/10000026.png diff --git a/mys/char_done/10000027.png b/mihoyo_bbs/char_done/10000027.png similarity index 100% rename from mys/char_done/10000027.png rename to mihoyo_bbs/char_done/10000027.png diff --git a/mys/char_done/10000029.png b/mihoyo_bbs/char_done/10000029.png similarity index 100% rename from mys/char_done/10000029.png rename to mihoyo_bbs/char_done/10000029.png diff --git a/mys/char_done/10000030.png b/mihoyo_bbs/char_done/10000030.png similarity index 100% rename from mys/char_done/10000030.png rename to mihoyo_bbs/char_done/10000030.png diff --git a/mys/char_done/10000031.png b/mihoyo_bbs/char_done/10000031.png similarity index 100% rename from mys/char_done/10000031.png rename to mihoyo_bbs/char_done/10000031.png diff --git a/mys/char_done/10000032.png b/mihoyo_bbs/char_done/10000032.png similarity index 100% rename from mys/char_done/10000032.png rename to mihoyo_bbs/char_done/10000032.png diff --git a/mys/char_done/10000033.png b/mihoyo_bbs/char_done/10000033.png similarity index 100% rename from mys/char_done/10000033.png rename to mihoyo_bbs/char_done/10000033.png diff --git a/mys/char_done/10000034.png b/mihoyo_bbs/char_done/10000034.png similarity index 100% rename from mys/char_done/10000034.png rename to mihoyo_bbs/char_done/10000034.png diff --git a/mys/char_done/10000035.png b/mihoyo_bbs/char_done/10000035.png similarity index 100% rename from mys/char_done/10000035.png rename to mihoyo_bbs/char_done/10000035.png diff --git a/mys/char_done/10000036.png b/mihoyo_bbs/char_done/10000036.png similarity index 100% rename from mys/char_done/10000036.png rename to mihoyo_bbs/char_done/10000036.png diff --git a/mys/char_done/10000037.png b/mihoyo_bbs/char_done/10000037.png similarity index 100% rename from mys/char_done/10000037.png rename to mihoyo_bbs/char_done/10000037.png diff --git a/mys/char_done/10000038.png b/mihoyo_bbs/char_done/10000038.png similarity index 100% rename from mys/char_done/10000038.png rename to mihoyo_bbs/char_done/10000038.png diff --git a/mys/char_done/10000039.png b/mihoyo_bbs/char_done/10000039.png similarity index 100% rename from mys/char_done/10000039.png rename to mihoyo_bbs/char_done/10000039.png diff --git a/mys/char_done/10000041.png b/mihoyo_bbs/char_done/10000041.png similarity index 100% rename from mys/char_done/10000041.png rename to mihoyo_bbs/char_done/10000041.png diff --git a/mys/char_done/10000042.png b/mihoyo_bbs/char_done/10000042.png similarity index 100% rename from mys/char_done/10000042.png rename to mihoyo_bbs/char_done/10000042.png diff --git a/mys/char_done/10000043.png b/mihoyo_bbs/char_done/10000043.png similarity index 100% rename from mys/char_done/10000043.png rename to mihoyo_bbs/char_done/10000043.png diff --git a/mys/char_done/10000044.png b/mihoyo_bbs/char_done/10000044.png similarity index 100% rename from mys/char_done/10000044.png rename to mihoyo_bbs/char_done/10000044.png diff --git a/mys/char_done/10000045.png b/mihoyo_bbs/char_done/10000045.png similarity index 100% rename from mys/char_done/10000045.png rename to mihoyo_bbs/char_done/10000045.png diff --git a/mys/char_done/10000046.png b/mihoyo_bbs/char_done/10000046.png similarity index 100% rename from mys/char_done/10000046.png rename to mihoyo_bbs/char_done/10000046.png diff --git a/mys/char_done/10000047.png b/mihoyo_bbs/char_done/10000047.png similarity index 100% rename from mys/char_done/10000047.png rename to mihoyo_bbs/char_done/10000047.png diff --git a/mys/char_done/10000048.png b/mihoyo_bbs/char_done/10000048.png similarity index 100% rename from mys/char_done/10000048.png rename to mihoyo_bbs/char_done/10000048.png diff --git a/mys/char_done/10000049.png b/mihoyo_bbs/char_done/10000049.png similarity index 100% rename from mys/char_done/10000049.png rename to mihoyo_bbs/char_done/10000049.png diff --git a/mys/char_done/10000051.png b/mihoyo_bbs/char_done/10000051.png similarity index 100% rename from mys/char_done/10000051.png rename to mihoyo_bbs/char_done/10000051.png diff --git a/mys/char_done/10000052.png b/mihoyo_bbs/char_done/10000052.png similarity index 100% rename from mys/char_done/10000052.png rename to mihoyo_bbs/char_done/10000052.png diff --git a/mys/char_done/10000053.png b/mihoyo_bbs/char_done/10000053.png similarity index 100% rename from mys/char_done/10000053.png rename to mihoyo_bbs/char_done/10000053.png diff --git a/mys/char_done/10000054.png b/mihoyo_bbs/char_done/10000054.png similarity index 100% rename from mys/char_done/10000054.png rename to mihoyo_bbs/char_done/10000054.png diff --git a/mys/char_done/10000056.png b/mihoyo_bbs/char_done/10000056.png similarity index 100% rename from mys/char_done/10000056.png rename to mihoyo_bbs/char_done/10000056.png diff --git a/mys/char_done/10000062.png b/mihoyo_bbs/char_done/10000062.png similarity index 100% rename from mys/char_done/10000062.png rename to mihoyo_bbs/char_done/10000062.png diff --git a/mys/char_img/UI_AvatarIcon_Albedo@2x.png b/mihoyo_bbs/char_img/UI_AvatarIcon_Albedo@2x.png similarity index 100% rename from mys/char_img/UI_AvatarIcon_Albedo@2x.png rename to mihoyo_bbs/char_img/UI_AvatarIcon_Albedo@2x.png diff --git a/mys/char_img/UI_AvatarIcon_Ambor@2x.png b/mihoyo_bbs/char_img/UI_AvatarIcon_Ambor@2x.png similarity index 100% rename from mys/char_img/UI_AvatarIcon_Ambor@2x.png rename to mihoyo_bbs/char_img/UI_AvatarIcon_Ambor@2x.png diff --git a/mys/char_img/UI_AvatarIcon_Ayaka@2x.png b/mihoyo_bbs/char_img/UI_AvatarIcon_Ayaka@2x.png similarity index 100% rename from mys/char_img/UI_AvatarIcon_Ayaka@2x.png rename to mihoyo_bbs/char_img/UI_AvatarIcon_Ayaka@2x.png diff --git a/mys/char_img/UI_AvatarIcon_Barbara@2x.png b/mihoyo_bbs/char_img/UI_AvatarIcon_Barbara@2x.png similarity index 100% rename from mys/char_img/UI_AvatarIcon_Barbara@2x.png rename to mihoyo_bbs/char_img/UI_AvatarIcon_Barbara@2x.png diff --git a/mys/char_img/UI_AvatarIcon_Beidou@2x.png b/mihoyo_bbs/char_img/UI_AvatarIcon_Beidou@2x.png similarity index 100% rename from mys/char_img/UI_AvatarIcon_Beidou@2x.png rename to mihoyo_bbs/char_img/UI_AvatarIcon_Beidou@2x.png diff --git a/mys/char_img/UI_AvatarIcon_Bennett@2x.png b/mihoyo_bbs/char_img/UI_AvatarIcon_Bennett@2x.png similarity index 100% rename from mys/char_img/UI_AvatarIcon_Bennett@2x.png rename to mihoyo_bbs/char_img/UI_AvatarIcon_Bennett@2x.png diff --git a/mys/char_img/UI_AvatarIcon_Diluc@2x.png b/mihoyo_bbs/char_img/UI_AvatarIcon_Diluc@2x.png similarity index 100% rename from mys/char_img/UI_AvatarIcon_Diluc@2x.png rename to mihoyo_bbs/char_img/UI_AvatarIcon_Diluc@2x.png diff --git a/mys/char_img/UI_AvatarIcon_Diona@2x.png b/mihoyo_bbs/char_img/UI_AvatarIcon_Diona@2x.png similarity index 100% rename from mys/char_img/UI_AvatarIcon_Diona@2x.png rename to mihoyo_bbs/char_img/UI_AvatarIcon_Diona@2x.png diff --git a/mys/char_img/UI_AvatarIcon_Eula@2x.png b/mihoyo_bbs/char_img/UI_AvatarIcon_Eula@2x.png similarity index 100% rename from mys/char_img/UI_AvatarIcon_Eula@2x.png rename to mihoyo_bbs/char_img/UI_AvatarIcon_Eula@2x.png diff --git a/mys/char_img/UI_AvatarIcon_Feiyan@2x.png b/mihoyo_bbs/char_img/UI_AvatarIcon_Feiyan@2x.png similarity index 100% rename from mys/char_img/UI_AvatarIcon_Feiyan@2x.png rename to mihoyo_bbs/char_img/UI_AvatarIcon_Feiyan@2x.png diff --git a/mys/char_img/UI_AvatarIcon_Fischl@2x.png b/mihoyo_bbs/char_img/UI_AvatarIcon_Fischl@2x.png similarity index 100% rename from mys/char_img/UI_AvatarIcon_Fischl@2x.png rename to mihoyo_bbs/char_img/UI_AvatarIcon_Fischl@2x.png diff --git a/mys/char_img/UI_AvatarIcon_Ganyu@2x.png b/mihoyo_bbs/char_img/UI_AvatarIcon_Ganyu@2x.png similarity index 100% rename from mys/char_img/UI_AvatarIcon_Ganyu@2x.png rename to mihoyo_bbs/char_img/UI_AvatarIcon_Ganyu@2x.png diff --git a/mys/char_img/UI_AvatarIcon_Hutao@2x.png b/mihoyo_bbs/char_img/UI_AvatarIcon_Hutao@2x.png similarity index 100% rename from mys/char_img/UI_AvatarIcon_Hutao@2x.png rename to mihoyo_bbs/char_img/UI_AvatarIcon_Hutao@2x.png diff --git a/mys/char_img/UI_AvatarIcon_Kaeya@2x.png b/mihoyo_bbs/char_img/UI_AvatarIcon_Kaeya@2x.png similarity index 100% rename from mys/char_img/UI_AvatarIcon_Kaeya@2x.png rename to mihoyo_bbs/char_img/UI_AvatarIcon_Kaeya@2x.png diff --git a/mys/char_img/UI_AvatarIcon_Kazuha@2x.png b/mihoyo_bbs/char_img/UI_AvatarIcon_Kazuha@2x.png similarity index 100% rename from mys/char_img/UI_AvatarIcon_Kazuha@2x.png rename to mihoyo_bbs/char_img/UI_AvatarIcon_Kazuha@2x.png diff --git a/mys/char_img/UI_AvatarIcon_Keqing@2x.png b/mihoyo_bbs/char_img/UI_AvatarIcon_Keqing@2x.png similarity index 100% rename from mys/char_img/UI_AvatarIcon_Keqing@2x.png rename to mihoyo_bbs/char_img/UI_AvatarIcon_Keqing@2x.png diff --git a/mys/char_img/UI_AvatarIcon_Klee@2x.png b/mihoyo_bbs/char_img/UI_AvatarIcon_Klee@2x.png similarity index 100% rename from mys/char_img/UI_AvatarIcon_Klee@2x.png rename to mihoyo_bbs/char_img/UI_AvatarIcon_Klee@2x.png diff --git a/mys/char_img/UI_AvatarIcon_Lisa@2x.png b/mihoyo_bbs/char_img/UI_AvatarIcon_Lisa@2x.png similarity index 100% rename from mys/char_img/UI_AvatarIcon_Lisa@2x.png rename to mihoyo_bbs/char_img/UI_AvatarIcon_Lisa@2x.png diff --git a/mys/char_img/UI_AvatarIcon_Mona@2x.png b/mihoyo_bbs/char_img/UI_AvatarIcon_Mona@2x.png similarity index 100% rename from mys/char_img/UI_AvatarIcon_Mona@2x.png rename to mihoyo_bbs/char_img/UI_AvatarIcon_Mona@2x.png diff --git a/mys/char_img/UI_AvatarIcon_Ningguang@2x.png b/mihoyo_bbs/char_img/UI_AvatarIcon_Ningguang@2x.png similarity index 100% rename from mys/char_img/UI_AvatarIcon_Ningguang@2x.png rename to mihoyo_bbs/char_img/UI_AvatarIcon_Ningguang@2x.png diff --git a/mys/char_img/UI_AvatarIcon_Noel@2x.png b/mihoyo_bbs/char_img/UI_AvatarIcon_Noel@2x.png similarity index 100% rename from mys/char_img/UI_AvatarIcon_Noel@2x.png rename to mihoyo_bbs/char_img/UI_AvatarIcon_Noel@2x.png diff --git a/mys/char_img/UI_AvatarIcon_PlayerBoy@2x.png b/mihoyo_bbs/char_img/UI_AvatarIcon_PlayerBoy@2x.png similarity index 100% rename from mys/char_img/UI_AvatarIcon_PlayerBoy@2x.png rename to mihoyo_bbs/char_img/UI_AvatarIcon_PlayerBoy@2x.png diff --git a/mys/char_img/UI_AvatarIcon_PlayerGirl@2x.png b/mihoyo_bbs/char_img/UI_AvatarIcon_PlayerGirl@2x.png similarity index 100% rename from mys/char_img/UI_AvatarIcon_PlayerGirl@2x.png rename to mihoyo_bbs/char_img/UI_AvatarIcon_PlayerGirl@2x.png diff --git a/mys/char_img/UI_AvatarIcon_Qin@2x.png b/mihoyo_bbs/char_img/UI_AvatarIcon_Qin@2x.png similarity index 100% rename from mys/char_img/UI_AvatarIcon_Qin@2x.png rename to mihoyo_bbs/char_img/UI_AvatarIcon_Qin@2x.png diff --git a/mys/char_img/UI_AvatarIcon_Qiqi@2x.png b/mihoyo_bbs/char_img/UI_AvatarIcon_Qiqi@2x.png similarity index 100% rename from mys/char_img/UI_AvatarIcon_Qiqi@2x.png rename to mihoyo_bbs/char_img/UI_AvatarIcon_Qiqi@2x.png diff --git a/mys/char_img/UI_AvatarIcon_Razor@2x.png b/mihoyo_bbs/char_img/UI_AvatarIcon_Razor@2x.png similarity index 100% rename from mys/char_img/UI_AvatarIcon_Razor@2x.png rename to mihoyo_bbs/char_img/UI_AvatarIcon_Razor@2x.png diff --git a/mys/char_img/UI_AvatarIcon_Shougun@2x.png b/mihoyo_bbs/char_img/UI_AvatarIcon_Shougun@2x.png similarity index 100% rename from mys/char_img/UI_AvatarIcon_Shougun@2x.png rename to mihoyo_bbs/char_img/UI_AvatarIcon_Shougun@2x.png diff --git a/mys/char_img/UI_AvatarIcon_Tartaglia@2x.png b/mihoyo_bbs/char_img/UI_AvatarIcon_Tartaglia@2x.png similarity index 100% rename from mys/char_img/UI_AvatarIcon_Tartaglia@2x.png rename to mihoyo_bbs/char_img/UI_AvatarIcon_Tartaglia@2x.png diff --git a/mys/char_img/UI_AvatarIcon_Venti@2x.png b/mihoyo_bbs/char_img/UI_AvatarIcon_Venti@2x.png similarity index 100% rename from mys/char_img/UI_AvatarIcon_Venti@2x.png rename to mihoyo_bbs/char_img/UI_AvatarIcon_Venti@2x.png diff --git a/mys/char_img/UI_AvatarIcon_Xiangling@2x.png b/mihoyo_bbs/char_img/UI_AvatarIcon_Xiangling@2x.png similarity index 100% rename from mys/char_img/UI_AvatarIcon_Xiangling@2x.png rename to mihoyo_bbs/char_img/UI_AvatarIcon_Xiangling@2x.png diff --git a/mys/char_img/UI_AvatarIcon_Xiao@2x.png b/mihoyo_bbs/char_img/UI_AvatarIcon_Xiao@2x.png similarity index 100% rename from mys/char_img/UI_AvatarIcon_Xiao@2x.png rename to mihoyo_bbs/char_img/UI_AvatarIcon_Xiao@2x.png diff --git a/mys/char_img/UI_AvatarIcon_Xingqiu@2x.png b/mihoyo_bbs/char_img/UI_AvatarIcon_Xingqiu@2x.png similarity index 100% rename from mys/char_img/UI_AvatarIcon_Xingqiu@2x.png rename to mihoyo_bbs/char_img/UI_AvatarIcon_Xingqiu@2x.png diff --git a/mys/char_img/UI_AvatarIcon_Yoimiya@2x.png b/mihoyo_bbs/char_img/UI_AvatarIcon_Yoimiya@2x.png similarity index 100% rename from mys/char_img/UI_AvatarIcon_Yoimiya@2x.png rename to mihoyo_bbs/char_img/UI_AvatarIcon_Yoimiya@2x.png diff --git a/mys/char_img/UI_AvatarIcon_Zhongli@2x.png b/mihoyo_bbs/char_img/UI_AvatarIcon_Zhongli@2x.png similarity index 100% rename from mys/char_img/UI_AvatarIcon_Zhongli@2x.png rename to mihoyo_bbs/char_img/UI_AvatarIcon_Zhongli@2x.png diff --git a/mys/chars/10000002.png b/mihoyo_bbs/chars/10000002.png similarity index 100% rename from mys/chars/10000002.png rename to mihoyo_bbs/chars/10000002.png diff --git a/mys/chars/10000003.png b/mihoyo_bbs/chars/10000003.png similarity index 100% rename from mys/chars/10000003.png rename to mihoyo_bbs/chars/10000003.png diff --git a/mys/chars/10000005.png b/mihoyo_bbs/chars/10000005.png similarity index 100% rename from mys/chars/10000005.png rename to mihoyo_bbs/chars/10000005.png diff --git a/mys/chars/10000006.png b/mihoyo_bbs/chars/10000006.png similarity index 100% rename from mys/chars/10000006.png rename to mihoyo_bbs/chars/10000006.png diff --git a/mys/chars/10000007.png b/mihoyo_bbs/chars/10000007.png similarity index 100% rename from mys/chars/10000007.png rename to mihoyo_bbs/chars/10000007.png diff --git a/mys/chars/10000014.png b/mihoyo_bbs/chars/10000014.png similarity index 100% rename from mys/chars/10000014.png rename to mihoyo_bbs/chars/10000014.png diff --git a/mys/chars/10000015.png b/mihoyo_bbs/chars/10000015.png similarity index 100% rename from mys/chars/10000015.png rename to mihoyo_bbs/chars/10000015.png diff --git a/mys/chars/10000016.png b/mihoyo_bbs/chars/10000016.png similarity index 100% rename from mys/chars/10000016.png rename to mihoyo_bbs/chars/10000016.png diff --git a/mys/chars/10000020.png b/mihoyo_bbs/chars/10000020.png similarity index 100% rename from mys/chars/10000020.png rename to mihoyo_bbs/chars/10000020.png diff --git a/mys/chars/10000021.png b/mihoyo_bbs/chars/10000021.png similarity index 100% rename from mys/chars/10000021.png rename to mihoyo_bbs/chars/10000021.png diff --git a/mys/chars/10000022.png b/mihoyo_bbs/chars/10000022.png similarity index 100% rename from mys/chars/10000022.png rename to mihoyo_bbs/chars/10000022.png diff --git a/mys/chars/10000023.png b/mihoyo_bbs/chars/10000023.png similarity index 100% rename from mys/chars/10000023.png rename to mihoyo_bbs/chars/10000023.png diff --git a/mys/chars/10000024.png b/mihoyo_bbs/chars/10000024.png similarity index 100% rename from mys/chars/10000024.png rename to mihoyo_bbs/chars/10000024.png diff --git a/mys/chars/10000025.png b/mihoyo_bbs/chars/10000025.png similarity index 100% rename from mys/chars/10000025.png rename to mihoyo_bbs/chars/10000025.png diff --git a/mys/chars/10000026.png b/mihoyo_bbs/chars/10000026.png similarity index 100% rename from mys/chars/10000026.png rename to mihoyo_bbs/chars/10000026.png diff --git a/mys/chars/10000027.png b/mihoyo_bbs/chars/10000027.png similarity index 100% rename from mys/chars/10000027.png rename to mihoyo_bbs/chars/10000027.png diff --git a/mys/chars/10000029.png b/mihoyo_bbs/chars/10000029.png similarity index 100% rename from mys/chars/10000029.png rename to mihoyo_bbs/chars/10000029.png diff --git a/mys/chars/10000030.png b/mihoyo_bbs/chars/10000030.png similarity index 100% rename from mys/chars/10000030.png rename to mihoyo_bbs/chars/10000030.png diff --git a/mys/chars/10000031.png b/mihoyo_bbs/chars/10000031.png similarity index 100% rename from mys/chars/10000031.png rename to mihoyo_bbs/chars/10000031.png diff --git a/mys/chars/10000032.png b/mihoyo_bbs/chars/10000032.png similarity index 100% rename from mys/chars/10000032.png rename to mihoyo_bbs/chars/10000032.png diff --git a/mys/chars/10000033.png b/mihoyo_bbs/chars/10000033.png similarity index 100% rename from mys/chars/10000033.png rename to mihoyo_bbs/chars/10000033.png diff --git a/mys/chars/10000034.png b/mihoyo_bbs/chars/10000034.png similarity index 100% rename from mys/chars/10000034.png rename to mihoyo_bbs/chars/10000034.png diff --git a/mys/chars/10000035.png b/mihoyo_bbs/chars/10000035.png similarity index 100% rename from mys/chars/10000035.png rename to mihoyo_bbs/chars/10000035.png diff --git a/mys/chars/10000036.png b/mihoyo_bbs/chars/10000036.png similarity index 100% rename from mys/chars/10000036.png rename to mihoyo_bbs/chars/10000036.png diff --git a/mys/chars/10000037.png b/mihoyo_bbs/chars/10000037.png similarity index 100% rename from mys/chars/10000037.png rename to mihoyo_bbs/chars/10000037.png diff --git a/mys/chars/10000039.png b/mihoyo_bbs/chars/10000039.png similarity index 100% rename from mys/chars/10000039.png rename to mihoyo_bbs/chars/10000039.png diff --git a/mys/chars/10000041.png b/mihoyo_bbs/chars/10000041.png similarity index 100% rename from mys/chars/10000041.png rename to mihoyo_bbs/chars/10000041.png diff --git a/mys/chars/10000042.png b/mihoyo_bbs/chars/10000042.png similarity index 100% rename from mys/chars/10000042.png rename to mihoyo_bbs/chars/10000042.png diff --git a/mys/chars/10000043.png b/mihoyo_bbs/chars/10000043.png similarity index 100% rename from mys/chars/10000043.png rename to mihoyo_bbs/chars/10000043.png diff --git a/mys/chars/10000044.png b/mihoyo_bbs/chars/10000044.png similarity index 100% rename from mys/chars/10000044.png rename to mihoyo_bbs/chars/10000044.png diff --git a/mys/chars/10000045.png b/mihoyo_bbs/chars/10000045.png similarity index 100% rename from mys/chars/10000045.png rename to mihoyo_bbs/chars/10000045.png diff --git a/mys/chars/10000046.png b/mihoyo_bbs/chars/10000046.png similarity index 100% rename from mys/chars/10000046.png rename to mihoyo_bbs/chars/10000046.png diff --git a/mys/chars/10000047.png b/mihoyo_bbs/chars/10000047.png similarity index 100% rename from mys/chars/10000047.png rename to mihoyo_bbs/chars/10000047.png diff --git a/mys/chars/10000048.png b/mihoyo_bbs/chars/10000048.png similarity index 100% rename from mys/chars/10000048.png rename to mihoyo_bbs/chars/10000048.png diff --git a/mys/chars/10000049.png b/mihoyo_bbs/chars/10000049.png similarity index 100% rename from mys/chars/10000049.png rename to mihoyo_bbs/chars/10000049.png diff --git a/mys/chars/10000051.png b/mihoyo_bbs/chars/10000051.png similarity index 100% rename from mys/chars/10000051.png rename to mihoyo_bbs/chars/10000051.png diff --git a/mys/chars/10000052.png b/mihoyo_bbs/chars/10000052.png similarity index 100% rename from mys/chars/10000052.png rename to mihoyo_bbs/chars/10000052.png diff --git a/mys/chars/10000053.png b/mihoyo_bbs/chars/10000053.png similarity index 100% rename from mys/chars/10000053.png rename to mihoyo_bbs/chars/10000053.png diff --git a/mys/chars/10000054.png b/mihoyo_bbs/chars/10000054.png similarity index 100% rename from mys/chars/10000054.png rename to mihoyo_bbs/chars/10000054.png diff --git a/mys/chars/10000056.png b/mihoyo_bbs/chars/10000056.png similarity index 100% rename from mys/chars/10000056.png rename to mihoyo_bbs/chars/10000056.png diff --git a/mys/chars/10000062.png b/mihoyo_bbs/chars/10000062.png similarity index 100% rename from mys/chars/10000062.png rename to mihoyo_bbs/chars/10000062.png diff --git a/mys/index/lots.txt b/mihoyo_bbs/index/lots.txt similarity index 99% rename from mys/index/lots.txt rename to mihoyo_bbs/index/lots.txt index 5f034f31..d8933ac3 100644 --- a/mys/index/lots.txt +++ b/mihoyo_bbs/index/lots.txt @@ -1,16 +1,16 @@ - - 4oCU4oCU5aSn5ZCJ4oCU4oCUCuWuneWJkeWHuuWMo+adpe+8jOaXoOW+gOS4jeWIqeOAguWHuuWMo+S5i+WFie+8jOS6puiDveeFp+S6ruS7luS6uuOAggrku4rml6Xog73kuIDnrq3lsITkuK3nqbrkuK3nmoTnjI7nianvvIzog73kuIDlh7vlkb3kuK3lrojljavopoHlrrPjgIIK6Iul5rKh5pyJ55uu5qCH77yM5LiN5aao5Zub5aSE6L2s6L2s77yM6K+05LiN5a6a5Lya5pyJ5oSP5aSW5LmL5Zac44CCCuWQjOaXtu+8jOS5n+S4jeimgeW/mOiusOWSjOWAkumcieeahOWQjOS8tOWIhuS6q+S4gOS4i+Wlvei/kOawlOWTpuOAggoK5LuK5aSp55qE5bm46L+Q54mp5pivOumavuW+l+S4gOingeeahOOAjOmprOWwvuOAjeOAggrpqazlsL7pmo/lpKfniYfojbvojYnnlJ/plb/vvIzkvYbljbTmm7TkuLrmjLrmi5TjgIIK5LiO5YKy54S25oy656uL5LqO5q2k5LiW55qE5L2g5LiA5a6a5b6I5piv55u46YWN44CC - - 4oCU4oCU5aSn5ZCJ4oCU4oCUCuWkseiAjOWkjeW+l+eahOS4gOWkqeOAggrljp/mnKzku6XkuLrnn7PmsonlpKfmtbfnmoTkuovmg4XmnInkuoblpb3nmoTlm57lupTvvIwK5Y6f5pys5YiG6YGT5oms6ZWz55qE5pyL5Y+L5oiW6K645Y+v5Lul5YaN5bqm5ZKM5aW977yMCuS4jee7j+aEj+mXtOaDs+i1t+S6huWOn+acrOW3sue7j+W/mOiusOS6hueahOS6i+aDheOAggrkuJbnlYzkuIrmsqHmnInku4DkuYjmmK/msLjov5zml6Dms5XmjL3lm57nmoTvvIwK5LuK5aSp5bCx5piv6IO95aSf5oy95Zue5aSx5Y675LqL54mp55qE5pel5a2Q44CCCgrku4rlpKnnmoTlubjov5DnianmmK865rS76Lmm5Lmx6Lez55qE44CM6ay85YWc6Jmr44CN44CCCumsvOWFnOiZq+aYr+eIseWlveWSjOW5s+OAgeS4jeaEv+aEj+S6ieaWl+eahOWwj+eUn+eJqeOAggrov5nku73ov73msYLlubPlkoznmoTlv4PkuIDlrprog73kuLrkvaDluKbmnaXlubjnpo/lkKfjgII= - - 4oCU4oCU5aSn5ZCJ4oCU4oCUCuS8mui1t+mjjueahOaXpeWtkO+8jOaXoOiuuuW5suS7gOS5iOmDveS8muW+iOmhuuWIqeeahOS4gOWkqeOAggrlkajlm7TnmoTkurrlv4Pmg4XkuZ/pnZ7luLjmhInlv6vvvIznu53lr7nkuI3kvJrlj5HnlJ/lhrLnqoHvvIwK6L+Y5Y+v5Lul5ZCD5Yiw5LiA55u05oOz5ZCD77yM5L2G5rKh5py65Lya5ZCD55qE576O5ZGz5L2z6IK044CCCuaXoOiuuuaYr+W3peS9nO+8jOi/mOaYr+aXheihjO+8jOmDveS4gOWumuS8muWNgeWIhumhuuWIqeWQp+OAggrpgqPkuYjvvIzlupTlvZPlnKjov5nmoLfnmoTlpb3ml7bovrDph4zvvIzkuIDpvJPkvZzmsJTliY3ov5suLi4KCuS7iuWkqeeahOW5uOi/kOeJqeaYrzrojIHlo67miJDplb/nmoTjgIzpuKPojYnjgI3jgIIK6K645aSa5Lq65oiW6K645LiN55+l6YGT77yM6bij6I2J5piv6IO96aKE5oql6Zu35pq055qE5qSN54mp44CCCuWQkeW+gOedgOmbt+elnuWkp+S6uueahOmdkuedkO+8jOWPquWcqOeou+Wmu+WIl+Wym+S4iueUn+mVv+OAggrmkZjkuIvpuKPojYnml7bphaXphaXpurvpurvnmoTop6bmhJ/vvIzmja7or7Tlkozlubjnpo/nmoTmu4vlkbPlvojlg4/jgII= - - 4oCU4oCU5aSn5ZCJ4oCU4oCUCua1ruS6keaVo+WwveaciOW9k+epuu+8jOmAouatpOetvuiAheeahuS4uuS4iuWQieOAggrmmI7plZzlnKjlv4PmuIXlpoLorrjvvIzmiYDmsYLkuYvkuovlv4Pmg7PliJnmiJDjgIIK5ZCI6YCC6aG65b+D6ICM5Li655qE5LiA5aSp77yM5LiN566h5piv5oOz5YGa55qE5LqL5oOF77yMCui/mOaYr+aDs+ingeeahOS6uu+8jOeOsOWcqOaYr+ihjOWKqOi1t+adpeeahOWlveaXtuacuuOAggoK5LuK5aSp55qE5bm46L+Q54mp5pivOuS4jeaWreWPkeeDreeahOOAjOeDiOeEsOiKseiKseiViuOAjeOAggrng4jnhLDoirHnmoTngpnng63mnaXoh6rkuo7ngavovqPovqPnmoToirHlv4PjgIIK5LiH5LqL6aG65Yip5piv5Zug5Li65b+D5Lit6Ieq5pyJ5LiA5p2h5piO6Lev44CC - - 4oCU4oCU5Lit5ZCJ4oCU4oCUCuWNgeW5tOejqOS4gOWJke+8jOS7iuacneekuumcnOWIg+OAggrmgbbov5Dlt7LplIDvvIzouqvkuLTlkKbmnoHms7DmnaXkuYvml7bjgIIK6Ium57uD5aSa5bm05pyq6IO95LiA5pi+6Lqr5omL55qE5omN6IO977yMCueOsOS7iuacieS6huWkp+Wxlei6q+aJi+eahOaegeWlveacuuS8muOAggroi6XmmK/pgYfliLDpmLvnoo3kuYvkuovvvIzkuqbkuI3lv4Xov7fmg5jvvIwK5aSn6IOG5Zyw5ouU5YmR77yM55eb5b+r5Zyw5oiY5paX5LiA55Wq5ZCn44CCCgrku4rlpKnnmoTlubjov5DnianmmK8655Sf6ZW/5aSa5bm055qE44CM5rW354G16Iqd44CN44CCCuW8seWwj+eahOa1t+eBteiKneiZq+e7j+WOhuWkmuW5tOeahOmjjumjjumbqOmbqO+8jOaJjeiDvee7k+aIkOa1t+eBteiKneOAggrkuLrnm67moIfogIzliqrlipvliY3ooYznmoTkurrku6zvvIzmnIDnu4jkuZ/lv4XlsIbmi6XmnInog5zliKnnmoTmnpzlrp7jgII= - - 4oCU4oCU5Lit5ZCJ4oCU4oCUCuWkqeS4iuacieS6kemjmOi/h+eahOaXpeWtkO+8jOWkqeawlOS7pOS6uuWNgeWIhuiIkueVheOAggrlt6XkvZzpnZ7luLjpobrliKnvvIzov57ljYjnnaHml7bkuZ/kvJrmg7PliLDlpb3ngrnlrZDjgIIK56qB54S25Y+R546w77yM5LiO6ICB5pyL5Y+L6L+Y5pyJ5YW25LuW55qE5YWx5ZCM6K+d6aKYLi4uCuKAlOKAlOavj+S4gOWkqeavj+S4gOWkqemDveimgeenr+aegeW8gOacl+WcsOW6pui/h+KAlOKAlAoK5LuK5aSp55qE5bm46L+Q54mp5pivOuiJsuazveiJs+S4veeahOOAjOWgh+eTnOOAjeOAggrkurrku6zluLjor7Tooajph4zlpoLkuIDmmK/nvo7lvrfvvIwK5L2G5aCH55Oc5piO6Imz55qE5aSW6LKM5LiL6ZqQ6JeP552A55qE5piv6LCm5Y2R6ICM55SY55Sc55qE5YaF5Zyo44CC - - 4oCU4oCU5ZCJ4oCU4oCUCuS4gOWmguaXouW+gOeahOS4gOWkqeOAgui6q+S9k+WSjOW/g+eBtemDvemAguW6lOS6hueahOaXpeW4uOOAggrlh7rnjrDkuobog73mm7/ku6PlvITkuKLnmoTkuJzopb/nmoTnianlk4HvvIzku6TkurrlvojoiJLlv4PjgIIK5ZKM5bi45bi46YGH6KeB55qE5Lq65YWz57O75Lya5Y+Y5aW977yM5Y+v6IO95Lya5oiQ5Li65pyL5Y+L44CCCuKAlOKAlOaXoOiuuuaYr+WkmuWvu+W4uOeahOaXpeWtkO+8jOmDveiDveaIkOS4uuWunei0teeahOWbnuW/huKAlOKAlAoK5LuK5aSp55qE5bm46L+Q54mp5pivOumXqumXquWPkeS6rueahOOAjOaZtuaguOOAjeOAggrmmbbonbbmmK/lh53ogZrlpKnlnLDpl7TnmoTlhYPntKDvvIzogIzplb/miJDnmoTnu4blsI/nlJ/nianjgIIK6ICM5YWD57Sg5piv6L+Z5Liq5LiW55WM6K645Lul5aSp5Zyw5b2T5Lit55qE5Lq65Lus55qE56Wd56aP44CC - - 4oCU4oCU5ZCJ4oCU4oCUCuaYjuaYjuayoeacieS7gOS5iOeJueWIq+eahOS6i+aDhe+8jOWNtOaEn+WIsOW/g+aDhei9u+W/q+eahOaXpeWtkOOAggrlnKjmsqHms6jmhI/ov4fnmoTop5LokL3lj6/ku6Xmib7liLDmnKzku6XkuLrkuKLlpLHlt7LkuYXnmoTkuJzopb/jgIIK6aOf54mp5q+U5bmz5pe25pu05Yqg6bKc576O77yM6Lev5LiK55qE6aOO5pmv5Lmf5Luk5Lq655y85YmN5LiA6auY44CCCuKAlOKAlOi/meS4quS4lueVjOS4iuWFhea7oeS6huaWsOWlh+eahOe+juWlveS6i+eJqeKAlOKAlAoK5LuK5aSp55qE5bm46L+Q54mp5pivOuaVo+WPkeaaluaEj+eahOOAjOm4n+ibi+OAjeOAggrpuJ/om4vlrZXogrLnnYDml6DpmZDnmoTlj6/og73mgKfvvIzmmK/mnKrmnaXkuYvnp43jgIIK5Y+N6L+H5p2l77yM6L+Z5Liq5LiW55WM5a+56bif6JuL5Lit55qE55Sf5ZG96ICM6KiA77yMCuS5n+WFhea7oeS6huS7pOWFtuWFtOWli+eahOacquefpeS6i+eJqeWQp+OAggropoHmuKnmn5Tlr7nlvoXpuJ/om4vllpTjgII= - - 4oCU4oCU5ZCJ4oCU4oCUCuaer+acqOmAouaYpe+8jOato+W9k+S4h+eJqeWkjeiLj+S5i+aXtuOAggrpmbflhaXlm7DlooPml7bvvIzog73lvpfliLDop6PlhrPlip7ms5XjgIIK5Li+5qOL5LiN5a6a5pe277yM5Lya5pyJ6LS15Lq65p2l55u45Yqp44CCCuWPr+S7peaVtOmhv+S4gOeVquW/g+aDhe+8jOa4heeQhuS4gOeVquWutuijhe+8jAror7TkuI3lrprog73lj5HnjrDmhI/lpJbkuYvotKLjgIIKCuS7iuWkqeeahOW5uOi/kOeJqeaYrzroioLoioLpq5jljYfnmoTjgIznq7nnrIvjgI3jgIIK56u556yL5oul5pyJ552A5peg6ZmQ55qE5r2c5Yqb77yMCuayoeacieS6uuefpemBk+S4gOmil+erueesi++8jOWIsOW6leiDvemVv+aIkOWkmumrmOeahOerueWtkOOAggrnnIvnnYDnq7nnrIvvvIzkvJrorqnkurrkuI3nlLHoh6rkuLvmnJ/lvoXotbfmnKrmnaXlkKfjgII= - - 4oCU4oCU5pyr5ZCJ4oCU4oCUCuawlOWOi+eojeW+ruacieeCueS9ju+8jOaYr+S8muS7pOS6uuaDs+WIsOmBpei/nOeahOi/h+WOu+eahOaXpeWtkOOAggrml6nlt7Lov4flvoDnmoTlubTovbvlsoHmnIjvvIzkuI7lho3msqHogZTns7vov4fnmoTmlYXlj4vnmoTlm57lv4bvvIwK5Lya6K6p5Lq65oSf5Yiw5Lid5bmz5reh55qE5oCA5b+177yM5Y+I56iN5b6u5pyJ5LiA54K554K55oSf5Lyk44CCCuKAlOKAlOWBtuWwlOaAgOW/tei/h+WOu+S5n+W+iOWlveOAguaUvuadvuW/g+aDhemdouWvueacquadpeWQp+KAlOKAlAoK5LuK5aSp55qE5bm46L+Q54mp5pivOua4heaWsOaAoeS6uueahOOAjOiWhOiNt+OAjeOAggrlj6ropoHmnInojYnmnKjnlJ/plb/nmoTnqbrpl7TvvIzlsLHkuIDlrprmnInoloTojbfjgIIK6L+Z5LmI55yL5p2l77yM6JaE6I235piv5LiW55WM5LiK5pyA5by66Z+n55qE55Sf54G144CCCuaNruivtOi/nuiSmeW+t+eahOmbquWxseS4iuS5n+mVv+edgOiWhOiNt+WRouOAgg== - - 4oCU4oCU5pyr5ZCJ4oCU4oCUCuepuuS4reeahOS6keWxguWBj+S9ju+8jOW5tuS4lOS7jeacieWghuenr+S5i+WKv++8jArkuI3nn6XkvZXml7bpm7fpm6jkvJrpqqTnhLbku47lpLTpobblgL7nm4bogIzkuIvjgIIK5L2G5piv562J6Zu36Zuo6L+H5ZCO77yM6L+Y5Lya5pyJ5b2p6Jm55Zyo562J552A44CCCuWunOW+quS6juaXp++8jOWuiOS6jumdme+8jOiLpeWmhOS4uuWImemavuaIkOS5i+OAggoK5LuK5aSp55qE5bm46L+Q54mp5pivOuagkeS4iuaOieiQveeahOOAjOadvuaenOOAjeOAggrlubbkuI3mmK/miYDmnInnmoTmnb7mnpzpg73og73plb/miJDpq5jlpKfnmoTmnb7moJHvvIwK5oiQ6ZW/6ZyA6KaB6YCC5a6c55qE546v5aKD77yM5pu06ZyA6KaB5LiA54K56L+Q5rCU44CCCuaJgOS7peS4jeeUqOe7meiHquW3sei/h+WkmuWOi+WKm++8jOiAkOW/g+etieW+heW9qeiZueWQp+OAgg== - - 4oCU4oCU5pyr5ZCJ4oCU4oCUCuS6kemBruaciOWNiui+ue+8jOmbvui1t+abtOi/t+emu+OAggrmiqzlpLTljbPmmK/mta7kupHpga7mnIjvvIzkvY7lpLTliJnmmK/mtZPpm77mvKvmvKvjgIIK6Jm954S25LiA5pe25YmN6Lev6L+35oOY77yM5L2G5Lmf5Lya5pyJ5LiA5YiH5piO5LqG55qE5pe25Yi744CCCueOsOS4i+S4jeWmgui2geatpOacuuS8muejqOeCvOiHquaIke+8jOetieW+heaLqOS6keingeeajuaciOOAggoK5LuK5aSp55qE5bm46L+Q54mp5pivOuaal+S4reWPkeS6rueahOOAjOWPkeWFiemrk+OAjeOAggrlj5HlhYnpq5PliqrlipvlnLDlj5Hlh7rlvq7lvLHnmoTlhYnoipLjgIIK6Jm954S25q+U5LiN6L+H5YW25LuW5YWJ5rqQ77yM5L2G55yL5riF5YmN6Lev5Lmf5aSf55So5LqG44CC - - 4oCU4oCU5pyr5ZCJ4oCU4oCUCuW5s+eos+WuieivpueahOS4gOWkqeOAguayoeacieS7gOS5iOS7pOS6uumavui/h+eahOS6i+aDheS8muWPkeeUn+OAggrpgILlkIjlkozkuYXmnKrogZTns7vnmoTmnIvlj4vogYrogYrov4fljrvnmoTkuovmg4XvvIzkuIDlkIzmrKLnrJHjgIIK5ZCD5Lic6KW/55qE5pe25YCZ5Lya5bCd5Yiw5b6I5LmF5Lul5YmN5L2T6aqM6L+H55qE6L+H5Y6755qE5ZGz6YGT44CCCuKAlOKAlOimgeePjeaDnOi6q+i+ueeahOS6uuS4juS6i+KAlOKAlAoK5LuK5aSp55qE5bm46L+Q54mp5pivOumFpemFpem6u+m6u+eahOOAjOeUteawlOawtOaZtuOAjeOAggrnlLXmsJTmsLTmmbbolbTlkKvnnYDml6DpmZDnmoTog73ph4/jgIIK5aaC5p6c6IO95aSf5aW95aW95a+85byV6L+Z6IKh6IO96YeP77yM6K+05LiN5a6a5bCx6IO95oiQ5bCx5LuA5LmI5LqL5Lia44CC - - 4oCU4oCU5Ye24oCU4oCUCumakOe6puaEn+inieS8muS4i+mbqOeahOS4gOWkqeOAguWPr+iDveS8mumBh+WIsOS4jemhuuW/g+eahOS6i+aDheOAggrlupTor6XnmoTopJLlpZbov5/ov5/msqHmnInliLDmnaXvvIzmnI3liqHnlJ/kuZ/lj6/og73kvJrkuIrplJnoj5zjgIIK5piO5piO5rKh5LuA5LmI5aSn5LiN5LqG55qE5LqL77yM5Y205oC75oSf6KeJ5pyJ5Lqb5b+D54Om55qE5pel5a2Q44CCCuKAlOKAlOmavuWFjeaciei/meagt+eahOaXpeWtkOKAlOKAlAoK5LuK5aSp55qE5bm46L+Q54mp5pivOumaj+azouaRh+abs+eahOOAjOa1t+iNieOAjeOAggrmtbfojYnmmK/nm7jlvZPmuKnmn5TogIzlnZrlvLrnmoTmpI3nianvvIwK5Y2z5L2/5Zyo6Ium5rap55qE5rW35rC05Lit77yM5Lmf5LiN5oS/5pS55Y+Y6Ieq5bex44CCCuWNs+S9v+WcqOmAhuWig+S4re+8jOS5n+S4jeimgeaUvuW8g+a4qeaflOeahOW/g+eBteOAgg== - - 4oCU4oCU5Ye24oCU4oCUCuePjeaDnOeahOS4nOilv+WPr+iDveS8mumBl+Wkse+8jOmcgOimgeWwj+W/g+OAggrlpoLmnpzouqvkvZPmnInkuI3pgILvvIzkuIDlrpropoHms6jmhI/kvJHmga/jgIIK5Zyo5YGa5Ye65Yaz5a6a5LmL5YmN77yM5LiA5a6a6KaB5YaN5LiJ5oCd6ICD44CCCgrku4rlpKnnmoTlubjov5DnianmmK865Yaw5YeJ5Yaw5YeJ55qE44CM5Yaw6Zu+6Iqx44CN44CCCuWGsOmbvuiKseaVo+WPkeedgOOAjOeUn+S6uuWLv+i/m+OAjeeahOWvkuawlOOAggrkvYbmnInml7blhrDlhrfnmoTmsJTotKjvvIzkuZ/og73orqnkurrnmoTlv4Pmg4XkuI7lpLTohJHlhrfpnZnkuIvmnaXjgIIK5o2u5q2k6YeH5Y+W5q2j56Gu55qE5Yik5pat77yM5piO5pm65Zyw6KGM5Yqo44CC + - 4oCU4oCU5aSn5ZCJ4oCU4oCUCuWuneWJkeWHuuWMo+adpe+8jOaXoOW+gOS4jeWIqeOAguWHuuWMo+S5i+WFie+8jOS6puiDveeFp+S6ruS7luS6uuOAggrku4rml6Xog73kuIDnrq3lsITkuK3nqbrkuK3nmoTnjI7nianvvIzog73kuIDlh7vlkb3kuK3lrojljavopoHlrrPjgIIK6Iul5rKh5pyJ55uu5qCH77yM5LiN5aao5Zub5aSE6L2s6L2s77yM6K+05LiN5a6a5Lya5pyJ5oSP5aSW5LmL5Zac44CCCuWQjOaXtu+8jOS5n+S4jeimgeW/mOiusOWSjOWAkumcieeahOWQjOS8tOWIhuS6q+S4gOS4i+Wlvei/kOawlOWTpuOAggoK5LuK5aSp55qE5bm46L+Q54mp5pivOumavuW+l+S4gOingeeahOOAjOmprOWwvuOAjeOAggrpqazlsL7pmo/lpKfniYfojbvojYnnlJ/plb/vvIzkvYbljbTmm7TkuLrmjLrmi5TjgIIK5LiO5YKy54S25oy656uL5LqO5q2k5LiW55qE5L2g5LiA5a6a5b6I5piv55u46YWN44CC + - 4oCU4oCU5aSn5ZCJ4oCU4oCUCuWkseiAjOWkjeW+l+eahOS4gOWkqeOAggrljp/mnKzku6XkuLrnn7PmsonlpKfmtbfnmoTkuovmg4XmnInkuoblpb3nmoTlm57lupTvvIwK5Y6f5pys5YiG6YGT5oms6ZWz55qE5pyL5Y+L5oiW6K645Y+v5Lul5YaN5bqm5ZKM5aW977yMCuS4jee7j+aEj+mXtOaDs+i1t+S6huWOn+acrOW3sue7j+W/mOiusOS6hueahOS6i+aDheOAggrkuJbnlYzkuIrmsqHmnInku4DkuYjmmK/msLjov5zml6Dms5XmjL3lm57nmoTvvIwK5LuK5aSp5bCx5piv6IO95aSf5oy95Zue5aSx5Y675LqL54mp55qE5pel5a2Q44CCCgrku4rlpKnnmoTlubjov5DnianmmK865rS76Lmm5Lmx6Lez55qE44CM6ay85YWc6Jmr44CN44CCCumsvOWFnOiZq+aYr+eIseWlveWSjOW5s+OAgeS4jeaEv+aEj+S6ieaWl+eahOWwj+eUn+eJqeOAggrov5nku73ov73msYLlubPlkoznmoTlv4PkuIDlrprog73kuLrkvaDluKbmnaXlubjnpo/lkKfjgII= + - 4oCU4oCU5aSn5ZCJ4oCU4oCUCuS8mui1t+mjjueahOaXpeWtkO+8jOaXoOiuuuW5suS7gOS5iOmDveS8muW+iOmhuuWIqeeahOS4gOWkqeOAggrlkajlm7TnmoTkurrlv4Pmg4XkuZ/pnZ7luLjmhInlv6vvvIznu53lr7nkuI3kvJrlj5HnlJ/lhrLnqoHvvIwK6L+Y5Y+v5Lul5ZCD5Yiw5LiA55u05oOz5ZCD77yM5L2G5rKh5py65Lya5ZCD55qE576O5ZGz5L2z6IK044CCCuaXoOiuuuaYr+W3peS9nO+8jOi/mOaYr+aXheihjO+8jOmDveS4gOWumuS8muWNgeWIhumhuuWIqeWQp+OAggrpgqPkuYjvvIzlupTlvZPlnKjov5nmoLfnmoTlpb3ml7bovrDph4zvvIzkuIDpvJPkvZzmsJTliY3ov5suLi4KCuS7iuWkqeeahOW5uOi/kOeJqeaYrzrojIHlo67miJDplb/nmoTjgIzpuKPojYnjgI3jgIIK6K645aSa5Lq65oiW6K645LiN55+l6YGT77yM6bij6I2J5piv6IO96aKE5oql6Zu35pq055qE5qSN54mp44CCCuWQkeW+gOedgOmbt+elnuWkp+S6uueahOmdkuedkO+8jOWPquWcqOeou+Wmu+WIl+Wym+S4iueUn+mVv+OAggrmkZjkuIvpuKPojYnml7bphaXphaXpurvpurvnmoTop6bmhJ/vvIzmja7or7Tlkozlubjnpo/nmoTmu4vlkbPlvojlg4/jgII= + - 4oCU4oCU5aSn5ZCJ4oCU4oCUCua1ruS6keaVo+WwveaciOW9k+epuu+8jOmAouatpOetvuiAheeahuS4uuS4iuWQieOAggrmmI7plZzlnKjlv4PmuIXlpoLorrjvvIzmiYDmsYLkuYvkuovlv4Pmg7PliJnmiJDjgIIK5ZCI6YCC6aG65b+D6ICM5Li655qE5LiA5aSp77yM5LiN566h5piv5oOz5YGa55qE5LqL5oOF77yMCui/mOaYr+aDs+ingeeahOS6uu+8jOeOsOWcqOaYr+ihjOWKqOi1t+adpeeahOWlveaXtuacuuOAggoK5LuK5aSp55qE5bm46L+Q54mp5pivOuS4jeaWreWPkeeDreeahOOAjOeDiOeEsOiKseiKseiViuOAjeOAggrng4jnhLDoirHnmoTngpnng63mnaXoh6rkuo7ngavovqPovqPnmoToirHlv4PjgIIK5LiH5LqL6aG65Yip5piv5Zug5Li65b+D5Lit6Ieq5pyJ5LiA5p2h5piO6Lev44CC + - 4oCU4oCU5Lit5ZCJ4oCU4oCUCuWNgeW5tOejqOS4gOWJke+8jOS7iuacneekuumcnOWIg+OAggrmgbbov5Dlt7LplIDvvIzouqvkuLTlkKbmnoHms7DmnaXkuYvml7bjgIIK6Ium57uD5aSa5bm05pyq6IO95LiA5pi+6Lqr5omL55qE5omN6IO977yMCueOsOS7iuacieS6huWkp+Wxlei6q+aJi+eahOaegeWlveacuuS8muOAggroi6XmmK/pgYfliLDpmLvnoo3kuYvkuovvvIzkuqbkuI3lv4Xov7fmg5jvvIwK5aSn6IOG5Zyw5ouU5YmR77yM55eb5b+r5Zyw5oiY5paX5LiA55Wq5ZCn44CCCgrku4rlpKnnmoTlubjov5DnianmmK8655Sf6ZW/5aSa5bm055qE44CM5rW354G16Iqd44CN44CCCuW8seWwj+eahOa1t+eBteiKneiZq+e7j+WOhuWkmuW5tOeahOmjjumjjumbqOmbqO+8jOaJjeiDvee7k+aIkOa1t+eBteiKneOAggrkuLrnm67moIfogIzliqrlipvliY3ooYznmoTkurrku6zvvIzmnIDnu4jkuZ/lv4XlsIbmi6XmnInog5zliKnnmoTmnpzlrp7jgII= + - 4oCU4oCU5Lit5ZCJ4oCU4oCUCuWkqeS4iuacieS6kemjmOi/h+eahOaXpeWtkO+8jOWkqeawlOS7pOS6uuWNgeWIhuiIkueVheOAggrlt6XkvZzpnZ7luLjpobrliKnvvIzov57ljYjnnaHml7bkuZ/kvJrmg7PliLDlpb3ngrnlrZDjgIIK56qB54S25Y+R546w77yM5LiO6ICB5pyL5Y+L6L+Y5pyJ5YW25LuW55qE5YWx5ZCM6K+d6aKYLi4uCuKAlOKAlOavj+S4gOWkqeavj+S4gOWkqemDveimgeenr+aegeW8gOacl+WcsOW6pui/h+KAlOKAlAoK5LuK5aSp55qE5bm46L+Q54mp5pivOuiJsuazveiJs+S4veeahOOAjOWgh+eTnOOAjeOAggrkurrku6zluLjor7Tooajph4zlpoLkuIDmmK/nvo7lvrfvvIwK5L2G5aCH55Oc5piO6Imz55qE5aSW6LKM5LiL6ZqQ6JeP552A55qE5piv6LCm5Y2R6ICM55SY55Sc55qE5YaF5Zyo44CC + - 4oCU4oCU5ZCJ4oCU4oCUCuS4gOWmguaXouW+gOeahOS4gOWkqeOAgui6q+S9k+WSjOW/g+eBtemDvemAguW6lOS6hueahOaXpeW4uOOAggrlh7rnjrDkuobog73mm7/ku6PlvITkuKLnmoTkuJzopb/nmoTnianlk4HvvIzku6TkurrlvojoiJLlv4PjgIIK5ZKM5bi45bi46YGH6KeB55qE5Lq65YWz57O75Lya5Y+Y5aW977yM5Y+v6IO95Lya5oiQ5Li65pyL5Y+L44CCCuKAlOKAlOaXoOiuuuaYr+WkmuWvu+W4uOeahOaXpeWtkO+8jOmDveiDveaIkOS4uuWunei0teeahOWbnuW/huKAlOKAlAoK5LuK5aSp55qE5bm46L+Q54mp5pivOumXqumXquWPkeS6rueahOOAjOaZtuaguOOAjeOAggrmmbbonbbmmK/lh53ogZrlpKnlnLDpl7TnmoTlhYPntKDvvIzogIzplb/miJDnmoTnu4blsI/nlJ/nianjgIIK6ICM5YWD57Sg5piv6L+Z5Liq5LiW55WM6K645Lul5aSp5Zyw5b2T5Lit55qE5Lq65Lus55qE56Wd56aP44CC + - 4oCU4oCU5ZCJ4oCU4oCUCuaYjuaYjuayoeacieS7gOS5iOeJueWIq+eahOS6i+aDhe+8jOWNtOaEn+WIsOW/g+aDhei9u+W/q+eahOaXpeWtkOOAggrlnKjmsqHms6jmhI/ov4fnmoTop5LokL3lj6/ku6Xmib7liLDmnKzku6XkuLrkuKLlpLHlt7LkuYXnmoTkuJzopb/jgIIK6aOf54mp5q+U5bmz5pe25pu05Yqg6bKc576O77yM6Lev5LiK55qE6aOO5pmv5Lmf5Luk5Lq655y85YmN5LiA6auY44CCCuKAlOKAlOi/meS4quS4lueVjOS4iuWFhea7oeS6huaWsOWlh+eahOe+juWlveS6i+eJqeKAlOKAlAoK5LuK5aSp55qE5bm46L+Q54mp5pivOuaVo+WPkeaaluaEj+eahOOAjOm4n+ibi+OAjeOAggrpuJ/om4vlrZXogrLnnYDml6DpmZDnmoTlj6/og73mgKfvvIzmmK/mnKrmnaXkuYvnp43jgIIK5Y+N6L+H5p2l77yM6L+Z5Liq5LiW55WM5a+56bif6JuL5Lit55qE55Sf5ZG96ICM6KiA77yMCuS5n+WFhea7oeS6huS7pOWFtuWFtOWli+eahOacquefpeS6i+eJqeWQp+OAggropoHmuKnmn5Tlr7nlvoXpuJ/om4vllpTjgII= + - 4oCU4oCU5ZCJ4oCU4oCUCuaer+acqOmAouaYpe+8jOato+W9k+S4h+eJqeWkjeiLj+S5i+aXtuOAggrpmbflhaXlm7DlooPml7bvvIzog73lvpfliLDop6PlhrPlip7ms5XjgIIK5Li+5qOL5LiN5a6a5pe277yM5Lya5pyJ6LS15Lq65p2l55u45Yqp44CCCuWPr+S7peaVtOmhv+S4gOeVquW/g+aDhe+8jOa4heeQhuS4gOeVquWutuijhe+8jAror7TkuI3lrprog73lj5HnjrDmhI/lpJbkuYvotKLjgIIKCuS7iuWkqeeahOW5uOi/kOeJqeaYrzroioLoioLpq5jljYfnmoTjgIznq7nnrIvjgI3jgIIK56u556yL5oul5pyJ552A5peg6ZmQ55qE5r2c5Yqb77yMCuayoeacieS6uuefpemBk+S4gOmil+erueesi++8jOWIsOW6leiDvemVv+aIkOWkmumrmOeahOerueWtkOOAggrnnIvnnYDnq7nnrIvvvIzkvJrorqnkurrkuI3nlLHoh6rkuLvmnJ/lvoXotbfmnKrmnaXlkKfjgII= + - 4oCU4oCU5pyr5ZCJ4oCU4oCUCuawlOWOi+eojeW+ruacieeCueS9ju+8jOaYr+S8muS7pOS6uuaDs+WIsOmBpei/nOeahOi/h+WOu+eahOaXpeWtkOOAggrml6nlt7Lov4flvoDnmoTlubTovbvlsoHmnIjvvIzkuI7lho3msqHogZTns7vov4fnmoTmlYXlj4vnmoTlm57lv4bvvIwK5Lya6K6p5Lq65oSf5Yiw5Lid5bmz5reh55qE5oCA5b+177yM5Y+I56iN5b6u5pyJ5LiA54K554K55oSf5Lyk44CCCuKAlOKAlOWBtuWwlOaAgOW/tei/h+WOu+S5n+W+iOWlveOAguaUvuadvuW/g+aDhemdouWvueacquadpeWQp+KAlOKAlAoK5LuK5aSp55qE5bm46L+Q54mp5pivOua4heaWsOaAoeS6uueahOOAjOiWhOiNt+OAjeOAggrlj6ropoHmnInojYnmnKjnlJ/plb/nmoTnqbrpl7TvvIzlsLHkuIDlrprmnInoloTojbfjgIIK6L+Z5LmI55yL5p2l77yM6JaE6I235piv5LiW55WM5LiK5pyA5by66Z+n55qE55Sf54G144CCCuaNruivtOi/nuiSmeW+t+eahOmbquWxseS4iuS5n+mVv+edgOiWhOiNt+WRouOAgg== + - 4oCU4oCU5pyr5ZCJ4oCU4oCUCuepuuS4reeahOS6keWxguWBj+S9ju+8jOW5tuS4lOS7jeacieWghuenr+S5i+WKv++8jArkuI3nn6XkvZXml7bpm7fpm6jkvJrpqqTnhLbku47lpLTpobblgL7nm4bogIzkuIvjgIIK5L2G5piv562J6Zu36Zuo6L+H5ZCO77yM6L+Y5Lya5pyJ5b2p6Jm55Zyo562J552A44CCCuWunOW+quS6juaXp++8jOWuiOS6jumdme+8jOiLpeWmhOS4uuWImemavuaIkOS5i+OAggoK5LuK5aSp55qE5bm46L+Q54mp5pivOuagkeS4iuaOieiQveeahOOAjOadvuaenOOAjeOAggrlubbkuI3mmK/miYDmnInnmoTmnb7mnpzpg73og73plb/miJDpq5jlpKfnmoTmnb7moJHvvIwK5oiQ6ZW/6ZyA6KaB6YCC5a6c55qE546v5aKD77yM5pu06ZyA6KaB5LiA54K56L+Q5rCU44CCCuaJgOS7peS4jeeUqOe7meiHquW3sei/h+WkmuWOi+WKm++8jOiAkOW/g+etieW+heW9qeiZueWQp+OAgg== + - 4oCU4oCU5pyr5ZCJ4oCU4oCUCuS6kemBruaciOWNiui+ue+8jOmbvui1t+abtOi/t+emu+OAggrmiqzlpLTljbPmmK/mta7kupHpga7mnIjvvIzkvY7lpLTliJnmmK/mtZPpm77mvKvmvKvjgIIK6Jm954S25LiA5pe25YmN6Lev6L+35oOY77yM5L2G5Lmf5Lya5pyJ5LiA5YiH5piO5LqG55qE5pe25Yi744CCCueOsOS4i+S4jeWmgui2geatpOacuuS8muejqOeCvOiHquaIke+8jOetieW+heaLqOS6keingeeajuaciOOAggoK5LuK5aSp55qE5bm46L+Q54mp5pivOuaal+S4reWPkeS6rueahOOAjOWPkeWFiemrk+OAjeOAggrlj5HlhYnpq5PliqrlipvlnLDlj5Hlh7rlvq7lvLHnmoTlhYnoipLjgIIK6Jm954S25q+U5LiN6L+H5YW25LuW5YWJ5rqQ77yM5L2G55yL5riF5YmN6Lev5Lmf5aSf55So5LqG44CC + - 4oCU4oCU5pyr5ZCJ4oCU4oCUCuW5s+eos+WuieivpueahOS4gOWkqeOAguayoeacieS7gOS5iOS7pOS6uumavui/h+eahOS6i+aDheS8muWPkeeUn+OAggrpgILlkIjlkozkuYXmnKrogZTns7vnmoTmnIvlj4vogYrogYrov4fljrvnmoTkuovmg4XvvIzkuIDlkIzmrKLnrJHjgIIK5ZCD5Lic6KW/55qE5pe25YCZ5Lya5bCd5Yiw5b6I5LmF5Lul5YmN5L2T6aqM6L+H55qE6L+H5Y6755qE5ZGz6YGT44CCCuKAlOKAlOimgeePjeaDnOi6q+i+ueeahOS6uuS4juS6i+KAlOKAlAoK5LuK5aSp55qE5bm46L+Q54mp5pivOumFpemFpem6u+m6u+eahOOAjOeUteawlOawtOaZtuOAjeOAggrnlLXmsJTmsLTmmbbolbTlkKvnnYDml6DpmZDnmoTog73ph4/jgIIK5aaC5p6c6IO95aSf5aW95aW95a+85byV6L+Z6IKh6IO96YeP77yM6K+05LiN5a6a5bCx6IO95oiQ5bCx5LuA5LmI5LqL5Lia44CC + - 4oCU4oCU5Ye24oCU4oCUCumakOe6puaEn+inieS8muS4i+mbqOeahOS4gOWkqeOAguWPr+iDveS8mumBh+WIsOS4jemhuuW/g+eahOS6i+aDheOAggrlupTor6XnmoTopJLlpZbov5/ov5/msqHmnInliLDmnaXvvIzmnI3liqHnlJ/kuZ/lj6/og73kvJrkuIrplJnoj5zjgIIK5piO5piO5rKh5LuA5LmI5aSn5LiN5LqG55qE5LqL77yM5Y205oC75oSf6KeJ5pyJ5Lqb5b+D54Om55qE5pel5a2Q44CCCuKAlOKAlOmavuWFjeaciei/meagt+eahOaXpeWtkOKAlOKAlAoK5LuK5aSp55qE5bm46L+Q54mp5pivOumaj+azouaRh+abs+eahOOAjOa1t+iNieOAjeOAggrmtbfojYnmmK/nm7jlvZPmuKnmn5TogIzlnZrlvLrnmoTmpI3nianvvIwK5Y2z5L2/5Zyo6Ium5rap55qE5rW35rC05Lit77yM5Lmf5LiN5oS/5pS55Y+Y6Ieq5bex44CCCuWNs+S9v+WcqOmAhuWig+S4re+8jOS5n+S4jeimgeaUvuW8g+a4qeaflOeahOW/g+eBteOAgg== + - 4oCU4oCU5Ye24oCU4oCUCuePjeaDnOeahOS4nOilv+WPr+iDveS8mumBl+Wkse+8jOmcgOimgeWwj+W/g+OAggrlpoLmnpzouqvkvZPmnInkuI3pgILvvIzkuIDlrpropoHms6jmhI/kvJHmga/jgIIK5Zyo5YGa5Ye65Yaz5a6a5LmL5YmN77yM5LiA5a6a6KaB5YaN5LiJ5oCd6ICD44CCCgrku4rlpKnnmoTlubjov5DnianmmK865Yaw5YeJ5Yaw5YeJ55qE44CM5Yaw6Zu+6Iqx44CN44CCCuWGsOmbvuiKseaVo+WPkeedgOOAjOeUn+S6uuWLv+i/m+OAjeeahOWvkuawlOOAggrkvYbmnInml7blhrDlhrfnmoTmsJTotKjvvIzkuZ/og73orqnkurrnmoTlv4Pmg4XkuI7lpLTohJHlhrfpnZnkuIvmnaXjgIIK5o2u5q2k6YeH5Y+W5q2j56Gu55qE5Yik5pat77yM5piO5pm65Zyw6KGM5Yqo44CC - 4oCU4oCU5aSn5Ye24oCU4oCUCuWGheW/g+epuuiQveiQveeahOS4gOWkqeOAguWPr+iDveS8mumZt+WFpea3sea3seeahOaXoOWKm+aEn+S5i+S4reOAggrlvojlpJrkuovmg4Xpg73ml6Dms5XnkIbmuIXlpLTnu6rvvIzov4fkuo7pkrvniZvop5LlsJbliJnmmJPnlJ/nl4XjgIIK6Jm954S25LiA5YiH55qG6Zm35LqO5L2O5r2u6LC35bqV5Lit77yM5L2G5Lmf5LiN5b+F5Zug5q2k6ICM5rCU6aaB44CCCuiLpeiDveaSkei/h+S4gOaXtuWbsOWig++8jOS7luaXpeW/heWPpuacieS4gOeVquS9nOS4uuOAggoK5LuK5aSp55qE5bm46L+Q54mp5pivOuW8r+W8r+absuabsueahOOAjOicpeictOWwvuW3tOOAjeOAggronKXonLTpgYfliLDmvZzlnKjnmoTljbHpmanml7bvvIzlpKflpJrmlbDkvJrmlq3lsL7msYLnlJ/jgIIK6Iul5piv6YGH5Yiw5peg5rOV5pW055CG55qE5oOF57uq77yM6YKj5LmI6K+l5pat5YiZ5pat5ZCn44CC \ No newline at end of file diff --git a/mys/index/语音.png b/mihoyo_bbs/index/语音.png similarity index 100% rename from mys/index/语音.png rename to mihoyo_bbs/index/语音.png diff --git a/mys/reliquaries/UI_RelicIcon_10005_1.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_10005_1.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_10005_1.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_10005_1.png diff --git a/mys/reliquaries/UI_RelicIcon_10009_4.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_10009_4.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_10009_4.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_10009_4.png diff --git a/mys/reliquaries/UI_RelicIcon_14001_1.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_14001_1.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_14001_1.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_14001_1.png diff --git a/mys/reliquaries/UI_RelicIcon_14001_2.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_14001_2.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_14001_2.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_14001_2.png diff --git a/mys/reliquaries/UI_RelicIcon_14001_3.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_14001_3.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_14001_3.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_14001_3.png diff --git a/mys/reliquaries/UI_RelicIcon_14001_4.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_14001_4.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_14001_4.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_14001_4.png diff --git a/mys/reliquaries/UI_RelicIcon_14001_5.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_14001_5.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_14001_5.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_14001_5.png diff --git a/mys/reliquaries/UI_RelicIcon_14002_3.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_14002_3.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_14002_3.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_14002_3.png diff --git a/mys/reliquaries/UI_RelicIcon_14002_4.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_14002_4.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_14002_4.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_14002_4.png diff --git a/mys/reliquaries/UI_RelicIcon_14003_1.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_14003_1.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_14003_1.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_14003_1.png diff --git a/mys/reliquaries/UI_RelicIcon_14003_2.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_14003_2.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_14003_2.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_14003_2.png diff --git a/mys/reliquaries/UI_RelicIcon_14003_3.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_14003_3.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_14003_3.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_14003_3.png diff --git a/mys/reliquaries/UI_RelicIcon_14003_4.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_14003_4.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_14003_4.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_14003_4.png diff --git a/mys/reliquaries/UI_RelicIcon_14003_5.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_14003_5.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_14003_5.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_14003_5.png diff --git a/mys/reliquaries/UI_RelicIcon_14004_1.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_14004_1.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_14004_1.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_14004_1.png diff --git a/mys/reliquaries/UI_RelicIcon_14004_2.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_14004_2.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_14004_2.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_14004_2.png diff --git a/mys/reliquaries/UI_RelicIcon_14004_3.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_14004_3.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_14004_3.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_14004_3.png diff --git a/mys/reliquaries/UI_RelicIcon_14004_4.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_14004_4.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_14004_4.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_14004_4.png diff --git a/mys/reliquaries/UI_RelicIcon_14004_5.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_14004_5.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_14004_5.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_14004_5.png diff --git a/mys/reliquaries/UI_RelicIcon_15001_1.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15001_1.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15001_1.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15001_1.png diff --git a/mys/reliquaries/UI_RelicIcon_15001_2.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15001_2.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15001_2.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15001_2.png diff --git a/mys/reliquaries/UI_RelicIcon_15001_3.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15001_3.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15001_3.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15001_3.png diff --git a/mys/reliquaries/UI_RelicIcon_15001_4.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15001_4.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15001_4.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15001_4.png diff --git a/mys/reliquaries/UI_RelicIcon_15001_5.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15001_5.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15001_5.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15001_5.png diff --git a/mys/reliquaries/UI_RelicIcon_15002_1.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15002_1.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15002_1.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15002_1.png diff --git a/mys/reliquaries/UI_RelicIcon_15002_2.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15002_2.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15002_2.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15002_2.png diff --git a/mys/reliquaries/UI_RelicIcon_15002_3.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15002_3.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15002_3.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15002_3.png diff --git a/mys/reliquaries/UI_RelicIcon_15002_4.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15002_4.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15002_4.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15002_4.png diff --git a/mys/reliquaries/UI_RelicIcon_15002_5.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15002_5.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15002_5.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15002_5.png diff --git a/mys/reliquaries/UI_RelicIcon_15003_1.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15003_1.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15003_1.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15003_1.png diff --git a/mys/reliquaries/UI_RelicIcon_15003_2.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15003_2.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15003_2.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15003_2.png diff --git a/mys/reliquaries/UI_RelicIcon_15003_3.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15003_3.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15003_3.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15003_3.png diff --git a/mys/reliquaries/UI_RelicIcon_15003_4.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15003_4.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15003_4.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15003_4.png diff --git a/mys/reliquaries/UI_RelicIcon_15003_5.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15003_5.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15003_5.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15003_5.png diff --git a/mys/reliquaries/UI_RelicIcon_15005_1.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15005_1.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15005_1.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15005_1.png diff --git a/mys/reliquaries/UI_RelicIcon_15005_2.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15005_2.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15005_2.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15005_2.png diff --git a/mys/reliquaries/UI_RelicIcon_15005_4.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15005_4.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15005_4.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15005_4.png diff --git a/mys/reliquaries/UI_RelicIcon_15005_5.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15005_5.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15005_5.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15005_5.png diff --git a/mys/reliquaries/UI_RelicIcon_15006_1.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15006_1.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15006_1.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15006_1.png diff --git a/mys/reliquaries/UI_RelicIcon_15006_2.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15006_2.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15006_2.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15006_2.png diff --git a/mys/reliquaries/UI_RelicIcon_15006_3.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15006_3.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15006_3.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15006_3.png diff --git a/mys/reliquaries/UI_RelicIcon_15006_4.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15006_4.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15006_4.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15006_4.png diff --git a/mys/reliquaries/UI_RelicIcon_15006_5.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15006_5.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15006_5.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15006_5.png diff --git a/mys/reliquaries/UI_RelicIcon_15007_1.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15007_1.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15007_1.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15007_1.png diff --git a/mys/reliquaries/UI_RelicIcon_15007_2.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15007_2.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15007_2.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15007_2.png diff --git a/mys/reliquaries/UI_RelicIcon_15007_3.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15007_3.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15007_3.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15007_3.png diff --git a/mys/reliquaries/UI_RelicIcon_15007_4.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15007_4.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15007_4.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15007_4.png diff --git a/mys/reliquaries/UI_RelicIcon_15007_5.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15007_5.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15007_5.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15007_5.png diff --git a/mys/reliquaries/UI_RelicIcon_15008_4.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15008_4.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15008_4.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15008_4.png diff --git a/mys/reliquaries/UI_RelicIcon_15008_5.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15008_5.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15008_5.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15008_5.png diff --git a/mys/reliquaries/UI_RelicIcon_15014_1.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15014_1.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15014_1.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15014_1.png diff --git a/mys/reliquaries/UI_RelicIcon_15014_2.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15014_2.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15014_2.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15014_2.png diff --git a/mys/reliquaries/UI_RelicIcon_15014_3.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15014_3.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15014_3.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15014_3.png diff --git a/mys/reliquaries/UI_RelicIcon_15014_4.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15014_4.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15014_4.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15014_4.png diff --git a/mys/reliquaries/UI_RelicIcon_15014_5.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15014_5.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15014_5.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15014_5.png diff --git a/mys/reliquaries/UI_RelicIcon_15015_2.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15015_2.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15015_2.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15015_2.png diff --git a/mys/reliquaries/UI_RelicIcon_15016_1.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15016_1.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15016_1.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15016_1.png diff --git a/mys/reliquaries/UI_RelicIcon_15016_2.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15016_2.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15016_2.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15016_2.png diff --git a/mys/reliquaries/UI_RelicIcon_15016_3.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15016_3.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15016_3.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15016_3.png diff --git a/mys/reliquaries/UI_RelicIcon_15016_4.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15016_4.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15016_4.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15016_4.png diff --git a/mys/reliquaries/UI_RelicIcon_15016_5.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15016_5.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15016_5.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15016_5.png diff --git a/mys/reliquaries/UI_RelicIcon_15017_1.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15017_1.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15017_1.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15017_1.png diff --git a/mys/reliquaries/UI_RelicIcon_15017_2.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15017_2.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15017_2.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15017_2.png diff --git a/mys/reliquaries/UI_RelicIcon_15017_3.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15017_3.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15017_3.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15017_3.png diff --git a/mys/reliquaries/UI_RelicIcon_15017_4.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15017_4.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15017_4.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15017_4.png diff --git a/mys/reliquaries/UI_RelicIcon_15017_5.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15017_5.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15017_5.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15017_5.png diff --git a/mys/reliquaries/UI_RelicIcon_15018_1.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15018_1.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15018_1.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15018_1.png diff --git a/mys/reliquaries/UI_RelicIcon_15018_2.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15018_2.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15018_2.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15018_2.png diff --git a/mys/reliquaries/UI_RelicIcon_15018_3.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15018_3.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15018_3.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15018_3.png diff --git a/mys/reliquaries/UI_RelicIcon_15018_4.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15018_4.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15018_4.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15018_4.png diff --git a/mys/reliquaries/UI_RelicIcon_15018_5.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15018_5.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15018_5.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15018_5.png diff --git a/mys/reliquaries/UI_RelicIcon_15019_1.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15019_1.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15019_1.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15019_1.png diff --git a/mys/reliquaries/UI_RelicIcon_15019_2.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15019_2.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15019_2.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15019_2.png diff --git a/mys/reliquaries/UI_RelicIcon_15019_3.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15019_3.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15019_3.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15019_3.png diff --git a/mys/reliquaries/UI_RelicIcon_15019_4.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15019_4.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15019_4.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15019_4.png diff --git a/mys/reliquaries/UI_RelicIcon_15019_5.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15019_5.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15019_5.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15019_5.png diff --git a/mys/reliquaries/UI_RelicIcon_15020_1.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15020_1.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15020_1.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15020_1.png diff --git a/mys/reliquaries/UI_RelicIcon_15020_2.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15020_2.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15020_2.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15020_2.png diff --git a/mys/reliquaries/UI_RelicIcon_15020_3.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15020_3.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15020_3.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15020_3.png diff --git a/mys/reliquaries/UI_RelicIcon_15020_4.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15020_4.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15020_4.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15020_4.png diff --git a/mys/reliquaries/UI_RelicIcon_15020_5.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15020_5.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15020_5.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15020_5.png diff --git a/mys/reliquaries/UI_RelicIcon_15021_2.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15021_2.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15021_2.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15021_2.png diff --git a/mys/reliquaries/UI_RelicIcon_15021_3.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15021_3.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15021_3.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15021_3.png diff --git a/mys/reliquaries/UI_RelicIcon_15021_4.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15021_4.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15021_4.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15021_4.png diff --git a/mys/reliquaries/UI_RelicIcon_15021_5.png b/mihoyo_bbs/reliquaries/UI_RelicIcon_15021_5.png similarity index 100% rename from mys/reliquaries/UI_RelicIcon_15021_5.png rename to mihoyo_bbs/reliquaries/UI_RelicIcon_15021_5.png diff --git a/mys/texture2d/1s_3.png b/mihoyo_bbs/texture2d/1s_3.png similarity index 100% rename from mys/texture2d/1s_3.png rename to mihoyo_bbs/texture2d/1s_3.png diff --git a/mys/texture2d/2s_3.png b/mihoyo_bbs/texture2d/2s_3.png similarity index 100% rename from mys/texture2d/2s_3.png rename to mihoyo_bbs/texture2d/2s_3.png diff --git a/mys/texture2d/3s_3.png b/mihoyo_bbs/texture2d/3s_3.png similarity index 100% rename from mys/texture2d/3s_3.png rename to mihoyo_bbs/texture2d/3s_3.png diff --git a/mys/texture2d/4s_1.png b/mihoyo_bbs/texture2d/4s_1.png similarity index 100% rename from mys/texture2d/4s_1.png rename to mihoyo_bbs/texture2d/4s_1.png diff --git a/mys/texture2d/4s_2.png b/mihoyo_bbs/texture2d/4s_2.png similarity index 100% rename from mys/texture2d/4s_2.png rename to mihoyo_bbs/texture2d/4s_2.png diff --git a/mys/texture2d/4s_3.png b/mihoyo_bbs/texture2d/4s_3.png similarity index 100% rename from mys/texture2d/4s_3.png rename to mihoyo_bbs/texture2d/4s_3.png diff --git a/mys/texture2d/4s_4.png b/mihoyo_bbs/texture2d/4s_4.png similarity index 100% rename from mys/texture2d/4s_4.png rename to mihoyo_bbs/texture2d/4s_4.png diff --git a/mys/texture2d/4star_1.png b/mihoyo_bbs/texture2d/4star_1.png similarity index 100% rename from mys/texture2d/4star_1.png rename to mihoyo_bbs/texture2d/4star_1.png diff --git a/mys/texture2d/4star_2.png b/mihoyo_bbs/texture2d/4star_2.png similarity index 100% rename from mys/texture2d/4star_2.png rename to mihoyo_bbs/texture2d/4star_2.png diff --git a/mys/texture2d/5s_1.png b/mihoyo_bbs/texture2d/5s_1.png similarity index 100% rename from mys/texture2d/5s_1.png rename to mihoyo_bbs/texture2d/5s_1.png diff --git a/mys/texture2d/5s_2.png b/mihoyo_bbs/texture2d/5s_2.png similarity index 100% rename from mys/texture2d/5s_2.png rename to mihoyo_bbs/texture2d/5s_2.png diff --git a/mys/texture2d/5s_3.png b/mihoyo_bbs/texture2d/5s_3.png similarity index 100% rename from mys/texture2d/5s_3.png rename to mihoyo_bbs/texture2d/5s_3.png diff --git a/mys/texture2d/5s_4.png b/mihoyo_bbs/texture2d/5s_4.png similarity index 100% rename from mys/texture2d/5s_4.png rename to mihoyo_bbs/texture2d/5s_4.png diff --git a/mys/texture2d/5star_1.png b/mihoyo_bbs/texture2d/5star_1.png similarity index 100% rename from mys/texture2d/5star_1.png rename to mihoyo_bbs/texture2d/5star_1.png diff --git a/mys/texture2d/5star_2.png b/mihoyo_bbs/texture2d/5star_2.png similarity index 100% rename from mys/texture2d/5star_2.png rename to mihoyo_bbs/texture2d/5star_2.png diff --git a/mys/texture2d/All_Mask.png b/mihoyo_bbs/texture2d/All_Mask.png similarity index 100% rename from mys/texture2d/All_Mask.png rename to mihoyo_bbs/texture2d/All_Mask.png diff --git a/mys/texture2d/abyss_0.png b/mihoyo_bbs/texture2d/abyss_0.png similarity index 100% rename from mys/texture2d/abyss_0.png rename to mihoyo_bbs/texture2d/abyss_0.png diff --git a/mys/texture2d/abyss_1.png b/mihoyo_bbs/texture2d/abyss_1.png similarity index 100% rename from mys/texture2d/abyss_1.png rename to mihoyo_bbs/texture2d/abyss_1.png diff --git a/mys/texture2d/abyss_2.png b/mihoyo_bbs/texture2d/abyss_2.png similarity index 100% rename from mys/texture2d/abyss_2.png rename to mihoyo_bbs/texture2d/abyss_2.png diff --git a/mys/texture2d/abyss_3.png b/mihoyo_bbs/texture2d/abyss_3.png similarity index 100% rename from mys/texture2d/abyss_3.png rename to mihoyo_bbs/texture2d/abyss_3.png diff --git a/mys/texture2d/abyss_star0.png b/mihoyo_bbs/texture2d/abyss_star0.png similarity index 100% rename from mys/texture2d/abyss_star0.png rename to mihoyo_bbs/texture2d/abyss_star0.png diff --git a/mys/texture2d/abyss_star1.png b/mihoyo_bbs/texture2d/abyss_star1.png similarity index 100% rename from mys/texture2d/abyss_star1.png rename to mihoyo_bbs/texture2d/abyss_star1.png diff --git a/mys/texture2d/avatar_bg.png b/mihoyo_bbs/texture2d/avatar_bg.png similarity index 100% rename from mys/texture2d/avatar_bg.png rename to mihoyo_bbs/texture2d/avatar_bg.png diff --git a/mys/texture2d/avatar_fg.png b/mihoyo_bbs/texture2d/avatar_fg.png similarity index 100% rename from mys/texture2d/avatar_fg.png rename to mihoyo_bbs/texture2d/avatar_fg.png diff --git a/mys/texture2d/char_bg.png b/mihoyo_bbs/texture2d/char_bg.png similarity index 100% rename from mys/texture2d/char_bg.png rename to mihoyo_bbs/texture2d/char_bg.png diff --git a/mys/texture2d/char_fg.png b/mihoyo_bbs/texture2d/char_fg.png similarity index 100% rename from mys/texture2d/char_fg.png rename to mihoyo_bbs/texture2d/char_fg.png diff --git a/mys/texture2d/charpic_mask.png b/mihoyo_bbs/texture2d/charpic_mask.png similarity index 100% rename from mys/texture2d/charpic_mask.png rename to mihoyo_bbs/texture2d/charpic_mask.png diff --git a/mys/texture2d/event_1.png b/mihoyo_bbs/texture2d/event_1.png similarity index 100% rename from mys/texture2d/event_1.png rename to mihoyo_bbs/texture2d/event_1.png diff --git a/mys/texture2d/event_2.png b/mihoyo_bbs/texture2d/event_2.png similarity index 100% rename from mys/texture2d/event_2.png rename to mihoyo_bbs/texture2d/event_2.png diff --git a/mys/texture2d/jinglian_4.png b/mihoyo_bbs/texture2d/jinglian_4.png similarity index 100% rename from mys/texture2d/jinglian_4.png rename to mihoyo_bbs/texture2d/jinglian_4.png diff --git a/mys/texture2d/jinglian_5.png b/mihoyo_bbs/texture2d/jinglian_5.png similarity index 100% rename from mys/texture2d/jinglian_5.png rename to mihoyo_bbs/texture2d/jinglian_5.png diff --git a/mys/texture2d/mask_img.png b/mihoyo_bbs/texture2d/mask_img.png similarity index 100% rename from mys/texture2d/mask_img.png rename to mihoyo_bbs/texture2d/mask_img.png diff --git a/mys/texture2d/panle_1.png b/mihoyo_bbs/texture2d/panle_1.png similarity index 100% rename from mys/texture2d/panle_1.png rename to mihoyo_bbs/texture2d/panle_1.png diff --git a/mys/texture2d/panle_3.png b/mihoyo_bbs/texture2d/panle_3.png similarity index 100% rename from mys/texture2d/panle_3.png rename to mihoyo_bbs/texture2d/panle_3.png diff --git a/mys/texture2d/stand_mask.png b/mihoyo_bbs/texture2d/stand_mask.png similarity index 100% rename from mys/texture2d/stand_mask.png rename to mihoyo_bbs/texture2d/stand_mask.png diff --git a/mys/texture2d/weaponpic_mask.png b/mihoyo_bbs/texture2d/weaponpic_mask.png similarity index 100% rename from mys/texture2d/weaponpic_mask.png rename to mihoyo_bbs/texture2d/weaponpic_mask.png diff --git a/mys/texture2d/wordcloud_0.png b/mihoyo_bbs/texture2d/wordcloud_0.png similarity index 100% rename from mys/texture2d/wordcloud_0.png rename to mihoyo_bbs/texture2d/wordcloud_0.png diff --git a/mys/texture2d/wordcloudmask.png b/mihoyo_bbs/texture2d/wordcloudmask.png similarity index 100% rename from mys/texture2d/wordcloudmask.png rename to mihoyo_bbs/texture2d/wordcloudmask.png diff --git a/mys/weapon/UI_EquipIcon_Bow_Amos.png b/mihoyo_bbs/weapon/UI_EquipIcon_Bow_Amos.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Bow_Amos.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Bow_Amos.png diff --git a/mys/weapon/UI_EquipIcon_Bow_Arjuna.png b/mihoyo_bbs/weapon/UI_EquipIcon_Bow_Arjuna.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Bow_Arjuna.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Bow_Arjuna.png diff --git a/mys/weapon/UI_EquipIcon_Bow_Bakufu.png b/mihoyo_bbs/weapon/UI_EquipIcon_Bow_Bakufu.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Bow_Bakufu.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Bow_Bakufu.png diff --git a/mys/weapon/UI_EquipIcon_Bow_Blackrock.png b/mihoyo_bbs/weapon/UI_EquipIcon_Bow_Blackrock.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Bow_Blackrock.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Bow_Blackrock.png diff --git a/mys/weapon/UI_EquipIcon_Bow_Crowfeather.png b/mihoyo_bbs/weapon/UI_EquipIcon_Bow_Crowfeather.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Bow_Crowfeather.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Bow_Crowfeather.png diff --git a/mys/weapon/UI_EquipIcon_Bow_Curve.png b/mihoyo_bbs/weapon/UI_EquipIcon_Bow_Curve.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Bow_Curve.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Bow_Curve.png diff --git a/mys/weapon/UI_EquipIcon_Bow_Dvalin.png b/mihoyo_bbs/weapon/UI_EquipIcon_Bow_Dvalin.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Bow_Dvalin.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Bow_Dvalin.png diff --git a/mys/weapon/UI_EquipIcon_Bow_Exotic.png b/mihoyo_bbs/weapon/UI_EquipIcon_Bow_Exotic.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Bow_Exotic.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Bow_Exotic.png diff --git a/mys/weapon/UI_EquipIcon_Bow_Fleurfair.png b/mihoyo_bbs/weapon/UI_EquipIcon_Bow_Fleurfair.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Bow_Fleurfair.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Bow_Fleurfair.png diff --git a/mys/weapon/UI_EquipIcon_Bow_Fossil.png b/mihoyo_bbs/weapon/UI_EquipIcon_Bow_Fossil.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Bow_Fossil.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Bow_Fossil.png diff --git a/mys/weapon/UI_EquipIcon_Bow_Hardwood.png b/mihoyo_bbs/weapon/UI_EquipIcon_Bow_Hardwood.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Bow_Hardwood.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Bow_Hardwood.png diff --git a/mys/weapon/UI_EquipIcon_Bow_Hunters.png b/mihoyo_bbs/weapon/UI_EquipIcon_Bow_Hunters.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Bow_Hunters.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Bow_Hunters.png diff --git a/mys/weapon/UI_EquipIcon_Bow_Msg.png b/mihoyo_bbs/weapon/UI_EquipIcon_Bow_Msg.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Bow_Msg.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Bow_Msg.png diff --git a/mys/weapon/UI_EquipIcon_Bow_Nachtblind.png b/mihoyo_bbs/weapon/UI_EquipIcon_Bow_Nachtblind.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Bow_Nachtblind.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Bow_Nachtblind.png diff --git a/mys/weapon/UI_EquipIcon_Bow_Narukami.png b/mihoyo_bbs/weapon/UI_EquipIcon_Bow_Narukami.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Bow_Narukami.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Bow_Narukami.png diff --git a/mys/weapon/UI_EquipIcon_Bow_Old.png b/mihoyo_bbs/weapon/UI_EquipIcon_Bow_Old.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Bow_Old.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Bow_Old.png diff --git a/mys/weapon/UI_EquipIcon_Bow_Outlaw.png b/mihoyo_bbs/weapon/UI_EquipIcon_Bow_Outlaw.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Bow_Outlaw.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Bow_Outlaw.png diff --git a/mys/weapon/UI_EquipIcon_Bow_Proto.png b/mihoyo_bbs/weapon/UI_EquipIcon_Bow_Proto.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Bow_Proto.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Bow_Proto.png diff --git a/mys/weapon/UI_EquipIcon_Bow_Recluse.png b/mihoyo_bbs/weapon/UI_EquipIcon_Bow_Recluse.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Bow_Recluse.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Bow_Recluse.png diff --git a/mys/weapon/UI_EquipIcon_Bow_Sling.png b/mihoyo_bbs/weapon/UI_EquipIcon_Bow_Sling.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Bow_Sling.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Bow_Sling.png diff --git a/mys/weapon/UI_EquipIcon_Bow_Theocrat.png b/mihoyo_bbs/weapon/UI_EquipIcon_Bow_Theocrat.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Bow_Theocrat.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Bow_Theocrat.png diff --git a/mys/weapon/UI_EquipIcon_Bow_Troupe.png b/mihoyo_bbs/weapon/UI_EquipIcon_Bow_Troupe.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Bow_Troupe.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Bow_Troupe.png diff --git a/mys/weapon/UI_EquipIcon_Bow_Viridescent.png b/mihoyo_bbs/weapon/UI_EquipIcon_Bow_Viridescent.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Bow_Viridescent.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Bow_Viridescent.png diff --git a/mys/weapon/UI_EquipIcon_Bow_Widsith.png b/mihoyo_bbs/weapon/UI_EquipIcon_Bow_Widsith.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Bow_Widsith.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Bow_Widsith.png diff --git a/mys/weapon/UI_EquipIcon_Bow_Zephyrus.png b/mihoyo_bbs/weapon/UI_EquipIcon_Bow_Zephyrus.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Bow_Zephyrus.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Bow_Zephyrus.png diff --git a/mys/weapon/UI_EquipIcon_Catalyst_Amber.png b/mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Amber.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Catalyst_Amber.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Amber.png diff --git a/mys/weapon/UI_EquipIcon_Catalyst_Apprentice.png b/mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Apprentice.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Catalyst_Apprentice.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Apprentice.png diff --git a/mys/weapon/UI_EquipIcon_Catalyst_Bakufu.png b/mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Bakufu.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Catalyst_Bakufu.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Bakufu.png diff --git a/mys/weapon/UI_EquipIcon_Catalyst_Blackrock.png b/mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Blackrock.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Catalyst_Blackrock.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Blackrock.png diff --git a/mys/weapon/UI_EquipIcon_Catalyst_Dvalin.png b/mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Dvalin.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Catalyst_Dvalin.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Dvalin.png diff --git a/mys/weapon/UI_EquipIcon_Catalyst_Everfrost.png b/mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Everfrost.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Catalyst_Everfrost.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Everfrost.png diff --git a/mys/weapon/UI_EquipIcon_Catalyst_Exotic.png b/mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Exotic.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Catalyst_Exotic.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Exotic.png diff --git a/mys/weapon/UI_EquipIcon_Catalyst_Fossil.png b/mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Fossil.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Catalyst_Fossil.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Fossil.png diff --git a/mys/weapon/UI_EquipIcon_Catalyst_Fourwinds.png b/mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Fourwinds.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Catalyst_Fourwinds.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Fourwinds.png diff --git a/mys/weapon/UI_EquipIcon_Catalyst_Intro.png b/mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Intro.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Catalyst_Intro.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Intro.png diff --git a/mys/weapon/UI_EquipIcon_Catalyst_Jade.png b/mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Jade.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Catalyst_Jade.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Jade.png diff --git a/mys/weapon/UI_EquipIcon_Catalyst_Kunwu.png b/mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Kunwu.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Catalyst_Kunwu.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Kunwu.png diff --git a/mys/weapon/UI_EquipIcon_Catalyst_Lightnov.png b/mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Lightnov.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Catalyst_Lightnov.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Lightnov.png diff --git a/mys/weapon/UI_EquipIcon_Catalyst_Ludiharpastum.png b/mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Ludiharpastum.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Catalyst_Ludiharpastum.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Ludiharpastum.png diff --git a/mys/weapon/UI_EquipIcon_Catalyst_Outlaw.png b/mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Outlaw.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Catalyst_Outlaw.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Outlaw.png diff --git a/mys/weapon/UI_EquipIcon_Catalyst_Phoney.png b/mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Phoney.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Catalyst_Phoney.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Phoney.png diff --git a/mys/weapon/UI_EquipIcon_Catalyst_Pocket.png b/mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Pocket.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Catalyst_Pocket.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Pocket.png diff --git a/mys/weapon/UI_EquipIcon_Catalyst_Proto.png b/mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Proto.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Catalyst_Proto.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Proto.png diff --git a/mys/weapon/UI_EquipIcon_Catalyst_Pulpfic.png b/mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Pulpfic.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Catalyst_Pulpfic.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Pulpfic.png diff --git a/mys/weapon/UI_EquipIcon_Catalyst_Resurrection.png b/mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Resurrection.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Catalyst_Resurrection.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Resurrection.png diff --git a/mys/weapon/UI_EquipIcon_Catalyst_Theocrat.png b/mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Theocrat.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Catalyst_Theocrat.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Theocrat.png diff --git a/mys/weapon/UI_EquipIcon_Catalyst_Troupe.png b/mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Troupe.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Catalyst_Troupe.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Troupe.png diff --git a/mys/weapon/UI_EquipIcon_Catalyst_Truelens.png b/mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Truelens.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Catalyst_Truelens.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Truelens.png diff --git a/mys/weapon/UI_EquipIcon_Catalyst_Zephyrus.png b/mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Zephyrus.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Catalyst_Zephyrus.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Catalyst_Zephyrus.png diff --git a/mys/weapon/UI_EquipIcon_Claymore_Aniki.png b/mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Aniki.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Claymore_Aniki.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Aniki.png diff --git a/mys/weapon/UI_EquipIcon_Claymore_Bakufu.png b/mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Bakufu.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Claymore_Bakufu.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Bakufu.png diff --git a/mys/weapon/UI_EquipIcon_Claymore_Blackrock.png b/mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Blackrock.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Claymore_Blackrock.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Blackrock.png diff --git a/mys/weapon/UI_EquipIcon_Claymore_Dragonfell.png b/mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Dragonfell.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Claymore_Dragonfell.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Dragonfell.png diff --git a/mys/weapon/UI_EquipIcon_Claymore_Dvalin.png b/mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Dvalin.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Claymore_Dvalin.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Dvalin.png diff --git a/mys/weapon/UI_EquipIcon_Claymore_Exotic.png b/mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Exotic.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Claymore_Exotic.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Exotic.png diff --git a/mys/weapon/UI_EquipIcon_Claymore_Fossil.png b/mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Fossil.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Claymore_Fossil.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Fossil.png diff --git a/mys/weapon/UI_EquipIcon_Claymore_Glaive.png b/mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Glaive.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Claymore_Glaive.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Glaive.png diff --git a/mys/weapon/UI_EquipIcon_Claymore_Kione.png b/mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Kione.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Claymore_Kione.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Kione.png diff --git a/mys/weapon/UI_EquipIcon_Claymore_Kunwu.png b/mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Kunwu.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Claymore_Kunwu.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Kunwu.png diff --git a/mys/weapon/UI_EquipIcon_Claymore_Lapis.png b/mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Lapis.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Claymore_Lapis.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Lapis.png diff --git a/mys/weapon/UI_EquipIcon_Claymore_Mitsurugi.png b/mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Mitsurugi.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Claymore_Mitsurugi.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Mitsurugi.png diff --git a/mys/weapon/UI_EquipIcon_Claymore_Oyaji.png b/mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Oyaji.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Claymore_Oyaji.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Oyaji.png diff --git a/mys/weapon/UI_EquipIcon_Claymore_Perdue.png b/mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Perdue.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Claymore_Perdue.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Perdue.png diff --git a/mys/weapon/UI_EquipIcon_Claymore_Proto.png b/mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Proto.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Claymore_Proto.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Proto.png diff --git a/mys/weapon/UI_EquipIcon_Claymore_Quartz.png b/mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Quartz.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Claymore_Quartz.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Quartz.png diff --git a/mys/weapon/UI_EquipIcon_Claymore_Reasoning.png b/mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Reasoning.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Claymore_Reasoning.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Reasoning.png diff --git a/mys/weapon/UI_EquipIcon_Claymore_Siegfry.png b/mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Siegfry.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Claymore_Siegfry.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Siegfry.png diff --git a/mys/weapon/UI_EquipIcon_Claymore_Theocrat.png b/mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Theocrat.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Claymore_Theocrat.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Theocrat.png diff --git a/mys/weapon/UI_EquipIcon_Claymore_Tin.png b/mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Tin.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Claymore_Tin.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Tin.png diff --git a/mys/weapon/UI_EquipIcon_Claymore_Troupe.png b/mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Troupe.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Claymore_Troupe.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Troupe.png diff --git a/mys/weapon/UI_EquipIcon_Claymore_Widsith.png b/mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Widsith.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Claymore_Widsith.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Widsith.png diff --git a/mys/weapon/UI_EquipIcon_Claymore_Wolfmound.png b/mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Wolfmound.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Claymore_Wolfmound.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Wolfmound.png diff --git a/mys/weapon/UI_EquipIcon_Claymore_Zephyrus.png b/mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Zephyrus.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Claymore_Zephyrus.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Claymore_Zephyrus.png diff --git a/mys/weapon/UI_EquipIcon_Pole_Bakufu.png b/mihoyo_bbs/weapon/UI_EquipIcon_Pole_Bakufu.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Pole_Bakufu.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Pole_Bakufu.png diff --git a/mys/weapon/UI_EquipIcon_Pole_Blackrock.png b/mihoyo_bbs/weapon/UI_EquipIcon_Pole_Blackrock.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Pole_Blackrock.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Pole_Blackrock.png diff --git a/mys/weapon/UI_EquipIcon_Pole_Dvalin.png b/mihoyo_bbs/weapon/UI_EquipIcon_Pole_Dvalin.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Pole_Dvalin.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Pole_Dvalin.png diff --git a/mys/weapon/UI_EquipIcon_Pole_Everfrost.png b/mihoyo_bbs/weapon/UI_EquipIcon_Pole_Everfrost.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Pole_Everfrost.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Pole_Everfrost.png diff --git a/mys/weapon/UI_EquipIcon_Pole_Exotic.png b/mihoyo_bbs/weapon/UI_EquipIcon_Pole_Exotic.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Pole_Exotic.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Pole_Exotic.png diff --git a/mys/weapon/UI_EquipIcon_Pole_Flagpole.png b/mihoyo_bbs/weapon/UI_EquipIcon_Pole_Flagpole.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Pole_Flagpole.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Pole_Flagpole.png diff --git a/mys/weapon/UI_EquipIcon_Pole_Gewalt.png b/mihoyo_bbs/weapon/UI_EquipIcon_Pole_Gewalt.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Pole_Gewalt.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Pole_Gewalt.png diff --git a/mys/weapon/UI_EquipIcon_Pole_Gladiator.png b/mihoyo_bbs/weapon/UI_EquipIcon_Pole_Gladiator.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Pole_Gladiator.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Pole_Gladiator.png diff --git a/mys/weapon/UI_EquipIcon_Pole_Halberd.png b/mihoyo_bbs/weapon/UI_EquipIcon_Pole_Halberd.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Pole_Halberd.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Pole_Halberd.png diff --git a/mys/weapon/UI_EquipIcon_Pole_Homa.png b/mihoyo_bbs/weapon/UI_EquipIcon_Pole_Homa.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Pole_Homa.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Pole_Homa.png diff --git a/mys/weapon/UI_EquipIcon_Pole_Kunwu.png b/mihoyo_bbs/weapon/UI_EquipIcon_Pole_Kunwu.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Pole_Kunwu.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Pole_Kunwu.png diff --git a/mys/weapon/UI_EquipIcon_Pole_Lapis.png b/mihoyo_bbs/weapon/UI_EquipIcon_Pole_Lapis.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Pole_Lapis.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Pole_Lapis.png diff --git a/mys/weapon/UI_EquipIcon_Pole_Morax.png b/mihoyo_bbs/weapon/UI_EquipIcon_Pole_Morax.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Pole_Morax.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Pole_Morax.png diff --git a/mys/weapon/UI_EquipIcon_Pole_Noire.png b/mihoyo_bbs/weapon/UI_EquipIcon_Pole_Noire.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Pole_Noire.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Pole_Noire.png diff --git a/mys/weapon/UI_EquipIcon_Pole_Proto.png b/mihoyo_bbs/weapon/UI_EquipIcon_Pole_Proto.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Pole_Proto.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Pole_Proto.png diff --git a/mys/weapon/UI_EquipIcon_Pole_Rod.png b/mihoyo_bbs/weapon/UI_EquipIcon_Pole_Rod.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Pole_Rod.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Pole_Rod.png diff --git a/mys/weapon/UI_EquipIcon_Pole_Ruby.png b/mihoyo_bbs/weapon/UI_EquipIcon_Pole_Ruby.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Pole_Ruby.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Pole_Ruby.png diff --git a/mys/weapon/UI_EquipIcon_Pole_Stardust.png b/mihoyo_bbs/weapon/UI_EquipIcon_Pole_Stardust.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Pole_Stardust.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Pole_Stardust.png diff --git a/mys/weapon/UI_EquipIcon_Pole_Theocrat.png b/mihoyo_bbs/weapon/UI_EquipIcon_Pole_Theocrat.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Pole_Theocrat.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Pole_Theocrat.png diff --git a/mys/weapon/UI_EquipIcon_Pole_Zephyrus.png b/mihoyo_bbs/weapon/UI_EquipIcon_Pole_Zephyrus.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Pole_Zephyrus.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Pole_Zephyrus.png diff --git a/mys/weapon/UI_EquipIcon_Sword_Bakufu.png b/mihoyo_bbs/weapon/UI_EquipIcon_Sword_Bakufu.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Sword_Bakufu.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Sword_Bakufu.png diff --git a/mys/weapon/UI_EquipIcon_Sword_Blackrock.png b/mihoyo_bbs/weapon/UI_EquipIcon_Sword_Blackrock.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Sword_Blackrock.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Sword_Blackrock.png diff --git a/mys/weapon/UI_EquipIcon_Sword_Bloodstained.png b/mihoyo_bbs/weapon/UI_EquipIcon_Sword_Bloodstained.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Sword_Bloodstained.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Sword_Bloodstained.png diff --git a/mys/weapon/UI_EquipIcon_Sword_Blunt.png b/mihoyo_bbs/weapon/UI_EquipIcon_Sword_Blunt.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Sword_Blunt.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Sword_Blunt.png diff --git a/mys/weapon/UI_EquipIcon_Sword_Darker.png b/mihoyo_bbs/weapon/UI_EquipIcon_Sword_Darker.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Sword_Darker.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Sword_Darker.png diff --git a/mys/weapon/UI_EquipIcon_Sword_Dawn.png b/mihoyo_bbs/weapon/UI_EquipIcon_Sword_Dawn.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Sword_Dawn.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Sword_Dawn.png diff --git a/mys/weapon/UI_EquipIcon_Sword_Dvalin.png b/mihoyo_bbs/weapon/UI_EquipIcon_Sword_Dvalin.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Sword_Dvalin.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Sword_Dvalin.png diff --git a/mys/weapon/UI_EquipIcon_Sword_Exotic.png b/mihoyo_bbs/weapon/UI_EquipIcon_Sword_Exotic.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Sword_Exotic.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Sword_Exotic.png diff --git a/mys/weapon/UI_EquipIcon_Sword_Falcon.png b/mihoyo_bbs/weapon/UI_EquipIcon_Sword_Falcon.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Sword_Falcon.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Sword_Falcon.png diff --git a/mys/weapon/UI_EquipIcon_Sword_Fossil.png b/mihoyo_bbs/weapon/UI_EquipIcon_Sword_Fossil.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Sword_Fossil.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Sword_Fossil.png diff --git a/mys/weapon/UI_EquipIcon_Sword_Kunwu.png b/mihoyo_bbs/weapon/UI_EquipIcon_Sword_Kunwu.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Sword_Kunwu.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Sword_Kunwu.png diff --git a/mys/weapon/UI_EquipIcon_Sword_Magnum.png b/mihoyo_bbs/weapon/UI_EquipIcon_Sword_Magnum.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Sword_Magnum.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Sword_Magnum.png diff --git a/mys/weapon/UI_EquipIcon_Sword_Mitsurugi.png b/mihoyo_bbs/weapon/UI_EquipIcon_Sword_Mitsurugi.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Sword_Mitsurugi.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Sword_Mitsurugi.png diff --git a/mys/weapon/UI_EquipIcon_Sword_Morax.png b/mihoyo_bbs/weapon/UI_EquipIcon_Sword_Morax.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Sword_Morax.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Sword_Morax.png diff --git a/mys/weapon/UI_EquipIcon_Sword_Narukami.png b/mihoyo_bbs/weapon/UI_EquipIcon_Sword_Narukami.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Sword_Narukami.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Sword_Narukami.png diff --git a/mys/weapon/UI_EquipIcon_Sword_Outlaw.png b/mihoyo_bbs/weapon/UI_EquipIcon_Sword_Outlaw.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Sword_Outlaw.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Sword_Outlaw.png diff --git a/mys/weapon/UI_EquipIcon_Sword_Proto.png b/mihoyo_bbs/weapon/UI_EquipIcon_Sword_Proto.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Sword_Proto.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Sword_Proto.png diff --git a/mys/weapon/UI_EquipIcon_Sword_Psalmus.png b/mihoyo_bbs/weapon/UI_EquipIcon_Sword_Psalmus.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Sword_Psalmus.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Sword_Psalmus.png diff --git a/mys/weapon/UI_EquipIcon_Sword_Rockkiller.png b/mihoyo_bbs/weapon/UI_EquipIcon_Sword_Rockkiller.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Sword_Rockkiller.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Sword_Rockkiller.png diff --git a/mys/weapon/UI_EquipIcon_Sword_Sashimi.png b/mihoyo_bbs/weapon/UI_EquipIcon_Sword_Sashimi.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Sword_Sashimi.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Sword_Sashimi.png diff --git a/mys/weapon/UI_EquipIcon_Sword_Silver.png b/mihoyo_bbs/weapon/UI_EquipIcon_Sword_Silver.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Sword_Silver.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Sword_Silver.png diff --git a/mys/weapon/UI_EquipIcon_Sword_Steel.png b/mihoyo_bbs/weapon/UI_EquipIcon_Sword_Steel.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Sword_Steel.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Sword_Steel.png diff --git a/mys/weapon/UI_EquipIcon_Sword_Theocrat.png b/mihoyo_bbs/weapon/UI_EquipIcon_Sword_Theocrat.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Sword_Theocrat.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Sword_Theocrat.png diff --git a/mys/weapon/UI_EquipIcon_Sword_Traveler.png b/mihoyo_bbs/weapon/UI_EquipIcon_Sword_Traveler.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Sword_Traveler.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Sword_Traveler.png diff --git a/mys/weapon/UI_EquipIcon_Sword_Troupe.png b/mihoyo_bbs/weapon/UI_EquipIcon_Sword_Troupe.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Sword_Troupe.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Sword_Troupe.png diff --git a/mys/weapon/UI_EquipIcon_Sword_Widsith.png b/mihoyo_bbs/weapon/UI_EquipIcon_Sword_Widsith.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Sword_Widsith.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Sword_Widsith.png diff --git a/mys/weapon/UI_EquipIcon_Sword_Zephyrus.png b/mihoyo_bbs/weapon/UI_EquipIcon_Sword_Zephyrus.png similarity index 100% rename from mys/weapon/UI_EquipIcon_Sword_Zephyrus.png rename to mihoyo_bbs/weapon/UI_EquipIcon_Sword_Zephyrus.png diff --git a/mys/weapon/weapons.json b/mihoyo_bbs/weapon/weapons.json similarity index 100% rename from mys/weapon/weapons.json rename to mihoyo_bbs/weapon/weapons.json diff --git a/mys/yuanshen.ttf b/mihoyo_bbs/yuanshen.ttf similarity index 100% rename from mys/yuanshen.ttf rename to mihoyo_bbs/yuanshen.ttf diff --git a/mys/chars/__init__.py b/mys/chars/__init__.py deleted file mode 100644 index 57bdd1c7..00000000 --- a/mys/chars/__init__.py +++ /dev/null @@ -1,73 +0,0 @@ -import re - -#from nonebot import on_command -#from nonebot.adapters.cqhttp import Event, Bot, Message - -from .getImg import draw_pic,draw_char_pic,new_draw_pic,draw_abyss_pic - -from nonebot import * -import json -from random import randint -import requests,random,os,json,re -from hoshino import Service,R,priv,util -from hoshino.typing import MessageSegment,CQEvent, HoshinoBot -from hoshino.util import FreqLimiter,pic2b64 -import hoshino -import asyncio -import time -import string -import random -import hashlib -import requests -import os -from PIL import Image,ImageFont,ImageDraw -from io import BytesIO -import base64 - -import urllib - -sv = Service('genshinuid') -bot = get_bot() - -FILE_PATH = os.path.dirname(__file__) -FILE2_PATH = os.path.join(FILE_PATH,'mys') -Texture_PATH = os.path.join(FILE2_PATH,'texture2d') - -@sv.on_prefix('uid') -async def _(bot:HoshinoBot, ev: CQEvent): - image = re.search(r"\[CQ:image,file=(.*),url=(.*)\]", str(ev.message)) - message = ev.message.extract_plain_text() - uid = re.findall(r"\d+", message)[0] # str - m = ''.join(re.findall('[\u4e00-\u9fa5]',message)) - if m == "角色": - #try: - im = await draw_char_pic(uid,ev.sender['nickname'],image) - await bot.send(ev, im, at_sender=True) - #except: - # await bot.send(ev,'输入也许错误!') - elif m == "深渊": - try: - floor_num = re.findall(r"\d+", message)[1] - im = await draw_abyss_pic(uid,ev.sender['nickname'],floor_num,image) - await bot.send(ev, im, at_sender=True) - except: - await bot.send(ev,'深渊输入错误!') - else: - #try: - im = await new_draw_pic(uid,ev.sender['nickname'],image) - await bot.send(ev, im, at_sender=True) - #except: - # await bot.send(ev,'输入错误!') - - -@sv.on_prefix('UID') -async def _(bot:HoshinoBot, ev: CQEvent): - image = re.search(r"\[CQ:image,file=(.*),url=(.*)\]", str(ev.message)) - message = ev.message.extract_plain_text() - uid = re.findall(r"\d+", message)[0] # str - try: - im = await draw_pic(uid,ev.sender['nickname'],image) - await bot.send(ev, im, at_sender=True) - except: - await bot.send(ev,'输入错误!') -