Exemple #1
0
    async def check_update(self):
        temp_dict = {}
        diff_dict = {}
        logger.info(f'Original: {self.tweet_list_init}')
        tasks = []
        for ch_name in self.tweet_config:
            tasks.append(self._check_update_helper(ch_name))

        results = await asyncio.gather(*tasks)

        for element in results:
            temp_dict.update(element)

        for element in temp_dict:
            if element not in self.tweet_list_init or \
                    (self.tweet_list_init[element] != temp_dict[element]):

                if not (not temp_dict[element] or temp_dict[element] == '转发动态'
                        or temp_dict[element] == self.INFO_NOT_AVAILABLE
                        or element not in self.tweet_list_init):

                    diff_dict[element] = temp_dict[element]
                    self.tweet_list_init = temp_dict

        logger.info(f'Changed: {self.tweet_list_init}')
        return diff_dict
Exemple #2
0
async def _(bot: Bot, event: Event, state: dict):
    msg = str(event.message)
    logger.info(msg)
    user_id = str(event.user_id)
    group = str(event.group_id)

    if group not in records:
        rec = Record(msg, user_id, 1)
        records[group] = rec
        return

    rec = records.get(group)
    if rec.last_msg != msg or rec.last_user_id == user_id:
        rec.last_msg = msg
        rec.repeat_count = 1
        return

    rec.repeat_count += 1

    if rec.repeat_count == 2:
        if msg not in repeat_data:
            repeat_data[msg] = 1
        else:
            repeat_data[msg] += 1
        with open(RECORD, 'w') as file:
            ujson.dump(repeat_data, file)
        delay = randint(5, 20) / 10
        await asyncio.sleep(delay)
        await repeater.finish(msg)
Exemple #3
0
async def addQQ(qqNum, qqId) -> str:

    if qqNum in myQQs:
        try:

            qqInfo = qqId.split(",")

            for i in qqInfo:
                if i == "":
                    continue
                try:
                    int(i.split("*")[0])  #判断是不是数字
                    if len(i.split("*")) > 1:  #判断增加次数是不是数字
                        int(i.split("*")[1])
                except ValueError as identifier:
                    continue

                logger.info(i)
                num = int(i.split("*")[1]) if len(i.split("*")) > 1 else 1
                addQQUsedNum(i.split("*")[0], num)

            msg = getCurrQQList(getQQList())
            #return "添加成功!当前可用列表:"+(",".join('%s' %id for id in qqList))
            return "添加成功!当前可用列表:\n" + msg
        except (ValueError):

            return "QQ只能是数字哦~"

    else:
        return "您没有权限添加!"
async def achat(session: CommandSession):
    logger.info('[一言]用户激活指令开始运行')
    aword = session.get('aword')
    logger.debug('[一言]向编译库发送请求获取信息')
    achat_report = await get_achat_of_chat(aword)
    logger.info('[一言]向用户发送运行结果,任务结束')
    await session.send(achat_report,at_sender=True)
Exemple #5
0
async def pixiv_handle(bot: Bot, event: Event, state: dict):
    msg = str(event.message).strip()
    msg = msg.replace('/pixiv', '')
    if not msg:
        logger.info('pixiv_handle | no keyword')
        await sv_search.finish()
    state['keyword'] = msg
Exemple #6
0
async def call_tencent_api(qq: int, content: str):
    rand_str = ''.join(random.sample(ALL_STR, 20))  # 随机字符串
    time_pin = int(time.time())  # 时间戳

    raw = "app_id=" + APP_ID + \
          "&nonce_str=" + rand_str + \
          "&question=" + quote(content.replace(' ', '。')) + \
          "&session=" + str(qq) + \
          "&time_stamp=" + str(time_pin)

    sign = await calcu_sign(raw + "&app_key=" + APP_KEY)
    raw += '&sign=' + sign
    resp = await requests.get(CHAT_API + raw)
    resp = await resp.json()

    logger.info(resp)

    if not isinstance(resp, dict) or \
            resp.get('ret') != 0 or \
            not resp.get('data'):
        return None

    if qq:
        return resp['data']['answer']

    return resp['data']['answer']
Exemple #7
0
async def do_tweet_update_fetch():
    logger.info('Automatically fetching tweet info...')
    diff_dict = await tweet.check_update()
    if diff_dict:
        bot = nonebot.get_bot()
        for ch_name in diff_dict:
            group_id_list = tweet.get_tweet_config()[ch_name]['group']
            message = diff_dict[ch_name]

            if message[0:2] == 'RT':
                message = f'=== {ch_name}转发推文说 ===\n' + message
            elif message[0] == '@':
                message = f'=== {ch_name}回了一条推 ===\n' + message
            else:
                message = f'=== {ch_name}发了一条推 ===\n' + message

            nonebot.logger.warning(f'发现新推!来自{ch_name}:\n' f'{message}')

            for element in group_id_list:
                sanity_meter.set_user_data(0, 'tweet', 1, True)
                await bot.send_group_msg(group_id=element, message=message)
                await bot.send_private_msg(
                    user_id=SUPER_USER,
                    message=f'[{datetime.now().strftime("%Y-%m-%d %H:%M:%S")}] '
                    f'A message was sent to group: {element}\n'
                    f'The group belongs to: {ch_name}')
Exemple #8
0
async def dblwar(session: CommandSession):
    tag = session.get('tag',
                      prompt='欢迎使用特别功能!请回复你的游戏TAG查询你的部落战情况吧',
                      at_sender=True,
                      only_to_me=True)
    dblwar_report = await get_dblwar(tag)
    #logger.info('[部落3+1]发送打油诗')
    #await session.send('信息量较大查询可能较慢,敬请谅解\n请稍微休息一下吧:\n部落3 + 1,获胜笑嘻嘻。\n既能拿宝箱,还能拿奖品。\n倘若人数多,岂不悲哀乎?\n管家笑嘻嘻,首领惨兮兮。\n温馨提示:仅为小管家自动吐槽,逗君一笑,请勿当真!',at_sender=True)
    if dblwar_report == 'ERROR-CRTimeOut':
        logger.info('[部落3+1]出现错误了:官方API查询超时,提示详见Debug模式')
        logger.debug('[部落3+1]详细信息:查询超时.详见小管家Wiki')
        logger.debug('[部落3+1]查询脚本执行完毕并返回信息到Nonebot脚本')
        await session.send('出现意外了:\n因为连接速度太慢所以主动放弃查询了,请您重新使用指令再查询一下吧',
                           at_sender=True)
    elif dblwar_report == 'ERROR-CRNotCallMe':
        logger.info('[部落3+1]用户意外触发或未正常放弃,查询无效,提示详见Debug模式')
        logger.debug('[部落3+1]详细信息:包含英文数字以外的其他语言,查询无效.详见小管家Wiki')
        logger.debug('[部落3+1]查询脚本执行完毕并返回信息到Nonebot脚本')
        await session.send('对不起,你似乎不是来查询信息的(。﹏。)', at_sender=True)
    elif dblwar_report == 'NotWar':
        logger.info('[部落3+1]信息查询完成,部落未开部落战')
        logger.debug('[部落3+1]查询脚本执行完毕并返回信息到Nonebot脚本')
        await session.send('部落战还没有开始呢,着急不是一件好事情(⊙o⊙)哦', at_sender=True)
    elif dblwar_report == 'NoUser':
        logger.info('[部落3+1]信息查询完成,没有参战或不在查询部落')
        logger.debug('[部落3+1]查询脚本执行完毕并返回信息到Nonebot脚本')
        await session.send('没有参战的小坏蛋查什么部落战?一边喝可乐去( ̄┰ ̄)', at_sender=True)
    else:
        await session.send(dblwar_report, at_sender=True)
        logger.info('[部落3+1]结果无错误并已查询完毕并发送给用户,任务结束')
Exemple #9
0
def run_py(code, callback):
    logger.info("Running .. '{}'".format(code))
    client = docker.from_env()
    tmp_dir = tempfile.mkdtemp()
    file_name = "temp.py"
    with open(os.path.join(tmp_dir, file_name), "w", encoding="utf-8") as file:
        file.write("{}".format(code))
    logger.info("Container created.")
    container = client.containers.create(
        DOCKER_IMAGE,
        "python /temp/{}".format(file_name),
        tty=True,
        detach=False,
        volumes={tmp_dir: {
            "bind": "/temp",
            "mode": "ro"
        }},
        mem_limit="50m",
        memswap_limit="50m",
        oom_kill_disable=True,
        nano_cpus=int(0.1 * 1 / 1e-9),
    )

    thd = Thread(target=execute_daemon_calc, args=(container, callback))
    thd.setDaemon(True)
    thd.start()
    keeper = Thread(target=keeper_thread,
                    args=(thd, container, code, callback))
    keeper.setDaemon(True)
    keeper.start()
    keeper.join()
    thd.join()
Exemple #10
0
    async def wrapper(session: UnionSession, *args, **kwargs):
        returnData: Union[Tuple[str, bool], str] = await function(
            session, *args, **kwargs
        )
        if isinstance(returnData, tuple):
            replyData, atSender = returnData
        else:
            replyData, atSender = returnData, True

        if not isinstance(replyData, (str, MessageSegment)):
            return

        replyData = str(replyData)

        if atSender:
            replyData = "\n" + replyData
        if settings.DEBUG:
            replyData += "\n(DEBUG)"
        logger.info(
            "Reply to message of conversation "
            + f'{session.ctx["message_id"]} as {_shortCQCode(replyData)}'
        )

        if hasattr(session, "finish"):
            session.finish(replyData, at_sender=atSender)
        else:
            await session.send(replyData, at_sender=atSender)
Exemple #11
0
async def update_pcrdata():
    '''
    对比本地和远程的_pcr_data.py, 自动补充本地没有的角色信息, 已有角色信息不受影响
    '''
    online_pcrdata = await get_online_pcrdata()

    logger.info('开始对比角色数据')
    if online_pcrdata == {}:
        return -1
    for id in online_pcrdata:
        if id not in _pcr_data.CHARA_NAME and id != 9401:
            logger.info(f'已开始更新角色{id}的数据和图标')
            # 由于返回数据可能出现全半角重复, 做一定程度的兼容性处理, 会将所有全角替换为半角, 并移除重复别称
            for i, name in enumerate(online_pcrdata[id]):
                name_format = name.replace('(', '(')
                name_format = name_format.replace(')', ')')
                online_pcrdata[id][i] = name_format

            # 转集合再转列表, 移除重复元素
            online_pcrdata[id] = list(set(online_pcrdata[id]))
            _pcr_data.chara_master.add_chara(id, online_pcrdata[id])
            chara.download_chara_icon(id, 6)
            chara.download_chara_icon(id, 3)
            chara.download_chara_icon(id, 1)
    # 重载花名册(不会引起全局reload)
    _pcr_data.chara_master.sort()
    chara.update()
Exemple #12
0
async def autoTest(session: CommandSession):
    msg = session.get('msgInfo', prompt='请输入学号和密码(ps:学号和密码用空格分隔开,密码为身份证后6位)')
    qqNum = session.ctx["user_id"]
    useNum = selectNumByQQId(qqNum)
    msgsplit = msg.split(' ')
    logger.info(str(qqNum) + "当前可用次数:" + str(useNum))
    if (useNum is not None and useNum > 0) or qqNum in myQQs:
        if len(msgsplit) < 2:
            sendMsg = "账号密码格式不正确!"
        else:
            auth = "9h6BGD624a273gm2FOJeeDeY5jKB7b5NR6b1LR75adQleqg8gfE8vyBq3abXY1eV090u5n6fR5RefEFyZ3jZH820NtuDc4HZ9Isz63IeDv6dPA0FeHU3P0TJ15O9mzf4d00ffMeaX8qvS2i8U3CX7Df9r5x00Fn2UJT3Q1btEa4X0kiy1c0L2P0ao4LB0J1RB17cJf6O17e84rc8M9pbcvuu01d2N1R6aW1FBMVS20c6A6cs5C586Tlc2dJFGxsB"
            resp = httpGet(session.bot.config.localhost + "/getToken?auth=" +
                           auth)
            data = {
                "username": msgsplit[0],
                "password": msgsplit[1],
                "token": resp.text
            }
            sendMsg = httpPost(session.bot.config.localhost + "/sportfull",
                               data).json()['msg']
            if sendMsg.find("请自行登录公体部查询确认") > 0:
                updateNum(qqNum, useNum - 1)

    else:
        sendMsg = "您还未获得相关权限!"
    await session.send(sendMsg)
Exemple #13
0
 def disable_cache(self) -> None:
     """关闭定时缓存任务"""
     if self._cache_job:
         self._cache_job.remove()
     self._cache_job = None
     plugin_config.fflogs_enable_cache = False
     logger.info("定时缓存已关闭")
Exemple #14
0
async def luck(bot: Bot, event: Event, state: dict):
    if len(utils.war or utils.magic or utils.land or utils.hand or utils.stains) == 0:
        await utils.initialization()
    # 拿到命令使用者的qq号
    caller_qq_number = event.user_id
    logger.info(caller_qq_number)
    # 生成当天种子
    r = random.Random(await utils.get_seed(caller_qq_number))
    # content
    # 运势 1-100
    luck_number = str(r.randint(1, 100))
    # 职业 ff14全部职业
    luck_job = await utils.sub_event(str(r.choice(utils.war + utils.magic + utils.land + utils.hand)))
    # 宜
    luck_event = r.choice(utils.EVENT_LIST)
    # 忌
    unlucky_event = utils.EVENT_LIST.copy()
    unlucky_event.remove(luck_event)
    unlucky_event = r.choice(unlucky_event)
    # 染剂
    stain = r.choice(utils.stains)
    # 一言
    hint = await utils.get_hint(luck_number, luck_job, luck_event, unlucky_event, stain)

    message = "运势: " + luck_number + "%  幸运职业: " \
              + luck_job + "\n宜: " + luck_event + "  忌: " + unlucky_event + "  幸运染剂: " + stain + "\n" + hint
    # print(r.randint(0, len(EVENT_LIST) - 2))
    try:
        group_id = event.group_id
        await ffxiv_zhanbu.send("\n" + message, at_sender=True)
    except:
        await ffxiv_zhanbu.send(message)
Exemple #15
0
async def passkeygetdll():
    data = await request.form
    dllid = data['id']
    passkey = data['passkey']
    HWID = data['HWID']
    ret = {}
    if passkey and HWID and db.checkPassKey(passkey, HWID):
        db.varpp('dllcount')
        db.varpp('dllcountday')
        ret['status'] = 'success'
        paths = db.getDLL(dllid)
        with open(paths['dllpath'], 'rb') as dllfile:
            with open(paths['xprpath'], 'rb') as xprfile:
                    ret['payload'] = {
                            'dll': base64.b64encode(dllfile.read()).decode(),
                            'xpr': base64.b64encode(xprfile.read()).decode(),
                        }
        if paths['resourcepath']:
            with open(paths['resourcepath'], 'rb') as rcfile:
                ret['payload']['resource'] = base64.b64encode(rcfile.read()).decode()
        await bot.send_group_msg_rate_limited(group_id=config.notice_group,
                                              message='用户' + passkey + '已注入DLL IP:' + request.remote_addr)
        logger.info('用户' + passkey + '已注入DLL IP:' + request.remote_addr)
    else:
        ret['status'] = 'failed'
    return json.dumps(ret)
Exemple #16
0
async def selectItem(session: CommandSession):

    getItem = session.get('msgInfo', prompt='请问你要查询的题目是?')
    data = {'topic[0]': getItem}
    resp = requests.session().post('https://cx.icodef.com/v2/answer',
                                   data=data,
                                   verify=False,
                                   timeout=5)
    logger.info(resp.json())
    result = []
    for each in resp.json():
        for answ in each['result']:
            temp = {}
            temp['题目'] = answ['topic']
            temp['答案'] = ''
            for option in answ['correct']:
                temp['答案'] = temp['答案'] + str(option['content'])
            isAdd = True
            for i in result:
                if removeSign(i).find(removeSign(temp['题目'])) > 0:
                    isAdd = False
            if isAdd:
                result.append(
                    str("题目:" + temp['题目'] + "\n答案:" + temp['答案'] + "\n"))

    if len(result) > 0:
        resultMsg = "查询结果如下:\n" + "\n".join(result)
    else:
        resultMsg = "没有该题目的答案"
    await session.send(resultMsg)
Exemple #17
0
def del_event(token: str, event_type='normal', **kwargs) -> None:
    """
    移除冷却事件。

    参数:
    - `token: str`:事件标签。

    关键字参数:
    - `event_type: str`:事件类型,默认为 `normal`。包括:
        - `global`:全局冷却事件;
        - `group`:群组冷却事件,需要额外的关键字参数 `group: int` 指定群组 ID;
        - `normal`:一般冷却事件,需要额外的关键字参数 `group: int` 和
          `user: int` 分别指定群组 ID 和用户 ID;
        - `user`:用户冷却事件,需要额外的关键字参数 `user: int` 指定用户 ID。
    """
    global _cooldown_events

    group = kwargs.get('group') if event_type in ('group', 'normal') else 0
    user = kwargs.get('user') if event_type in ('normal', 'user') else 0

    records = _cooldown_events.get(token)
    for i, record in enumerate(records):
        if record.get('group') == group and record.get('user') == user:
            del records[i]
            logger.info(f'Event {token}({record}) has been removed manually.')
Exemple #18
0
async def deldy(session: CommandSession):
    rss_name = session.get('deldy', prompt='输入要删除的订阅名或订阅地址')
    # 权限判断
    user_id = session.ctx['user_id']
    # print(type(user_id),type(config.ROOTUSER))
    if int(user_id) in config.ROOTUSER:
        # 获取、处理信息
        flag = 0
        try:
            list_rss = RWlist.readRss()
            for rss_ in list_rss:
                if rss_.name == rss_name or rss_.url == rss_name:
                    list_rss.remove(rss_)
                    scheduler.remove_job(rss_.name)
                    try:
                        os.remove(file_path+rss_.name+".json")
                    except BaseException as e:
                        logger.info(e)
                    await session.send('订阅 ' + rss_name + ' 删除成功!')
                    flag = flag + 1
            if flag <= 0:
                await session.send('订阅 ' + rss_name + ' 删除失败!该订阅不存在!')
            else:
                RWlist.writeRss(list_rss)
                await session.send('删除 ' + str(flag) + ' 条订阅!')
        except BaseException as e:
            #logger.info(e)
            await session.send('你还没有任何订阅!')
    else:
        await session.send('你没有权限进行此操作!\n关于插件:http://ii1.fun/7byIVb')
Exemple #19
0
async def handle_image(bot: Bot, event: Event, state: dict):
    message = str(event.get_message())

    images = await get_data(message)
    # TODO 使用抛出异常的方式统一处理,避免使用独立的异常处理逻辑
    if type(images) is list and len(images):
        logger.info(f'[{message}] images count: {len(images)}')
        reply_image = random.choice(images)
        # logger.info(f'reply_image: {reply_image}')
        # 使用 objURL 时,图片可能会不存在,不知道百度搜图这个操作啥意思 _(:3J∠)_
        # 可能是由于百度会从源地址去下载原图,但是原图不存在的问题
        obj_url = reply_image['objURL']
        middle_url = reply_image['middleURL']
        logger.info(f'obj_url: {obj_url}')
        logger.info(f'middle_url: {middle_url}')
        try:
            # await image.finish(f'[CQ:image,file={escape(reply_image)}]') # 通过字符串暂时无法发送带有特殊符号的图片链接
            await image.finish(get_message(event, obj_url))
            logger.info(f'reply obj_url: {obj_url}')
        except exception.ActionFailed:
            logger.warning(f'reply obj_url failed, retry by middle_url')
            await image.finish(get_message(event, middle_url))
    else:
        logger.info(f'[{message}] no images')
        await image.finish(f'未找到 [{message}] 相关图片 _(:3J∠)_')
Exemple #20
0
async def update_group_members(bot: Bot, group_id: str):
    """Update group members' information and store it to the database."""
    logger.info('Updating group [%s] members ...' % group_id)
    universal_id = str(bot.self_id) + str(group_id)

    # load the original information from the database
    members = load(universal_id, 'members')
    if not members:
        members = {}

    group_members_list = await bot.get_group_member_list(group_id=group_id)
    for member in group_members_list:
        group_member_info = await bot.get_group_member_info(
            group_id=group_id, user_id=member['user_id'], no_cache=True)

        user_id = str(group_member_info['user_id'])

        if user_id not in members:  # update the user information from the remote server
            members[user_id] = {}
        members[user_id]['id'] = group_member_info['title']
        members[user_id]['nickname'] = group_member_info['nickname']
        members[user_id]['card'] = group_member_info['card']

    for user_id in members:  # generate locally stored information
        members[user_id].setdefault('42score', 0)
        members[user_id].setdefault('42score_daily', 0)

    # save the updated information to the database
    save(universal_id, 'members', members)
Exemple #21
0
async def commit():
    """Commit to the database, saving the file on disk from memory."""
    logger.info('Saving the database to disk ...')

    database_backup = os.path.join(database_backup_directory,
                                   '%d.bak' % int(time.time() * 1000000))
    shutil.copyfile(database_location, database_backup)

    backups = os.listdir(database_backup_directory)
    removes = (0 < database_backup_max_storage <
               len(backups)) * (len(backups) - database_backup_max_storage)
    for i in range(removes):
        os.remove(os.path.join(database_backup_directory,
                               backups[i]))  # remove the redundant files

    try:
        with gzip.open(database_location,
                       'wb',
                       compresslevel=database_compress_level) as tf:
            tf.write(json.dumps(database, sort_keys=True).encode())
        return True
    except Exception:
        logger.error('Failed to save the database ...')
        logger.error(traceback.format_exc())
        return False
Exemple #22
0
async def execute(cmd, cwd=SHARED, user="******", main_group="damebot", extra_group=tuple(), env_vars=None, umask=None, empty_hint=True):
    if env_vars is None:
        env_vars = {}
    os.makedirs(cwd, exist_ok=True)
    result = await ensure_user(user, main_group, extra_group)
    splited = shlex.split(cmd)
    logger.info(f"trying to execute {splited}")
    proc = await asyncio.create_subprocess_exec(
        *splited,
        stdout=asyncio.subprocess.PIPE,
        stderr=asyncio.subprocess.PIPE,
        cwd=cwd,
        preexec_fn=set_ids(user, umask),
        env=env_vars,
    )
    logger.debug(f"'{cmd}' process created.")
    stdout, stderr = await proc.communicate()
    logger.debug(f"got stdout \nf{stdout}")
    logger.debug(f"got stderr \nf{stderr}")
    if proc.returncode == 0:
    # also can use proc.returncode
        output = stdout.decode()
        if output.strip() == "":
            output = stderr.decode().strip()
            if empty_hint:
                if output.strip() == "":
                    output = f"'{cmd}' できだ" + "!" * randint(1,3)
    else:
        err_short = await summary(stdout.decode().strip() + " " + stderr.decode().strip())
        output = dame(err_short)
    return output
Exemple #23
0
async def pixiv_rank(bot: Bot, event: Event, state: dict):
    # uid = bot.config.superusers[0]
    # sid = bot.self_id

    now = datetime.datetime.now()
    last = datetime.timedelta(days=1)
    lastday = now - last
    yesterday = lastday.strftime('%Y-%m-%d')
    try:
        aapi.login(USERNAME, PWD)
        res = aapi.illust_ranking(mode='day', date=yesterday)
    except Exception as e:
        await sv_rank.finish('exception')
        return
    if 'has_error' in res:
        error_info = res['errors']['system']['message']
        res_info = f'pixivrank error:{error_info}'
        await sv_rank.finish(res_info)
        return
    if not res.illusts:
        logger.info('no pixiv rank result')
        await sv_rank.finish('no result')
        return
    works = res.illusts[:5]
    rank_list = ''
    for item in works:
        pid = item['id']
        title = item['title']
        account = item['user']['name']
        image = await get_image(pid)
        link = f'https://www.pixiv.net/artworks/{pid}'
        rank_list += f'>>>{title}\n画师:{account}\n{image}\n{link}\n'
    msg = f'======pixiv排行榜======\n{rank_list}'.strip()
    await sv_rank.finish(msg)
Exemple #24
0
    async def refresh_calendar(self) -> None:
        """获取最新的日程表"""
        if self._timeline:
            # 最近四小时内才更新的不用再次更新
            if self._timeline_update_time > datetime.now() - timedelta(hours=4):
                return
        try:
            async with httpx.AsyncClient() as client:
                r = await client.get(self._url)
                rjson = r.json()

                # 清除以前的时间线
                self._timeline.clear()
                for event in rjson:
                    start_time = datetime.strptime(
                        event["start_time"], "%Y/%m/%d %H:%M:%S"
                    )
                    end_time = datetime.strptime(event["end_time"], "%Y/%m/%d %H:%M:%S")
                    name = event["name"]
                    self.add_event(start_time, end_time, name)

                self._timeline_update_time = datetime.now()
                logger.info("公主连结Re:Dive 日程表刷新成功")
        except (httpx.HTTPError, KeyError) as e:
            logger.error(f"获取日程表出错,{e}")
            # 抛出上面任何异常,说明调用失败
            return
def my_trigger_cron(rss: rss_class.Rss):
    # 解析参数
    tmp_list = rss.time.split("_")
    times_list = ["*/5", "*", "*", "*", "*"]
    for index, value in enumerate(tmp_list):
        if value:
            times_list[index] = value
    try:
        # 制作一个触发器
        trigger = CronTrigger(
            minute=times_list[0],
            hour=times_list[1],
            day=times_list[2],
            month=times_list[3],
            day_of_week=times_list[4],
            timezone="Asia/Shanghai",
        )
    except Exception as e:
        logger.error(f"创建定时器错误!cron:{times_list} E:{e}")
        return

    # 添加任务
    scheduler.add_job(
        func=check_update,  # 要添加任务的函数,不要带参数
        trigger=trigger,  # 触发器
        args=(rss,),  # 函数的参数列表,注意:只有一个值时,不能省略末尾的逗号
        id=rss.name,
        misfire_grace_time=30,  # 允许的误差时间,建议不要省略
        max_instances=1,  # 最大并发
        default=ThreadPoolExecutor(64),  # 最大线程
        processpool=ProcessPoolExecutor(8),  # 最大进程
        coalesce=True,  # 积攒的任务是否只跑一次,是否合并所有错过的Job
    )
    logger.info(f"定时任务 {rss.name} 添加成功")
Exemple #26
0
def saveDetail():
    logger.info("Refreshing detail of users and groups.")
    groupList: List[Dict[str, Any]] = callModuleAPI("get_group_list")
    groupData: Dict[int, Dict[str, Any]] = {}
    usersData: Dict[int, List[Dict[str, Any]]] = {}
    for group in groupList:
        groupID: int = group["group_id"]
        groupName: str = group["group_name"]
        data = callModuleAPI("get_group_member_list",
                             params={"group_id": groupID},
                             ignoreError=True)
        if not data:
            continue
        groupData[groupID] = data
        DatabaseIO.groupCreate(models.Groups(gid=groupID,
                                             name=groupName,
                                             members=data),
                               updateIfExist=True)
        for user in data:
            userID: int = user["user_id"]
            userGroups = usersData.get(userID, [])
            for i in userGroups:
                if i["group_id"] == groupID:
                    userGroups.remove(i)
            userGroups.append(user)
            usersData[userID] = userGroups
    for userID, user in usersData.items():
        DatabaseIO.userCreate(
            models.Users(uid=userID, nickname=user[0]["nickname"], data=user),
            updateIfExist=True,
        )
Exemple #27
0
async def _run_matcher(Matcher: Type[Matcher], bot: Bot, event: Event,
                       state: dict) -> Union[None, NoReturn]:
    if Matcher.expire_time and datetime.now() > Matcher.expire_time:
        raise _ExceptionContainer([ExpiredException])

    try:
        if not await Matcher.check_perm(
                bot, event) or not await Matcher.check_rule(bot, event, state):
            return
    except Exception as e:
        logger.error(f"Rule check failed for matcher {Matcher}. Ignored.")
        logger.exception(e)
        return

    # TODO: log matcher
    logger.info(f"Event will be handled by {Matcher}")

    matcher = Matcher()
    # TODO: BeforeMatcherRun
    try:
        logger.debug(f"Running matcher {matcher}")
        await matcher.run(bot, event, state)
    except Exception as e:
        logger.error(f"Running matcher {matcher} failed.")
        logger.exception(e)

    exceptions = []
    if Matcher.temp:
        exceptions.append(ExpiredException)
    if Matcher.block:
        exceptions.append(StopPropagation)
    if exceptions:
        raise _ExceptionContainer(exceptions)
Exemple #28
0
async def getdll():
    data = await request.form
    id = data['id']
    sessionkey = data['sessionkey']
    ret = {}
    if db.isbanned(sessionkey.split('::')[0]):
        ret['status'] = 'banned'
        return json.dumps(ret)
    if id and sessionkey and ssmgr.checkSessionkey(sessionkey) and data['version'] == db.getvar('current_version'):
        db.varpp('dllcount')
        db.varpp('dllcountday')
        db.statistics_injectpp(sessionkey.split('::')[0])
        ret['status'] = 'success'
        paths = db.getDLL(id)
        with open(paths['dllpath'], 'rb') as dllfile:
            with open(paths['xprpath'], 'rb') as xprfile:
                    ret['payload'] = {
                            'dll': base64.b64encode(dllfile.read()).decode(),
                            'xpr': base64.b64encode(xprfile.read()).decode(),
                        }
        if paths['resourcepath']:
            with open(paths['resourcepath'], 'rb') as rcfile:
                ret['payload']['resource'] = base64.b64encode(rcfile.read()).decode()
        if paths['keypath']:
            with open(paths['keypath'], 'rb') as rcfile:
                ret['payload']['keyfile'] = base64.b64encode(rcfile.read()).decode()
                ret['payload']['keyfilename'] = paths['keypath'].split('/')[-1]
        ret['sessionkey'] = sessionkey # db.newSessionkey(sessionkey.split("::")[0])
        await bot.send_group_msg_rate_limited(group_id=config.notice_group,
                                              message='用户' + sessionkey.split('::')[0] + '注入DLL ' + id + ' IP:' + request.remote_addr)
        logger.info('用户' + sessionkey.split('::')[0] + '注入DLL ' + id + ' IP:' + request.remote_addr)
    else:
        ret['status'] = 'failed'
    return json.dumps(ret)
Exemple #29
0
def run(host: Optional[str] = None,
        port: Optional[int] = None,
        *args,
        **kwargs):
    """
    :说明:

      启动 NoneBot,即运行全局 Driver 对象。

    :参数:

      * ``host: Optional[str]``: 主机名/IP,若不传入则使用配置文件中指定的值
      * ``port: Optional[int]``: 端口,若不传入则使用配置文件中指定的值
      * ``*args``: 传入 Driver.run 的位置参数
      * ``**kwargs``: 传入 Driver.run 的命名参数

    :返回:

      - ``None``

    :用法:

    .. code-block:: python

        nonebot.run(host="127.0.0.1", port=8080)

    """
    logger.info("Running NoneBot...")
    get_driver().run(host, port, *args, **kwargs)
    def new(cls, data: Dict[str, Any]) -> "Event":
        """
        此事件类的工厂函数, 能够通过事件数据选择合适的子类进行序列化
        """
        type = data['type']

        def all_subclasses(cls: Type[Event]):
            return set(cls.__subclasses__()).union(
                [s for c in cls.__subclasses__() for s in all_subclasses(c)])

        event_class: Optional[Type[Event]] = None
        for subclass in all_subclasses(cls):
            if subclass.__name__ != type:
                continue
            event_class = subclass

        if event_class is None:
            return Event.parse_obj(data)

        while issubclass(event_class, Event):
            try:
                return event_class.parse_obj(data)
            except ValidationError as e:
                logger.info(
                    f'Failed to parse {data} to class {event_class.__name__}: '
                    f'{e.errors()!r}. Fallback to parent class.')
                event_class = event_class.__base__

        raise ValueError(f'Failed to serialize {data}.')