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}会目前还没有成员')
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}会所有成员均已出完刀!各位辛苦了!')
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('出错啦!')
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},请检查你的输入是否正确')
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))
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}成功')
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))
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)
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}')
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)
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)
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}')
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}号出刀记录')
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']}会删除")
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
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
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))
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.')
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))
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)
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))
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))
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}')
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('删除完成')
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}')
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')
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("删除撤销!")
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)
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))
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], ))