def get_annotations_mapping(self):
     return {
         Mirai: lambda k: self,
         GroupMessage: lambda k: k.body \
             if self.getEventCurrentName(k.body) == "GroupMessage" else \
             raiser(ValueError("you cannot setting a unbind argument.")),
         FriendMessage: lambda k: k.body \
             if self.getEventCurrentName(k.body) == "FriendMessage" else \
             raiser(ValueError("you cannot setting a unbind argument.")),
         TempMessage: lambda k: k.body \
             if self.getEventCurrentName(k.body) == "TempMessage" else \
             raiser(ValueError("you cannot setting a unbind argument.")),
         MessageChain: lambda k: k.body.messageChain \
             if self.getEventCurrentName(k.body) in MessageTypes else \
             raiser(ValueError("MessageChain is not enable in this type of event.")),
         components.Source: lambda k: k.body.messageChain.getSource() \
             if self.getEventCurrentName(k.body) in MessageTypes else \
             raiser(TypeError("Source is not enable in this type of event.")),
         Group: lambda k: k.body.sender.group \
             if self.getEventCurrentName(k.body) in ["GroupMessage", "TempMessage"] else \
             raiser(ValueError("Group is not enable in this type of event.")),
         Friend: lambda k: k.body.sender \
             if self.getEventCurrentName(k.body) == "FriendMessage" else \
             raiser(ValueError("Friend is not enable in this type of event.")),
         Member: lambda k: k.body.sender \
             if self.getEventCurrentName(k.body) in ["GroupMessage", "TempMessage"] else \
             raiser(ValueError("Group is not enable in this type of event.")),
         "Sender": lambda k: k.body.sender \
             if self.getEventCurrentName(k.body) in MessageTypes else \
             raiser(ValueError("Sender is not enable in this type of event.")),
         "Type": lambda k: self.getEventCurrentName(k.body),
         **self.gen_event_anno()
     }
Beispiel #2
0
 def get_annotations_mapping(self):
   from .event.message import MessageChain
   return {
     Session: lambda k: self,
     GroupMessage: lambda k: k.body \
       if k.name == "GroupMessage" else\
         raiser(ValueError("you cannot setting a unbind argument.")),
     FriendMessage: lambda k: k.body \
       if k.name == "FriendMessage" else\
         raiser(ValueError("you cannot setting a unbind argument.")),
     MessageChain: lambda k: k.body.messageChain\
       if k.name in MessageTypes else\
         raiser(ValueError("MessageChain is not enable in this type of event.")),
     components.Source: lambda k: k.body.messageChain.getSource()\
       if k.name in MessageTypes else\
         raiser(TypeError("Source is not enable in this type of event.")),
     Group: lambda k: k.body.sender.group\
       if k.name == "GroupMessage" else\
         raiser(ValueError("Group is not enable in this type of event.")),
     Friend: lambda k: k.body.sender\
       if k.name == "FriendMessage" else\
         raiser(ValueError("Friend is not enable in this type of event.")),
     Member: lambda k: k.body.sender\
       if k.name == "GroupMessage" else\
         raiser(ValueError("Group is not enable in this type of event.")),
     "Sender": lambda k: k.body.sender\
       if k.name in MessageTypes else\
         raiser(ValueError("Sender is not enable in this type of event.")),
     "Type": lambda k: k.name,
     **self.gen_event_anno()
   }
Beispiel #3
0
 async def handleMessageForTempMessage(
     self, 
     message: T.Union[
         MessageChain,
         BaseMessageComponent,
         T.List[BaseMessageComponent],
         str
     ]):
     if isinstance(message, MessageChain):
         return json.loads(message.json())
     elif isinstance(message, BaseMessageComponent):
         return [json.loads(message.json())]
     elif isinstance(message, (tuple, list)):
         result = []
         for i in message:
             if isinstance(i, InternalImage):
                 result.append({
                     "type": "Image" if not i.flash else "FlashImage",
                     "imageId": (await self.handleInternalImageForTempMessage(i)).asFriendImage()
                 })
             elif isinstance(i, components.Image):
                 result.append({
                     "type": "Image" if not i.flash else "FlashImage",
                     "imageId": i.asFriendImage()
                 })
             else:
                 result.append(json.loads(i.json()))
         return result
     elif isinstance(message, str):
         return [json.loads(components.Plain(text=message).json())]
     else:
         raise raiser(ValueError("invaild message."))
Beispiel #4
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)
Beispiel #5
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)
Beispiel #6
0
    async def handleMessageAsFriend(
        self, message: T.Union[MessageChain, BaseMessageComponent,
                               T.List[BaseMessageComponent], str]):
        return json.loads(message.json()) \
            if isinstance(message, MessageChain) else \
                [json.loads(message.json())] \
            if isinstance(message, BaseMessageComponent) else \
                [
                    json.loads(i.json()) \
                        # 对Image特殊处理

                        if type(i) != InternalImage else \
                    {
                        "type": "Image",
                        "imageId": (await self.handleInternalImageAsFriend(i)).asFriendImage()
                    } \
                    for i in message if i
                ] \
            if isinstance(message, (tuple, list)) else \
                [json.loads(components.Plain(text=message).json())] \
            if isinstance(message, str) else \
                raiser(ValueError("invaild message(s)."))
Beispiel #7
0
 def handleMessageAsGroup(
     self,
     message: T.Union[
         MessageChain,
         BaseMessageComponent,
         T.List[BaseMessageComponent],
         str
     ]):
     return json.loads(message.json()) \
         if isinstance(message, MessageChain) else \
             [json.loads(message.json())] \
         if isinstance(message, BaseMessageComponent) else \
             [
                 json.loads(i.json()) \
                     # 对Image特殊处理
                     if type(i) != components.Image else \
                         {"type": "Image", "imageId": i.asGroupImage()} \
                 for i in message
             ] \
         if isinstance(message, (tuple, list)) else \
             [json.loads(components.Plain(text=message).json())] \
         if isinstance(message, str) else \
             raiser(ValueError("invaild message(s)."))
Beispiel #8
0
 def handleTargetAsMember(self, target: T.Union[Member, int]):
     return target if isinstance(target, int) else \
         target.id if isinstance(target, Member) else \
             raiser(ValueError("invaild target as a member obj."))
Beispiel #9
0
 def handleTargetAsFriend(self, target: T.Union[Friend, int]):
     return target if isinstance(target, int) else \
         target.id if isinstance(target, Friend) else \
             raiser(ValueError("invaild target as a friend obj."))
Beispiel #10
0
 def handleTargetAsGroup(self, target: T.Union[Group, int]):
     return target if isinstance(target, int) else \
         target.id if isinstance(target, Group) else \
             raiser(ValueError("invaild target as group."))
Beispiel #11
0
  async def main_entrance(self, run_body, event_context, queue):
    if isinstance(run_body, dict):
      callable_target = run_body['func']
      for depend in run_body['dependencies']:
        await self.main_entrance(
          {
            "func": depend.func if not inspect.isclass(depend.func) else\
              depend.func.__call__ if hasattr(depend.func, "__call__") else\
                raiser(TypeError("must be callable.")), 
              "middlewares": depend.middlewares
          },
          event_context, queue
        )
    else:
      callable_target = run_body if not inspect.isclass(run_body) else\
        run_body.__call__ if hasattr(run_body, "__call__") else\
          raiser(TypeError("must be callable."))

    translated_mapping = {
      **(await self.argument_compiler(
        callable_target,
        event_context
      )),
      **(await self.signature_checkout(
        callable_target,
        event_context,
        queue
      ))
    }

    try:
      if isinstance(run_body, dict):
        middlewares = run_body.get("middlewares")
        if middlewares:
          async_middlewares = []
          normal_middlewares = []

          for middleware in middlewares:
            if all([
              hasattr(middleware, "__aenter__"),
              hasattr(middleware, "__aexit__")
            ]):
              async_middlewares.append(middleware)
            elif all([
              hasattr(middleware, "__enter__"),
              hasattr(middleware, "__exit__")
            ]):
              normal_middlewares.append(middleware)
            else:
              SessionLogger.error(f"threw a exception by {event_context.name}, no currect context error.")
              raise AttributeError("no a currect context object.")

          async with contextlib.AsyncExitStack() as async_stack:
            for async_middleware in async_middlewares:
              SessionLogger.debug(f"a event called {event_context.name}, enter a currect async context.")
              await async_stack.enter_async_context(async_middleware)
            with contextlib.ExitStack() as normal_stack:
              for normal_middleware in normal_middlewares:
                SessionLogger.debug(f"a event called {event_context.name}, enter a currect context.")
                normal_stack.enter_context(normal_middleware)
              if inspect.iscoroutinefunction(callable_target):
                return await callable_target(**translated_mapping)
              else:
                return callable_target(**translated_mapping)

      if inspect.iscoroutinefunction(callable_target):
        return await callable_target(**translated_mapping)
      else:
        return callable_target(**translated_mapping)
    except (NameError, TypeError) as e:
      EventLogger.error(f"threw a exception by {event_context.name}, it's about Annotations Checker, please report to developer.")
      traceback.print_exc()
    except Exception as e:
      EventLogger.error(f"threw a exception by {event_context.name}, and it's {e}")
      await self.throw_exception_event(event_context, queue, e)
Beispiel #12
0
from .entities import (Normal, Require, Optional)
from collections import Counter
from functools import lru_cache
from typing import List
from mirai.misc import raiser, printer
from .logger import CommandLogger

# 这些规则都是互斥的, 并且是由转译层完成, 属于高级设定
default_unique_handlers = {
    "int": lambda x: int(x),
    "float": lambda x: float(x),
    "LongParams": lambda x: x.split(" "),
    "bool": lambda x: \
    True if x == "true" else \
    False if x == "false" else \
      raiser(ValueError(f"cannot parse this string as a vaild bool: {x}"))
}


def string_as_string(string):
    return f"\\{string}"


def signature_spliter(signature_string: str):
    result = re.split(r"((?!\\)[<>\[\]\:\,])", signature_string)
    if result:
        if result[-1] == "":
            result.pop()  # 直接去掉最后有可能丢数据, 这里还是判断一下吧
    return result