Beispiel #1
0
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 = sv.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_NOTE}',
                            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}')
Beispiel #2
0
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)
Beispiel #3
0
async def lssv(session: CommandSession):
    parser = ArgumentParser(session=session)
    parser.add_argument('-a', '--all', action='store_true')
    parser.add_argument('-g', '--group', type=int, default=0)
    args = parser.parse_args(session.argv)

    verbose_all = args.all
    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 sv.visible or verbose_all:
            x = '○' if on else '×'
            msg.append(f"|{x}| {sv.name}")
    await session.send('\n'.join(msg))
Beispiel #4
0
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(lambda x: str(x), sv.enable_group))
        off_g = '\n'.join(map(lambda x: str(x), 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}')
Beispiel #5
0
async def ls_service(session: CommandSession, service_name: str):
    all_services = Service.get_loaded_services()
    for sv in all_services:
        if sv.name == service_name:

            on_g = '\n'.join(map(lambda x: str(x), sv.enable_group))
            off_g = '\n'.join(map(lambda x: str(x), sv.disable_group))
            default_ = '开启' if sv.enable_on_default else '关闭'
            msg = f"服务{service_name}:\n默认:{default_}\n启用群:\n{on_g}\n禁用群:\n{off_g}"
            await session.finish(msg)
            return
    await session.send(f'未找到服务{service_name}')
Beispiel #6
0
async def show_group_services(gid_str: str):
    #group_svs = get_group_services(int(gid))
    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 set_group():
    #接收前端传来的配置数据,数据格式{"10000":{'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)
            else:
                svs[sv_name].set_disable(gid)
    return 'ok'
Beispiel #8
0
async def disable_service(session: CommandSession):
    if session.ctx['message_type'] != 'group':
        return
    all_service = Service.get_loaded_services()
    target_name = session.current_arg
    for sv in all_service:
        if sv.name == target_name:
            u_priv = await sv.get_user_privilege(session.ctx)
            if u_priv >= sv.manage_priv:
                sv.set_disable(session.ctx['group_id'])
                await session.send(f'{sv.name}服务已禁用!', at_sender=True)
                return
            else:
                await session.send(f'权限不足!需要:{sv.manage_priv},您的:{u_priv}',
                                   at_sender=True)
                return
    await session.send(f'未找到服务:{target_name}', at_sender=True)
Beispiel #9
0
async def lssv(session: CommandSession):
    verbose_all = session.current_arg_text == '-a' or session.current_arg_text == '--all'
    gid = session.ctx['group_id']
    msg = ["服务一览:"]
    svs = Service.get_loaded_services()
    svs = map(
        lambda sv: (sv, (gid in sv.enable_group) or
                    (sv.enable_on_default and gid not in sv.disable_group)),
        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 sv.visible or verbose_all:
            x = '○' if on else '×'
            msg.append(f"|{x}| {sv.name}")
    await session.send('\n'.join(msg))
Beispiel #10
0
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 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 not groups:
        enable_groups = await svs[sv_name].get_enable_groups()
        send_groups = enable_groups.keys()
    else:
        send_groups = groups

    for gid in send_groups:
        try:
            await bot.send_group_msg(group_id=gid, message=msg)
            logger.info(f'群{gid}投递消息成功')
            await asyncio.sleep(0.5)
        except:
            logger.error(f'在群{gid}投递消息失败')
Beispiel #12
0
async def broadcast(session: CommandSession):
    msg = session.current_arg
    if not ' ' in msg:
        await session.send(f'请输入服务名,全群广播则输入all')
        return
    args = msg.split(' ',1)
    bc_sv_name =  args[0]
    bc_msg = args[1]
    svs = Service.get_loaded_services()
    if bc_sv_name not in svs and bc_sv_name != 'all':
        await session.send(f'未找到该服务,请输入正确的服务')
        return
    sid = list(hoshino.get_self_ids())[0]
    if bc_sv_name == 'all':
        gl = await session.bot.get_group_list(self_id=sid)
        gl = [ g['group_id'] for g in gl ]
    else:
        enable_groups = await svs[bc_sv_name].get_enable_groups()
        gl = enable_groups.keys()
    for sid in hoshino.get_self_ids():
        for g in gl:
            await asyncio.sleep(0.5)
            try:
                msg_obj = await session.bot.send_group_msg(self_id=sid, group_id=g, message=bc_msg)
                with await lock:
                    broadcast_record.append(msg_obj['message_id'])
                hoshino.logger.info(f'群{g} 投递广播成功')
            except Exception as e:
                hoshino.logger.error(f'群{g} 投递广播失败:{type(e)}')
                try:
                    await session.send(f'群{g} 投递广播失败:{type(e)}')
                except Exception as e:
                    hoshino.logger.critical(f'向广播发起者进行错误回报时发生错误:{type(e)}')
    await session.send(f'广播完成!')
    await asyncio.sleep(120)
    with await lock:
        broadcast_record.clear()