async def mirai_Poke(ctx: Poke, event: Message, chat: Chat): content = f"[Poke]\n{ctx.name}" if ctx.name else "[Content missing]" at_str = "@me" begin_index = len(content) end_index = begin_index + len(at_str) at_list = {(begin_index, end_index): chat.self} return [efb_text_simple_wrapper(content, at_list)]
async def mirai_Quote(ctx: Quote, event: Message, chat: Chat): original_message = "" for message in ctx.origin: if isinstance(message, Plain): original_message += message.text elif isinstance(message, Image): original_message += " [Image] " elif isinstance(message, Face): original_message += f" [Face {message.faceId}]" return [efb_text_simple_wrapper(f"「{original_message}」\n\n")]
async def mirai_At(ctx: At, event: Message, chat: Chat): at_list = None if not ctx.display: if event.type == MessageType.GROUP.value: members = await MiraiFactory.instance.async_get_group_member_list( group_id=event.member.group.id, no_cache=False) flag = False for member in members: if int(member['uid']) == int(ctx.target): ctx.display = f"@{member['name']}" flag = True break if not flag: ctx.display = "@Unknown" if MiraiConfig.configs.get('qq', 0) == ctx.target: ctx.display = "@me" begin_index = 0 end_index = len(ctx.display) at_list = {(begin_index, end_index): chat.self} logger.debug(at_list) return [efb_text_simple_wrapper(ctx.display, at_list)]
async def mirai_AtAll(ctx: AtAll, event: Message, chat: Chat): content = "@all" begin_index = 0 end_index = len(content) at_list = {(begin_index, end_index): chat.self} return [efb_text_simple_wrapper(content, at_list)]
async def mirai_Face(ctx: Face, event: Message, chat: Chat): qq_face = int(ctx.faceId) & 255 if qq_face in qq_emoji_list: return [efb_text_simple_wrapper(qq_emoji_list[qq_face])] else: return [efb_text_simple_wrapper(f"[Face {ctx.faceId}]")]
async def mirai_Plain(ctx: Plain, event: Message, chat: Chat): if not ctx.text: return [] content = ctx.text return [efb_text_simple_wrapper(content)]
async def message_handler(event: Event.BaseEvent): try: if isinstance(event, Event.Message): if event.type == MessageType.GROUP.value: chat = ChatMgr.build_efb_chat_as_group(EFBGroupChat( uid=f"group_{event.member.group.id}", name=event.member.group.name )) author = ChatMgr.build_efb_chat_as_member(chat, EFBGroupMember( name=event.member.memberName, alias=await self.async_get_friend_remark(event.member.id), uid=f'member_{event.member.id}' )) elif event.type == MessageType.FRIEND.value: chat = ChatMgr.build_efb_chat_as_private(EFBPrivateChat( uid=f'friend_{event.friend.id}', name=event.friend.nickname, alias=event.friend.remark )) author = chat.other else: # temp message chat = ChatMgr.build_efb_chat_as_private(EFBPrivateChat( uid=f'private_{event.member.id}_{event.member.group.id}', name=event.member.memberName )) author = chat.other messages = [] try: for message in event.messageChain[1:]: func = getattr(MiraiMessageProcessor, f'mirai_{message.type}') messages.extend(await func(message, event, chat)) except: print_exc() message_id = event.messageChain.get_source().id text = "" ats = {} for idx, val in enumerate(messages): flag = False if val.substitutions: flag = True for indexes, substitution in val.substitutions.items(): original_begin, original_end = indexes new_begin = original_begin + len(text) new_end = original_end + len(text) ats[new_begin, new_end] = substitution if val.text: flag = True text += val.text if flag: continue val.uid = chat.uid + f"_{message_id}_{idx}" val.chat = chat val.author = author val.deliver_to = coordinator.master coordinator.send_message(val) if val.file: val.file.close() # Finally send the text messages if text: text_msg = efb_text_simple_wrapper(text, ats) text_msg.uid = chat.uid + f"_{message_id}" text_msg.chat = chat text_msg.author = author text_msg.deliver_to = coordinator.master coordinator.send_message(text_msg) if text_msg.file: text_msg.file.close() return True except: print_exc() return False