async def lock_boss(bot: KokkoroBot, ev: EventInterface, args: ParseResult): bm = BattleMaster(ev.get_group_id()) _check_clan(bm) _check_member(bm, ev.get_author_id(), bm.group) sub = _load_sub(bm.group) lock = sub.get_lock_info() if lock: uid, ts = lock[0] time = datetime.fromtimestamp(ts) mem = bm.get_member(uid, bm.group) or bm.get_member(uid, 0) or { 'name': str(uid) } delta = datetime.now() - time delta = timedelta(seconds=round( delta.total_seconds())) # ignore miliseconds msg = f"\n锁定失败:{mem['name']}已于{delta}前锁定了Boss" await bot.kkr_send(ev, msg, at_sender=True) else: uid = ev.get_author_id() time = datetime.now() sub.set_lock(uid, datetime.now().timestamp()) _save_sub(sub, bm.group) msg = f"已锁定Boss" await bot.kkr_send(ev, msg, at_sender=True)
async def subscribe(bot: KokkoroBot, ev: EventInterface, args: ParseResult): bm = BattleMaster(ev.get_group_id()) uid = ev.get_author_id() _check_clan(bm) _check_member(bm, uid, bm.group) sub = _load_sub(bm.group) boss = args[''] memo = args.M boss_name = bm.int2kanji(boss) slist = sub.get_sub_list(boss) mlist = sub.get_memo_list(boss) limit = sub.get_sub_limit(boss) if uid in slist: raise AlreadyExistError(f'您已经预约过{boss_name}王了') msg = [''] if len(slist) < limit: sub.add_sub(boss, uid, memo) _save_sub(sub, bm.group) msg.append(f'已为您预约{boss_name}王!') else: msg.append(f'预约失败:{boss_name}王预约人数已达上限') msg.append(f'=== 当前队列 {len(slist)}/{limit} ===') msg.extend(_gen_namelist_text(bot, bm, slist, mlist)) msg.append(SUBSCRIBE_TIP) 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 pcr_comp(bot, ev: EventInterface): global g_result, g_uid uid = ev.get_author_id() if not lmt.check(uid): await bot.kkr_send(ev, '今天已经赛过5次力', at_sender=True) return if g_result != []: await bot.kkr_send(ev, '上一场比赛尚未结束,请等待', at_sender=True) return lmt.increase(uid) await bot.kkr_send(ev, f'第○届兰德索尔杯比赛开始!', at_sender=True) gid = str(ev.get_group_id()) player = Player(_group_pool[gid]) result = player.get_chara() result_number = player.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]) result_name = [f'{c.name}' for c in result] res_name = ' '.join(result_name) if sv.bot.config.ENABLE_IMAGE: await bot.kkr_send(ev, res) await bot.kkr_send(ev, f'{res_name}\n※发送“选中+角色名称”开始比赛', at_sender=False) else: await bot.kkr_send(ev, f'Image is disabled') save_player(result_name) g_uid = uid
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 login(bot: KokkoroBot, ev: EventInterface, args: ParseResult): if False and "this message is from group": # FIXME return '请私聊使用' wm = WebMaster() uid = ev.get_author_id() gid = ev.get_group_id() auth = ev.get_author().get_priv() member = wm.get_member(uid, gid) if member is None: await bot.kkr_send(ev, '请先加入公会') return member['authority_group'] = 100 if auth == SUPERUSER: member['authority_group'] = 1 elif auth == ADMIN: member['authority_group'] = 10 wm.mod_member(member) user = wm.get_or_add_user(uid, rand_string(16)) login_code = rand_string(6) user['login_code'] = login_code user['login_code_available'] = True user['login_code_expire_time'] = int(time.time()) + 60 wm.mod_user(user) url = urljoin( config.PUBLIC_ADDRESS, '{}login/c/#uid={}&key={}'.format( config.PUBLIC_BASEPATH, user['uid'], login_code, )) await bot.kkr_send_dm(ev, url)
async def add_member(bot: KokkoroBot, ev: EventInterface, args: ParseResult): bm = BattleMaster(ev.get_group_id()) clan = _check_clan(bm) uid = args['@'] or args.uid name = args[''] or args.name author = ev.get_author() if uid == None: uid = ev.get_author_id() else: if uid != ev.get_author_id(): _check_admin(ev, '才能添加其他人') # if not ev.whether_user_in_group(uid): # raise NotFoundError(f'Error: 无法获取该群员信息,请检查{uid}是否属于本群') ## if we can't get name from mentions # if not name and : # m = await bot.get_group_member_info(self_id=ctx['self_id'], group_id=bm.group, user_id=uid) # name = m['card'] or m['nickname'] or str(m['user_id']) name = name or author.get_nick_name() or author.get_name() mem = bm.get_member(uid, bm.group) or bm.get_member(uid, 0) # 兼容cmdv1 if mem: bm.mod_member(uid, mem['alt'], name, 1) await bot.kkr_send(ev, f'成员{bot.kkr_at(uid)}昵称已修改为{name}') else: bm.add_member(uid, bm.group, name, 1) await bot.kkr_send( ev, f"成员{bot.kkr_at(uid)}添加成功!欢迎{name}加入{clan['name']}")
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 del_member(bot: KokkoroBot, ev: EventInterface, args: ParseResult): bm = BattleMaster(ev.get_group_id()) uid = args['@'] or args.uid or ev.get_author_id() mem = _check_member(bm, uid, bm.group, '公会内无此成员') if uid != ev.get_author_id(): _check_admin(ev, '才能踢人') bm.del_member(uid, mem['alt']) await bot.kkr_send(ev, f"成员{mem['name']}已从公会删除", at_sender=True)
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 add_challenge_timeout(bot: KokkoroBot, ev: EventInterface, args: ParseResult): challenge = ParseResult({ 'round': args.R, 'boss': args.B, 'damage': 0, 'uid': args['@'] or args.uid or ev.get_author_id(), 'alt': ev.get_group_id(), 'flag': BattleMaster.TIMEOUT }) await process_challenge(bot, ev, challenge)
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 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 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 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 stat_score(bot: KokkoroBot, ev: EventInterface, args: ParseResult): bm = BattleMaster(ev.get_group_id()) now = datetime.now() clan = _check_clan(bm) yyyy, mm, _ = bm.get_yyyymmdd(now) stat = bm.stat_score(1, now) stat.sort(key=lambda x: x[3], reverse=True) if not len(stat): await bot.kkr_send(ev, f"{clan['name']}{yyyy}年{mm}月会战统计数据为空", at_sender=True) return # msg = [ f"\n{yyyy}年{mm}月会战{clan['name']}分数统计:" ] # for _, _, name, score in stat: # score = f'{score:,d}' # 数字太多会被腾讯ban,用逗号分隔 # blank = ' ' * (11-len(score)) # QQ字体非等宽,width(空格*2) == width(数字*1) # msg.append(f"{blank}{score}分 | {name}") # generate statistic figure fig, ax = plt.subplots() score = list(map(lambda i: i[3], stat)) yn = len(stat) name = list(map(lambda i: i[2], stat)) y_pos = list(range(yn)) if score[0] >= 1e8: unit = 1e8 unit_str = 'e' else: unit = 1e4 unit_str = 'w' y_size = 0.3 * yn + 1.0 fig.set_size_inches(10, y_size) bars = ax.barh(y_pos, score, align='center') ax.set_title(f"{clan['name']}{yyyy}年{mm}月会战分数统计") ax.set_yticks(y_pos) ax.set_yticklabels(name) ax.set_ylim((-0.6, yn - 0.4)) ax.invert_yaxis() ax.set_xlabel('分数') ax.ticklabel_format(axis='x', style='plain') for rect in bars: w = rect.get_width() ax.text(w, rect.get_y() + rect.get_height() / 2, f'{w/unit:.2f}{unit_str}', ha='left', va='center') plt.subplots_adjust(left=0.12, right=0.96, top=1 - 0.35 / y_size, bottom=0.55 / y_size) await bot.kkr_send(ev, fig) plt.close() msg = f"※伤害统计请发送“!伤害统计”" await bot.kkr_send(ev, msg, at_sender=True)
async def avatar_guess(bot: KokkoroBot, ev: EventInterface): try: gid = ev.get_group_id() if winner_judger.get_on_off_status(gid): await bot.kkr_send(ev, "此轮猜头像还没结束 0x0") return winner_judger.turn_on(gid) chara_id_list = list(_pcr_data.CHARA_NAME.keys()) random.shuffle(chara_id_list) i = 0 while chara_id_list[i] in BLACKLIST_ID: i += 1 correct_id = chara_id_list[i] winner_judger.set_result(gid, correct_id) msg = f'猜猜这个图片是哪位角色头像的一部分?\n※发送"头像提示",可以得到更多信息~\n※回答时请加前缀 ag\n※示例:ag 可可萝' await bot.kkr_send(ev, msg) group_hint_cnt[gid] = 0 await hint(bot, ev) except Exception as e: winner_judger.turn_off(gid) raise e
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 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 description_guess(bot: KokkoroBot, ev: EventInterface): try: gid = ev.get_group_id() if winner_judger.get_on_off_status(gid): await bot.kkr_send(ev, "此轮猜角色还没结束 0x0") return winner_judger.turn_on(gid) msg = f'猜猜这是哪位角色?\n※发送"角色提示",可以得到更多信息~\n※回答时请加前缀 dg\n※示例:dg 可可萝' await bot.kkr_send(ev, msg) desc_lable = ['名字', '公会', '生日', '年龄', '身高', '体重', '血型', '种族', '喜好', '声优'] desc_suffix = ['', '', '', '', 'cm', 'kg', '', '', '', ''] index_list = list(range(1,10)) random.shuffle(index_list) chara_id_list = list(_chara_data.CHARA_DATA.keys()) random.shuffle(chara_id_list) chara_id = chara_id_list[0] chara_desc_list = _chara_data.CHARA_DATA[chara_id] winner_judger.set_result(gid, chara_id) # init group_hints[gid] = { 'index_list': index_list, 'desc_lable': desc_lable, 'chara_desc_list': chara_desc_list, 'desc_suffix': desc_suffix } group_hint_cnt[gid] = 0 await hint(bot, ev) except Exception as e: winner_judger.turn_off(gid) raise e
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 _do_show_remain(bot: KokkoroBot, ev: EventInterface, args: ParseResult, at_user: bool): bm = BattleMaster(ev.get_group_id()) clan = _check_clan(bm) if at_user: _check_admin(ev, '才能催刀。您可以用【!查刀】查询余刀') rlist = bm.list_challenge_remain( 1, datetime.now() - timedelta(days=args.get('D', 0))) rlist.sort(key=lambda x: x[3] + x[4], reverse=True) msg = [f"\n{clan['name']}今日余刀:"] sum_remain = 0 for uid, _, name, r_n, r_e in rlist: if r_n or r_e: msg.append( f"剩{r_n}刀 补时{r_e}刀 | {bot.kkr_at(uid) if at_user else name}") sum_remain += r_n if len(msg) == 1: await bot.kkr_send(ev, f"今日{clan['name']}所有成员均已下班!各位辛苦了!", at_sender=True) else: msg.append(f'共计剩余{sum_remain}刀') msg.append('若有负数说明报刀有误 请注意核对\n使用“!出刀记录 @id”可查看详细记录') if at_user: msg.append("=========\n在?阿sir喊你出刀啦!") await bot.kkr_send(ev, '\n'.join(msg), at_sender=True) if at_user: await bot.kkr_send(ev, R.img('priconne/催刀.jpg'))
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 send_time_dist(bot: KokkoroBot, event: EventInterface): gid = event.get_group_id() year,month = get_ym() try: name,times = get_time(gid,year,month) except Exception as e: await bot.kkr_send(event, f"出现错误: {str(e)}\n请联系开发组调教。") return plt.rcParams['axes.unicode_minus']=False prop = fm.FontProperties(fname=FONT_PATH) prop.set_size('large') fig,ax = plt.subplots(figsize=(12,6),facecolor='white') ax.set_xlabel('时间',fontproperties=prop) ax.set_ylabel('刀数',fontproperties=prop) ax.set_title(f'{name}{year}年{month}月会战出刀时间统计',fontproperties=prop) ax.set_xlim((0-0.5,24)) ax.spines['top'].set_visible(False) ax.spines['right'].set_visible(False) colors=(['#808080']*6)+(['#9bc5af']*6)+(['#c54731']*6)+(['#3a4a59']*6) plt.xticks(range(24),fontproperties=prop) plt.bar(range(24),times,color=colors) await bot.kkr_send(event, fig) plt.close()
async def clear_member(bot: KokkoroBot, ev: EventInterface, args: ParseResult): bm = BattleMaster(ev.get_group_id()) clan = _check_clan(bm) _check_admin(ev) msg = f"{clan['name']}已清空!" if bm.clear_member() else f"{clan['name']}已无成员" await bot.kkr_send(ev, msg, at_sender=True)
async def add_sos(bot: KokkoroBot, ev: EventInterface, args: ParseResult): bm = BattleMaster(ev.get_group_id()) uid = ev.get_author_id() clan = _check_clan(bm) _check_member(bm, uid, bm.group) sub = _load_sub(bm.group) tree = sub.get_tree_list() if uid in tree: raise AlreadyExistError("您已在树上") sub.add_tree(uid) _save_sub(sub, bm.group) msg = ["\n您已上树,本Boss被击败时将会通知您", f"目前{clan['name']}挂树人数为{len(tree)}人:"] msg.extend(_gen_namelist_text(bot, bm, tree)) await bot.kkr_send(ev, '\n'.join(msg), at_sender=True) await bot.kkr_send(ev, R.img('priconne/挂树.jpg'))
async def del_challenge(bot: KokkoroBot, ev: EventInterface, args: ParseResult): bm = BattleMaster(ev.get_group_id()) now = datetime.now() clan = _check_clan(bm) ch = bm.get_challenge(args.E, 1, now) if not ch: raise NotFoundError(f'未找到出刀记录E{args.E}') if ch['uid'] != ev.get_author_id(): _check_admin(ev, '才能删除其他人的记录') bm.del_challenge(args.E, 1, now) await bot.kkr_send( ev, f"{clan['name']}已删除{bot.kkr_at(ch['uid'])}的出刀记录E{args.E}", at_sender=True)
async def list_challenge(bot: KokkoroBot, ev: EventInterface, args: ParseResult): bm = BattleMaster(ev.get_group_id()) clan = _check_clan(bm) now = datetime.now() - timedelta(days=args.D) zone = bm.get_timezone_num(clan['server']) uid = args['@'] or args.uid if uid: mem = _check_member(bm, uid, bm.group, '公会内无此成员') challen = bm.list_challenge_of_user_of_day(mem['uid'], mem['alt'], now, zone) else: challen = bm.list_challenge_of_day(clan['cid'], now, zone) msg = [f'{clan["name"]}出刀记录:\n编号|出刀者|周目|Boss|伤害|标记'] challenstr = 'E{eid:0>3d}|{name}|r{round}|b{boss}|{dmg: >7,d}{flag_str}' for c in challen: mem = bm.get_member(c['uid'], c['alt']) c['name'] = mem['name'] if mem else c['uid'] flag = c['flag'] c['flag_str'] = '|' + ','.join( BattleMaster.damage_kind_to_string(flag)) msg.append(challenstr.format_map(c)) await bot.kkr_send(ev, '\n'.join(msg))
async def add_challenge(bot: KokkoroBot, ev: EventInterface, args: ParseResult): challenge = ParseResult({ 'round': args.R, 'boss': args.B, 'damage': args.get(''), 'uid': args['@'] or args.uid or ev.get_author_id(), 'alt': ev.get_group_id(), 'flag': BattleMaster.NORM, 'dayoffset': args.get('D', 0) }) await process_challenge(bot, ev, challenge) damage = args.get('') if isDD(damage): await jiuzhe(bot, ev)
async def description_guess_group_ranking(bot: KokkoroBot, ev: EventInterface): members = ev.get_members_in_group() card_winningcount_dict = {} winning_counter = WinningCounter(DB_PATH) for member in members: if member.get_id() != ev.get_author_id(): card_winningcount_dict[ member.get_nick_name()] = winning_counter._get_winning_number( ev.get_group_id(), member.get_id()) group_ranking = sorted(card_winningcount_dict.items(), key=lambda x: x[1], reverse=True) msg = '猜头像小游戏此群排行为:\n' for i in range(min(len(group_ranking), 10)): if group_ranking[i][1] != 0: msg += f'第{i+1}名: {group_ranking[i][0]}, 猜对次数: {group_ranking[i][1]}次\n' await bot.kkr_send(ev, msg.strip())