Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 22 additions & 0 deletions botpy/audio.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
from .api import BotAPI
from .types import gateway, audio


class Audio:
__slots__ = (
"_api",
"_ctx",
"channel_id",
"guild_id",
"audio_url",
"text",
"event_id")

def __init__(self, api: BotAPI, ctx: gateway.WsContext, data: audio.AudioAction):
self._api = api

self.channel_id = data.get("channel_id")
self.guild_id = data.get("guild_id")
self.audio_url = data.get("audio_url")
self.text = data.get("text")
self.event_id = ctx.get("id")
40 changes: 26 additions & 14 deletions botpy/connection.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,11 @@
from .channel import Channel
from .guild import Guild
from .interaction import Interaction
from .message import Message, MessageAudit
from .message import Message, DirectMessage, MessageAudit
from .user import Member
from .reaction import Reaction
from .audio import Audio
from .forum import Thread

from . import logging
from .api import BotAPI
Expand Down Expand Up @@ -135,18 +138,20 @@ def parse_message_delete(self, ctx: gateway.WsContext, data: gateway.MessagePayl

# botpy.flags.Intents.guild_message_reactions
def parse_message_reaction_add(self, ctx: gateway.WsContext, data: reaction.Reaction):
self._dispatch("message_reaction_add", data)
_reaction = Reaction(self.api, ctx, data)
self._dispatch("message_reaction_add", _reaction)

def parse_message_reaction_remove(self, ctx: gateway.WsContext, data: reaction.Reaction):
self._dispatch("message_reaction_remove", data)
_reaction = Reaction(self.api, ctx, data)
self._dispatch("message_reaction_remove", _reaction)

# botpy.flags.Intents.direct_message
def parse_direct_message_create(self, ctx: gateway.WsContext, data: gateway.MessagePayload):
_message = Message(self.api, ctx, data)
def parse_direct_message_create(self, ctx: gateway.WsContext, data: gateway.DirectMessagePayload):
_message = DirectMessage(self.api, ctx, data)
self._dispatch("direct_message_create", _message)

def parse_direct_message_delete(self, ctx: gateway.WsContext, data: gateway.MessagePayload):
_message = Message(self.api, ctx, data)
def parse_direct_message_delete(self, ctx: gateway.WsContext, data: gateway.DirectMessagePayload):
_message = DirectMessage(self.api, ctx, data)
self._dispatch("direct_message_delete", _message)

# botpy.flags.Intents.interaction
Expand All @@ -165,16 +170,20 @@ def parse_message_audit_reject(self, ctx: gateway.WsContext, data: gateway.Messa

# botpy.flags.Intents.audio_action
def parse_audio_start(self, ctx: gateway.WsContext, data):
self._dispatch("audio_start", data)
_audio = Audio(self.api, ctx, data)
self._dispatch("audio_start", _audio)

def parse_audio_finish(self, ctx: gateway.WsContext, data):
self._dispatch("audio_finish", data)
_audio = Audio(self.api, ctx, data)
self._dispatch("audio_finish", _audio)

def parse_on_mic(self, ctx: gateway.WsContext, data):
self._dispatch("on_mic", data)
_audio = Audio(self.api, ctx, data)
self._dispatch("on_mic", _audio)

def parse_off_mic(self, ctx: gateway.WsContext, data):
self._dispatch("off_mic", data)
_audio = Audio(self.api, ctx, data)
self._dispatch("off_mic", _audio)

# botpy.flags.Intents.public_guild_messages
def parse_at_message_create(self, ctx: gateway.WsContext, data: gateway.MessagePayload):
Expand All @@ -188,13 +197,16 @@ def parse_resumed(self, ctx: gateway.WsContext, data: gateway.ReadyEvent):
self._dispatch("resumed")

def parse_forum_thread_create(self, ctx: gateway.WsContext, data: forum.Thread):
self._dispatch("forum_thread_create", data)
_forum = Thread(self.api, ctx, data)
self._dispatch("forum_thread_create", _forum)

def parse_forum_thread_update(self, ctx: gateway.WsContext, data: forum.Thread):
self._dispatch("forum_thread_update", data)
_forum = Thread(self.api, ctx, data)
self._dispatch("forum_thread_update", _forum)

def parse_forum_thread_delete(self, ctx: gateway.WsContext, data: forum.Thread):
self._dispatch("forum_thread_delete", data)
_forum = Thread(self.api, ctx, data)
self._dispatch("forum_thread_delete", _forum)

def parse_forum_post_create(self, ctx: gateway.WsContext, data: forum.Post):
self._dispatch("forum_post_create", data)
Expand Down
108 changes: 108 additions & 0 deletions botpy/forum.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
from json import loads

from .api import BotAPI
from .types import gateway, forum


class _Text:
def __init__(self, data):
self.text = data.get("text", None)


class _Image:
def __init__(self, data):
self.plat_image = self._PlatImage(data.get("plat_image", {}))

class _PlatImage:
def __init__(self, data):
self.url = data.get("url", None)
self.width = data.get("width", None)
self.height = data.get("height", None)
self.image_id = data.get("image_id", None)


class _Video:
def __init__(self, data):
self.plat_video = self._PlatVideo(data.get("plat_video", {}))

class _PlatVideo:
def __init__(self, data):
self.url = data.get("url", None)
self.width = data.get("width", None)
self.height = data.get("height", None)
self.video_id = data.get("video_id", None)
self.cover = data.get("cover", {})

class _Cover:
def __init__(self, data):
self.url = data.get("url", None)
self.width = data.get("width", None)
self.height = data.get("height", None)


class _Url:
def __init__(self, data):
self.url = data.get("url", None)
self.desc = data.get("desc", None)


class Thread:
__slots__ = (
"_api",
"_ctx",
"thread_info",
"channel_id",
"guild_id",
"author_id",
"event_id")

def __init__(self, api: BotAPI, ctx: gateway.WsContext, data: forum.Thread):
self._api = api

self.author_id = data.get("author_id")
self.channel_id = data.get("channel_id")
self.guild_id = data.get("guild_id")
self.thread_info = self._ThreadInfo(data.get("thread_info"))
self.event_id = ctx.get("id")

class _ThreadInfo:
def __init__(self, data):
self.title = self._Title(loads(data.get("title")))
self.content = self._Content(loads(data.get("content")))
self.thread_id = data.get("thread_id")
self.date_time = data.get("date_time")

class _Title:
def __init__(self, data):
self.paragraphs = [self._Paragraphs(items) for items in data.get("paragraphs")]

class _Paragraphs:
def __init__(self, data):
self.elems = [self._Elems(items) for items in data.get("elems")]
self.props = data.get("props")

class _Elems:
def __init__(self, data):
self.type = data.get("type")
self.text = _Text(data.get("text", {}))

class _Content:
def __init__(self, data):
self.paragraphs = [self._Paragraphs(items) for items in data.get("paragraphs")]

class _Paragraphs:
def __init__(self, data):
self.elems = [self._Elems(items) for items in data.get("elems")]
self.props = data.get("props")

class _Elems:
def __init__(self, data):
self.type = data.get("type")
if self.type == 1:
self.text = _Text(data.get("text", {}))
elif self.type == 2:
self.image = _Image(data.get("image", {}))
elif self.type == 3:
self.video = _Video(data.get("video", {}))
elif self.type == 4:
self.url = _Url(data.get("url", {}))
78 changes: 75 additions & 3 deletions botpy/message.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ class Message:
"id",
"guild_id",
"member",
"message_reference",
"mentions",
"seq",
"seq_in_channel",
Expand All @@ -22,18 +23,89 @@ def __init__(self, api: BotAPI, ctx: gateway.WsContext, data: gateway.MessagePay
# TODO 创建一些实体类的数据缓存 @veehou
self._api = api

self.author = data.get("author")
self.author = self._User(data.get("author"))
self.channel_id = data.get("channel_id")
self.id = data.get("id")
self.content = data.get("content")
self.guild_id = data.get("guild_id")
self.member = data.get("member")
self.mentions = data.get("mentions")
self.member = self._Member(data.get("member"))
self.message_reference = self._MessageRef(data.get("message_reference", {}))
self.mentions = [self._User(items) for items in data.get("mentions", {})]
self.seq = data.get("seq") # 全局消息序号
self.seq_in_channel = data.get("seq_in_channel") # 子频道消息序号
self.timestamp = data.get("timestamp")
self.event_id = ctx.get("id")

class _User:
def __init__(self, data):
self.id = data.get("id")
self.username = data.get("username")
self.bot = data.get("bot")
self.avatar = data.get("avatar")

class _Member:
def __init__(self, data):
self.nick = data.get("nick", None)
self.roles = data.get("roles", None)
self.joined_at = data.get("joined_at", None)

class _MessageRef:
def __init__(self, data):
self.message_id = data.get("message_id", None)

async def reply(self, **kwargs):
return await self._api.post_message(channel_id=self.channel_id, msg_id=self.id, **kwargs)


class DirectMessage:
__slots__ = (
"_api",
"author",
"content",
"direct_message",
"channel_id",
"id",
"guild_id",
"member",
"message_reference",
"seq",
"seq_in_channel",
"src_guild_id",
"timestamp",
"event_id"
)

def __init__(self, api: BotAPI, ctx: gateway.WsContext, data: gateway.DirectMessagePayload):
self._api = api

self.author = self._User(data.get("author"))
self.channel_id = data.get("channel_id")
self.id = data.get("id")
self.content = data.get("content")
self.direct_message = data.get("direct_message")
self.guild_id = data.get("guild_id")
self.member = self._Member(data.get("member"))
self.message_reference = self._MessageRef(data.get("message_reference", {}))
self.seq = data.get("seq") # 全局消息序号
self.seq_in_channel = data.get("seq_in_channel") # 子频道消息序号
self.src_guild_id = data.get("src_guild_id")
self.timestamp = data.get("timestamp")
self.event_id = ctx.get("id")

class _User:
def __init__(self, data):
self.id = data.get("id")
self.username = data.get("username")
self.avatar = data.get("avatar")

class _Member:
def __init__(self, data):
self.joined_at = data.get("joined_at", None)

class _MessageRef:
def __init__(self, data):
self.message_id = data.get("message_id", None)

async def reply(self, **kwargs):
return await self._api.post_message(channel_id=self.channel_id, msg_id=self.id, **kwargs)

Expand Down
34 changes: 34 additions & 0 deletions botpy/reaction.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
from .api import BotAPI
from .types import gateway, reaction


class Reaction:
__slots__ = (
"_api",
"_ctx",
"user_id",
"channel_id",
"guild_id",
"emoji",
"target",
"event_id")

def __init__(self, api: BotAPI, ctx: gateway.WsContext, data: reaction.Reaction):
self._api = api

self.user_id = data.get("user_id")
self.channel_id = data.get("channel_id")
self.guild_id = data.get("guild_id")
self.emoji = self._Emoji(data.get("emoji"))
self.target = self._Target(data.get("target"))
self.event_id = ctx.get("id")

class _Emoji:
def __init__(self, data):
self.id = data.get("id")
self.type = data.get("type")

class _Target:
def __init__(self, data):
self.id = data.get("id")
self.type = data.get("type") # 0: 消息 1: 帖子 2: 评论 3: 回复
21 changes: 21 additions & 0 deletions botpy/types/gateway.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,11 @@ class UserPayload(TypedDict):
username: str
bot: bool
status: int
avatar: str


class MessageRefPayload(TypedDict):
message_id: str


class ReadyEvent(TypedDict):
Expand All @@ -32,12 +37,28 @@ class MessagePayload(TypedDict):
guild_id: str
id: str
member: Member
message_reference: MessageRefPayload
mentions: List[UserPayload]
seq: int
seq_in_channel: str
timestamp: str


class DirectMessagePayload(TypedDict):
author: UserPayload
channel_id: str
content: str
direct_message: bool
guild_id: str
id: str
member: Member
message_reference: MessageRefPayload
seq: int
seq_in_channel: str
src_guild_id: str
timestamp: str


class MessageAuditPayload(TypedDict):
audit_id: str
message_id: str
Expand Down
Loading