Compare commits
2 Commits
463ad26217
...
a4aa4335a5
Author | SHA1 | Date | |
---|---|---|---|
a4aa4335a5 | |||
b9d93a90fa |
@ -50,6 +50,7 @@ if TYPE_CHECKING:
|
|||||||
Thread,
|
Thread,
|
||||||
DMChannel,
|
DMChannel,
|
||||||
Webhook,
|
Webhook,
|
||||||
|
Invite,
|
||||||
)
|
)
|
||||||
from .ui.view import View
|
from .ui.view import View
|
||||||
from .enums import ChannelType as EnumChannelType
|
from .enums import ChannelType as EnumChannelType
|
||||||
@ -698,6 +699,13 @@ class Client:
|
|||||||
self._webhooks[webhook.id] = webhook
|
self._webhooks[webhook.id] = webhook
|
||||||
return webhook
|
return webhook
|
||||||
|
|
||||||
|
def parse_invite(self, data: Dict[str, Any]) -> "Invite":
|
||||||
|
"""Parses invite data into an :class:`Invite`."""
|
||||||
|
|
||||||
|
from .models import Invite
|
||||||
|
|
||||||
|
return Invite.from_dict(data)
|
||||||
|
|
||||||
async def fetch_user(self, user_id: Snowflake) -> Optional["User"]:
|
async def fetch_user(self, user_id: Snowflake) -> Optional["User"]:
|
||||||
"""Fetches a user by ID from Discord."""
|
"""Fetches a user by ID from Discord."""
|
||||||
if self._closed:
|
if self._closed:
|
||||||
@ -1249,6 +1257,33 @@ class Client:
|
|||||||
|
|
||||||
await self._http.delete_webhook(webhook_id)
|
await self._http.delete_webhook(webhook_id)
|
||||||
|
|
||||||
|
async def create_invite(
|
||||||
|
self, channel_id: Snowflake, payload: Dict[str, Any]
|
||||||
|
) -> "Invite":
|
||||||
|
"""|coro| Create an invite for the given channel."""
|
||||||
|
|
||||||
|
if self._closed:
|
||||||
|
raise DisagreementException("Client is closed.")
|
||||||
|
|
||||||
|
return await self._http.create_invite(channel_id, payload)
|
||||||
|
|
||||||
|
async def delete_invite(self, code: str) -> None:
|
||||||
|
"""|coro| Delete an invite by code."""
|
||||||
|
|
||||||
|
if self._closed:
|
||||||
|
raise DisagreementException("Client is closed.")
|
||||||
|
|
||||||
|
await self._http.delete_invite(code)
|
||||||
|
|
||||||
|
async def fetch_invites(self, channel_id: Snowflake) -> List["Invite"]:
|
||||||
|
"""|coro| Fetch all invites for a channel."""
|
||||||
|
|
||||||
|
if self._closed:
|
||||||
|
raise DisagreementException("Client is closed.")
|
||||||
|
|
||||||
|
data = await self._http.get_channel_invites(channel_id)
|
||||||
|
return [self.parse_invite(inv) for inv in data]
|
||||||
|
|
||||||
# --- Application Command Methods ---
|
# --- Application Command Methods ---
|
||||||
async def process_interaction(self, interaction: Interaction) -> None:
|
async def process_interaction(self, interaction: Interaction) -> None:
|
||||||
"""Internal method to process an interaction from the gateway."""
|
"""Internal method to process an interaction from the gateway."""
|
||||||
|
@ -23,7 +23,7 @@ from .interactions import InteractionResponsePayload
|
|||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from .client import Client
|
from .client import Client
|
||||||
from .models import Message, Webhook, File
|
from .models import Message, Webhook, File, Invite
|
||||||
from .interactions import ApplicationCommand, Snowflake
|
from .interactions import ApplicationCommand, Snowflake
|
||||||
|
|
||||||
# Discord API constants
|
# Discord API constants
|
||||||
@ -409,6 +409,30 @@ class HTTPClient:
|
|||||||
"""Fetches a channel by ID."""
|
"""Fetches a channel by ID."""
|
||||||
return await self.request("GET", f"/channels/{channel_id}")
|
return await self.request("GET", f"/channels/{channel_id}")
|
||||||
|
|
||||||
|
async def get_channel_invites(
|
||||||
|
self, channel_id: "Snowflake"
|
||||||
|
) -> List[Dict[str, Any]]:
|
||||||
|
"""Fetches the invites for a channel."""
|
||||||
|
|
||||||
|
return await self.request("GET", f"/channels/{channel_id}/invites")
|
||||||
|
|
||||||
|
async def create_invite(
|
||||||
|
self, channel_id: "Snowflake", payload: Dict[str, Any]
|
||||||
|
) -> "Invite":
|
||||||
|
"""Creates an invite for a channel."""
|
||||||
|
|
||||||
|
data = await self.request(
|
||||||
|
"POST", f"/channels/{channel_id}/invites", payload=payload
|
||||||
|
)
|
||||||
|
from .models import Invite
|
||||||
|
|
||||||
|
return Invite.from_dict(data)
|
||||||
|
|
||||||
|
async def delete_invite(self, code: str) -> None:
|
||||||
|
"""Deletes an invite by code."""
|
||||||
|
|
||||||
|
await self.request("DELETE", f"/invites/{code}")
|
||||||
|
|
||||||
async def create_webhook(
|
async def create_webhook(
|
||||||
self, channel_id: "Snowflake", payload: Dict[str, Any]
|
self, channel_id: "Snowflake", payload: Dict[str, Any]
|
||||||
) -> "Webhook":
|
) -> "Webhook":
|
||||||
|
@ -6,6 +6,7 @@ Data models for Discord objects.
|
|||||||
|
|
||||||
import asyncio
|
import asyncio
|
||||||
import json
|
import json
|
||||||
|
from dataclasses import dataclass
|
||||||
from typing import Any, AsyncIterator, Dict, List, Optional, TYPE_CHECKING, Union
|
from typing import Any, AsyncIterator, Dict, List, Optional, TYPE_CHECKING, Union
|
||||||
|
|
||||||
import aiohttp # pylint: disable=import-error
|
import aiohttp # pylint: disable=import-error
|
||||||
@ -1978,6 +1979,41 @@ class Reaction:
|
|||||||
return f"<Reaction message_id='{self.message_id}' user_id='{self.user_id}' emoji='{emoji_value}'>"
|
return f"<Reaction message_id='{self.message_id}' user_id='{self.user_id}' emoji='{emoji_value}'>"
|
||||||
|
|
||||||
|
|
||||||
|
@dataclass
|
||||||
|
class Invite:
|
||||||
|
"""Represents a Discord invite."""
|
||||||
|
|
||||||
|
code: str
|
||||||
|
channel_id: Optional[str]
|
||||||
|
guild_id: Optional[str]
|
||||||
|
inviter_id: Optional[str]
|
||||||
|
uses: Optional[int]
|
||||||
|
max_uses: Optional[int]
|
||||||
|
max_age: Optional[int]
|
||||||
|
temporary: Optional[bool]
|
||||||
|
created_at: Optional[str]
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def from_dict(cls, data: Dict[str, Any]) -> "Invite":
|
||||||
|
channel = data.get("channel")
|
||||||
|
guild = data.get("guild")
|
||||||
|
inviter = data.get("inviter")
|
||||||
|
return cls(
|
||||||
|
code=data["code"],
|
||||||
|
channel_id=(channel or {}).get("id") if channel else data.get("channel_id"),
|
||||||
|
guild_id=(guild or {}).get("id") if guild else data.get("guild_id"),
|
||||||
|
inviter_id=(inviter or {}).get("id"),
|
||||||
|
uses=data.get("uses"),
|
||||||
|
max_uses=data.get("max_uses"),
|
||||||
|
max_age=data.get("max_age"),
|
||||||
|
temporary=data.get("temporary"),
|
||||||
|
created_at=data.get("created_at"),
|
||||||
|
)
|
||||||
|
|
||||||
|
def __repr__(self) -> str:
|
||||||
|
return f"<Invite code='{self.code}' guild_id='{self.guild_id}' channel_id='{self.channel_id}'>"
|
||||||
|
|
||||||
|
|
||||||
class GuildMemberRemove:
|
class GuildMemberRemove:
|
||||||
"""Represents a GUILD_MEMBER_REMOVE event."""
|
"""Represents a GUILD_MEMBER_REMOVE event."""
|
||||||
|
|
||||||
|
24
docs/invites.md
Normal file
24
docs/invites.md
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
# Working with Invites
|
||||||
|
|
||||||
|
The library exposes helper methods for creating and deleting invites.
|
||||||
|
|
||||||
|
## Create an Invite
|
||||||
|
|
||||||
|
```python
|
||||||
|
invite = await client.create_invite("1234567890", {"max_age": 3600})
|
||||||
|
print(invite.code)
|
||||||
|
```
|
||||||
|
|
||||||
|
## Delete an Invite
|
||||||
|
|
||||||
|
```python
|
||||||
|
await client.delete_invite(invite.code)
|
||||||
|
```
|
||||||
|
|
||||||
|
## List Invites
|
||||||
|
|
||||||
|
```python
|
||||||
|
invites = await client.fetch_invites("1234567890")
|
||||||
|
for inv in invites:
|
||||||
|
print(inv.code, inv.uses)
|
||||||
|
```
|
Loading…
x
Reference in New Issue
Block a user