Exemple #1
0
 async def respondRequest(
         self,
         request: T.Union[eem.BotInvitedJoinGroupRequestEvent,  # 新增
                          eem.NewFriendRequestEvent,
                          eem.MemberJoinRequestEvent],
         operate: T.Union[BotInvitedJoinGroupRequestResponseOperate,
                          NewFriendRequestResponseOperate,
                          MemberJoinRequestResponseOperate, int],
         message: T.Optional[str] = ""):
     """回应请求, 请求指 `添加好友请求` 或 `申请加群请求`."""
     if isinstance(request, eem.BotInvitedJoinGroupRequestEvent):  # 新增
         if not isinstance(
                 operate, (BotInvitedJoinGroupRequestResponseOperate, int)):
             raise TypeError(f"unknown operate: {operate}")
         operate = (operate.value if isinstance(
             operate, BotInvitedJoinGroupRequestResponseOperate) else
                    operate)
         return assertOperatorSuccess(await fetch.http_post(
             f"{self.baseurl}/resp/botInvitedJoinGroupRequestEvent", {
                 "sessionKey": self.session_key,
                 "eventId": request.requestId,
                 "fromId": request.supplicant,
                 "groupId": request.sourceGroup,
                 "operate": operate,
                 "message": message
             }),
                                      raise_exception=True)
     elif isinstance(request, eem.NewFriendRequestEvent):
         if not isinstance(operate, (NewFriendRequestResponseOperate, int)):
             raise TypeError(f"unknown operate: {operate}")
         operate = (operate.value if isinstance(
             operate, NewFriendRequestResponseOperate) else operate)
         return assertOperatorSuccess(await fetch.http_post(
             f"{self.baseurl}/resp/newFriendRequestEvent", {
                 "sessionKey": self.session_key,
                 "eventId": request.requestId,
                 "fromId": request.supplicant,
                 "groupId": request.sourceGroup,
                 "operate": operate,
                 "message": message
             }),
                                      raise_exception=True)
     elif isinstance(request, eem.MemberJoinRequestEvent):
         if not isinstance(operate,
                           (MemberJoinRequestResponseOperate, int)):
             raise TypeError(f"unknown operate: {operate}")
         operate = (operate.value if isinstance(
             operate, MemberJoinRequestResponseOperate) else operate)
         return assertOperatorSuccess(await fetch.http_post(
             f"{self.baseurl}/resp/memberJoinRequestEvent", {
                 "sessionKey": self.session_key,
                 "eventId": request.requestId,
                 "fromId": request.supplicant,
                 "groupId": request.sourceGroup,
                 "operate": operate,
                 "message": message
             }),
                                      raise_exception=True)
     else:
         raise TypeError(f"unknown request: {request}")
Exemple #2
0
 async def revokeMessage(self, source: T.Union[components.Source, int]):
     return assertOperatorSuccess(await fetch.http_post(
         f"{self.baseurl}/recall", {
             "sessionKey": self.session_key,
             "target": source if isinstance(source, int) else source.id
         }),
                                  raise_exception=True)
Exemple #3
0
 async def verify(self):
     return assertOperatorSuccess(
         await fetch.http_post(f"{self.baseurl}/verify", {
             "sessionKey": self.session_key,
             "qq": self.qq
         }
     ), raise_exception=True, return_as_is=True)
Exemple #4
0
    async def fetchMessage(self, count: int) -> T.List[T.Union[FriendMessage, GroupMessage, ExternalEvent]]:
        from mirai.event.external.enums import ExternalEvents
        result = assertOperatorSuccess(
            await fetch.http_get(f"{self.baseurl}/fetchMessage", {
                "sessionKey": self.session_key,
                "count": count
            }
        ), raise_exception=True, return_as_is=True)['data']
        # 因为重新生成一个开销太大, 所以就直接在原数据内进行遍历替换
        try:
            for index in range(len(result)):
                # 判断当前项是否为 Message
                if result[index]['type'] in MessageTypes:
                    if 'messageChain' in result[index]: 
                        result[index]['messageChain'] = MessageChain.parse_obj(result[index]['messageChain'])

                    result[index] = \
                        MessageTypes[result[index]['type']].parse_obj(result[index])

                elif hasattr(ExternalEvents, result[index]['type']):
                    # 判断当前项为 Event
                    result[index] = \
                        ExternalEvents[result[index]['type']].value.parse_obj(result[index])
        except pydantic.ValidationError:
            ProtocolLogger.error(f"parse failed: {result}")
            traceback.print_exc()
            raise
        return result
Exemple #5
0
 async def release(self):
     return assertOperatorSuccess(
         await fetch.http_post(f"{self.baseurl}/release", {
             "sessionKey": self.session_key,
             "qq": self.qq
         }
     ), raise_exception=True)
Exemple #6
0
 async def unmuteAll(self, group: T.Union[Group, int]) -> bool:
     return assertOperatorSuccess(
         await fetch.http_post(f"{self.baseurl}/unmuteAll", {
             "sessionKey": self.session_key,
             "target": self.handleTargetAsGroup(group)
         }
     ), raise_exception=True)
Exemple #7
0
 async def revokeMessage(self, source: T.Union[components.Source, BotMessage, int]):
     return assertOperatorSuccess(await fetch.http_post(f"{self.baseurl}/recall", {
         "sessionKey": self.session_key,
         "target": source if isinstance(source, int) else source.id \
             if isinstance(source, components.Source) else source.messageId\
             if isinstance(source, BotMessage) else\
                 raiser(TypeError("invaild message source"))
     }), raise_exception=True)
 async def groupMkdir(self, target: int, dir_name: str):
     return assertOperatorSuccess(await fetch.http_post(
         f"{self.baseurl}/groupMkdir", {
             "sessionKey": self.session_key,
             "target": target,
             "dir": dir_name
         }),
                                  raise_exception=True)
 async def groupDeleteFile(self, target: int, id: str):
     return assertOperatorSuccess(await fetch.http_post(
         f"{self.baseurl}/groupFileDelete", {
             "sessionKey": self.session_key,
             "target": target,
             "id": id
         }),
                                  raise_exception=True)
Exemple #10
0
 async def unmute(self, group: T.Union[Group, int], member: T.Union[Member,
                                                                    int]):
     return assertOperatorSuccess(await fetch.http_post(
         f"{self.baseurl}/unmute", {
             "sessionKey": self.session_key,
             "target": self.handleTargetAsGroup(group),
             "memberId": self.handleTargetAsMember(member),
         }),
                                  raise_exception=True)
Exemple #11
0
 async def changeGroupConfig(self, group: T.Union[Group, int],
                             config: GroupSetting) -> bool:
     return assertOperatorSuccess(await fetch.http_post(
         f"{self.baseurl}/groupConfig", {
             "sessionKey": self.session_key,
             "target": self.handleTargetAsGroup(group),
             "config": json.loads(config.json())
         }),
                                  raise_exception=True)
Exemple #12
0
 async def sendCommand(self, command, *args):
     return assertOperatorSuccess(await fetch.http_post(
         f"{self.baseurl}/command/send", {
             "authKey": self.auth_key,
             "name": command,
             "args": args
         }),
                                  raise_exception=True,
                                  return_as_is=True)
Exemple #13
0
 async def quit(
         self,  # 新增
         group: T.Union[Group, int]):
     return assertOperatorSuccess(await fetch.http_post(
         f"{self.baseurl}/quit", {
             "sessionKey": self.session_key,
             "target": self.handleTargetAsGroup(group)
         }),
                                  raise_exception=True)
Exemple #14
0
 async def memberInfo(self,
     group: T.Union[Group, int],
     member: T.Union[Member, int]
 ):
     return MemberChangeableSetting.parse_obj(assertOperatorSuccess(
         await fetch.http_get(f"{self.baseurl}/memberInfo", {
             "sessionKey": self.session_key,
             "target": self.handleTargetAsGroup(group),
             "memberId": self.handleTargetAsMember(member)
         }
     ), raise_exception=True, return_as_is=True))
Exemple #15
0
 async def changeMemberInfo(self, group: T.Union[Group, int],
                            member: T.Union[Member, int],
                            setting: MemberChangeableSetting) -> bool:
     return assertOperatorSuccess(await fetch.http_post(
         f"{self.baseurl}/memberInfo", {
             "sessionKey": self.session_key,
             "target": self.handleTargetAsGroup(group),
             "memberId": self.handleTargetAsMember(member),
             "info": json.loads(setting.json())
         }),
                                  raise_exception=True)
Exemple #16
0
 async def setConfig(self, cacheSize=None, enableWebsocket=None):
     return assertOperatorSuccess(await fetch.http_post(
         f"{self.baseurl}/config", {
             "sessionKey": self.session_key,
             **({
                 "cacheSize": cacheSize
             } if cacheSize else {}),
             **({
                 "enableWebsocket": enableWebsocket
             } if enableWebsocket else {})
         }),
                                  raise_exception=True,
                                  return_as_is=True)
Exemple #17
0
 async def kick(self,
                group: T.Union[Group, int],
                member: T.Union[Member, int],
                kickMessage: T.Optional[str] = None):
     return assertOperatorSuccess(await fetch.http_post(
         f"{self.baseurl}/kick", {
             "sessionKey": self.session_key,
             "target": self.handleTargetAsGroup(group),
             "memberId": self.handleTargetAsMember(member),
             **({
                 "msg": kickMessage
             } if kickMessage else {})
         }),
                                  raise_exception=True)
 async def nudge(self, type: T.Union[str, NudgeType], subject: int,
                 target: int):
     type = type if isinstance(type, str) else type.value
     return assertOperatorSuccess(
         await fetch.http_post(
             f"{self.baseurl}/sendNudge",
             {
                 "sessionKey": self.session_key,
                 "target": target,
                 "subject": subject,
                 "kind": '{}{}'.format(type[0].upper(),
                                       type[1:])  # 不知道为什么现在需要首字母大写
             }),
         raise_exception=True)
Exemple #19
0
 async def sendFriendMessage(
     self, friend: T.Union[Friend, int],
     message: T.Union[MessageChain, BaseMessageComponent,
                      T.List[BaseMessageComponent], str]
 ) -> BotMessage:
     return BotMessage.parse_obj(
         assertOperatorSuccess(await fetch.http_post(
             f"{self.baseurl}/sendFriendMessage", {
                 "sessionKey": self.session_key,
                 "target": self.handleTargetAsFriend(friend),
                 "messageChain": await self.handleMessageAsFriend(message)
             }),
                               raise_exception=True,
                               return_as_is=True))
Exemple #20
0
 async def mute(self, group: T.Union[Group, int],
                member: T.Union[Member, int], time: T.Union[timedelta,
                                                            int]):
     if isinstance(time, timedelta):
         time = int(time.total_seconds())
     time = min(86400 * 30, max(60, time))
     return assertOperatorSuccess(await fetch.http_post(
         f"{self.baseurl}/mute", {
             "sessionKey": self.session_key,
             "target": self.handleTargetAsGroup(group),
             "memberId": self.handleTargetAsMember(member),
             "time": time
         }),
                                  raise_exception=True)
Exemple #21
0
 async def sendGroupMessage(
         self,
         group: T.Union[Group, int],
         message: T.Union[MessageChain, BaseMessageComponent,
                          T.List[BaseMessageComponent], str],
         quoteSource: T.Union[int, components.Source] = None) -> BotMessage:
     return BotMessage.parse_obj(assertOperatorSuccess(
         await fetch.http_post(f"{self.baseurl}/sendGroupMessage", {
             "sessionKey": self.session_key,
             "target": self.handleTargetAsGroup(group),
             "messageChain": await self.handleMessageAsGroup(message),
             **({"quote": quoteSource.id \
                     if isinstance(quoteSource, components.Source) else quoteSource}\
                 if quoteSource else {})
         }
     ), raise_exception=True, return_as_is=True))
Exemple #22
0
    async def messageFromId(self, sourceId: T.Union[components.Source, components.Quote, int]):
        if isinstance(sourceId, (components.Source, components.Quote)):
            sourceId = sourceId.id

        result = assertOperatorSuccess(await fetch.http_get(f"{self.baseurl}/messageFromId", {
            "sessionKey": self.session_key,
            "id": sourceId
        }), raise_exception=True, return_as_is=True)

        if result['type'] in MessageTypes:
            if "messageChain" in result:
                result['messageChain'] = MessageChain.custom_parse(result['messageChain'])

            return MessageTypes[result['type']].parse_obj(result)
        else:
            raise TypeError(f"unknown message, not found type.")
Exemple #23
0
 async def fetchMessage(self, count: int) -> T.List[T.Union[FriendMessage, GroupMessage, ExternalEvent]]:
     result = assertOperatorSuccess(
         await fetch.http_get(f"{self.baseurl}/fetchMessage", {
             "sessionKey": self.session_key,
             "count": count
         }
     ), raise_exception=True, return_as_is=True)
     for index in range(len(result)): # 因为重新生成一个开销太大, 所以就直接在原数据内进行遍历替换
         if result[index]['type'] in MessageTypes: # 判断当前项是否为 Message
             if 'messageChain' in result[index]: # 使用 custom_parse 方法处理消息链
                 result[index]['messageChain'] = MessageChain.custom_parse(result[index]['messageChain'])
             result[index] = \
                 MessageTypes[result[index]['type']].parse_obj(result[index])
         elif hasattr(ExternalEvents, result[index]['type']): # 判断当前项是否为 Event
             result[index] = \
                 ExternalEvents[result[index]['type']].value.parse_obj(result[index])
     return result
Exemple #24
0
 async def sendTempMessage(
         self,
         group: T.Union[Group, int],
         member: T.Union[Member, int],
         message: T.Union[MessageChain, BaseMessageComponent,
                          T.List[T.Union[BaseMessageComponent,
                                         InternalImage]], str],
         quoteSource: T.Union[int, components.Source] = None) -> BotMessage:
     return BotMessage.parse_obj(assertOperatorSuccess(
         await fetch.http_post(f"{self.baseurl}/sendTempMessage", {
             "sessionKey": self.session_key,
             "qq": (member.id if isinstance(member, Member) else member),
             "group": (group.id if isinstance(group, Group) else group),
             "messageChain": await self.handleMessageForTempMessage(message),
             **({"quote": quoteSource.id \
                 if isinstance(quoteSource, components.Source) else quoteSource}\
             if quoteSource else {})
         }
     ), raise_exception=True, return_as_is=True))
Exemple #25
0
 async def mute(self, group: T.Union[Group, int],
                member: T.Union[Member, int], time: T.Union[timedelta,
                                                            int]):
     return assertOperatorSuccess(
         await fetch.http_post(f"{self.baseurl}/mute", {
             "sessionKey": self.session_key,
             "target": self.handleTargetAsGroup(group),
             "memberId": self.handleTargetAsMember(member),
             "time": time if isinstance(time, int) else \
                     int(time.total_seconds()) \
                         if timedelta(days=30) >= time >= timedelta(minutes=1) \
                     else \
                         int(timedelta(days=30).total_seconds()) \
                             if timedelta(days=30) >= time else \
                         int(timedelta(minutes=1).total_seconds()) \
                             if time <= timedelta(minutes=1) else \
                         raiser(ValueError("invaild time."))
                 if isinstance(time, timedelta) else raiser(ValueError("invaild time."))
         }
     ), raise_exception=True)
Exemple #26
0
 async def getConfig(self) -> dict:
     return assertOperatorSuccess(
         await fetch.http_get(f"{self.baseurl}/config", {
             "sessionKey": self.session_key
         }
     ), raise_exception=True, return_as_is=True)
Exemple #27
0
 async def auth(self):
     return assertOperatorSuccess(
         await fetch.http_post(f"{self.baseurl}/auth", {
             "authKey": self.auth_key
         }
     ), raise_exception=True, return_as_is=True)
Exemple #28
0
 async def getManagers(self):
     return assertOperatorSuccess(await fetch.http_get(f"{self.baseurl}/managers"))