Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: do some typing in commands/context.py #848

Merged
merged 2 commits into from
Jan 28, 2022
Merged
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
66 changes: 35 additions & 31 deletions discord/commands/context.py
Original file line number Diff line number Diff line change
Expand Up @@ -27,25 +27,31 @@
from typing import TYPE_CHECKING, Optional, TypeVar, Union

import discord.abc
from discord.interactions import InteractionMessage

if TYPE_CHECKING:
from typing_extensions import ParamSpec

import discord
from discord import Bot
from discord.state import ConnectionState
from .. import Bot
from ..state import ConnectionState
from ..voice_client import VoiceProtocol

from .core import ApplicationCommand, Option
from ..interactions import Interaction, InteractionResponse, InteractionChannel
from ..guild import Guild
from ..member import Member
from ..message import Message
from ..user import User
from ..client import ClientUser
from discord.webhook.async_ import Webhook

from ..cog import Cog
from ..webhook import WebhookMessage
from typing import Callable

from typing import Callable, Awaitable

from ..guild import Guild
from ..interactions import Interaction, InteractionResponse
from ..member import Member
from ..message import Message
from ..user import User
from ..utils import cached_property
from ..utils import _cached_property as cached_property

T = TypeVar('T')
CogT = TypeVar('CogT', bound="Cog")
Expand Down Expand Up @@ -88,8 +94,8 @@ def __init__(self, bot: Bot, interaction: Interaction):

self._state: ConnectionState = self.interaction._state

async def _get_channel(self) -> discord.abc.Messageable:
return self.channel
async def _get_channel(self) -> Optional[InteractionChannel]:
return self.interaction.channel

async def invoke(self, command: ApplicationCommand[CogT, P, T], /, *args: P.args, **kwargs: P.kwargs) -> T:
r"""|coro|
Expand Down Expand Up @@ -118,7 +124,7 @@ async def invoke(self, command: ApplicationCommand[CogT, P, T], /, *args: P.args
return await command(self, *args, **kwargs)

@cached_property
def channel(self):
def channel(self) -> Optional[InteractionChannel]:
return self.interaction.channel

@cached_property
Expand All @@ -142,8 +148,8 @@ def guild_locale(self) -> Optional[str]:
return self.interaction.guild_locale

@cached_property
def me(self) -> Union[Member, User]:
return self.guild.me if self.guild is not None else self.bot.user
def me(self) -> Optional[Union[Member, ClientUser]]:
return self.interaction.guild.me if self.interaction.guild is not None else self.bot.user

@cached_property
def message(self) -> Optional[Message]:
Expand All @@ -153,66 +159,64 @@ def message(self) -> Optional[Message]:
def user(self) -> Optional[Union[Member, User]]:
return self.interaction.user

@cached_property
def author(self) -> Optional[Union[Member, User]]:
return self.user
author = user

@property
def voice_client(self):
if self.guild is None:
def voice_client(self) -> Optional[VoiceProtocol]:
if self.interaction.guild is None:
return None

return self.guild.voice_client
return self.interaction.guild.voice_client

@cached_property
def response(self) -> InteractionResponse:
return self.interaction.response

@property
def respond(self) -> Callable[..., Union[Interaction, WebhookMessage]]:
def respond(self) -> Callable[..., Awaitable[Union[Interaction, WebhookMessage]]]:
"""Callable[..., Union[:class:`~.Interaction`, :class:`~.Webhook`]]: Sends either a response
or a followup response depending if the interaction has been responded to yet or not."""
if not self.response.is_done():
if not self.interaction.response.is_done():
return self.interaction.response.send_message # self.response
else:
return self.followup.send # self.send_followup

@property
def send_response(self):
if not self.response.is_done():
def send_response(self) -> Callable[..., Awaitable[Interaction]]:
if not self.interaction.response.is_done():
return self.interaction.response.send_message
else:
raise RuntimeError(
f"Interaction was already issued a response. Try using {type(self).__name__}.send_followup() instead."
)

@property
def send_followup(self):
if self.response.is_done():
def send_followup(self) -> Callable[..., Awaitable[WebhookMessage]]:
if self.interaction.response.is_done():
return self.followup.send
else:
raise RuntimeError(
f"Interaction was not yet issued a response. Try using {type(self).__name__}.respond() first."
)

@property
def defer(self):
def defer(self) -> Callable[..., Awaitable[None]]:
return self.interaction.response.defer

@property
def followup(self):
def followup(self) -> Webhook:
return self.interaction.followup

async def delete(self):
"""Calls :attr:`~discord.commands.ApplicationContext.respond`.
If the response is done, then calls :attr:`~discord.commands.ApplicationContext.respond` first."""
if not self.response.is_done():
if not self.interaction.response.is_done():
await self.defer()

return await self.interaction.delete_original_message()

@property
def edit(self):
def edit(self) -> Callable[..., Awaitable[InteractionMessage]]:
return self.interaction.edit_original_message

@property
Expand Down Expand Up @@ -249,7 +253,7 @@ class AutocompleteContext:

__slots__ = ("bot", "interaction", "command", "focused", "value", "options")

def __init__(self, bot: Bot, interaction: Interaction) -> None:
def __init__(self, bot: Bot, interaction: Interaction):
Dorukyum marked this conversation as resolved.
Show resolved Hide resolved
self.bot = bot
self.interaction = interaction

Expand Down