Exemplo n.º 1
0
async def list_member(session: CommandSession):
    parser = ArgumentParser(session=session, usage='list-member [--cid]')
    parser.add_argument('--cid', type=int, default=1)
    args = parser.parse_args(session.argv)

    group_id = session.ctx['group_id']
    cid = args.cid

    battlemaster = BattleMaster(group_id)
    clan = battlemaster.get_clan(cid)

    if not clan:
        await session.finish('Error: 指定的分会不存在')
    cmems = battlemaster.list_member(cid)
    if len(cmems):
        msg = f'{cid}会成员一览:  {len(cmems)}/30\n'
        # 数字太多会被腾讯ban
        memstr = '{uid: <11,d} {name}\n'
        memstr_alt = '{uid: <11,d} {name} 小号{alt}\n'

        for m in cmems:
            msg = msg + (memstr.format_map(m)
                         if not m['alt'] else memstr_alt.format_map(m))
        await session.send(msg)
    else:
        await session.send(f'{cid}会目前还没有成员')
Exemplo n.º 2
0
async def show_remain(session: CommandSession):

    parser = ArgumentParser(session=session, usage='show-remain [--cid]')
    parser.add_argument('--cid', type=int, default=1)
    args = parser.parse_args(session.argv)

    group_id = session.ctx['group_id']
    cid = args.cid

    battlemaster = BattleMaster(group_id)

    if not battlemaster.has_clan(cid):
        session.finish(f'本群还没有{cid}会哦!使用list-clan查看本群所有公会')

    stat = battlemaster.list_challenge_remain(cid, datetime.now())

    is_admin = await perm.check_permission(session.bot, session.ctx,
                                           perm.GROUP_ADMIN)
    msg1 = []
    for uid, alt, name, rem_n, rem_e in stat:
        if rem_n or rem_e:
            line = ( str(MessageSegment.at(uid)) if is_admin else name ) + \
                   ( f'的小号{alt} ' if alt else '' ) + \
                   ( f' 余{rem_n}刀 补时{rem_e}刀\n' if rem_e else f'余{rem_n}刀\n' )
            msg1.append(line)

    if msg1:
        await session.send('今日余刀统计:\n' + ''.join(msg1))
    else:
        await session.send(f'{cid}会所有成员均已出完刀!各位辛苦了!')
Exemplo n.º 3
0
async def translate(session: nonebot.CommandSession):
    parser = ArgumentParser(session=session, usage=__plugin_usage__)
    parser.add_argument('content')
    args = parser.parse_args(session.argv)
    try:
        tr = '\n'.join([line["tgt"] for line in await YoudaoFanyi().fanyi(str(args.content))])
        await session.send(tr)
    except Exception as e:
        nonebot.logger.error(e)
        await session.send('出错啦!')
Exemplo n.º 4
0
async def sched_remove(session: CommandSession):
    parser = ArgumentParser(session=session, usage=usage.REMOVE)
    parser.add_argument('name')
    args = parser.parse_args(session.argv)
    ok = await scheduler.remove_job(scheduler.make_job_id(
        PLUGIN_NAME, context_id(session.ctx), args.name))
    if ok:
        await session.send(f'成功删除计划任务 {args.name}')
    else:
        await session.send(f'没有找到计划任务 {args.name},请检查你的输入是否正确')
Exemplo n.º 5
0
async def lssv(session:CommandSession):
    parser = ArgumentParser(session=session)
    parser.add_argument('-a', '--all', action='store_true')
    parser.add_argument('-H', '--hidden', action='store_true')
    parser.add_argument('-g', '--group', type=int, default=0)
    args = parser.parse_args(session.argv)
    
    verbose_all = args.all
    only_hidden = args.hidden
    if session.ctx['user_id'] in session.bot.config.SUPERUSERS:
        gid = args.group or session.ctx.get('group_id')
        if not gid:
            session.finish('Usage: -g|--group <group_id> [-a|--all]')
    else:
        gid = session.ctx['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 session.send('\n'.join(msg))
Exemplo n.º 6
0
async def addrss(session: CommandSession):
    parser = ArgumentParser(session=session)
    parser.add_argument('name')
    parser.add_argument('url')
    parser.add_argument('-r', '--rsshub', action='store_true')
    args = parser.parse_args(session.argv)
    name = args.name
    url = BASE_URL+args.url if args.rsshub else args.url
    try:
        stats = await aiohttpx.head(url, timeout=5, allow_redirects=True)
    except Exception as e:
        sv.logger.exception(e)
        sv.logger.error(type(e))
        session.finish('请求路由失败,请稍后再试')
    if stats.status_code != 200:
        session.finish('请求路由失败,请检查路由状态')
    rss = Rss(url)
    if not await rss.has_entries:
        session.finish('暂不支持该RSS')
    try:
        Rssdata.replace(url=rss.url, name=name, group=session.event.group_id, date=await rss.last_update).execute()
    except Exception as e:
        sv.logger.exception(e)
        sv.logger.error(type(e))
        session.finish('添加订阅失败')
    session.finish(f'添加订阅{name}成功')
Exemplo n.º 7
0
async def sched_get(session: CommandSession):
    parser = ArgumentParser(session=session, usage=usage.GET)
    parser.add_argument('name')
    args = parser.parse_args(session.argv)
    job = await scheduler.get_job(scheduler.make_job_id(
        PLUGIN_NAME, context_id(session.ctx), args.name))
    if not job:
        await session.send(f'没有找到计划任务 {args.name},请检查你的输入是否正确')
        return

    await session.send('找到计划任务如下')
    await session.send(format_job(args.name, job))
Exemplo n.º 8
0
async def set_group(session: CommandSession):
    parser = ArgumentParser(session=session, usage=USAGE)
    parser.add_argument('-ls', '--list', action='store_true')
    parser.add_argument('-l', '--leave', type=int, default=0)
    args = parser.parse_args(session.argv)
    if args.list:
        await ls_group(session)
    elif args.leave:
        gid = args.leave
        await leave_group(session, gid)
    else:
        await session.finish(USAGE)
Exemplo n.º 9
0
async def show_progress(session: CommandSession):
    parser = ArgumentParser(session=session, usage='show-progress [--cid]')
    parser.add_argument('--cid', type=int, default=1)
    args = parser.parse_args(session.argv)

    group_id = session.ctx['group_id']
    battlemaster = BattleMaster(group_id)
    cid = args.cid
    clan = battlemaster.get_clan(cid)
    if not clan:
        await session.finish(f'本群不存在{cid}会')
    round_, boss, remain_hp = battlemaster.get_challenge_progress(cid, datetime.now())
    total_hp = battlemaster.get_boss_hp(round_, boss, clan['server'])
    score_rate = battlemaster.get_score_rate(round_, boss, clan['server'])

    await session.send(f'当前{cid}会进度:\n{round_}周目 老{battlemaster.int2kanji(boss)} HP={remain_hp}/{total_hp} x{score_rate:.1f}')
Exemplo n.º 10
0
async def ls(session: CommandSession):
    parser = ArgumentParser(session=session)
    switch = parser.add_mutually_exclusive_group()
    switch.add_argument('-g', '--group', action='store_true')
    switch.add_argument('-f', '--friend', action='store_true')
    switch.add_argument('-b', '--bot', action='store_true')
    switch.add_argument('-s', '--service')
    args = parser.parse_args(session.argv)

    if args.group:
        await ls_group(session)
    elif args.friend:
        await ls_friend(session)
    elif args.bot:
        await ls_bot(session)
    elif args.service:
        await ls_service(session, args.service)
Exemplo n.º 11
0
async def list_challenge(session: CommandSession):
    parser = ArgumentParser(session=session,
                            usage='list-challenge [--cid] [--all]')
    parser.add_argument('--cid', type=int, default=1)
    # parser.add_argument('--uid', type=int, default=-1)
    # parser.add_argument('--alt', type=int, default=0)
    parser.add_argument('--all', action='store_true')
    args = parser.parse_args(session.argv)

    group_id = session.ctx['group_id']
    cid = args.cid

    battlemaster = BattleMaster(group_id)
    clan = battlemaster.get_clan(cid)

    if not clan:
        await session.finish(f'Error: 本群不存在{cid}会')

    now = datetime.now()
    zone = battlemaster.get_timezone_num(clan['server'])
    challen = battlemaster.list_challenge(
        cid, now) if args.all else battlemaster.list_challenge_of_day(
            cid, now, zone)

    msg = f'{cid}会出刀记录:\neid|name|round|boss|damage\n'
    challenstr = '{eid:0>3d}|{name}|r{round}|b{boss}|{dmg: >7,d}{flag_str}\n'
    for c in challen:
        mem = battlemaster.get_member(c['uid'], c['alt'])
        c['name'] = mem['name'] if mem else c['uid']
        flag = c['flag']
        c['flag_str'] = '|ext' if flag & BattleMaster.EXT else '|last' if flag & BattleMaster.LAST else '|timeout' if flag & BattleMaster.TIMEOUT else ''
        msg = msg + challenstr.format_map(c)
    await session.send(msg)
Exemplo n.º 12
0
async def add_clan(session:CommandSession):

    if not await perm.check_permission(session.bot, session.ctx, perm.GROUP_ADMIN):
        await session.finish('Error: 只有管理员才能添加新公会')

    parser = ArgumentParser(session=session, usage='add-clan --name [--cid] --server')
    parser.add_argument('--name', default=None, required=False)
    parser.add_argument('--cid', type=int, default=-1)
    parser.add_argument('--server', default='Unknown')
    args = parser.parse_args(session.argv)
    group_id = session.ctx['group_id']
    battlemaster = BattleMaster(group_id)

    name = args.name
    if not name:
        ginfo = await session.bot._get_group_info(self_id=session.ctx['self_id'], group_id=group_id)
        name = ginfo['group_name']

    cid = args.cid
    if cid <= 0:
        clans = battlemaster.list_clan()
        for clan in clans:
            cid = clan['cid'] if clan['cid'] > cid else cid
        cid = cid + 1 if cid > 0 else 1

    server = battlemaster.get_server_code(args.server)
    if server < 0:
        await session.finish('请指定公会所在服务器 例【add-clan --server jp】')

    if battlemaster.add_clan(cid, name, server):
        await session.send('公会添加失败...ごめんなさい!嘤嘤嘤(〒︿〒)')
    else:
        await session.send(f'公会添加成功!{cid}会 {name}')
Exemplo n.º 13
0
async def del_challenge(session: CommandSession):
    parser = ArgumentParser(session=session,
                            usage='del-challenge --eid [--cid]')
    parser.add_argument('--eid', type=int)
    parser.add_argument('--cid', type=int, default=1)
    args = parser.parse_args(session.argv)

    eid = args.eid
    group_id = session.ctx['group_id']
    cid = args.cid

    battlemaster = BattleMaster(group_id)
    clan = battlemaster.get_clan(cid)

    if not clan:
        await session.finish(f'Error: 本群不存在{cid}会')

    now = datetime.now()
    challen = battlemaster.get_challenge(eid, cid, now)

    if not challen:
        await session.finish(f'Error: 无法在{cid}会的记录中找到编号为{eid}的出刀记录')

    if challen['uid'] != session.ctx['user_id']:
        if not await perm.check_permission(session.bot, session.ctx,
                                           perm.GROUP_ADMIN):
            await session.finish('Error: 只有管理员删除其他人的出刀记录')

    if battlemaster.del_challenge(eid, cid, now):
        await session.send('记录删除失败...ごめんなさい!嘤嘤嘤(〒︿〒)')
    else:
        await session.send(f'已成功删除{cid}会的{eid}号出刀记录')
Exemplo n.º 14
0
async def del_member(session: CommandSession):
    parser = ArgumentParser(session=session,
                            usage='del-member [--uid] [--alt]')
    parser.add_argument('--uid', type=int, default=-1)
    parser.add_argument('--alt', type=int, default=0)
    args = parser.parse_args(session.argv)

    group_id = session.ctx['group_id']
    uid = args.uid if args.uid > 0 else session.ctx['user_id']
    alt = args.alt

    battlemaster = BattleMaster(group_id)

    mem = battlemaster.get_member(uid, alt)

    if mem == None:
        await session.finish('Error: 指定成员不在本群')

    if uid != session.ctx['user_id']:
        if not await perm.check_permission(session.bot, session.ctx,
                                           perm.GROUP_ADMIN):
            await session.finish('Error: 只有管理员才能删除其他成员')

    if battlemaster.del_member(uid, alt):
        await session.send('成员删除失败...ごめんなさい!嘤嘤嘤(〒︿〒)')
    else:
        await session.send(f"成员{mem['name']}已从{mem['cid']}会删除")
Exemplo n.º 15
0
async def _(session: CommandSession):
    arg = session.current_arg_text.strip()

    if session.is_first_run:
        parser = ArgumentParser(session=session)

        parser.add_argument("--fr", "-f", type=str, default="no")
        parser.add_argument("--to", "-t", type=str, default="no")
        parser.add_argument("token", type=str, default="", nargs="+")
        argv = parser.parse_args(session.current_arg.split(" "))

        arg = " ".join(argv.token)

    if arg == "":
        session.pause("输入不能为空哦!")

    session.state["fr"] = detect(arg) if argv.fr == "no" else argv.fr

    if session.state["fr"][:2] == "zh":
        session.state["fr"] = "zh"

    if argv.to == "no":
        if session.state["fr"] == "zh":
            session.state["to"] = "en"
        else:
            session.state["to"] = "zh"
    else:
        session.state["to"] = argv.to

    if argv.fr == "no":
        session.state["fr"] = "auto"

    session.state["token"] = arg
Exemplo n.º 16
0
async def _(session: CommandSession):
    stripped_arg = session.current_arg_text.strip()
    if session.is_first_run:
        if stripped_arg == "":
            return
        parser = ArgumentParser(session=session)
        parser.add_argument("-l", "--language", default="python", help="指定编程语言")
        parser.add_argument("source", help="运行源代码", nargs="*")
        argv = parser.parse_args(stripped_arg.split(" "))
        language = argv.language
        if language not in SUPPORTED_LANGUAGES:
            session.finish("暂时不支持运行你输入的编程语言")
        session.state["language"] = language
        source = " ".join(argv.source)
        if source == "":
            return
        session.state["code"] = " ".join(argv.source)
        return

    if not stripped_arg:
        return

    if not stripped_arg:
        session.pause("请输入有效内容")
    if session.current_key == "language":
        if stripped_arg not in SUPPORTED_LANGUAGES:
            session.finish("暂时不支持运行你输入的编程语言")
    session.state[session.current_key] = stripped_arg
Exemplo n.º 17
0
async def testrss(session: CommandSession):
    parser = ArgumentParser(session=session)
    parser.add_argument('name')
    args = parser.parse_args(session.argv)
    name = args.name
    try:
        res = Rssdata.select(Rssdata.url).where(Rssdata.name == name, Rssdata.group ==
                                                session.event.group_id)
        r = res[0]
        rss = Rss(r.url)
        newinfo = await rss.get_new_entry_info()
    except Exception as e:
        sv.logger.exception(e)
        sv.logger.error(type(e))
        session.finish(f'test {name}失败')
    msg = [f'订阅 {name} TEST!']
    msg.append(CQimage(info2pic(newinfo)))
    msg.append(f'链接: {newinfo["链接"]}')
    session.finish('\n'.join(msg))
Exemplo n.º 18
0
async def show_remain(session: CommandSession):

    print(f'[{datetime.now()} show_remain] Function called')

    parser = ArgumentParser(session=session, usage='show-remain [--cid]')
    parser.add_argument('--cid', type=int, default=1)
    args = parser.parse_args(session.argv)

    print(f'[{datetime.now()} show_remain] arguments parsed')

    group_id = session.ctx['group_id']
    cid = args.cid

    print(f'[{datetime.now()} show_remain] getting BattleMaster...')
    battlemaster = BattleMaster(group_id)
    print(f'[{datetime.now()} show_remain] got BattleMaster!')
    print(
        f'[{datetime.now()} show_remain] call battlemaster.list_challenge_remain'
    )
    stat = battlemaster.list_challenge_remain(cid, datetime.now())
    print(f'[{datetime.now()} show_remain] got remain stat')

    print(f'[{datetime.now()} show_remain] checking permission')
    is_admin = await check_permission(session.bot, session.ctx, GROUP_ADMIN)
    print(f'[{datetime.now()} show_remain] permission: is_admin={is_admin}')
    print(f'[{datetime.now()} show_remain] generating message...')
    msg1 = []
    for uid, alt, name, rem_n, rem_e in stat:
        if rem_n or rem_e:
            line = ( str(MessageSegment.at(uid)) if is_admin else name ) + \
                   ( f'的小号{alt} ' if alt else '' ) + \
                   ( f' 余{rem_n}刀 补时{rem_e}刀\n' if rem_e else f'余{rem_n}刀\n' )
            msg1.append(line)
    print(f'[{datetime.now()} show_remain] message prepared! sending...')

    if msg1:
        await session.send('今日余刀统计:\n' + ''.join(msg1))
    else:
        await session.send(f'{cid}会所有成员均已出完刀!各位辛苦了!')

    print(f'[{datetime.now()} show_remain] Function finished successfully.')
Exemplo n.º 19
0
async def stat(session: CommandSession):
    parser = ArgumentParser(session=session, usage='stat [--cid]')
    parser.add_argument('--cid', type=int, default=1)
    args = parser.parse_args(session.argv)

    group_id = session.ctx['group_id']
    cid = args.cid
    battlemaster = BattleMaster(group_id)
    stat = battlemaster.stat_score(cid, datetime.now())
    yyyy, mm, _ = BattleMaster.get_yyyymmdd(datetime.now())

    stat.sort(key=lambda x: x[3], reverse=True)
    msg1 = []
    for uid, alt, name, score in stat:
        # QQ字体非等宽,width(空格*2) == width(数字*1)
        # 数字太多会被腾讯ban,用逗号分隔
        score = f'{score:,d}'
        blank = ' ' * (11 - len(score)) * 2
        line = f"{blank}{score}分 {name}\n"

        msg1.append(line)
    await session.send(f'{yyyy}年{mm}月会战{cid}会分数统计:\n' + ''.join(msg1))
Exemplo n.º 20
0
async def translation(session: CommandSession):
    # 向用户发送信息
    parser = ArgumentParser(session=session, usage=__plugin_usage__)
    parser.add_argument('-o', '--original')
    parser.add_argument('-t', '--to')
    args = parser.parse_args(session.argv)
    langlist = {
        '中文': 'zh',
        '日语': 'jp',
        '泰语': 'th',
        '法语': 'fra',
        '英语': 'en',
        '西班牙语': 'spa',
        '韩语': 'kor',
        '越南语': 'vie',
        '德语': 'de',
        '俄语': 'ru',
        '阿拉伯语': 'ara',
        '爱沙尼亚语': 'est',
        '保加利亚语': 'bul',
        '波兰语': 'pl',
        '丹麦语': 'dan',
        '芬兰语': 'fin',
        '荷兰语': 'nl',
        '捷克语': 'cs',
        '罗马尼亚语': 'rom',
        '葡萄牙语': 'pt',
        '瑞典语': 'swe',
        '斯洛文尼亚语': 'slo',
        '希腊语': 'el',
        '匈牙利语': 'hu',
        '意大利语': 'it',
        '粤语': 'yue',
        '文言文': 'wyw',
        '中文繁体': 'cht'
    }
    try:
        text = args.original
        tolanguage = langlist[args.to]
    except:
        echo = "参数不足或不正确,请使用 --help 参数查询使用帮助"
    else:
        echo = render(text, tolanguage)
    await session.finish(echo, at_sender=True)
Exemplo n.º 21
0
async def switch(session: CommandSession):
    parser = ArgumentParser(session=session, usage=USAGE)
    parser.add_argument('-r',
                        '--repeat-message',
                        action='store_true',
                        default=False)
    parser.add_argument('message')
    args = parser.parse_args(session.argv)

    kill_current_session(session.ctx)

    msg = Message(args.message)
    if args.repeat_message:
        await session.send(msg)

    ctx = session.ctx.copy()
    ctx['message'] = msg
    ctx['to_me'] = True  # ensure to_me
    asyncio.ensure_future(handle_message(session.bot, ctx))
Exemplo n.º 22
0
async def lookrss(session: CommandSession):
    parser = ArgumentParser(session=session)
    parser.add_argument('name')
    parser.add_argument('-l', '--limit', default=5, type=int)
    args = parser.parse_args(session.argv)
    limit = args.limit
    name = args.name
    try:
        res = Rssdata.select(Rssdata.url).where(Rssdata.name == name, Rssdata.group ==
                                                session.event.group_id)
        r = res[0]
        rss = Rss(r.url, limit)
        infos = await rss.get_all_entry_info()
    except Exception as e:
        sv.logger.exception(e)
        sv.logger.error(type(e))
        session.finish(f'查订阅{name}失败')
    msg = [f'{name}的最近记录:']
    msg.append(infos2pic(infos))
    msg.append('详情可看: '+await rss.link)
    session.finish('\n'.join(msg))
Exemplo n.º 23
0
async def add_clan(session: CommandSession):
    parser = ArgumentParser(session=session, usage='add-clan --name [--cid]')
    parser.add_argument('--name', default=None, required=False)
    parser.add_argument('--cid', type=int, default=-1)
    args = parser.parse_args(session.argv)
    group_id = session.ctx['group_id']
    battlemaster = BattleMaster(group_id)

    name = args.name
    if not name:
        ginfo = await session.bot._get_group_info(group_id=group_id)
        name = ginfo['group_name']

    cid = args.cid
    if cid <= 0:
        clans = battlemaster.list_clan()
        for clan in clans:
            cid = clan['cid'] if clan['cid'] > cid else cid
        cid = cid + 1 if cid > 0 else 1

    if battlemaster.add_clan(cid, name):
        await session.send('公会添加失败...ごめんなさい!嘤嘤嘤(〒︿〒)')
    else:
        await session.send(f'公会添加成功!{cid}会 {name}')
Exemplo n.º 24
0
async def bighead(session: CommandSession):

    parser = ArgumentParser(session=session, usage=BIGUSAGE)
    group = parser.add_argument_group()
    group.add_argument('-p', '--price', type=int, help="大头菜的价格")
    group.add_argument('-l',
                       '--list',
                       action='store_true',
                       help="列出当前有的大头菜价格",
                       default=False)
    group.add_argument('-d',
                       '--delt',
                       action='store_true',
                       help='删除你自己的大头菜价格',
                       default=False)

    args = parser.parse_args(session.argv)
    if args.price != None:
        if args.price > 810 or args.price < 0:
            session.finish('小老弟,你怎么回事?')
        async with db.pool.acquire() as conn:
            try:
                state = await conn.execute(
                    '''insert into datou (qid,price) values ({0},{1});'''.
                    format(session.event.user_id, args.price))
            except asyncpg.exceptions.ForeignKeyViolationError as e:
                await conn.execute(
                    '''insert into quser (qid,swid) values ({0},{1});'''.
                    format(
                        session.event.user_id,
                        swFormatter(
                            session.event.sender['card'] if session.
                            event['message_type'] != 'private' else '-1')))
                state = await conn.execute(
                    '''insert into datou (qid,price) values ({0},{1});'''.
                    format(session.event.user_id, args.price))
            except asyncpg.exceptions.UniqueViolationError as e:
                state = await conn.execute(
                    '''update datou set price = {1} where qid='{0}';'''.format(
                        session.event.user_id, args.price))

            values = await conn.fetch(
                '''select * from datou where qid = {0}'''.format(
                    session.event.user_id))

        logger.info('大头菜上市完成')

        session.finish(
            '已{}如下记录:\n'.format('添加' if 'UPDATE' not in state else '更新') +
            roomPaser(values[0], 1))

    elif args.list == True:
        bot = nonebot.get_bot()
        async with db.pool.acquire() as conn:
            values = await conn.fetch(
                '''select * from datou order by price DESC''')
        if len(values) == 0:
            session.finish('很遗憾,当前没有大头菜报价。')
        for i in range(min(maxbig_head, len(values))):
            await session.send(roomPaser(values[i]))
        if session.event['message_type'] == 'group' and len(
                values) <= maxbig_head:
            await session.send(
                unescape(f"{cq.at(session.event.user_id)} 全部报价如上。"))
        try:
            for value in values[maxbig_head:]:
                await bot.send_private_msg(message=roomPaser(value),
                                           user_id=session.event.user_id)
            if len(values) > maxbig_head:
                await bot.send_private_msg(message='全部报价如上。',
                                           user_id=session.event.user_id)
        except CQHttpError:
            session.finish(
                unescape(
                    f'{cq.at(session.event.user_id)} 剩余大头菜报价信息发送失败,请尝试与我发送临时消息。'
                ))
        if len(values
               ) > maxbig_head and session.event['message_type'] == 'group':
            pass
            # await session.send(unescape(f'{cq.at(session.event.user_id)} 剩余大头菜报价已私发,请查收。'))

    elif args.delt == True:
        async with db.pool.acquire() as conn:
            value = await conn.execute(
                f'select * from datou where qid={session.event.user_id}')
            if len(value) == 0:
                session.finish('你貌似并没有上市的大头菜。')
            await conn.execute(
                f'''delete from datou where qid={session.event.user_id};''')
        session.finish('删除完成')
Exemplo n.º 25
0
async def add_member(session: CommandSession):
    parser = ArgumentParser(
        session=session,
        usage=
        'add-member [--cid] [--uid] [--alt] [--name]\n\n加入1会:\n【 join-clan --name [游戏内昵称(缺省自动获取群名片)] 】\n将骑士A的小号2加入3会:\n【 add-member --uid [骑士A的QQ号] --alt 2 --cid 3 --name [骑士A的昵称] 】'
    )
    parser.add_argument('--cid', type=int, default=1)
    parser.add_argument('--uid', type=int, default=-1)
    parser.add_argument('--alt', type=int, default=0)
    parser.add_argument('--name', default=None)
    args = parser.parse_args(session.argv)

    group_id = session.ctx['group_id']
    cid = args.cid
    uid = args.uid if args.uid > 0 else session.ctx['user_id']
    alt = args.alt
    name = args.name
    try:  # 尝试获取群员信息,用以检查该成员是否在群中
        group_member_info = await session.bot.get_group_member_info(
            group_id=group_id, user_id=uid)
    except:
        await session.finish(
            f'Error: 无法获取到指定群员的信息,请检查{uid}是否属于本群\n(注:uid为QQ号,机器人无需九码,如有小号请指定alt参数)'
        )
        return
    if not name:
        name = group_member_info['card']
        if not name.strip():
            session.finish('Error: name参数未指定,且获取群名片为空。请尝试指定name参数(建议使用游戏内昵称)')

    battlemaster = BattleMaster(group_id)
    clan = battlemaster.get_clan(cid)
    if not clan:
        await session.finish(f'Error: 指定的分会{cid}不存在')
    if alt < 0:
        await session.finish('Error: 小号编号不能小于0')
    if uid != session.ctx['user_id']:
        if not await check_permission(session.bot, session.ctx, GROUP_ADMIN):
            await session.finish('Error: 只有管理员才能添加其他人到公会')

    if battlemaster.add_member(uid, alt, name, cid):
        await session.send(
            f'成员添加失败...ごめんなさい!嘤嘤嘤(〒︿〒)\n请检查帐号{uid}(的小号{alt})是否已存在于其他公会')
    else:
        msg_alt = f'的{alt}号小号' if alt else ''
        clan_name = clan['name']
        await session.send(f'成员添加成功!欢迎{name}{msg_alt}加入{cid}会 {clan_name}')
Exemplo n.º 26
0
async def schedule_add(session: CommandSession):
    """
    添加一个每日定时提醒,Asia/Shanghai时区
    :return:
    """
    ttype = 'cron'
    usage = r"""
添加提醒

使用方法:
    添加提醒 [OPTIONS]
    schedule_add [OPTIONS]
    sa [OPTIONS]

OPTIONS:
    -h, --help  显示本使用帮助
    -o, --hours HOURS 小时
    -m, --minutes MINUTES 分钟
    -j, --job_name JOB_NAME 任务名
    --at_sender at发送者
    --msg MSG 要发送的消息
""".strip()
    parser = ArgumentParser(session=session, usage=usage)
    parser.add_argument('-o', '--hours', help='小时')
    parser.add_argument('-m', '--minutes', help='分钟')
    parser.add_argument('-j', '--job_name', help='任务名')
    parser.add_argument('--at_sender',
                        action='store_const',
                        help='at发送者',
                        const='y')
    parser.add_argument('--msg', help='要发送的消息')
    args = parser.parse_args(session.argv)
    hours = int(args.hours if (args.hours is not None) else session.get(
        'hours',
        prompt='小时(0-23)',
        arg_filters=[
            handle_cancellation(session),
        ]  # 处理用户可能的取消指令
    ))
    if hours > 23 or hours < 0:
        await session.send('小时只能是0-23的整数')
        return

    minutes = int(args.minutes if (args.minutes is not None) else session.get(
        'minutes',
        prompt='分钟(0-59)',
        arg_filters=[
            handle_cancellation(session),
        ]  # 处理用户可能的取消指令
    ))
    if minutes > 59 or minutes < 0:
        await session.send('分钟只能是0-59的整数')
        return

    msg = (
        args.msg if (args.msg is not None) else session.get(
            'msg',
            prompt='发送要发的消息',
            arg_filters=[
                handle_cancellation(session),
            ]  # 处理用户可能的取消指令
        ))

    user_id = session.ctx['user_id']
    user_id = (await NUser.get(user_id)).nuid
    stype = 0 if 'group_id' in session.ctx else 1
    group_id = '' if stype else session.ctx['group_id']

    at_sender = (
        args.at_sender if (args.at_sender is not None) else session.get(
            'at_sender',
            prompt='是否需要at任务添加人(y/n)',
            arg_filters=[
                handle_cancellation(session),
            ]  # 处理用户可能的取消指令
        ))
    logger.debug('at_sender: ' + str(at_sender))
    at_sender = at_sender.lower() == 'y'
    logger.debug('at_sender: ' + str(at_sender))
    job_name = (
        args.job_name if (args.job_name is not None) else session.get(
            'job_name',
            prompt='计划任务名',
            arg_filters=[
                handle_cancellation(session),
            ]  # 处理用户可能的取消指令
        ))

    await add_cron_job(group_id=group_id,
                       send_type=stype,
                       msg=msg,
                       at_sender=at_sender,
                       user_id=user_id,
                       trigger=ttype,
                       hours=hours,
                       minutes=minutes,
                       job_name=job_name)
    await session.send('ok')
Exemplo n.º 27
0
async def notebook(session: CommandSession):

    if session.is_first_run:
        parser = ArgumentParser(session=session, usage=NOTEUSAGE)
        group = parser.add_mutually_exclusive_group()
        group.add_argument("-a", "--add", type=str, nargs="+", help="添加记录")
        group.add_argument("-l", "--list", action="store_true", help="查看记录")
        group.add_argument("-d", "--delt", type=str, help="删除记录")
        group.add_argument("-c", "--cls", action="store_true", help="清空记录")
        group.add_argument("-ls", "--listsort", action="store_true")

        args = parser.parse_args(session.argv)
    else:
        stripped_arg = session.current_arg_text.strip()

    if not session.is_first_run and (
        not stripped_arg and stripped_arg != "是" and stripped_arg != "否"
    ):
        session.pause("要输入「是」或者「否」中的一个哦。")

    if session.is_first_run and args.add != None:
        args.add = " ".join(args.add)
        if len(args.add) > 50:
            session.finish("呀,记录的长度不能超过 50 哦~")
        if args.add[0] == "*":
            session.finish("哦,当前并不支持以「*」开头的记录哦~")
        async with db.pool.acquire() as conn:
            try:
                values = await conn.fetch(
                    f"""select noteind from quser where qid = {session.event.user_id};"""
                )
                ind = values[0]["noteind"]
            except IndexError:
                await conn.execute(
                    """insert into quser (qid,swid) values ({0},{1});""".format(
                        session.event.user_id,
                        swFormatter(
                            session.event.sender["card"]
                            if session.event["message_type"] != "private"
                            else "-1"
                        ),
                    )
                )
                values = await conn.fetch(
                    f"""select noteind from quser where qid = {session.event.user_id};"""
                )
                ind = values[0]["noteind"]

            try:
                state = await conn.execute(
                    """insert into notebook (qid,item,ind) values ({0},'{1}',{2});""".format(
                        session.event.user_id, args.add, ind
                    )
                )
            except asyncpg.exceptions.ForeignKeyViolationError as e:
                await conn.execute(
                    """insert into quser (qid,swid) values ({0},{1});""".format(
                        session.event.user_id,
                        swFormatter(
                            session.event.sender["card"]
                            if session.event["message_type"] != "private"
                            else "-1"
                        ),
                    )
                )
                state = await conn.execute(
                    """insert into notebook (qid,item,ind) values ({0},'{1}',{2});""".format(
                        session.event.user_id, args.add, ind
                    )
                )
            except asyncpg.exceptions.UniqueViolationError as e:
                session.finish("你已经添加过该记录啦!")
            await conn.execute(
                f"""update quser set noteind = {ind + 1} where qid={session.event.user_id}"""
            )
            session.finish("记录:{0} 添加完毕!".format(args.add))

    elif session.is_first_run and args.list == True:
        async with db.pool.acquire() as conn:
            values = await conn.fetch(
                """select * from notebook where qid={0} order by ind;""".format(
                    session.event.user_id
                )
            )
        if len(values) == 0:
            session.finish("并没有找到任何记录,蛮遗憾的。")
        log = "\n"
        for item in values:
            if item["ind"] % 10 == 0 and item["ind"] != 0:
                await session.send(log[2:])
                log = "\n"
            log += "\n{0}. {1}".format(item["ind"] + 1, item["item"])
        await session.send(log[2:])
        session.finish("以上")

    elif session.is_first_run and args.listsort == True:
        async with db.pool.acquire() as conn:
            values = await conn.fetch(
                """select * from notebook where qid={0} order by item;""".format(
                    session.event.user_id
                )
            )
        if len(values) == 0:
            session.finish("并没有找到任何记录,蛮遗憾的。")
        log = "\n"
        for item in values:
            if item["ind"] % 10 == 0 and item["ind"] != 0:
                await session.send(log[2:])
                log = "\n"
            log += "\n{0}. {1}".format(item["ind"] + 1, item["item"])
        await session.send(log[2:])
        session.finish("以上")

    elif "del" in session.state or (session.is_first_run and args.delt != None):
        async with db.pool.acquire() as conn:
            if session.is_first_run:
                flg = 0
                if args.delt[0] == "*":
                    try:
                        args.delt = int(args.delt[1:]) - 1
                        flg = 1
                    except:
                        session.finish("「*」开头的记录表示记录序列号哦。")
                    values = await conn.fetch(
                        """select * from notebook where qid={0} and ind = '{1}';""".format(
                            session.event.user_id, args.delt
                        )
                    )
                else:
                    values = await conn.fetch(
                        """select * from notebook where qid={0} and item = '{1}';""".format(
                            session.event.user_id, args.delt
                        )
                    )
                if len(values) == 0:
                    session.finish(
                        "貌似,并没有找到该记录?你输入的记录为 {0}".format(
                            args.delt if flg == 0 else f"序列号:{args.delt + 1}"
                        )
                    )
                item = values[0]["item"]
                session.state["del"] = item
                session.state["delind"] = values[0]["ind"]
                session.pause(f"确定要删除「{item}」吗?(请输入「是」或「否」)")
            if stripped_arg == "是":
                state = await conn.execute(
                    """delete from notebook where qid={0} and item = '{1}';
                update notebook set ind = ind - 1 where ind > {2} and qid={0};
                update quser set noteind = noteind - 1 where qid = {0};""".format(
                        session.event.user_id,
                        session.state["del"],
                        session.state["delind"],
                    )
                )
                session.finish("确认删除「{}」了!".format(session.state["del"]))
            else:
                session.finish("删除撤销!")

    elif "cls" in session.state or (session.is_first_run and args.cls == True) == True:
        if session.is_first_run:
            session.state["cls"] = 1
            session.pause("确定要清空所有记录吗?(请输入「是」或「否」)")
        if stripped_arg == "是":
            async with db.pool.acquire() as conn:
                state = await conn.execute(
                    """delete from notebook where qid={0};
                update quser set noteind = 0 where qid = {0};""".format(
                        session.event.user_id
                    )
                )
                session.finish("完 全 清 空 !")
        else:
            session.finish("删除撤销!")
Exemplo n.º 28
0
async def add_challenge(session: CommandSession):
    '''
    这个命令最常用,需要给沙雕群友优化一下语法  ---->  简易版本见 add_challenge_e
    '''
    parser = ArgumentParser(
        session=session,
        usage=
        'dmg -r -b damage [--uid] [--alt] [--ext | --last | --timeout]\n对3周目的老五造成114514点伤害:\n【 dmg 114514 -r3 -b5 】\n帮骑士A出了尾刀收了4周目带善人:\n【 dmg 1919810 -r4 -b1 --last --uid [骑士A的QQ] 】'
    )
    parser.add_argument('-r', '--round', type=int)
    parser.add_argument('-b', '--boss', type=int)
    parser.add_argument('damage', type=int, default=-1)
    parser.add_argument('--uid', type=int, default=-1)
    parser.add_argument('--alt', type=int, default=0)
    flag_group = parser.add_mutually_exclusive_group()
    flag_group.add_argument('--ext', action='store_true')
    flag_group.add_argument('--last', action='store_true')
    flag_group.add_argument('--timeout', action='store_true')
    args = parser.parse_args(session.argv)

    flag = BattleMaster.NORM
    if args.last:
        flag = BattleMaster.LAST
    elif args.ext:
        flag = BattleMaster.EXT
    elif args.timeout:
        flag = BattleMaster.TIMEOUT
        args.damage = 0

    challenge = {
        'round': args.round,
        'boss': args.boss,
        'damage': args.damage,
        'uid': args.uid,
        'alt': args.alt,
        'flag': flag
    }
    await process_challenge(session, challenge)
Exemplo n.º 29
0
async def sched_add(session: CommandSession):
    parser = ArgumentParser(session=session, usage=usage.ADD)
    parser.add_argument('-S', '--second')
    parser.add_argument('-M', '--minute')
    parser.add_argument('-H', '--hour')
    parser.add_argument('-d', '--day')
    parser.add_argument('-m', '--month')
    parser.add_argument('-w', '--day-of-week')
    parser.add_argument('-f', '--force', action='store_true', default=False)
    parser.add_argument('-v', '--verbose', action='store_true', default=False)
    parser.add_argument('--name', required=True)
    parser.add_argument('commands', nargs='+')
    args = parser.parse_args(session.argv)

    if not re.match(r'[_a-zA-Z][_a-zA-Z0-9]*', args.name):
        await session.send(
            '计划任务名必须仅包含字母、数字、下划线,且以字母或下划线开头')
        return

    parsed_commands: List[ScheduledCommand] = []
    invalid_commands: List[str] = []

    if args.verbose:
        parsed_commands.append(
            ScheduledCommand(('echo',), f'开始执行计划任务 {args.name}……'))

    for cmd_str in args.commands:
        cmd, current_arg = parse_command(session.bot, cmd_str)
        if cmd:
            tmp_session = CommandSession(session.bot, session.ctx, cmd,
                                         current_arg=current_arg)
            if await cmd.run(tmp_session, dry=True):
                parsed_commands.append(ScheduledCommand(cmd.name, current_arg))
                continue
        invalid_commands.append(cmd_str)
    if invalid_commands:
        invalid_commands_joined = '\n'.join(
            [f'- {c}' for c in invalid_commands])
        await session.send(f'计划任务添加失败,'
                           f'因为下面的 {len(invalid_commands)} 个命令无法被运行'
                           f'(命令不存在或权限不够):\n'
                           f'{invalid_commands_joined}')
        return

    trigger_args = {k: v for k, v in args.__dict__.items()
                    if k in {'second', 'minute', 'hour',
                             'day', 'month', 'day_of_week'}}
    try:
        job = await scheduler.add_scheduled_commands(
            parsed_commands,
            job_id=scheduler.make_job_id(
                PLUGIN_NAME, context_id(session.ctx), args.name),
            ctx=session.ctx,
            trigger='cron', **trigger_args,
            replace_existing=args.force
        )
    except scheduler.JobIdConflictError:
        # a job with same name exists
        await session.send(f'计划任务 {args.name} 已存在,'
                           f'若要覆盖请使用 --force 参数')
        return

    await session.send(f'计划任务 {args.name} 添加成功')
    await session.send(format_job(args.name, job))
Exemplo n.º 30
0
async def _(session: CommandSession):
    if session.is_first_run:
        parser = ArgumentParser(session=session)
        subparser = parser.add_mutually_exclusive_group()
        subparser.add_argument("-s", "--subs", nargs="+", help="订阅指定的 rss 源")
        subparser.add_argument("-r",
                               "--route",
                               nargs="+",
                               help="获取自定路由的 rss 源的资讯")
        subparser.add_argument("-d", "--delete", nargs="+", help="删除 rss 订阅")
        subparser.add_argument("-l",
                               "--list",
                               action="store_true",
                               default=False,
                               help="列出已订阅的源")
        subparser.add_argument("-a", "--add", help="开通rss源")
        parser.add_argument("rss", nargs="*", help="获取已存在的 rss 源资讯")
        argv = parser.parse_args(session.current_arg_text.strip().split(" "))
        session.state["ls"] = []
        session.state["list"] = argv.list
        if argv.list:
            return
        if argv.subs != None:
            session.state["subs"] = argv.subs
            ls = argv.subs
        if argv.delete != None:
            session.state["del"] = argv.delete
            ls = argv.delete
        if argv.rss != []:
            session.state["rss"] = argv.rss
            ls = argv.rss
        if argv.route != None:
            session.state["route"] = argv.route
            session.state["ls"] = argv.route
            if len(session.state["ls"]) == 0:
                session.finish("查询路由地址不能为空哦!")
            return
        if argv.add != None:
            await session.send(str(session.event.user_id))
            result = await add_rss(argv.add.strip(),
                                   str(session.event.user_id))
            session.finish(result)

    ls = list(set(ls))
    if session.event.detail_type == "group":
        async with db.pool.acquire() as conn:
            values = await conn.fetch(
                "select safe from mg where gid = {}".format(
                    session.event.group_id))
            if len(values) > 0 and values[0]["safe"]:
                ls = [i for i in ls if "r18" not in i]

    for key in doc:
        if key in ls[:]:
            session.state["ls"].append((gtfun(key), key))
            ls.remove(key)

    if len(ls) > 0 and " ".join(ls).strip() != "":
        await session.send(
            unescape("没有添加「{}」的订阅源!请联系".format(" ".join(ls)) +
                     cq.at(545870222) + "添加订阅!"))
    if len(session.state["ls"]) == 0:
        await session.send(
            "本次资讯{}为空哦!".format("查看" if session.state["rss"] != [] else "订阅"))
        session.finish(
            AutoReply(
                "Rss 指令帮助菜单",
                "以下是 rss 指令支持的源",
                [(i, j) for i, j in doc.items() if "r18" not in i],
            ))