async def boss_slayer(bot, ev: EventInterface): server = re.findall("国服|日服?|台服?|b服?|cn|jp|tw", ev.get_param().remain, re.I) # 默认为国服 if len(server) == 0 or server[0] in [ '国服', 'b', 'B', 'b服', 'B服', 'CN', 'cn' ]: servertag = '**国服合刀**' ext0 = 100 # 当前版本国服补偿刀10秒起 else: servertag = '**日服/台服合刀**' ext0 = 110 # 日服补偿刀20秒起 remain = ev.get_param().remain prm = re.findall("\d+[wW万]", remain) if len(prm) == 3: hp = int(prm[0][:-1]) * 10000 dmg1 = int(prm[1][:-1]) * 10000 dmg2 = int(prm[2][:-1]) * 10000 else: prm = re.findall("\d+", remain) if len(prm) == 3: hp = int(prm[0]) dmg1 = int(prm[1]) dmg2 = int(prm[2]) else: usage = "使用方法:\n合刀计算 [服务器] BOSS剩余血量 伤害1 伤害2" await bot.kkr_send(ev, usage, at_sender=True) return if dmg1 + dmg2 < hp: msg = '0x0 这两刀合起来还打不死BOSS喔' else: if dmg1 >= hp and dmg2 >= hp: ans1 = f'先出{dmg1:,},BOSS直接就被打死啦' ans2 = f'先出{dmg2:,},BOSS直接就被打死啦' elif dmg1 >= hp and dmg2 < hp: ans1 = f'先出{dmg1:,},BOSS直接就被打死啦' ext2 = min(math.ceil(ext0 - ((hp - dmg2) / dmg1) * 90), 90) ans2 = f'先出{dmg2:,}再出{dmg1:,},返还时间{ext2}秒' elif dmg1 < hp and dmg2 >= hp: ext1 = min(math.ceil(ext0 - ((hp - dmg1) / dmg2) * 90), 90) ans1 = f'先出{dmg1:,}再出{dmg2:,},返还时间{ext1}秒' ans2 = f'先出{dmg2:,},BOSS直接就被打死啦' else: ext1 = min(math.ceil(ext0 - ((hp - dmg1) / dmg2) * 90), 90) ans1 = f'先出{dmg1:,}再出{dmg2:,},返还时间{ext1}秒' ext2 = min(math.ceil(ext0 - ((hp - dmg2) / dmg1) * 90), 90) ans2 = f'先出{dmg2:,}再出{dmg1:,},返还时间{ext2}秒' not_my_fault = "计算结果仅供参考,可能与游戏内实际返还时间有偏差" msg = '\n'.join([servertag, ans1, ans2, not_my_fault]) await bot.kkr_send(ev, msg, at_sender=False)
async def whois(bot, ev: EventInterface): uid = ev.get_author_id if not lmt.check(uid): await bot.kkr_send(ev, f'兰德索尔花名册冷却中(剩余 {int(lmt.left_time(uid)) + 1}秒)', at_sender=True) return lmt.start_cd(uid) name = ev.get_param().remain if not name: await bot.kkr_send(ev, '请发送"谁是"+别称,如"谁是霸瞳"') return id_ = chara.name2id(name) confi = 100 guess = False if id_ == chara.UNKNOWN: id_, guess_name, confi = chara.guess_id(name) guess = True c = chara.fromid(id_) if guess: lmt.start_cd(uid, 120) msg = f'兰德索尔似乎没有叫"{name}"的人...\n角色别称补全计划: github.com/Ice-Cirno/HoshinoBot/issues/5' await bot.kkr_send(ev, msg) msg = f'\n您有{confi}%的可能在找{guess_name} ' await bot.kkr_send(ev, msg) if confi > 60: await bot.kkr_send(ev, c.icon) await bot.kkr_send(ev, c.name, at_sender=True)
async def switch_service(bot, ev: EventInterface, turn_on: bool): action_tip = '启用' if turn_on else '禁用' names = ev.get_param().remain.split() if not names: await bot.kkr_send(ev, f"空格后接要{action_tip}的服务名", at_sender=True) return group_id = ev.get_group_id() svs = Service.get_loaded_services() succ, notfound = [], [] for name in names: if name in svs: sv = svs[name] u_priv = priv.get_user_priv(ev.get_author()) if u_priv >= sv.manage_priv: sv.set_enable(group_id) if turn_on else sv.set_disable( group_id) succ.append(name) else: try: await bot.kkr_send( ev, f'权限不足!{action_tip}{name}需要:{sv.manage_priv},您的:{u_priv}\n{PRIV_TIP}', at_sender=True) except: pass else: notfound.append(name) msg = [] if succ: msg.append(f'已{action_tip}服务:' + ', '.join(succ)) if notfound: msg.append('未找到服务:' + ', '.join(notfound)) if msg: await bot.kkr_send(ev, '\n'.join(msg), at_sender=True)
async def _select_(bot: KokkoroBot, ev: EventInterface): global g_uid_dict, g_status_dict gid = ev.get_group_id() uid = ev.get_author_id() horse_status: HorseStatus = g_status_dict.get(gid) if horse_status == None: await bot.kkr_send(ev, f'比赛尚未开始,发送指令"赛🐴"发起新的游戏', at_sender=True) elif not horse_status.multi_player and uid != g_uid_dict[gid]: await bot.kkr_send(ev, f'仅限比赛发起人进行选择~\n发送指令"多人赛🐴"发起多人游戏') else: pkey = ev.get_param().remain id_ = chara.name2id(pkey) s_chara = chara.fromid(id_) if s_chara.name not in g_status_dict[gid].charactors: await bot.kkr_send(ev, f'所选角色未在参赛角色中') return success = horse_status.add_player(uid, s_chara.name) if not success: await bot.kkr_send(ev, f'已经有人选过 {s_chara.name} 了 0x0', at_sender=True) elif horse_status.is_finished(): await bot.kkr_send(ev, f'比赛开始') res = horse_status.get_result() await bot.kkr_send(ev, f'{res}') # Clean up clean(gid) else: await bot.kkr_send(ev, f'已选择{s_chara.name}', at_sender=True)
async def public_recruit(bot: KokkoroBot, ev: EventInterface): over4_only = True args = ev.get_param().remain if args[:2] in ['-a', '全部']: over4_only = False args = args[2:] tags = args.split() size = len(tags) if size == 0: await bot.kkr_send(ev, HELP_MESSAGE) return for i in range(size): if tags[i][-2:] == "干员": tags[i] = tags[i][:-2] valid, _tag = validate_tags(tags) if not valid: await bot.kkr_send(ev, f'无效 TAG:{_tag}') return workers = get_workers(tags, worker_infos, over4_only) if len(workers) == 0: if over4_only: await bot.kkr_send( ev, f'无法保证招聘四星及以上干员\n若希望显示所有可能干员请使用命令:公开招募 -a {args}') else: await bot.kkr_send(ev, '无匹配干员') else: msg = format_workers(workers) await bot.kkr_send(ev, msg)
async def manaburner(bot, ev: EventInterface): prm = re.findall("\d+", ev.get_param().remain) if len(prm) == 0 or len(prm) >= 4: usage = "使用方法:\n角色计算 [[角色数量] 当前等级 ]目标等级" await bot.kkr_send(ev, usage, at_sender=True) return elif len(prm) == 1: n = 1 l = 1 r = int(prm[0]) elif len(prm) == 2: n = 1 l = int(prm[0]) r = int(prm[1]) elif len(prm) == 3: n = int(prm[0]) l = int(prm[1]) r = int(prm[2]) try: mana = (total_mana[r] - total_mana[l]) * n exp = (total_exp[r] - total_exp[l]) * n bottle = math.ceil(exp / 7500) buyexp = math.ceil(exp / 0.375) msg = f"{n}名角色从{l}级升到{r}级需要:\n{mana:,} mana\n{exp:,} 经验\n约{bottle:,}瓶超级经验药水(价值 {buyexp:,} mana)" except: msg = "0x0 好像超出了等级上限呢" await bot.kkr_send(ev, msg, at_sender=True)
async def lssv(bot: KokkoroBot, ev: EventInterface): parser = ArgumentParser() parser.add_argument('-a', '--all', action='store_true') parser.add_argument('-i', '--invisible', action='store_true') parser.add_argument('-g', '--group', type=int, default=0) args = parser.parse_args(ev.get_param().remain) verbose_all = args.all only_hidden = args.invisible if ev.get_author_id() in bot.config.SUPER_USER: gid = args.group or ev.get_group_id() if not gid: await bot.kkr_send(ev, 'Usage: -g|--group <group_id> [-a|--all]') return else: gid = ev.get_group_id() msg = [f"群{gid}服务一览:"] svs = Service.get_loaded_services().values() svs = map(lambda sv: (sv, sv.check_enabled(gid)), svs) key = cmp_to_key(lambda x, y: (y[1] - x[1]) or (-1 if x[0].name < y[ 0].name else 1 if x[0].name > y[0].name else 0)) svs = sorted(svs, key=key) for sv, on in svs: if verbose_all or (sv.visible ^ only_hidden): x = '○' if on else '×' msg.append(f"|{x}| {sv.name}") await bot.kkr_send(ev, '\n'.join(msg))
async def rank_sheet(bot, ev: EventInterface): match = ev.get_param().match is_jp = match.group(2) == '日' is_tw = match.group(2) == '台' is_cn = match.group(2) and match.group(2) in '国陆b' if not is_jp and not is_tw and not is_cn: await bot.kkr_send( ev, '\n请问您要查询哪个服务器的rank表?\n*日rank表\n*台rank表\n*B服rank表\n', at_sender=True) return msg = [ '\n※表格仅供参考,升r有风险,强化需谨慎\n※一切以会长要求为准——', ] if is_jp: msg.append('※不定期搬运自图中Q群\n※广告为原作者推广,与本bot无关\nR17-5 rank表:') await bot.kkr_send(ev, '\n'.join(msg), at_sender=True) pos = match.group(3) if not pos or '前' in pos: await bot.kkr_send(ev, p4, at_sender=True) if not pos or '中' in pos: await bot.kkr_send(ev, p5, at_sender=True) if not pos or '后' in pos: await bot.kkr_send(ev, p6, at_sender=True) elif is_tw: msg.append(f'※不定期搬运自漪夢奈特\n※油管频道有介绍视频及原文档\nR16-5 rank表:\n') await bot.kkr_send(ev, '\n'.join(msg), at_sender=True) await bot.kkr_send(ev, p1) await bot.kkr_send(ev, p2) elif is_cn: await bot.kkr_send(ev, '\n'.join(msg), at_sender=True) await bot.kkr_send(ev, cn_rank)
async def cherulize(bot: KokkoroBot, ev: EventInterface): s = ev.get_param().remain if len(s) > 500: await bot.kkr_send(ev, '切、切噜太长切不动勒切噜噜...', at_sender=True) return # if random.random() < 0.2: # await cheru_record(bot, ev) await bot.kkr_send(ev, '切噜~♪' + str2cheru(s))
async def decherulize(bot: KokkoroBot, ev: EventInterface): s = ev.get_param().remain if len(s) > 1501: await bot.kkr_send(ev, '切、切噜太长切不动勒切噜噜...', at_sender=True) return msg = bot.kkr_at(ev.get_author_id()) + '的切噜噜是:\n' + escape(cheru2str(s)) # if random.random() < 0.2: # await cheru_record(bot, ev) await bot.kkr_send(ev, msg)
async def arena_miner(bot, ev: EventInterface): try: rank = int(ev.get_param().remain) except: return rank = np.clip(rank, 1, 15001) s_all = all_season[1:rank].sum() s_this = this_season[1:rank].sum() msg = f"最高排名奖励还剩{s_this}钻\n历届最高排名还剩{s_all}钻" await bot.kkr_send(ev, msg, at_sender=True)
async def _select_(bot, ev: EventInterface): global g_uid, g_result uid = ev.get_author_id() if uid != g_uid and g_result != []: await bot.kkr_send(ev, f'仅限比赛发起人进行选择~') elif uid != g_uid and g_result == []: await bot.kkr_send(ev, f'上一场比赛已经结束,您可以用“@bot赛跑模拟”发起新的比赛', at_sender=True) elif uid == g_uid: await select_player(bot, ev, ev.get_param().remain) else: await bot.kkr_send(ev, f'出现错误,请联系维护组嘤嘤嘤')
async def wrapper(bot: KokkoroBot, ev: EventInterface): try: args = parser.parse(ev.get_param().args, ev) except ParseError as e: await bot.kkr_send(ev, e.message, at_sender=True) return try: return await func(bot, ev, args) except ClanBattleError as e: await bot.kkr_send(ev, e.message, at_sender=True) except Exception as e: await bot.kkr_send(ev, f'{SORRY} 发生未知错误', at_sender=True) raise e
async def boss_slayer(bot, ev: EventInterface, args: ParseResult): bm = BattleMaster(ev.get_group_id()) clan = _check_clan(bm) if clan['server'] == BattleMaster.SERVER_CN: servertag = '**国服合刀**' ext0 = 100 else: servertag = '**日服/台服合刀**' ext0 = 110 # 日服补偿刀20秒起 remain = ev.get_param().remain prm = re.findall("\d+[wW万]", remain) if len(prm) == 2: dmg1 = int(prm[0][:-1]) * 10000 dmg2 = int(prm[1][:-1]) * 10000 else: prm = re.findall("\d+", remain) if len(prm) == 2: dmg1 = int(prm[0]) dmg2 = int(prm[1]) else: usage = "【用法/用例】\n!补偿刀计算 50w 60w" await bot.kkr_send(ev, usage, at_sender=True) return r, b, hp = bm.get_challenge_progress(1, datetime.now()) if dmg1 + dmg2 < hp: msg = '0x0 这两刀合起来还打不死BOSS喔' else: if dmg1 >= hp and dmg2 >= hp: ans1 = f'先出{dmg1:,},BOSS直接就被打死啦' ans2 = f'先出{dmg2:,},BOSS直接就被打死啦' elif dmg1 >= hp and dmg2 < hp: ans1 = f'先出{dmg1:,},BOSS直接就被打死啦' ext2 = min(math.ceil(ext0 - ((hp - dmg2) / dmg1) * 90), 90) ans2 = f'先出{dmg2:,}再出{dmg1:,},返还时间{ext2}秒' elif dmg1 < hp and dmg2 >= hp: ext1 = min(math.ceil(ext0 - ((hp - dmg1) / dmg2) * 90), 90) ans1 = f'先出{dmg1:,}再出{dmg2:,},返还时间{ext1}秒' ans2 = f'先出{dmg2:,},BOSS直接就被打死啦' else: ext1 = min(math.ceil(ext0 - ((hp - dmg1) / dmg2) * 90), 90) ans1 = f'先出{dmg1:,}再出{dmg2:,},返还时间{ext1}秒' ext2 = min(math.ceil(ext0 - ((hp - dmg2) / dmg1) * 90), 90) ans2 = f'先出{dmg2:,}再出{dmg1:,},返还时间{ext2}秒' not_my_fault = "计算结果仅供参考,可能与游戏内实际返还时间有偏差" msg = '\n'.join([servertag, ans1, ans2, not_my_fault]) await bot.kkr_send(ev, msg, at_sender=False)
async def normal_map(bot, ev: EventInterface): try: number = int(ev.get_param().remain) except Exception as e: await bot.kkr_send(ev, '参数必须为数字。示例:`刷图 10`') return img = f'{NORMAL_MAP_PREFIX}-{number}.jpg' img = R.img(f'priconne/quick/{img}') if not img.exist: await bot.kkr_send(ev, f'{number} 图刷图攻略未找到呜呜呜 ┭┮﹏┭┮') else: await bot.kkr_send(ev, f'{number} 图刷图攻略:') await bot.kkr_send(ev, img)
async def get_last_5_weibo(bot: KokkoroBot, ev: EventInterface): uid = ev.get_author_id() if not lmt.check(uid): await bot.kkr_send(ev, '您查询得过于频繁,请稍等片刻', at_sender=True) return lmt.start_cd(uid) params = ev.get_param().remain.split(' ') if len(params) == 0 or params[0] == '': await bot.kkr_send(ev, f'使用方法:看微博 <微博别称> <1-5的数字>\n仅支持主动查看最新5条微博~') return alias = params[0] if len(params) == 1: amount = 5 else: try: amount = int(params[1]) except Exception as e: await bot.kkr_send(ev, f'使用方法:看微博 {alias} <1-5的数字>\n仅支持主动查看最新5条微博~') return if amount >= 5 or amount <= 0: amount = 5 if alias not in alias_dic: await bot.kkr_send(ev, f"未找到微博: {alias}") return service_name = alias_dic[alias]["service_name"] user_id = alias_dic[alias]["user_id"] spiders = subr_dic[service_name]["spiders"] for spider in spiders: if spider.get_user_id() == user_id: last_5_weibos = spider.get_last_5_weibos() weibos = last_5_weibos[-amount:] formatted_weibos = [wb_to_message(wb) for wb in weibos] for wb in formatted_weibos: await bot.kkr_send(ev, wb[0]) # send text imgs = wb[1] for img in imgs: await bot.kkr_send(ev, img) # send img await bot.kkr_send(ev, "===================================") await bot.kkr_send(ev, f"以上为 {alias} 的最新 {len(formatted_weibos)} 条微博") return await bot.kkr_send(ev, f"未找到微博: {alias}")
async def qks_rex(bot: KokkoroBot, ev: EventInterface): match = ev.get_param().match msg = f'骑空士爪巴远点\n{qksimg}' res = 'http://' + match.group(0) async with aiohttp.TCPConnector(verify_ssl=False) as connector: async with aiohttp.request( 'GET', url=res, allow_redirects=False, connector=connector, ) as resp: h = resp.headers s = resp.status if s == 301 or s == 302: if 'granbluefantasy.jp' in h['Location']: await bot.kkr_send(ev, msg, at_sender=True) await util.silence(ev, 60)
async def comic(bot: KokkoroBot, ev: EventInterface): episode = ev.get_param().remain if not re.fullmatch(r'\d{0,3}', episode): return episode = episode.lstrip('0') if not episode: await bot.kkr_send(ev, '请输入漫画集数 如:官漫132', at_sender=True) return index = load_index() if episode not in index: await bot.kkr_send(ev, f'未查找到第{episode}话,敬请期待官方更新', at_sender=True) return title = index[episode]['title'] pic = R.img('priconne/comic/', get_pic_name(episode)) msg = f'プリンセスコネクト!Re:Dive公式4コマ\n第{episode}話 {title}' await bot.kkr_send(ev, pic) await bot.kkr_send(ev, msg, at_sender=True)
async def lssv(bot: KokkoroBot, ev: EventInterface): parser = ArgumentParser() parser.add_argument('-a', '--all', action='store_true') parser.add_argument('-i', '--invisible', action='store_true') parser.add_argument('-g', '--group', type=int, default=0) args = parser.parse_args(ev.get_param().remain) verbose_all = args.all only_hidden = args.invisible if ev.get_author_id() in bot.config.SUPER_USER: gid = args.group or ev.get_group_id() if not gid: await bot.kkr_send(ev, 'Usage: -g|--group <group_id> [-a|--all]') return else: gid = ev.get_group_id() msg = svs_to_msg(Service.get_loaded_services().values(), gid, verbose_all, only_hidden) await bot.kkr_send(ev, msg)
async def on_input_chara_name(bot: KokkoroBot, ev: EventInterface): gid = ev.get_group_id() uid = ev.get_author_id() if winner_judger.get_on_off_status(gid): s = ev.get_param().remain cid = chara.name2id(s) correct_id = winner_judger.get_result(gid) if cid != chara.UNKNOWN and cid == winner_judger.get_result(gid) and winner_judger.get_winner(gid) == None: winner_judger.record_winner(gid, uid) winning_counter = WinningCounter(DB_PATH) winning_counter._record_winning(gid, uid) winning_count = winning_counter._get_winning_number(gid, uid) nick = ev.get_author().get_nick_name() msg_part = f'{nick}猜对了,真厉害!TA已经猜对{winning_count}次了~' c = chara.fromid(correct_id) msg = f'正确答案是: {c.name}' await bot.kkr_send(ev, msg) await bot.kkr_send(ev, c.icon) await bot.kkr_send(ev, msg_part) winner_judger.turn_off(gid)
async def africa(bot: KokkoroBot, ev: EventInterface): cmd = ev.get_param().plain_text if cmd in util.join_iterable(_africa, _image_suffix) or random.random() < 0.05: await bot.kkr_send(ev, R.img('非洲人.png'))
async def new_year_burst(bot: KokkoroBot, ev: EventInterface): cmd = ev.get_param().plain_text if cmd in util.join_iterable(_ch, _image_suffix) or random.random() < 0.02: await bot.kkr_send(ev, R.img('newyearburst.gif')) await bot.kkr_send(ev, nyb_player)
async def new_year_burst(bot: KokkoroBot, ev: EventInterface): cmd = ev.get_param().plain_text if cmd in util.join_iterable(_ue_sorry, _image_suffix) or random.random() < 0.02: await bot.kkr_send(ev, R.img('ue_sorry.jpg'))
async def dice(bot: KokkoroBot, ev: EventInterface): num, min_, max_, opr, offset = 1, 1, 100, 1, 0 match = ev.get_param().match if s := match.group('num'): num = int(s)
async def kc_marriage(bot: KokkoroBot, ev: EventInterface): wife = ev.get_param().remain tip = f'与{wife}的ケッコンカッコカリ结果是:' if wife else '的ケッコンカッコカリ结果是:' await do_dice(bot, ev, 1, 3, 6, 1, 0, tip)
async def pcr_horse(bot, ev: EventInterface): remain = ev.get_param().remain await _horse(bot, ev, remain == '-m')
async def broadcast(bot: KokkoroBot, ev: EventInterface): msg = ev.get_param().remain await sv.broadcast(msg)
async def chat_queshi(bot: KokkoroBot, ev: EventInterface): cmd = ev.get_param().plain_text if cmd in ['确实.jpg'] or random.random() < 0.05: await bot.kkr_send(ev, R.img('确实.jpg'))