コード例 #1
0
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)
コード例 #2
0
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)
コード例 #3
0
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)
コード例 #4
0
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
コード例 #5
0
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))
コード例 #6
0
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)
コード例 #7
0
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']}")
コード例 #8
0
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)
コード例 #9
0
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)
コード例 #10
0
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)
コード例 #11
0
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)
コード例 #12
0
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'出现错误,请联系维护组嘤嘤嘤')
コード例 #13
0
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)
コード例 #14
0
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)
コード例 #15
0
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}")
コード例 #16
0
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)
コード例 #17
0
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
コード例 #18
0
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)
コード例 #19
0
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)
コード例 #20
0
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
コード例 #21
0
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)
コード例 #22
0
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'))
コード例 #23
0
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)
コード例 #24
0
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()
コード例 #25
0
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)
コード例 #26
0
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'))
コード例 #27
0
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)
コード例 #28
0
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))
コード例 #29
0
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)
コード例 #30
0
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())