async def switch_service(session: CommandSession, turn_on: bool): action_tip = '启用' if turn_on else '禁用' if session.ctx['message_type'] == 'group': names = session.current_arg_text.split() if not names: session.finish(f"空格后接要{action_tip}的服务名", at_sender=True) group_id = session.ctx['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(session.ctx) 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 session.send( 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: session.finish('\n'.join(msg), at_sender=True) else: if session.ctx['user_id'] not in session.bot.config.SUPERUSERS: return args = session.current_arg_text.split() if len(args) < 2: session.finish( 'Usage: <service_name> <group_id1> [<group_id2>, ...]') name, *group_ids = args svs = Service.get_loaded_services() if name not in svs: session.finish(f'未找到服务:{name}') sv = svs[name] succ = [] for gid in group_ids: try: gid = int(gid) sv.set_enable(gid) if turn_on else sv.set_disable(gid) succ.append(gid) except: try: await session.send(f'非法群号:{gid}') except: pass session.finish(f'服务{name}已于{len(succ)}个群内{action_tip}:{succ}')
async def show_all_services(): svs = Service.get_loaded_services() sv_names = list(svs) return await render_template('by_service.html', items=sv_names, public_address=public_address, port=port)
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 send_help_xml(bot, ev: CQEvent): name = ev.message.extract_plain_text().strip() bundles = Service.get_bundles() svs = Service.get_loaded_services() info = Service.get_help() if not name: await bot.send(ev, TOP_MANUAL) elif name in svs: msg = get_service_help(name, info[name]) data ={ "type": "node", "data": { "name": '小冰', "uin": '2854196306', "content": msg } } await bot.send_group_forward_msg(group_id=ev.group_id, messages=data) elif name in bundles: msg = gen_bundle_manual(name, bundles[name], ev.group_id) data ={ "type": "node", "data": { "name": '小冰', "uin": '2854196306', "content": msg } } await bot.send_group_forward_msg(group_id=ev.group_id, messages=data)
async def show_group_services(gid_str:str): gid = int(gid_str) svs = Service.get_loaded_services() conf = {} conf[gid_str] = {} for key in svs: conf[gid_str][key] = svs[key].check_enabled(gid) return await render_template('group_services.html',group_id=gid_str,conf=conf,public_address=public_address,port=port)
async def show_group_services(gid_str: str): user = {'name': 'name'} gid = int(gid_str) svs = Service.get_loaded_services() conf = {gid_str: {}} for key in svs: conf[gid_str][key] = svs[key].check_enabled(gid) return await render_template('group_services.html', title=f'群{gid_str}服务一览', article_title=f'群{gid_str}服务一览', user=user, group_id=gid_str, conf=conf)
async def ls_service(session: CommandSession, service_name: str): all_services = Service.get_loaded_services() if service_name in all_services: sv = all_services[service_name] on_g = '\n'.join(map(str, sv.enable_group)) off_g = '\n'.join(map(str, sv.disable_group)) default_ = 'enabled' if sv.enable_on_default else 'disabled' msg = f"服务{sv.name}:\n默认:{default_}\nuse_priv={sv.use_priv}\nmanage_priv={sv.manage_priv}\nvisible={sv.visible}\n启用群:\n{on_g}\n禁用群:\n{off_g}" session.finish(msg) else: session.finish(f'未找到服务{service_name}')
async def service_list(): user = {'name': 'name'} svs = Service.get_loaded_services() sv_names = list(svs) return await render_template('service_list.html', title='按服务管理', article_title="按服务管理", items=sv_names, user=user, static_url_path=switcher.static_url_path, url_prefix=switcher.url_prefix)
async def show_service_groups(sv_name:str): svs = Service.get_loaded_services() groups = await get_groups() conf = {} for group in groups : gid = group['group_id'] gid_str = str(gid) conf[gid_str] = {} if svs[sv_name].check_enabled(gid): conf[gid_str][sv_name] = True else: conf[gid_str][sv_name] = False return await render_template('service_groups.html',sv_name=sv_name,conf=conf,groups=groups,public_address=public_address,port=port)
async def send_help(bot, ev: CQEvent): name = ev.message.extract_plain_text().strip() bundles = Service.get_bundles() svs = Service.get_loaded_services() info = Service.get_help() if not name: await bot.send(ev, TOP_MANUAL) elif name in svs: msg = get_service_help(name, info[name]) await bot.send(ev, msg) elif name in bundles: msg = gen_bundle_manual(name, bundles[name], ev.group_id) await bot.send(ev, msg)
async def send_help(bot, ev: CQEvent): gid = ev.group_id arg = ev.message.extract_plain_text().strip() bundles = Service.get_bundles() services = Service.get_loaded_services() if not arg: await bot.send(ev, TOP_MANUAL) elif arg in bundles: msg = gen_bundle_manual(arg, bundles[arg], gid) await bot.send(ev, msg) elif arg in services: s = services[arg] msg = gen_service_manual(s, gid) await bot.send(ev, msg)
async def show_service_groups(sv_name: str): user = {'name': 'name'} svs = Service.get_loaded_services() groups = await get_groups() conf = {} for group in groups: gid = group['group_id'] gid_str = str(gid) conf[gid_str] = {} if svs[sv_name].check_enabled(gid): conf[gid_str][sv_name] = True else: conf[gid_str][sv_name] = False return await render_template('service_groups.html', title=f'服务 {sv_name} ', article_title=sv_name, sv_name=sv_name, conf=conf, groups=groups, user=user)
async def set_group(): #接收前端传来的配置数据,数据格式{"<gid>":{'serviceA':True,'serviceB':False}} if request.method == 'POST': data = await request.get_data() conf = json.loads(data.decode()) svs = Service.get_loaded_services() for k in conf: gid = int(k) for sv_name in conf[k]: if conf[k][sv_name]: svs[sv_name].set_enable(gid) svs[sv_name].logger.info(f'启用群 {gid} 服务 {sv_name} ') else: svs[sv_name].set_disable(gid) svs[sv_name].logger.info(f'禁用群 {gid} 服务 {sv_name}') return 'ok'
async def broadcast(msg, groups=None, sv_name=None): bot = nonebot.get_bot() #当groups指定时,在groups中广播;当groups未指定,但sv_name指定,将在开启该服务的群广播 svs = Service.get_loaded_services() if not groups and sv_name not in svs: raise ValueError(f'不存在服务 {sv_name}') if sv_name: enable_groups = await svs[sv_name].get_enable_groups() send_groups = enable_groups.keys() if not groups else groups else: send_groups = groups for gid in send_groups: try: await bot.send_group_msg(group_id=gid, message=msg) await asyncio.sleep(0.5) except Exception as e: sv.logger.info(e)
async def version_select(bot, ev: CQEvent): gid = ev.group_id arg = ev.message.extract_plain_text() svs = Service.get_loaded_services() cbsvs = { 'v2': svs.get('clanbattle'), 'v3': svs.get('clanbattlev3'), 'v4': svs.get('clanbattlev4'), } if arg not in cbsvs: await bot.finish(ev, help_str) if not priv.check_priv(ev, priv.ADMIN): await bot.finish(ev, '只有*群管理*和*群主*才能切换会战管理版本') if not cbsvs[arg]: await bot.finish(ev, f'本bot未实装clanbattle{arg},请加入Hoshinoのお茶会(787493356)体验!') for k, v in cbsvs.items(): v.set_enable(gid) if k == arg else v.set_disable(gid) await bot.send(ev, f'已启用clanbattle{arg}\n{cbsvs[arg].help}')
async def service_list(): user = {'name': 'name'} svs = Service.get_loaded_services() sv_names = list(svs) return await render_template('service_list.html', title='按服务管理', article_title="按服务管理", items=sv_names, user=user)