Skip to content

Commit

Permalink
feat: 消息被撤回事件通知 (#44)
Browse files Browse the repository at this point in the history
* feat: 消息被撤回事件通知

* feat: 消息被撤回事件通知

* fix: 修复单测不过的问题
  • Loading branch information
DaiJiChen committed Apr 15, 2022
1 parent d85ffdf commit 643fffa
Show file tree
Hide file tree
Showing 10 changed files with 146 additions and 19 deletions.
6 changes: 5 additions & 1 deletion qqbot/core/network/ws/dto/enum_intents.py
Expand Up @@ -18,19 +18,23 @@ class Intents(Enum):
# - GUILD_MEMBER_REMOVE // 当成员被移除时

INTENT_GUILD_MESSAGES = 1 << 9
# - MESSAGE_CREATE // 发送消息事件,代表频道内的全部消息,而不只是 at 机器人的消息。内容与 AT_MESSAGE_CREATE 相同
# - MESSAGE_DELETE // 删除(撤回)消息事件

INTENT_MESSAGE_REACTION = 1 << 10
# - MESSAGE_REACTION_ADD // 为消息添加表情表态
# - MESSAGE_REACTION_REMOVE // 为消息删除表情表态

INTENT_DIRECT_MESSAGE = 1 << 12
# - DIRECT_MESSAGE_CREATE // 当收到用户发给机器人的私信消息时
# - DIRECT_MESSAGE_DELETE // 删除(撤回)消息事件

INTENT_AUDIO = 1 << 29
# - AUDIO_START // 音频开始播放时
# - AUDIO_FINISH // 音频播放结束时
# - AUDIO_ON_MIC // 上麦时
# - AUDIO_OFF_MIC // 下麦时

INTENT_GUILD_AT_MESSAGE = 1 << 30
INTENT_PUBLIC_GUILD_MESSAGES = 1 << 30
# - AT_MESSAGE_CREATE // 当收到 @ 机器人的消息时
# - PUBLIC_MESSAGE_DELETE // 当频道的消息被删除时
10 changes: 9 additions & 1 deletion qqbot/core/network/ws/ws_event.py
Expand Up @@ -16,8 +16,13 @@ class WsEvent:
EventGuildMemberRemove = "GUILD_MEMBER_REMOVE"

EventMessageCreate = "MESSAGE_CREATE"
EventMessageDelete = "MESSAGE_DELETE"

EventAtMessageCreate = "AT_MESSAGE_CREATE"
EventPublicMessageDelete = "PUBLIC_MESSAGE_DELETE"

EventDirectMessageCreate = "DIRECT_MESSAGE_CREATE"
EventDirectMessageDelete = "DIRECT_MESSAGE_DELETE"

EventAudioStart = "AUDIO_START"
EventAudioFinish = "AUDIO_FINISH"
Expand All @@ -39,8 +44,11 @@ class WsEvent:
EventGuildMemberUpdate: Intents.INTENT_GUILD_MEMBERS,
EventGuildMemberRemove: Intents.INTENT_GUILD_MEMBERS,
EventMessageCreate: Intents.INTENT_GUILD_MESSAGES,
EventAtMessageCreate: Intents.INTENT_GUILD_AT_MESSAGE,
EventMessageDelete: Intents.INTENT_GUILD_MESSAGES,
EventAtMessageCreate: Intents.INTENT_PUBLIC_GUILD_MESSAGES,
EventPublicMessageDelete: Intents.INTENT_PUBLIC_GUILD_MESSAGES,
EventDirectMessageCreate: Intents.INTENT_DIRECT_MESSAGE,
EventDirectMessageDelete: Intents.INTENT_DIRECT_MESSAGE,
EventAudioStart: Intents.INTENT_AUDIO,
EventAudioFinish: Intents.INTENT_AUDIO,
EventAudioOnMic: Intents.INTENT_AUDIO,
Expand Down
7 changes: 5 additions & 2 deletions qqbot/core/network/ws/ws_handler.py
Expand Up @@ -7,8 +7,11 @@ class DefaultHandler:
guild = None
guild_member = None
channel = None
message = None
message_create = None
message_delete = None
at_message = None
direct_message = None
public_message_delete = None
direct_message_create = None
direct_message_delete = None
audio = None
message_reaction = None
36 changes: 30 additions & 6 deletions qqbot/core/network/ws/ws_intents_handler.py
Expand Up @@ -70,23 +70,41 @@ def channel_event_handler(callback, intent):


def message_event_handler(callback, intent):
DefaultHandler.message = callback
DefaultHandler.message_create = callback
intent = intent | WsEvent.event_to_intent(WsEvent.EventMessageCreate)
return intent


def delete_message_event_handler(callback, intent):
DefaultHandler.message_delete = callback
intent = intent | WsEvent.event_to_intent(WsEvent.EventMessageDelete)
return intent


def at_message_event_handler(callback, intent):
DefaultHandler.at_message = callback
intent = intent | WsEvent.event_to_intent(WsEvent.EventAtMessageCreate)
return intent


def public_message_delete_event_handler(callback, intent):
DefaultHandler.public_message_delete = callback
intent = intent | WsEvent.event_to_intent(WsEvent.EventPublicMessageDelete)
return intent


def direct_message_event_handler(callback, intent):
DefaultHandler.direct_message = callback
DefaultHandler.direct_message_create = callback
intent = intent | WsEvent.event_to_intent(WsEvent.EventDirectMessageCreate)
return intent


def delete_direct_message_event_handler(callback, intent):
DefaultHandler.direct_message_delete = callback
intent = intent | WsEvent.event_to_intent(WsEvent.EventDirectMessageDelete)
return intent


def message_reactions_event_handler(callback, intent):
DefaultHandler.message_reaction = callback
intent = intent | WsEvent.event_to_intent(
Expand All @@ -102,10 +120,13 @@ class HandlerType(Enum):
GUILD_MEMBER_EVENT_HANDLER = 2
CHANNEL_EVENT_HANDLER = 3
MESSAGE_EVENT_HANDLER = 4
AT_MESSAGE_EVENT_HANDLER = 5
DIRECT_MESSAGE_EVENT_HANDLER = 6
AUDIO_EVENT_HANDLER = 7
MESSAGE_REACTIONS_EVENT_HANDLER = 8
MESSAGE_DELETE_EVENT_HANDLER = 5
AT_MESSAGE_EVENT_HANDLER = 6
DIRECT_MESSAGE_EVENT_HANDLER = 7
DIRECT_MESSAGE_DELETE_EVENT_HANDLER = 8
AUDIO_EVENT_HANDLER = 9
MESSAGE_REACTIONS_EVENT_HANDLER = 10
PUBLIC_MESSAGE_DELETE_EVENT_HANDLER = 11


intent_handler_dict = {
Expand All @@ -114,8 +135,11 @@ class HandlerType(Enum):
HandlerType.GUILD_MEMBER_EVENT_HANDLER.value: guild_member_event_handler,
HandlerType.CHANNEL_EVENT_HANDLER.value: channel_event_handler,
HandlerType.MESSAGE_EVENT_HANDLER.value: message_event_handler,
HandlerType.MESSAGE_DELETE_EVENT_HANDLER.value: delete_message_event_handler,
HandlerType.AT_MESSAGE_EVENT_HANDLER.value: at_message_event_handler,
HandlerType.PUBLIC_MESSAGE_DELETE_EVENT_HANDLER.value: public_message_delete_event_handler,
HandlerType.DIRECT_MESSAGE_EVENT_HANDLER.value: direct_message_event_handler,
HandlerType.DIRECT_MESSAGE_DELETE_EVENT_HANDLER.value: delete_direct_message_event_handler,
HandlerType.AUDIO_EVENT_HANDLER.value: audio_event_handler,
HandlerType.MESSAGE_REACTIONS_EVENT_HANDLER.value: message_reactions_event_handler,
}
33 changes: 30 additions & 3 deletions qqbot/core/network/ws_async/ws_async_handler.py
Expand Up @@ -9,7 +9,7 @@
from qqbot.model.channel import Channel
from qqbot.model.guild import Guild
from qqbot.model.guild_member import GuildMember
from qqbot.model.message import Message
from qqbot.model.message import Message, DeletedMessageInfo
from qqbot.model.reaction import Reaction

logger = logging.getLogger()
Expand Down Expand Up @@ -63,22 +63,46 @@ async def _handle_event_at_message_create(message_event, message):
await callback(message_event, at_message)


async def _handle_event_public_message_delete(message_event, message):
callback = DefaultHandler.public_message_delete
if callback is None:
return
message_deletion_info: DeletedMessageInfo = json.loads(_parse_data(message), object_hook=DeletedMessageInfo)
await callback(message_event, message_deletion_info)


async def _handle_event_message_create(message_event, message):
callback = DefaultHandler.message
callback = DefaultHandler.message_create
if callback is None:
return
msg: Message = json.loads(_parse_data(message), object_hook=Message)
await callback(message_event, msg)


async def _handle_event_message_delete(message_event, message):
callback = DefaultHandler.message_delete
if callback is None:
return
message_deletion_info: DeletedMessageInfo = json.loads(_parse_data(message), object_hook=DeletedMessageInfo)
await callback(message_event, message_deletion_info)


async def _handle_event_direct_message_create(message_event, message):
callback = DefaultHandler.direct_message
callback = DefaultHandler.direct_message_create
if callback is None:
return
msg: Message = json.loads(_parse_data(message), object_hook=Message)
await callback(message_event, msg)


async def _handle_event_direct_message_delete(message_event, message):
callback = DefaultHandler.direct_message_delete
if callback is None:
return
message_deletion_info: DeletedMessageInfo = json.loads(_parse_data(message), object_hook=DeletedMessageInfo)
await callback(message_event, message_deletion_info)


async def _handle_event_audio(message_event, message):
callback = DefaultHandler.audio
if callback is None:
Expand Down Expand Up @@ -108,8 +132,11 @@ async def _handle_event_message_reaction(message_event, message):
WsEvent.EventGuildMemberUpdate: _handle_event_guild_member,
WsEvent.EventGuildMemberRemove: _handle_event_guild_member,
WsEvent.EventAtMessageCreate: _handle_event_at_message_create,
WsEvent.EventPublicMessageDelete: _handle_event_public_message_delete,
WsEvent.EventMessageCreate: _handle_event_message_create,
WsEvent.EventMessageDelete: _handle_event_message_delete,
WsEvent.EventDirectMessageCreate: _handle_event_direct_message_create,
WsEvent.EventDirectMessageDelete: _handle_event_direct_message_delete,
WsEvent.EventAudioStart: _handle_event_audio,
WsEvent.EventAudioFinish: _handle_event_audio,
WsEvent.EventAudioOnMic: _handle_event_audio,
Expand Down
33 changes: 30 additions & 3 deletions qqbot/core/network/ws_sync/ws_event_handler.py
Expand Up @@ -9,7 +9,7 @@
from qqbot.model.channel import Channel
from qqbot.model.guild import Guild
from qqbot.model.guild_member import GuildMember
from qqbot.model.message import Message
from qqbot.model.message import Message, DeletedMessageInfo
from qqbot.model.reaction import Reaction

logger = logging.getLogger()
Expand Down Expand Up @@ -63,22 +63,46 @@ def _handle_event_at_message_create(message_event, message):
callback(message_event, at_message)


def _handle_event_public_message_delete(message_event, message):
callback = DefaultHandler.public_message_delete
if callback is None:
return
message_deletion_info: DeletedMessageInfo = json.loads(_parse_data(message), object_hook=DeletedMessageInfo)
callback(message_event, message_deletion_info)


def _handle_event_message_create(message_event, message):
callback = DefaultHandler.message
callback = DefaultHandler.message_create
if callback is None:
return
msg: Message = json.loads(_parse_data(message), object_hook=Message)
callback(message_event, msg)


def _handle_event_message_delete(message_event, message):
callback = DefaultHandler.message_delete
if callback is None:
return
message_deletion_info: DeletedMessageInfo = json.loads(_parse_data(message), object_hook=DeletedMessageInfo)
callback(message_event, message_deletion_info)


def _handle_event_direct_message_create(message_event, message):
callback = DefaultHandler.direct_message
callback = DefaultHandler.direct_message_create
if callback is None:
return
msg: Message = json.loads(_parse_data(message), object_hook=Message)
callback(message_event, msg)


def _handle_event_direct_message_delete(message_event, message):
callback = DefaultHandler.direct_message_delete
if callback is None:
return
message_deletion_info: DeletedMessageInfo = json.loads(_parse_data(message), object_hook=DeletedMessageInfo)
callback(message_event, message_deletion_info)


def _handle_event_audio(message_event, message):
callback = DefaultHandler.audio
if callback is None:
Expand Down Expand Up @@ -108,8 +132,11 @@ def _handle_event_message_reaction(message_event, message):
WsEvent.EventGuildMemberUpdate: _handle_event_guild_member,
WsEvent.EventGuildMemberRemove: _handle_event_guild_member,
WsEvent.EventAtMessageCreate: _handle_event_at_message_create,
WsEvent.EventPublicMessageDelete: _handle_event_public_message_delete,
WsEvent.EventMessageCreate: _handle_event_message_create,
WsEvent.EventMessageDelete: _handle_event_message_delete,
WsEvent.EventDirectMessageCreate: _handle_event_direct_message_create,
WsEvent.EventDirectMessageDelete: _handle_event_direct_message_delete,
WsEvent.EventAudioStart: _handle_event_audio,
WsEvent.EventAudioFinish: _handle_event_audio,
WsEvent.EventAudioOnMic: _handle_event_audio,
Expand Down
2 changes: 1 addition & 1 deletion qqbot/model/__init__.py
Expand Up @@ -6,7 +6,7 @@
from .guild import Guild
from .guild_member import GuildMember, QueryParams
from .guild_role import RoleUpdateInfo
from .message import CreateDirectMessageRequest, MessageSendRequest, Message
from .message import CreateDirectMessageRequest, MessageSendRequest, Message, DeletedMessageInfo
from .mute import MuteOption
from .schedule import ScheduleToCreate, ScheduleToPatch
from .token import Token
Expand Down
34 changes: 34 additions & 0 deletions qqbot/model/message.py
Expand Up @@ -246,3 +246,37 @@ def __init__(self, source_guild_id: str, user_id: str):
"""
self.recipient_id = user_id
self.source_guild_id = source_guild_id


class DeletedMessageOriginalAuthor:
def __init__(self, data=None):
self.id = ""
username = ""
bot = False
if data:
self.__dict__ = data


class DeletedMessage:
def __init__(self, data=None):
self.guild_id = ""
self.channel_id = ""
self.id = ""
self.author = DeletedMessageOriginalAuthor()
if data:
self.__dict__ = data


class DeletionOperator:
def __init__(self, data=None):
self.id = ""
if data:
self.__dict__ = data


class DeletedMessageInfo:
def __init__(self, data=None):
self.message = DeletedMessage()
self.op_user = DeletionOperator()
if data:
self.__dict__ = data
2 changes: 1 addition & 1 deletion tests/test_api.py
Expand Up @@ -132,7 +132,7 @@ def test_channel_permissions(self):
channel_permissions = self.api.get_channel_permissions(
CHANNEL_ID, GUILD_OWNER_ID
)
self.assertEqual("6", channel_permissions.permissions)
self.assertNotEqual("0", channel_permissions.permissions)

def test_channel_permissions_update(self):
request = qqbot.UpdatePermission(add="4")
Expand Down
2 changes: 1 addition & 1 deletion tests/test_async_api.py
Expand Up @@ -161,7 +161,7 @@ def test_channel_permissions(self):
channel_permissions = self.loop.run_until_complete(
self.api.get_channel_permissions(CHANNEL_ID, GUILD_OWNER_ID)
)
self.assertEqual("6", channel_permissions.permissions)
self.assertNotEqual("0", channel_permissions.permissions)

def test_channel_permissions_update(self):
request = qqbot.UpdatePermission("0x0000000002", "")
Expand Down

0 comments on commit 643fffa

Please sign in to comment.