예제 #1
0
 def infos(self, list_objects, with_userid=True, **kwargs):
     if with_userid:
         printer.infos(list_objects,
                       **kwargs,
                       extra_info=f'用户id:{self.id} 名字:{self.alias}')
     else:
         printer.infos(list_objects, **kwargs)
    async def check_result(self):
        while True:
            results = dyn_raffle_sql.select_rafflestatus(
                1, None,
                utils.curr_time() - 900)  # 延迟15min处理抽奖
            results += dyn_raffle_sql.select_rafflestatus(
                -1, None,
                utils.curr_time() - 900)
            printer.infos(['正在查找已经结束的动态抽奖:', results])
            for dyn_raffle_status in results:

                dyn_raffle_results: Optional[
                    DynRaffleResults] = await notifier.exec_func(
                        -1, DynRaffleHandlerTask.fetch_dyn_raffle_results,
                        dyn_raffle_status)
                print(dyn_raffle_status, dyn_raffle_results)

                await notifier.exec_task_awaitable(-2,
                                                   DynRaffleHandlerTask,
                                                   2,
                                                   dyn_raffle_status,
                                                   dyn_raffle_results,
                                                   delay_range=(0, 30))
                if dyn_raffle_results is not None:
                    dyn_raffle_sql.insert_dynraffle_results_table(
                        dyn_raffle_results)
                dyn_raffle_sql.del_from_dynraffle_status_table(
                    dyn_raffle_status.dyn_id)

            await asyncio.sleep(120)
    async def check_result(self):
        while True:
            results = substance_raffle_sql.select_rafflestatus(
                1, None,
                utils.curr_time() - 900)  # 延迟15min处理抽奖
            results += substance_raffle_sql.select_rafflestatus(
                -1, None,
                utils.curr_time() - 900)
            printer.infos(['正在查找已经结束的实物抽奖:', results])
            for substance_raffle_status in results:

                substance_raffle_results: Optional[
                    SubstanceRaffleResults] = await notifier.exec_func(
                        -1, SubstanceRaffleHandlerTask.
                        fetch_substance_raffle_results,
                        substance_raffle_status)
                print(substance_raffle_status, substance_raffle_results)

                await notifier.exec_task_awaitable(-2,
                                                   SubstanceRaffleHandlerTask,
                                                   2,
                                                   substance_raffle_status,
                                                   substance_raffle_results,
                                                   delay_range=(0, 30))
                if substance_raffle_results is not None:
                    substance_raffle_sql.insert_substanceraffle_results_table(
                        substance_raffle_results)
                substance_raffle_sql.del_from_substanceraffle_status_table(
                    substance_raffle_status.aid,
                    substance_raffle_status.number)

            await asyncio.sleep(30)
예제 #4
0
 async def is_normal_room(roomid):
     if not roomid:
         return True
     json_response = await UtilsReq.init_room(roomid)
     if not json_response['code']:
         data = json_response['data']
         param1 = data['is_hidden']
         param2 = data['is_locked']
         param3 = data['encrypted']
         if any((param1, param2, param3)):
             printer.infos([f'抽奖脚本检测到房间{roomid:^9}为异常房间'])
             return False
         else:
             printer.infos([f'抽奖脚本检测到房间{roomid:^9}为正常房间'])
             return True
    async def run(self):
        results = dyn_raffle_sql.select_rafflestatus(0)
        for dyn_raffle_status in results:
            print(dyn_raffle_status)
            printer.infos([f'正在暴力处理上次中断的{dyn_raffle_status.doc_id}的动态抽奖后续'])
            dyn_raffle_sql.set_rafflestatus_handle_status(
                1, dyn_raffle_status.dyn_id)

        printer.infos([f'欢迎使用动态抽奖'])
        tasks = []
        task_check_raffle = asyncio.ensure_future(self.check_raffle())
        tasks.append(task_check_raffle)
        task_check_result = asyncio.ensure_future(self.check_result())
        tasks.append(task_check_result)
        if not self.should_join_immediately:
            task_check_join = asyncio.ensure_future(self.check_handle())
            tasks.append(task_check_join)
        await asyncio.wait(tasks)
    async def run(self):
        results = substance_raffle_sql.select_rafflestatus(0)
        for substance_raffle_status in results:
            print(substance_raffle_status)
            aid = substance_raffle_status.aid
            number = substance_raffle_status.number
            printer.infos([f'正在暴力处理上次中断的{aid}({number})的实物抽奖后续'])
            substance_raffle_sql.set_rafflestatus_handle_status(1, aid, number)

        printer.infos([f'欢迎使用实物抽奖'])
        tasks = []
        task_check_raffle = asyncio.ensure_future(self.check_raffle())
        tasks.append(task_check_raffle)
        task_check_result = asyncio.ensure_future(self.check_result())
        tasks.append(task_check_result)
        if not self.should_join_immediately:
            task_check_join = asyncio.ensure_future(self.check_handle())
            tasks.append(task_check_join)
        await asyncio.wait(tasks)
 async def check_handle(self):
     while True:
         curr_time = utils.curr_time()
         results = substance_raffle_sql.select_rafflestatus(
             -1, (curr_time - 45, curr_time + 90))[:5]
         printer.infos(['正在查找需要参与的实物抽奖:', results])
         for substance_raffle_status in results:
             print(substance_raffle_status)
             aid = substance_raffle_status.aid
             number = substance_raffle_status.number
             is_exist = await notifier.exec_func(
                 -1, SubstanceRaffleHandlerTask.check, aid)
             if not is_exist:
                 substance_raffle_sql.del_from_substanceraffle_status_table(
                     aid, number)
                 printer.warn(f'{substance_raffle_status}消失了。。。。。')
                 continue
             printer.infos([f'{aid}({number})的实物抽奖正在参与'])
             await notifier.exec_task_awaitable(-2,
                                                SubstanceRaffleHandlerTask,
                                                1, substance_raffle_status)
             substance_raffle_sql.set_rafflestatus_handle_status(
                 1, aid, number)
             printer.infos([f'{aid}({number})的实物抽奖参与完毕'])
         if not results:
             await asyncio.sleep(60)
    async def dig_and_filter(self,
                             substance_raffle_status: SubstanceRaffleStatus):
        aid = substance_raffle_status.aid
        number = substance_raffle_status.number

        if substance_raffle_status.join_end_time <= utils.curr_time() + 90:
            printer.infos([f'{aid}({number})的实物抽奖已经开奖或马上开奖,不再参与/记录'])
            return
        for key_word in self.substance_raffle_description_filter:
            if key_word in substance_raffle_status.describe:
                printer.infos([f'{aid}({number})的实物抽奖正文触发关键词过滤({key_word})'])
                return
        if substance_raffle_sql.is_raffleid_duplicate(aid, number):
            printer.infos([f'{aid}({number})的实物抽奖触发重复性过滤'])
            return

        substance_raffle_sql.insert_substanceraffle_status_table(
            substance_raffle_status)

        printer.infos([f'{aid}({number})的实物抽奖通过过滤与验证,正式处理'])
        assert not self.should_join_immediately
        if not self.should_join_immediately:
            printer.infos([f'{aid}({number})的实物抽奖暂不参与,仅记录数据库中等候轮询'])
        return
 async def check_handle(self):
     while True:
         curr_time = utils.curr_time()
         results = dyn_raffle_sql.select_rafflestatus(
             -1, curr_time + 300, curr_time + 1200)[:5]  # 20分钟到5分钟
         printer.infos(['正在查找需要参与的动态抽奖:', results])
         for dyn_raffle_status in results:
             print(dyn_raffle_status)
             is_exist = await notifier.exec_func(-1,
                                                 DynRaffleHandlerTask.check,
                                                 dyn_raffle_status.doc_id)
             if not is_exist:
                 dyn_raffle_sql.del_from_dynraffle_status_table(
                     dyn_raffle_status.dyn_id)
                 continue
             printer.infos([f'{dyn_raffle_status.doc_id}的动态抽奖正在参与'])
             await notifier.exec_task_awaitable(-2, DynRaffleHandlerTask, 1,
                                                dyn_raffle_status)
             dyn_raffle_sql.set_rafflestatus_handle_status(
                 1, dyn_raffle_status.dyn_id)
             printer.infos([f'{dyn_raffle_status.doc_id}的动态抽奖参与完毕'])
         if not results:
             await asyncio.sleep(60)
    async def dig_and_filter(self, dyn_raffle_status: DynRaffleStatus):
        doc_id = dyn_raffle_status.doc_id
        if dyn_raffle_status.lottery_time <= utils.curr_time() + 180:
            printer.infos([f'{doc_id}的动态抽奖已经开奖或马上开奖,不再参与'])
            return
        for key_word in self.dyn_raffle_description_filter:
            if key_word in dyn_raffle_status.describe:
                printer.infos([f'{doc_id}的动态抽奖正文触发关键词过滤({key_word})'])
                return
        for key_word in self.dyn_prize_cmt_filter:
            if key_word in dyn_raffle_status.prize_cmt_1st or \
                    key_word in dyn_raffle_status.prize_cmt_2nd or \
                    key_word in dyn_raffle_status.prize_cmt_3rd:
                printer.infos([f'{doc_id}的动态抽奖正文触发关键词过滤({key_word})'])
                return
        # 如果是刚刚出来的抽奖,就延迟150秒,
        if dyn_raffle_status.post_time >= utils.curr_time() - 150:
            printer.infos([f'{doc_id}的动态抽奖触发时间约束,休眠150秒后再正式参与'])
            await asyncio.sleep(150)

        if dyn_raffle_sql.is_raffleid_duplicate(dyn_raffle_status.dyn_id):
            printer.infos([f'{dyn_raffle_status.doc_id}的动态抽奖触发重复性过滤'])
            return
        dyn_raffle_sql.insert_dynraffle_status_table(dyn_raffle_status)

        printer.infos([f'{doc_id}的动态抽奖通过过滤与验证,正式处理'])

        if not self.should_join_immediately:
            printer.infos([f'{dyn_raffle_status.doc_id}的动态抽奖暂不参与,仅记录数据库中等候轮询'])
            return
        printer.infos([f'{doc_id}的动态抽奖正在参与'])
        await notifier.exec_task_awaitable(-2,
                                           DynRaffleHandlerTask,
                                           1,
                                           dyn_raffle_status,
                                           delay_range=(0, 30))
        dyn_raffle_sql.set_rafflestatus_handle_status(1,
                                                      dyn_raffle_status.dyn_id)
        printer.infos([f'{doc_id}的动态抽奖参与完毕'])