async def on_query_arena_all(bot, ev): global binds, lck robj = ev['match'] id = robj.group(1) uid = str(ev['user_id']) async with lck: if id == None: if not uid in binds: await bot.finish(ev, '您还未绑定竞技场', at_sender=True) return else: id = binds[uid]['id'] try: res = await query(id) sv.logger.info('开始生成竞技场查询图片...') # 通过log显示信息 # result_image = await generate_info_pic(res, cx) result_image = await generate_info_pic(res, uid) result_image = pic2b64(result_image) # 转base64发送,不用将图片存本地 result_image = MessageSegment.image(result_image) result_support = await generate_support_pic(res, uid) result_support = pic2b64(result_support) # 转base64发送,不用将图片存本地 result_support = MessageSegment.image(result_support) sv.logger.info('竞技场查询图片已准备完毕!') try: await bot.finish(ev, f"\n{str(result_image)}\n{result_support}", at_sender=True) except Exception as e: sv.logger.info("do nothing") except ApiException as e: await bot.finish(ev, f'查询出错,{e}', at_sender=True)
async def neurasthenia_game(bot, ev: CQEvent): if gm.is_playing(ev.group_id): await bot.finish(ev, "游戏仍在进行中…") with gm.start_game(ev.group_id) as game: chosen_ids = random.sample(game_util.VALID_IDS, TOTAL_PIC_NUM // 2) chosen_ids.extend(chosen_ids) random.shuffle(chosen_ids) # 记忆阶段 await bot.send(ev, f'记忆阶段: ({SHOW_TIME}s后我会撤回图片哦~)') pic = MessageSegment.image(util.pic2b64(game_util.generate_full_pic(ROW_NUM, COL_NUM, chosen_ids))) msg = await bot.send(ev, pic) await asyncio.sleep(SHOW_TIME) await bot.delete_msg(message_id=msg['message_id']) await asyncio.sleep(2) # 回答阶段 displayed_sub_pic_index = random.randint(0, TOTAL_PIC_NUM - 1) chosen_id = chosen_ids[displayed_sub_pic_index] explanation = game_util.EXPLANATION[chosen_id] ids = [game_util.JUMP_ID if i != displayed_sub_pic_index else id for i, id in enumerate(chosen_ids)] pic = MessageSegment.image(util.pic2b64(game_util.generate_full_pic(ROW_NUM, COL_NUM, ids, True))) await bot.send(ev, f'请告诉我另一个"{explanation}"所在位置的编号~ ({ANSWER_TIME}s后公布答案){pic}') game.answer = [i for i, id in enumerate(chosen_ids) if i != displayed_sub_pic_index and id == chosen_id][0] + 1 await asyncio.sleep(ANSWER_TIME) # 结算 game.update_score() msg_part1 = f'{MessageSegment.at(game.winner[0])}首先答对,真厉害~ 加2分! 当前总分为{game.get_first_winner_score()}分' if game.winner else '' msg_part2 = f'{game_util.generate_at_message_segment(game.winner[1:])}也答对了, 加1分~' if game.winner[1:] else '' msg_part3 = f'{game_util.generate_at_message_segment(game.loser)}答错了, 扣1分o(╥﹏╥)o' if game.loser else '' msg_part4 = '咦, 这轮游戏没人参与, 看来题目可能有点难...' if not (msg_part1 or msg_part2 or msg_part3) else "" msg_part = '\n'.join([s for s in [msg_part1, msg_part2, msg_part3, msg_part4] if s]) await bot.send(ev, f'正确答案是: {game.answer}{MessageSegment.image(util.pic2b64(game_util.generate_full_pic(ROW_NUM, COL_NUM, chosen_ids)))}{msg_part}')
async def ss_rate(bot, ev): txt = ev.message.extract_plain_text().strip() if not txt: await bot.finish(ev, '请在后面跟部位:头/身/腰/手', at_sender=True) pos = "0" if txt == "头": pos = "1" elif txt == "身": pos = "2" elif txt == "腰": pos = "3" elif txt == "手": pos = "4" if pos == "0": await bot.finish(ev, '请在后面跟部位:头/身/腰/手', at_sender=True) r = random.randint(1, 100) splv = 0 if r < 80 else (1 if r < 99 else 2) sppool = [x for x in ssrsp if x["position"] == pos and x["lv"] == splv] if len(sppool) <= 0: await bot.finish(ev, '出错了,获取饰品数据失败', at_sender=True) sp = random.choice(sppool) #生成饰品图片 sppic = makePic(sp) res = pic2b64(sppic) await bot.finish(ev, f'\n{ms.image(res)}', at_sender=True)
def get_icons(arr,size=64,types='skill'): num = len(arr) des = Image.new('RGBA', (num*size, size), (255, 255, 255, 255)) for i, chara in enumerate(arr): pic = icon(chara,types).open().convert('RGBA').resize((size, size), Image.LANCZOS) des.paste(pic, (i * size, 0), pic) return str(MessageSegment.image(pic2b64(des)))
async def add_repass(self, tag: str, data): po = "——{}——".format(tag) for line in data: if THUMB_ON: try: #thumbnail_image = str(MessageSegment.image(pic2b64(ats_pic(Image.open(BytesIO(await get_pic(line[2]))))))) thumbnail_image = str( MessageSegment.image( pic2b64( ats_pic( Image.open( BytesIO( self.scraper.get( line[2], timeout=20, proxies=proxies).content)))))) except Exception as e: print(format_exc()) thumbnail_image = "[预览图下载失败]" else: thumbnail_image = "" putline = f"{thumbnail_image}\n[{line[1]}][{line[0]}]\n{line[3]}" po = "\n".join([po, putline]) return po
async def longwang(session): global imgbase_path uid = session.ctx['user_id'] if not _nlmt.check(uid): await session.send(EXCEED_NOTICE, at_sender=True) return if not _flmt.check(uid): await session.send('龙王她生气了,并堵上了你的嘴', at_sender=True) return _flmt.start_cd(uid) gid = session.ctx['group_id'] dragon_king = await session.bot.get_group_honor_info(group_id=gid, type='talkative') if not 'current_talkative' in dragon_king: await session.send('本群暂时还没有龙王哦……', at_sender=True) return dragon_king = dragon_king['current_talkative']['user_id'] dir_list = os.listdir(imgbase_path) img_path = path.join(imgbase_path, random.choice(dir_list)) count = 0 while os.path.isdir(img_path) == True: img_path = path.join(imgbase_path, random.choice(dir_list)) count += 1 if count % 5 == 0: hoshino.logger.error('缺少龙王图片资源或目录下文件夹过多') return longwang_img = R.img(img_path).open() longwang_img_message = MessageSegment.image(pic2b64(longwang_img)) reply = random.choice(['龙王出来挨透', '龙王出来喷水']) _nlmt.increase(uid) await session.finish( f'[CQ:at,qq={dragon_king}]\n{reply}\n{longwang_img_message}')
async def tip(poolid="1"): poolinfo = pool_dict[poolid] pooltype = poolinfo[2] name = poolinfo[1] pic = pic2b64(Image.open(os.path.join(picpath,"pool",f"{poolid}.png"))) pic = MessageSegment.image(pic) return f"卡池{poolid}[{name}]\n{pic}\n米歇尔祈愿中..."
def get_random_cards(card_file_names_list=card_file_names_all, amount=1): card_ids = [] size = 80 margin = 5 col_num = math.ceil(amount / 2) row_num = 2 if amount != 1 else 1 base = Image.new('RGBA', (col_num * size + (col_num - 1) * margin, (row_num * size + (row_num - 1) * margin)), (255, 255, 255, 255)) rarity_counter = {-1: 0, 0: 0, 1: 0} for i in range(amount): random_card = random.choice( card_file_names_list ) if card_file_names_list != card_file_names_all else random.choice( get_random_cards_list()) card_id, rarity = get_card_id_by_file_name(random_card) card_ids.append(card_id) rarity_counter[rarity] += 1 if PRELOAD: img = image_cache[random_card] else: img = Image.open(DIR_PATH + f'/{random_card}') row_index = i // col_num col_index = i % col_num img = img.resize((size, size), Image.ANTIALIAS) base.paste(add_rarity_frame(img, rarity), (col_index * (size + margin), row_index * (size + margin))) return card_ids, rarity_counter, MessageSegment.image(util.pic2b64(base))
async def gacha_10(bot, ev: CQEvent): SUPER_LUCKY_LINE = 170 await check_jewel_num(bot, ev) jewel_limit.increase(ev.user_id, 1500) gid = str(ev.group_id) gacha = Gacha(_group_pool[gid]) result, hiishi = gacha.gacha_ten() silence_time = hiishi * 6 if hiishi < SUPER_LUCKY_LINE else hiishi * 60 res1 = chara.gen_team_pic(result[:5], star_slot_verbose=False) res2 = chara.gen_team_pic(result[5:], star_slot_verbose=False) res = concat_pic([res1, res2]) res = pic2b64(res) res = MessageSegment.image(res) result = [f'{c.name}{"★"*c.star}' for c in result] res1 = ' '.join(result[0:5]) res2 = ' '.join(result[5:]) res = f'{res}\n{res1}\n{res2}' # 纯文字版 # result = [f'{c.name}{"★"*c.star}' for c in result] # res1 = ' '.join(result[0:5]) # res2 = ' '.join(result[5:]) # res = f'{res1}\n{res2}' if hiishi >= SUPER_LUCKY_LINE: await bot.send(ev, '恭喜海豹!おめでとうございます!') await bot.send(ev, f'素敵な仲間が増えますよ!\n{res}\n', at_sender=True) await silence(ev, silence_time)
async def avatar_guess(bot, ev: CQEvent): if winner_judger.get_on_off_status(ev.group_id): await bot.send(ev, "此轮游戏还没结束,请勿重复使用指令") return winner_judger.turn_on(ev.group_id) chara_id_list = list(_pcr_data.CHARA_NAME.keys()) list_len = len(chara_id_list) - 1 while True: index = random.randint(0, list_len) if chara_id_list[index] not in BLACKLIST_ID: break winner_judger.set_correct_chara_id(ev.group_id, chara_id_list[index]) dir_path = os.path.join(os.path.expanduser(hoshino.config.RES_DIR), 'img', 'priconne', 'unit') if not os.path.exists(dir_path): os.makedirs(dir_path) c = chara.fromid(chara_id_list[index]) img = c.icon.open() left = math.floor(random.random()*(129-PIC_SIDE_LENGTH)) upper = math.floor(random.random()*(129-PIC_SIDE_LENGTH)) cropped = img.crop((left, upper, left+PIC_SIDE_LENGTH, upper+PIC_SIDE_LENGTH)) cropped = MessageSegment.image(util.pic2b64(cropped)) msg = f'猜猜这个图片是哪位角色头像的一部分?({ONE_TURN_TIME}s后公布答案){cropped}' await bot.send(ev, msg) await asyncio.sleep(ONE_TURN_TIME) if winner_judger.get_winner(ev.group_id) != '': winner_judger.turn_off(ev.group_id) return msg = f'正确答案是: {c.name}{c.icon.cqcode}\n很遗憾,没有人答对~' winner_judger.turn_off(ev.group_id) await bot.send(ev, msg)
async def jc(bot, ev: CQEvent): kw = ev.message.extract_plain_text().strip() arr = kw.split('/') image = Image.open(os.path.join(os.path.dirname(__file__),'jichou.jpg')) # 创建Font对象: font = ImageFont.truetype(os.path.join(os.path.dirname(__file__),'simhei.ttf'), 80) time = datetime.datetime.now().strftime('%Y年%m月%d日') msg = f'{time},{arr[0]},{arr[1]},这个仇我先记下了' place = 12 line = len(msg.encode('utf-8')) // place + 1 positions = measure(msg, 80, 974) str_list = list(msg) for pos in positions: str_list.insert(pos,'\n') msg = "".join(str_list) # 创建Draw对象: image_text = Image.new('RGB', (974, 32 * line), (255, 255, 255)) draw = ImageDraw.Draw(image_text) draw.text((0, 0), msg, fill=(0 , 0, 0), font=font) # 模糊: image_text = image_text.filter(ImageFilter.BLUR) image_back = Image.new('RGB', (974, 32 * line + 764), (255, 255, 255)) image_back.paste(image, (0, 0)) image_back.paste(image_text, (0, 764)) await bot.send(ev, str(MessageSegment.image(pic2b64(image_back))))
async def pcr_comp(bot, ev: CQEvent): global g_result, g_uid uid = ev.user_id if not lmt.check(uid): await bot.send(ev, '今天已经赛过5次力', at_sender=True) return if g_result != []: await bot.send(ev, '上一场比赛尚未结束,请等待\n※管理员发送“@bot赛跑重置”可重置比赛', at_sender=True) return lmt.increase(uid) await bot.send(ev, f'第○届兰德索尔杯比赛开始!', at_sender=True) gid = str(ev.group_id) palyer = Palyer(_group_pool[gid]) result = palyer.get_chara() result_number = palyer.get_num() res2 = chara.gen_team_pic(result, star_slot_verbose=False) res1 = chara.gen_team_pic(result_number, star_slot_verbose=False) res = concat_pic([res1, res2]) res = pic2b64(res) res = MessageSegment.image(res) result_name = [f'{c.name}' for c in result] res_name = ' '.join(result_name) if sv.bot.config.USE_CQPRO: await bot.send(ev, f'比赛选手:\n{res}\n{res_name}\n※发送“选中+角色名称”开始比赛', at_sender=False) else: await bot.send(ev, f'error:CQpro is required') save_player(result_name) g_uid = uid
async def gacha_10(session: CommandSession): SUPER_LUCKY_LINE = 170 uid = session.ctx['user_id'] at = str(MessageSegment.at(session.ctx['user_id'])) if not check_gacha_num(uid): await session.finish(f'{at} {GACHA_EXCEED_NOTICE}') _user_gacha_count[uid] += 1 gacha = Gacha() result, hiishi = gacha.gacha_ten() silence_time = hiishi * 6 if hiishi < SUPER_LUCKY_LINE else hiishi * 60 if get_bot().config.IS_CQPRO: res1 = Chara.gen_team_pic(result[:5], star_slot_verbose=False) res2 = Chara.gen_team_pic(result[5:], star_slot_verbose=False) res = concat_pic([res1, res2]) res = pic2b64(res) res = MessageSegment.image(res) result = [f'{c.name}{"★"*c.star}' for c in result] res1 = ' '.join(result[0:5]) res2 = ' '.join(result[5:]) res = res + f'{res1}\n{res2}' else: result = [f'{c.name}{"★"*c.star}' for c in result] res1 = ' '.join(result[0:5]) res2 = ' '.join(result[5:]) res = f'{res1}\n{res2}' await silence(session.ctx, silence_time) msg = f'{at}\n素敵な仲間が増えますよ!\n{res}' await session.send(msg) if hiishi >= SUPER_LUCKY_LINE: await session.send('恭喜海豹!おめでとうございます!')
async def gacha_10(session:CommandSession): SUPER_LUCKY_LINE = 170 await check_jewel_num(session) uid = session.ctx['user_id'] jewel_limit.increase(uid, 1500) gid = str(session.ctx['group_id']) gacha = Gacha(_group_pool[gid]) result, hiishi = gacha.gacha_ten() silence_time = hiishi * 6 if hiishi < SUPER_LUCKY_LINE else hiishi * 60 if sv.bot.config.IS_CQPRO: res1 = Chara.gen_team_pic(result[:5], star_slot_verbose=False) res2 = Chara.gen_team_pic(result[5:], star_slot_verbose=False) res = concat_pic([res1, res2]) res = pic2b64(res) res = MessageSegment.image(res) result = [f'{c.name}{"★"*c.star}' for c in result] res1 = ' '.join(result[0:5]) res2 = ' '.join(result[5:]) res = f'{res}\n{res1}\n{res2}' else: result = [f'{c.name}{"★"*c.star}' for c in result] res1 = ' '.join(result[0:5]) res2 = ' '.join(result[5:]) res = f'{res1}\n{res2}' if hiishi >= SUPER_LUCKY_LINE: await session.send('恭喜海豹!おめでとうございます!') await session.send(f'素敵な仲間が増えますよ!\n{res}\n{SWITCH_POOL_TIP}', at_sender=True) await silence(session.ctx, silence_time)
async def gacha_10(bot, ev: CQEvent): SUPER_LUCKY_LINE = 170 SUPER_BAD_LUCK = 19 await check_jewel_num(bot, ev) jewel_limit.increase(ev.user_id, 1500) gid = str(ev.group_id) gacha = Gacha(_group_pool[gid]) result, hiishi = gacha.gacha_ten() silence_time = 240 if hiishi < SUPER_LUCKY_LINE else 400 if sv.bot.config.USE_CQPRO: res1 = chara.gen_team_pic(result[:5], star_slot_verbose=False) res2 = chara.gen_team_pic(result[5:], star_slot_verbose=False) res = concat_pic([res1, res2]) res = pic2b64(res) res = MessageSegment.image(res) result = [f'{c.name}{"★"*c.star}' for c in result] res1 = ' '.join(result[0:5]) res2 = ' '.join(result[5:]) res = f'{res}\n{res1}\n{res2}' else: result = [f'{c.name}{"★"*c.star}' for c in result] res1 = ' '.join(result[0:5]) res2 = ' '.join(result[5:]) res = f'{res1}\n{res2}' if hiishi >= SUPER_LUCKY_LINE: await bot.send(ev, '恭喜海豹!') elif hiishi <= SUPER_BAD_LUCK: await bot.send(ev, '世 界 名 画') await bot.send(ev, f'优秀的伙伴增加了!\n{res}\n', at_sender=True)
async def gacha_300(bot, ev: CQEvent): await check_tenjo_num(bot, ev) tenjo_limit.increase(ev.user_id) gid = str(ev.group_id) gacha = Gacha(_group_pool[gid]) result = gacha.gacha_tenjou() up = len(result['up']) s3 = len(result['s3']) s2 = len(result['s2']) s1 = len(result['s1']) res = [*(result['up']), *(result['s3'])] random.shuffle(res) lenth = len(res) if lenth <= 0: res = "竟...竟然没有3★?!" else: step = 4 pics = [] for i in range(0, lenth, step): j = min(lenth, i + step) pics.append(chara.gen_team_pic(res[i:j], star_slot_verbose=False)) res = concat_pic(pics) res = pic2b64(res) res = MessageSegment.image(res) msg = [ f"\n素敵な仲間が増えますよ! {res}", f"★★★×{up+s3} ★★×{s2} ★×{s1}", f"\n发送"选择卡池"可以切换卡池\n管理员发送"氪金+@你本人",可以再抽一次", f"获得记忆碎片×{100*up}与女神秘石×{50*(up+s3) + 10*s2 + s1}!\n第{result['first_up_pos']}抽首次获得up角色" if up else f"获得女神秘石{50*(up+s3) + 10*s2 + s1}个!" ] if up == 0 and s3 == 0: msg.append("太惨了,咱们还是退款删游吧...") elif up == 0 and s3 > 7: msg.append("up呢?我的up呢?") elif up == 0 and s3 <= 3: msg.append("这位酋长,梦幻包考虑一下?") elif up == 0: msg.append("据说天井的概率只有12.16%") elif up <= 2: if result['first_up_pos'] < 50: msg.append("你的喜悦我收到了,滚去喂鲨鱼吧!") elif result['first_up_pos'] < 100: msg.append("已经可以了,您已经很欧了") elif result['first_up_pos'] > 290: msg.append("标 准 结 局") elif result['first_up_pos'] > 250: msg.append("补井还是不补井,这是一个问题...") else: msg.append("期望之内,亚洲水平") elif up == 3: msg.append("抽井母五一气呵成!多出30等专武~") elif up >= 4: msg.append("记忆碎片一大堆!您是托吧?") await bot.send(ev, '\n'.join(msg), at_sender=True)
async def friend(bot, ev: CQEvent): # 定义非管理员的冷却时间 # if ev.user_id not in bot.config.SUPERUSERS: # if not _flmt.check(ev.user_id): # return # _flmt.start_cd(ev.user_id) data = load_config(os.path.join(os.path.dirname(__file__), 'config.json'))['friend'] arr = [] is_at = False for m in ev.message: if m.type == 'at' and m.data['qq'] != 'all': arr = [int(m.data['qq'])] sid = int(m.data['qq']) is_at = True if not is_at: try: arr = data[f'{ev.group_id}'] except: member_list = await bot.get_group_member_list(self_id=ev.self_id, group_id=ev.group_id) for member in member_list: arr.append(member['user_id']) sid = choice(arr) info = await bot.get_group_member_info(group_id=ev.group_id, user_id=sid, no_cache=True) name = info['card'] or info['nickname'] match = ev['match'] msg = match.group('kw') msg = msg.replace('他', '我').replace('她', '我') image = Image.open(BytesIO(get_pic(sid))) img_origin = Image.new('RGBA', (100, 100), (255, 255, 255)) scale = 3 # 使用新的半径构建alpha层 r = 100 * scale alpha_layer = Image.new('L', (r, r), 0) draw = ImageDraw.Draw(alpha_layer) draw.ellipse((0, 0, r, r), fill=255) # 使用ANTIALIAS采样器缩小图像 alpha_layer = alpha_layer.resize((100, 100), Image.ANTIALIAS) img_origin.paste(image, (0, 0), alpha_layer) # 创建Font对象: font = ImageFont.truetype( os.path.join(os.path.dirname(__file__), 'simhei.ttf'), 30) font2 = ImageFont.truetype( os.path.join(os.path.dirname(__file__), 'simhei.ttf'), 25) # 创建Draw对象: image_text = Image.new('RGB', (450, 150), (255, 255, 255)) draw = ImageDraw.Draw(image_text) draw.text((0, 0), name, fill=(0, 0, 0), font=font) draw.text((0, 40), msg, fill=(125, 125, 125), font=font2) image_back = Image.new('RGB', (700, 150), (255, 255, 255)) image_back.paste(img_origin, (25, 25)) image_back.paste(image_text, (150, 40)) await bot.send(ev, str(MessageSegment.image(pic2b64(image_back))))
async def gacha_10(bot, ev: CQEvent): await check_jewel_num(bot, ev) jewel_limit.increase(ev.user_id, 1500) gid = str(ev.group_id) gacha = Gacha(_group_pool[gid]) result = gacha.gacha_ten() uid = str(ev.user_id) if _colle_enable[uid]: await modify_colle(bot, ev, result) res1 = chara.gen_team_pic(result[:5], star_slot_verbose=False) res2 = chara.gen_team_pic(result[5:], star_slot_verbose=False) res = concat_pic([res1, res2]) res = pic2b64(res) res = MessageSegment.image(res) result = [f'{c.name}{"★"*c.star}' for c in result] res1 = ' '.join(result[0:5]) res2 = ' '.join(result[5:]) res = f'{res}\n{res1}\n{res2}' # 纯文字版 # result = [f'{c.name}{"★"*c.star}' for c in result] # res1 = ' '.join(result[0:5]) # res2 = ' '.join(result[5:]) # res = f'{res1}\n{res2}' await bot.send(ev, f'素敵な仲間が増えますよ!\n{res}', at_sender=True)
async def diary(bot, ev: CQEvent): global pre name = '富婆' for i in ev.message: if i.get('type', False) == 'at': name = get_name(i.data['qq']) kw = ev.message.extract_plain_text().strip() time = datetime.datetime.now().strftime('%Y年%m月%d日') arr = kw.split('/') content = '' if len(arr) >= 2: weather, content = arr weather = weather.split(' ')[-1] else: weather = '' if arr[0].split(' ') == 2: weather = arr[0].split(' ')[-1] if not content: with open(os.path.join(os.path.dirname(__file__), 'diary_data.json'), 'r', encoding='utf-8') as file: diaries = json.load(file) while True: index = random.randint(0, len(diaries) - 1) if index != pre: pre = index content = diaries[index] for s in '你她': content = content.replace(s, name) break image = Image.open(os.path.join(os.path.dirname(__file__), 'diary.png')) img_width, img_height = image.size # 创建Font对象: font_size = img_width // 18 font = ImageFont.truetype( os.path.join(os.path.dirname(__file__), 'simhei.ttf'), font_size) positions = measure(content, font_size, img_width) str_list = list(content) for pos in positions: str_list.insert(pos, '\n') # 日期单独一行 line = len(positions) + 2 content = f'{time},{weather}\n' + "".join(str_list) line_h = font_size + 4 # 创建Draw对象: image_text = Image.new('RGB', (img_width, line_h * line), (255, 255, 255)) draw = ImageDraw.Draw(image_text) draw.text((0, 0), content, fill=(0, 0, 0), font=font, spacing=2) # 模糊: # image_text = image_text.filter(ImageFilter.BLUR) image_back = Image.new('RGB', (img_width, line_h * line + img_height), (255, 255, 255)) image_back.paste(image, (0, 0)) image_back.paste(image_text, (0, img_height)) await bot.send(ev, str(MessageSegment.image(pic2b64(image_back))))
def infos2pic(infos: List[dict]) -> str: texts = [] for info in infos: text = f"标题: {info['标题']}\n时间: {info['时间']}\n======" texts.append(text) texts = '\n'.join(texts) base = text2pic(texts, font) return pic2b64(base)
async def gacha_10(session:CommandSession): SUPER_LUCKY_LINE = 170 await check_jewel_num(session) uid = session.ctx['user_id'] jewel_limit.increase(uid, 1500) gid=session.ctx['group_id'] gacha = Gacha(_group_pool[gid]) result, hiishi = gacha.gacha_ten() silence_time = hiishi * 6 if hiishi < SUPER_LUCKY_LINE else hiishi * 60 cardo = [cardram(),cardram(),cardram(),cardram(),cardram(),cardram(),cardram(),cardram(),cardram(),cardram()] if (cardo[0] + cardo[1] + cardo[2] + cardo[3] + cardo[4] + cardo[5] + cardo[6] + cardo[7] + cardo[8] + cardo[9]) == 60: cardo[9] = 5 cardu = [Chara.cardimg(cardo[0]),Chara.cardimg(cardo[1]),Chara.cardimg(cardo[2]),Chara.cardimg(cardo[3]),Chara.cardimg(cardo[4]),Chara.cardimg(cardo[5]),Chara.cardimg(cardo[6]),Chara.cardimg(cardo[7]),Chara.cardimg(cardo[8]),Chara.cardimg(cardo[9])] card = Chara.gen_card_pic(cardu, star_slot_verbose=False) card = pic2b64(card) card = MessageSegment.image(card) cardm1 = cardmjs(cardo[0])[0] + cardmjs(cardo[1])[0] + cardmjs(cardo[2])[0] + cardmjs(cardo[3])[0] + cardmjs(cardo[4])[0] + cardmjs(cardo[5])[0] + cardmjs(cardo[6])[0] + cardmjs(cardo[7])[0] + cardmjs(cardo[8])[0] + cardmjs(cardo[9])[0] cardm2 = cardmjs(cardo[0])[1] + cardmjs(cardo[1])[1] + cardmjs(cardo[2])[1] + cardmjs(cardo[3])[1] + cardmjs(cardo[4])[1] + cardmjs(cardo[5])[1] + cardmjs(cardo[6])[1] + cardmjs(cardo[7])[1] + cardmjs(cardo[8])[1] + cardmjs(cardo[9])[1] cardm3 = cardmjs(cardo[0])[2] + cardmjs(cardo[1])[2] + cardmjs(cardo[2])[2] + cardmjs(cardo[3])[2] + cardmjs(cardo[4])[2] + cardmjs(cardo[5])[2] + cardmjs(cardo[6])[2] + cardmjs(cardo[7])[2] + cardmjs(cardo[8])[2] + cardmjs(cardo[9])[2] cardmax = f'获得角色碎片x{cardm1},母猪石x{cardm2},公主之心碎片x{cardm3}' if sv.bot.config.IS_CQPRO: res1 = Chara.gen_team_pic(result[ :5], star_slot_verbose=False) res2 = Chara.gen_team_pic(result[5: ], star_slot_verbose=False) res = concat_pic([res1, res2]) res = pic2b64(res) res = MessageSegment.image(res) result = [f'{c.name}{"★"*c.star}' for c in result] res1 = ' '.join(result[0:5]) res2 = ' '.join(result[5:]) res = f'{res}\n{res1}\n{res2}' else: result = [f'{c.name}{"★"*c.star}' for c in result] res1 = ' '.join(result[0:5]) res2 = ' '.join(result[5:]) res = f'{res1}\n{res2}' if hiishi >= SUPER_LUCKY_LINE: await session.send('恭喜海豹!おめでとうございます!') await session.send(f'素敵な仲間が増えますよ!\n{res}\n{card}\n{cardmax}', at_sender=True) await silence(session.ctx, silence_time)
def cqcode(self) -> MessageSegment: if get_bot().config.RESOURCE_URL: return MessageSegment.image(self.url) else: try: return MessageSegment.image(pic2b64(self.open())) except Exception as e: logger.exception(e) return MessageSegment.text('[图片]')
async def gacha_300(bot, ev: CQEvent): await check_tenjo_num(bot, ev) tenjo_limit.increase(ev.user_id) gid = str(ev.group_id) gacha = Gacha(_group_pool[gid]) result = gacha.gacha_tenjou() up = len(result['up']) s3 = len(result['s3']) s2 = len(result['s2']) s1 = len(result['s1']) res = result['res'] lenth = len(res) if lenth <= 0: res = "竟...竟然没有3★?!" else: step = 4 pics = [] for i in range(0, lenth, step): j = min(lenth, i + step) pics.append(chara.gen_team_pic(res[i:j], star_slot_verbose=False)) res = concat_pic(pics) res = pic2b64(res) res = MessageSegment.image(res) msg = [ f"\n优秀的伙伴增加了! {res}", f"★★★×{up+s3} ★★×{s2} ★×{s1}", f"获得女神秘石×{50*(up+s3) + 10*s2 + s1}!\n第{result['first_up_pos']}抽首次获得up角色" if up else f"获得女神秘石{50*(up+s3) + 10*s2 + s1}个!" ] if up == 0 and s3 == 0: msg.append("太惨了,咱们还是退款删游吧...") elif up == 0 and s3 > 7: msg.append("up呢?我的up呢?") elif up == 0 and s3 <= 3: msg.append("这位酋长,梦幻包考虑一下?") elif up == 0: msg.append("据说天井的概率只有12.16%") else: if result['first_up_pos'] < 50: msg.append("你的喜悦我收到了,滚去喂鲨鱼吧!") elif result['first_up_pos'] < 100: msg.append("已经可以了,您已经很欧了") elif result['first_up_pos'] > 290: msg.append("标 准 结 局") elif result['first_up_pos'] > 250: msg.append("补井还是不补井,这是一个问题...") else: msg.append("期望之内,亚洲水平") await bot.send(ev, '\n'.join(msg), at_sender=True) silence_time = 1200
async def upload(ss: CommandSession): atk_team = ss.get('atk_team', prompt='请输入进攻队+5个表示星级的数字+5个表示专武的0/1 无需空格') def_team = ss.get('def_team', prompt='请输入防守队+5个表示星级的数字+5个表示专武的0/1 无需空格') if 'pic' not in ss.state: ss.state['pic'] = MessageSegment.image(pic2b64(concat_pic([ chara.gen_team_pic(atk_team), chara.gen_team_pic(def_team), ]))) confirm = ss.get('confirm', prompt=f'{ss.state["pic"]}\n{MessageSegment.at(ss.event.user_id)}确认上传?\n> 确认\n> 取消') # TODO: upload await ss.send('假装上传成功了...')
def cqcode(self) -> MessageSegment: if hoshino.config.RES_PROTOCOL == 'http': return MessageSegment.image(self.url) elif hoshino.config.RES_PROTOCOL == 'file': return MessageSegment.image(f'file:///{os.path.abspath(self.path)}') else: try: return MessageSegment.image(util.pic2b64(self.open())) except Exception as e: hoshino.logger.exception(e) return MessageSegment.text('[图片出错]')
async def avatar_find(bot, ev: CQEvent): if gm.is_playing(ev.group_id): await bot.finish(ev, "游戏仍在进行中…") with gm.start_game(ev.group_id) as game: game.answer, answer_pic = get_merge_avatar() answer_pic = MessageSegment.image(util.pic2b64(answer_pic)) await bot.send(ev, f'请找出不一样的头像坐标?({ONE_TURN_TIME}s后公布答案){answer_pic}') await asyncio.sleep(ONE_TURN_TIME) if game.winner: return await bot.send(ev, f'正确答案是: {game.answer}\n很遗憾,没有人答对~')
def info2pic(info: dict) -> str: title = f"标题: {info['标题']}\n" text = f"正文:\n{info['正文']}\n时间: {info['时间']}" titlesize = get_text_size(title, font2,(20,20,20,0)) textsize = get_text_size(text, font1,(20,20,10,10)) sumsize = max(titlesize[0], textsize[0]), titlesize[1]+textsize[1] base = Image.new('RGBA', sumsize, (255, 255, 255, 255)) titlepic = text2pic(title, font2,(20,20,20,0)) base.paste(titlepic, (0, 0)) textpic = text2pic(text, font1,(20,20,10,20)) base.paste(textpic, (0, titlesize[1])) return pic2b64(base)
def drawing_pic(model) -> Image: fontPath = { 'title': R.img('genshintunedata/font/Mamelon.otf').path, 'text': R.img('genshintunedata/font/sakura.ttf').path } if model == 'KELI': base_img = get_base_by_name("frame_1.png") elif model == 'TWINS': base_img = get_base_by_name('frame_42.png') else: base_img = random_Basemap() filename = os.path.basename(base_img.path) charaid = filename.lstrip('frame_') charaid = charaid.rstrip('.png') img = base_img.open() # Draw title draw = ImageDraw.Draw(img) text, title = get_info(charaid) text = text['content'] font_size = 45 color = '#F5F5F5' image_font_center = (140, 99) ttfront = ImageFont.truetype(fontPath['title'], font_size) font_length = ttfront.getsize(title) draw.text((image_font_center[0] - font_length[0] / 2, image_font_center[1] - font_length[1] / 2), title, fill=color, font=ttfront) # Text rendering font_size = 25 color = '#323232' image_font_center = [140, 297] ttfront = ImageFont.truetype(fontPath['text'], font_size) result = decrement(text) if not result[0]: return Exception('Unknown error in daily luck') textVertical = [] for i in range(0, result[0]): font_height = len(result[i + 1]) * (font_size + 4) textVertical = vertical(result[i + 1]) x = int(image_font_center[0] + (result[0] - 2) * font_size / 2 + (result[0] - 1) * 4 - i * (font_size + 4)) y = int(image_font_center[1] - font_height / 2) draw.text((x, y), textVertical, fill=color, font=ttfront) img = pic2b64(img) img = MessageSegment.image(img) return img
async def bang_gacha(bot, ev): uid = ev['user_id'] poolid = str(ev.message) if poolid in pool_dict: poolinfo = pool_dict[poolid] name = poolinfo[1] banner = pic2b64(Image.open(os.path.join(picpath,"pool",f"{poolid}.png"))) banner = MessageSegment.image(banner) type = poolinfo[2] if type=="恒久的": type="普通" if type=="ドリームフェスティバル": type="Fes" start = poolinfo[3] end = poolinfo[4] uplist = poolinfo[5:] while "" in uplist: uplist.remove("") step = 3 if len(uplist)>=3 else 2 pics=[] for i in range(0, len(uplist), step): size=180 j = min(len(uplist), i + step) des = Image.new('RGBA', (step*size, size), (255, 255, 255, 255)) for k, card in enumerate(uplist[i:j]): src = Image.open(os.path.join(picpath,"card",f"{card}_0.png")) des.paste(src, (k * size, 0)) pics.append(des) res = concat_pic(pics) up=MessageSegment.image(pic2b64(res)) msg=f"卡池[{name}]\n{banner}\n{type}池,开始于{start},结束于{end}\nPickUp列表:{up}" await bot.finish(ev, msg) else: await bot.finish(ev, '没有对应的卡池哦')
async def perfect_match(bot, ev: CQEvent): if gm.is_playing(ev.group_id): await bot.finish(ev, "游戏仍在进行中…") with gm.start_game(ev.group_id) as game: chosen_ids = random.sample(game_util.VALID_IDS, TOTAL_PIC_NUM) pushed_index = set() # 发送若干轮的隐藏部分子图的合成图,保证所有子图至少都被发送一次。发送完毕后等待若干秒再撤回图片 for i in range(TURN_NUM): await bot.send(ev, f'记忆阶段{i+1}/{TURN_NUM}: ({BASIC_SHOW_TIME - i * 2}s后我会撤回图片哦~)') if i < TURN_NUM-1: shown_index = random.sample(range(TOTAL_PIC_NUM), TOTAL_PIC_NUM - HIDDEN_NUM) ids = [chosen_ids[i] if i in shown_index else game_util.UNKNOWN_ID for i in range(TOTAL_PIC_NUM)] pushed_index = pushed_index.union(set(shown_index)) else: remnant_index = set(range(TOTAL_PIC_NUM)) - pushed_index shown_index = list(remnant_index) shown_index.extend(random.sample(pushed_index, TOTAL_PIC_NUM - HIDDEN_NUM - len(remnant_index))) ids = [chosen_ids[i] if i in shown_index else game_util.UNKNOWN_ID for i in range(TOTAL_PIC_NUM)] pic = MessageSegment.image(util.pic2b64(game_util.generate_full_pic(ROW_NUM, COL_NUM, ids))) msg = await bot.send(ev, pic) await asyncio.sleep(BASIC_SHOW_TIME - i * 2) await bot.delete_msg(message_id=msg['message_id']) await asyncio.sleep(3) # 开始答题 correct_index = random.randint(0, TOTAL_PIC_NUM - 1) correct_id = chosen_ids[correct_index] game.answer = correct_index + 1 correct_pic_img = MessageSegment.image(util.pic2b64(game_util.get_sub_pic_from_id(correct_id))) answer_number_img = MessageSegment.image(f'file:///{os.path.abspath(game_util.BACKGROUND_PIC_PATH)}') await bot.send(ev, f'还记得"{game_util.EXPLANATION[correct_id]}"的位置吗?{correct_pic_img}请告诉我它的编号~ ({ANSWER_TIME}s后公布答案){answer_number_img}') await asyncio.sleep(ANSWER_TIME) # 结算 game.update_score() msg_part1 = f'{MessageSegment.at(game.winner[0])}首先答对,真厉害~ 加2分! 当前总分为{game.get_first_winner_score()}分' if game.winner else '' msg_part2 = f'{game_util.generate_at_message_segment(game.winner[1:])}也答对了, 加1分~' if game.winner[1:] else '' msg_part3 = f'{game_util.generate_at_message_segment(game.loser)}答错了, 扣1分o(╥﹏╥)o' if game.loser else '' msg_part4 = '咦, 这轮游戏没人参与, 看来题目可能有点难...' if not (msg_part1 or msg_part2 or msg_part3) else "" msg_part = '\n'.join([s for s in [msg_part1, msg_part2, msg_part3, msg_part4] if s]) await bot.send(ev, f'正确答案是: {game.answer}{MessageSegment.image(util.pic2b64(game_util.generate_full_pic(ROW_NUM, COL_NUM, chosen_ids)))}{msg_part}')