Exemplo n.º 1
0
 async def wrapper(*args, **kwargs):
     member_id = -1
     group_id = -1
     for i in args:
         if isinstance(i, Member):
             member_id = i.id
         if isinstance(i, Group):
             group_id = i.id
     if member_id == -1 or group_id == -1 or not await get_setting(group_id, Setting.frequency_limit):
         if asyncio.iscoroutinefunction(func):
             return await func(*args, **kwargs)
         return func(*args, **kwargs)
     frequency_limit_instance = GlobalFrequencyLimitDict()
     await frequency_limit_instance.add_record(group_id, member_id, weight)
     if frequency_limit_instance.blacklist_judge(group_id, member_id):
         if not frequency_limit_instance.announce_judge(group_id, member_id):
             await frequency_limit_instance.blacklist_announced(group_id, member_id)
             return MessageItem(MessageChain.create([Plain(text="检测到大量请求,加入黑名单一小时!")]), QuoteSource(GroupStrategy()))
         else:
             return MessageItem(MessageChain.create([Plain("")]), DoNoting(GroupStrategy()))
     if frequency_limit_instance.get(group_id, member_id, func.__name__) + weight >= 10:
         return MessageItem(MessageChain.create([Plain(text="超过频率调用限制!")]), QuoteSource(GroupStrategy()))
     else:
         await frequency_limit_instance.update(group_id, weight)
         if asyncio.iscoroutinefunction(func):
             return await func(*args, **kwargs)
         return func(*args, **kwargs)
Exemplo n.º 2
0
async def bot_join_group(app: GraiaMiraiApplication, group: Group):
    logger.info(f"机器人加入群组 <{group.name}>")
    try:
        await orm.insert_or_update(Setting, [Setting.group_id == group.id], {
            "group_id": group.id,
            "group_name": group.name,
            "active": True
        })
        await orm.insert_or_update(
            UserPermission, [
                UserPermission.member_id == core.get_config()["HostQQ"],
                UserPermission.group_id == group.id
            ], {
                "member_id": core.get_config()["HostQQ"],
                "group_id": group.id,
                "level": 4
            })
        GlobalFrequencyLimitDict().add_group(group.id)
        await app.sendGroupMessage(
            group,
            MessageChain.create([Plain(text="欸嘿嘿~我来啦!宇宙无敌小可爱纱雾酱华丽登场!")]))
    except AccountMuted:
        pass
    except:
        logger.error(traceback.format_exc())
Exemplo n.º 3
0
 async def bot_launch_init(self):
     self.config_check()
     try:
         await orm.create_all()
         await orm.update(Setting, [], {"active": False})
         group_list = await self.__app.groupList()
         frequency_limit_dict = {}
         for group in group_list:
             frequency_limit_dict[group.id] = 0
             await orm.insert_or_update(Setting,
                                        [Setting.group_id == group.id], {
                                            "group_id": group.id,
                                            "group_name": group.name,
                                            "active": True
                                        })
         results = await orm.fetchall(
             select(Setting.group_id,
                    Setting.group_name).where(Setting.active == True))
         logger.info("本次启动活动群组如下:")
         for result in results:
             logger.info(
                 f"群ID: {str(result.group_id).ljust(14)}群名: {result.group_name}"
             )
         for result in results:
             await orm.insert_or_update(
                 UserPermission, [
                     UserPermission.member_id == self.__config["HostQQ"],
                     UserPermission.group_id == result[0]
                 ], {
                     "member_id": self.__config["HostQQ"],
                     "group_id": result[0],
                     "level": 4
                 })
         self.__frequency_limit_instance = GlobalFrequencyLimitDict(
             frequency_limit_dict)
         threading.Thread(target=frequency_limit,
                          args=(self.__frequency_limit_instance, )).start()
         exception_resender_instance = ExceptionReSender(self.__app)
         listener = threading.Thread(target=exception_resender_listener,
                                     args=(self.__app,
                                           exception_resender_instance,
                                           self.__loop))
         listener.start()
     except:
         logger.error(traceback.format_exc())
         exit()
Exemplo n.º 4
0
 async def bot_launch_init(self):
     self.config_check()
     orm.session.query(Setting).update({"active": False})
     group_list = await self.__app.groupList()
     frequency_limit_dict = {}
     for group in group_list:
         frequency_limit_dict[group.id] = 0
         try:
             orm.update(Setting, {"group_id": group.id}, {
                 "group_id": group.id,
                 "group_name": group.name,
                 "active": True
             })
         except Exception:
             logger.error(traceback.format_exc())
             orm.session.rollback()
     results = orm.fetchall(select(Setting).where(Setting.active == True))
     logger.info("本次启动活动群组如下:")
     for result in results:
         logger.info(f"群ID: {str(result[0]).ljust(14)}群名: {result[1]}")
     for result in results:
         orm.update(UserPermission, {
             "member_id": self.__config["HostQQ"],
             "group_id": result[0]
         }, {
             "member_id": self.__config["HostQQ"],
             "group_id": result[0],
             "level": 4
         })
     self.__frequency_limit_instance = GlobalFrequencyLimitDict(
         frequency_limit_dict)
     threading.Thread(target=frequency_limit,
                      args=(self.__frequency_limit_instance, )).start()
     exception_resender_instance = ExceptionReSender(self.__app)
     listener = threading.Thread(target=exception_resender_listener,
                                 args=(self.__app,
                                       exception_resender_instance,
                                       self.__loop))
     listener.start()
Exemplo n.º 5
0
 async def wrapper(*args, **kwargs):
     member_id = -1
     group_id = -1
     for i in args:
         if isinstance(i, Member):
             member_id = i.id
         if isinstance(i, Group):
             group_id = i.id
     if member_id == -1 or group_id == -1:
         if asyncio.iscoroutinefunction(func):
             return await func(*args, **kwargs)
         return func(*args, **kwargs)
     frequency_limit_instance = GlobalFrequencyLimitDict()
     frequency_limit_instance.add_record(group_id, member_id, weight)
     if frequency_limit_instance.blacklist_judge(group_id, member_id):
         if not frequency_limit_instance.announce_judge(
                 group_id, member_id):
             frequency_limit_instance.blacklist_announced(
                 group_id, member_id)
             return MessageItem(
                 MessageChain.create(
                     [Plain(text="检测到大量请求,警告一次,加入黑名单一小时!")]),
                 QuoteSource(GroupStrategy()))
         else:
             return MessageItem(MessageChain.create([]),
                                DoNoting(GroupStrategy()))
     if frequency_limit_instance.get(group_id) + weight >= 10:
         return MessageItem(
             MessageChain.create([
                 Plain(
                     text="Frequency limit exceeded every 10 seconds!")
             ]), QuoteSource(GroupStrategy()))
     else:
         frequency_limit_instance.update(group_id, weight)
         if asyncio.iscoroutinefunction(func):
             return await func(*args, **kwargs)
         return func(*args, **kwargs)
Exemplo n.º 6
0
 async def wrapper(*args, **kwargs):
     member_id = -1
     group_id = -1
     for i in args:
         if isinstance(i, Member):
             member_id = i.id
         if isinstance(i, Group):
             group_id = i.id
     if member_id == -1 or group_id == -1 or not await get_setting(
             group_id, Setting.frequency_limit):
         if asyncio.iscoroutinefunction(func):
             return await func(*args, **kwargs)
         return func(*args, **kwargs)
     frequency_limit_instance = GlobalFrequencyLimitDict()
     frequency_limit_instance.add_record(group_id, member_id, weight)
     if frequency_limit_instance.blacklist_judge(group_id, member_id):
         if not frequency_limit_instance.announce_judge(
                 group_id, member_id):
             frequency_limit_instance.blacklist_announced(
                 group_id, member_id)
             raise FrequencyLimitExceededAddBlackList
         else:
             raise FrequencyLimitExceededDoNothing
     if frequency_limit_instance.get(group_id) + weight >= 10:
         raise FrequencyLimitExceeded
     else:
         frequency_limit_instance.update(group_id, weight)
         if asyncio.iscoroutinefunction(func):
             return await func(*args, **kwargs)
         return func(*args, **kwargs)