From 86b357053cd1be32023c7b85c8a1b75784066327 Mon Sep 17 00:00:00 2001 From: Empathy <84625385+EmpathyYT@users.noreply.github.com> Date: Sun, 3 Oct 2021 16:22:10 +0300 Subject: [PATCH 001/180] Format examples and add another example --- examples/Info.py | 57 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 examples/Info.py diff --git a/examples/Info.py b/examples/Info.py new file mode 100644 index 0000000000..4e0305fabc --- /dev/null +++ b/examples/Info.py @@ -0,0 +1,57 @@ +import discord +from discord.ext import commands + + + +description = """An example to showcase how to extract info about users""" + +intents = discord.Intents.default() +intents.members = True + +bot = commands.Bot(command_prefix="?", description=description, intents=intents) + + +@bot.event +async def on_ready(): + print(f"Logged in as {bot.user} (ID: {bot.user.id})") + print("------") + + + @bot.command() + async def info(ctx, *, user: Union[discord.Member, discord.User] = None): + """Shows info about a user.""" + + user = user or ctx.author + e = discord.Embed() + roles = [role.name.replace('@', '@\u200b') for role in getattr(user, 'roles', [])] + e.set_author(name=str(user)) + + + + e.add_field(name='ID', value=user.id, inline=False) + e.add_field(name='Joined', value=round_time(user.joined_at), inline=False) + e.add_field(name='Created', value=round_time(user.created_at), inline=False) + + voice = getattr(user, 'voice', None) + if voice is not None: + vc = voice.channel + other_people = len(vc.members) - 1 + voice = f'{vc.name} with {other_people} others' if other_people else f'{vc.name} by themselves' + e.add_field(name='Voice', value=voice, inline=False) + + if roles: + e.add_field(name='Roles', value=', '.join(roles) if len(roles) < 10 else f'{len(roles)} roles', inline=False) + + colour = user.colour + if colour.value: + e.colour = colour + + if user.avatar: + e.set_thumbnail(url=user.avatar_url) + + if isinstance(user, discord.User): + e.set_footer(text='This member is not in this server.') + + await ctx.send(embed=e) + +bot.run("token") From 143319b1dff09fdc9803353421e0b1ac25a71df8 Mon Sep 17 00:00:00 2001 From: Empathy <84625385+EmpathyYT@users.noreply.github.com> Date: Sun, 3 Oct 2021 16:27:09 +0300 Subject: [PATCH 002/180] Update Info.py --- examples/Info.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/Info.py b/examples/Info.py index 4e0305fabc..b19738c981 100644 --- a/examples/Info.py +++ b/examples/Info.py @@ -1,6 +1,6 @@ import discord from discord.ext import commands - +from typing import Union description = """An example to showcase how to extract info about users""" From 6568287a7fe55929dc4c2e3c8890a6d7a0a5ce76 Mon Sep 17 00:00:00 2001 From: Empathy <84625385+EmpathyYT@users.noreply.github.com> Date: Sun, 3 Oct 2021 18:49:52 +0300 Subject: [PATCH 003/180] Update examples/Info.py Co-authored-by: MhmCats <71032999+MhmCats@users.noreply.github.com> --- examples/Info.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/Info.py b/examples/Info.py index b19738c981..541947f4fe 100644 --- a/examples/Info.py +++ b/examples/Info.py @@ -17,7 +17,7 @@ async def on_ready(): print("------") - @bot.command() +@bot.command() async def info(ctx, *, user: Union[discord.Member, discord.User] = None): """Shows info about a user.""" From b09868e1cd9570b62779637d158c81ba39becb3d Mon Sep 17 00:00:00 2001 From: Empathy <84625385+EmpathyYT@users.noreply.github.com> Date: Sun, 3 Oct 2021 18:50:16 +0300 Subject: [PATCH 004/180] Update examples/Info.py Co-authored-by: MhmCats <71032999+MhmCats@users.noreply.github.com> --- examples/Info.py | 52 ++++++++++++++++++++++++------------------------ 1 file changed, 26 insertions(+), 26 deletions(-) diff --git a/examples/Info.py b/examples/Info.py index 541947f4fe..1390eb36af 100644 --- a/examples/Info.py +++ b/examples/Info.py @@ -18,40 +18,40 @@ async def on_ready(): @bot.command() - async def info(ctx, *, user: Union[discord.Member, discord.User] = None): - """Shows info about a user.""" +async def info(ctx, *, user: Union[discord.Member, discord.User] = None): + """Shows info about a user.""" - user = user or ctx.author - e = discord.Embed() - roles = [role.name.replace('@', '@\u200b') for role in getattr(user, 'roles', [])] - e.set_author(name=str(user)) + user = user or ctx.author + e = discord.Embed() + roles = [role.name.replace('@', '@\u200b') for role in getattr(user, 'roles', [])] + e.set_author(name=str(user)) - - e.add_field(name='ID', value=user.id, inline=False) - e.add_field(name='Joined', value=round_time(user.joined_at), inline=False) - e.add_field(name='Created', value=round_time(user.created_at), inline=False) - voice = getattr(user, 'voice', None) - if voice is not None: - vc = voice.channel - other_people = len(vc.members) - 1 - voice = f'{vc.name} with {other_people} others' if other_people else f'{vc.name} by themselves' - e.add_field(name='Voice', value=voice, inline=False) + e.add_field(name='ID', value=user.id, inline=False) + e.add_field(name='Joined', value=round_time(user.joined_at), inline=False) + e.add_field(name='Created', value=round_time(user.created_at), inline=False) - if roles: - e.add_field(name='Roles', value=', '.join(roles) if len(roles) < 10 else f'{len(roles)} roles', inline=False) + voice = getattr(user, 'voice', None) + if voice is not None: + vc = voice.channel + other_people = len(vc.members) - 1 + voice = f'{vc.name} with {other_people} others' if other_people else f'{vc.name} by themselves' + e.add_field(name='Voice', value=voice, inline=False) - colour = user.colour - if colour.value: - e.colour = colour + if roles: + e.add_field(name='Roles', value=', '.join(roles) if len(roles) < 10 else f'{len(roles)} roles', inline=False) - if user.avatar: - e.set_thumbnail(url=user.avatar_url) + colour = user.colour + if colour.value: + e.colour = colour - if isinstance(user, discord.User): - e.set_footer(text='This member is not in this server.') + if user.avatar: + e.set_thumbnail(url=user.display_avatar.url) - await ctx.send(embed=e) + if isinstance(user, discord.User): + e.set_footer(text='This member is not in this server.') + + await ctx.send(embed=e) bot.run("token") From 0795f4422f48bc0458e23b0690fcce04a99c2456 Mon Sep 17 00:00:00 2001 From: Empathy <84625385+EmpathyYT@users.noreply.github.com> Date: Sun, 3 Oct 2021 19:13:03 +0300 Subject: [PATCH 005/180] simpler example that doubles as a slash command --- examples/Info.py | 42 +++++++++++------------------------------- 1 file changed, 11 insertions(+), 31 deletions(-) diff --git a/examples/Info.py b/examples/Info.py index 1390eb36af..ad2e154fe8 100644 --- a/examples/Info.py +++ b/examples/Info.py @@ -1,14 +1,11 @@ import discord -from discord.ext import commands -from typing import Union +from discord.app import Option description = """An example to showcase how to extract info about users""" -intents = discord.Intents.default() -intents.members = True - -bot = commands.Bot(command_prefix="?", description=description, intents=intents) +bot = discord.Bot(commands_prefix="x", description="e", + intents=discord.Intents.all()) @bot.event @@ -17,37 +14,20 @@ async def on_ready(): print("------") -@bot.command() -async def info(ctx, *, user: Union[discord.Member, discord.User] = None): - """Shows info about a user.""" - +@bot.slash_command(name="a", description="a") +async def perms(ctx, user: discord.Member): user = user or ctx.author e = discord.Embed() - roles = [role.name.replace('@', '@\u200b') for role in getattr(user, 'roles', [])] - e.set_author(name=str(user)) - - - + e.set_author(name=user.name) e.add_field(name='ID', value=user.id, inline=False) - e.add_field(name='Joined', value=round_time(user.joined_at), inline=False) - e.add_field(name='Created', value=round_time(user.created_at), inline=False) - - voice = getattr(user, 'voice', None) - if voice is not None: - vc = voice.channel - other_people = len(vc.members) - 1 - voice = f'{vc.name} with {other_people} others' if other_people else f'{vc.name} by themselves' - e.add_field(name='Voice', value=voice, inline=False) - - if roles: - e.add_field(name='Roles', value=', '.join(roles) if len(roles) < 10 else f'{len(roles)} roles', inline=False) - + e.add_field(name='Joined', value=user.joined_at.strftime( + "%A, %B %d %Y @ %H:%M:%S %p"), inline=False) + e.add_field(name='Created', value=user.created_at.strftime( + "%A, %B %d %Y @ %H:%M:%S %p"), inline=False) colour = user.colour if colour.value: - e.colour = colour - if user.avatar: - e.set_thumbnail(url=user.display_avatar.url) + e.colour = colour if isinstance(user, discord.User): e.set_footer(text='This member is not in this server.') From 37b964a0ac67ccb748873c22f3128c05f56cc914 Mon Sep 17 00:00:00 2001 From: Empathy <84625385+EmpathyYT@users.noreply.github.com> Date: Sun, 3 Oct 2021 19:16:10 +0300 Subject: [PATCH 006/180] Update Info.py --- examples/Info.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/examples/Info.py b/examples/Info.py index ad2e154fe8..b30e50d242 100644 --- a/examples/Info.py +++ b/examples/Info.py @@ -1,5 +1,5 @@ import discord -from discord.app import Option +from discord.ext import commands description = """An example to showcase how to extract info about users""" @@ -14,7 +14,8 @@ async def on_ready(): print("------") -@bot.slash_command(name="a", description="a") + +@bot.command() async def perms(ctx, user: discord.Member): user = user or ctx.author e = discord.Embed() @@ -29,9 +30,6 @@ async def perms(ctx, user: discord.Member): e.colour = colour - if isinstance(user, discord.User): - e.set_footer(text='This member is not in this server.') - await ctx.send(embed=e) bot.run("token") From d1ba22628f2dd523eb3f53b9317d3440a7d678ff Mon Sep 17 00:00:00 2001 From: Empathy <84625385+EmpathyYT@users.noreply.github.com> Date: Mon, 4 Oct 2021 15:25:55 +0300 Subject: [PATCH 007/180] Update examples/Info.py Co-authored-by: Izhar Ahmad <54180221+nerdguyahmad@users.noreply.github.com> --- examples/Info.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/examples/Info.py b/examples/Info.py index b30e50d242..5872367c02 100644 --- a/examples/Info.py +++ b/examples/Info.py @@ -25,11 +25,6 @@ async def perms(ctx, user: discord.Member): "%A, %B %d %Y @ %H:%M:%S %p"), inline=False) e.add_field(name='Created', value=user.created_at.strftime( "%A, %B %d %Y @ %H:%M:%S %p"), inline=False) - colour = user.colour - if colour.value: - - e.colour = colour - - await ctx.send(embed=e) + await ctx.send(embed=e, colour=user.colour) bot.run("token") From 5a19180946d8adaeb7682985609a39d1002c5467 Mon Sep 17 00:00:00 2001 From: Empathy <84625385+EmpathyYT@users.noreply.github.com> Date: Mon, 4 Oct 2021 15:33:49 +0300 Subject: [PATCH 008/180] fixed all issues --- examples/Info.py | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/examples/Info.py b/examples/Info.py index 5872367c02..56202bc93a 100644 --- a/examples/Info.py +++ b/examples/Info.py @@ -2,10 +2,15 @@ from discord.ext import commands -description = """An example to showcase how to extract info about users""" +# An example to showcase how to extract info about users -bot = discord.Bot(commands_prefix="x", description="e", - intents=discord.Intents.all()) +intents = discord.Intents( + members=True, + messages=True, + ) + +bot = commands.Bot(command_prefix=".", description="e", + intents=intents) @bot.event @@ -16,7 +21,7 @@ async def on_ready(): @bot.command() -async def perms(ctx, user: discord.Member): +async def userinfo(ctx, user: discord.Member): user = user or ctx.author e = discord.Embed() e.set_author(name=user.name) From 6bf447144d2ee598e6c46e56d6e61fd69c3b5971 Mon Sep 17 00:00:00 2001 From: Empathy <84625385+EmpathyYT@users.noreply.github.com> Date: Mon, 4 Oct 2021 15:37:30 +0300 Subject: [PATCH 009/180] Update Info.py --- examples/Info.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/Info.py b/examples/Info.py index 56202bc93a..f940231a52 100644 --- a/examples/Info.py +++ b/examples/Info.py @@ -9,7 +9,7 @@ messages=True, ) -bot = commands.Bot(command_prefix=".", description="e", +bot = commands.Bot(command_prefix=".", description="User info example", intents=intents) From 2fbffee03ed09a46a088c78046043ffa0cb83311 Mon Sep 17 00:00:00 2001 From: Empathy <84625385+EmpathyYT@users.noreply.github.com> Date: Mon, 4 Oct 2021 19:33:26 +0300 Subject: [PATCH 010/180] Update Info.py --- examples/Info.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/Info.py b/examples/Info.py index f940231a52..a4b7e144b8 100644 --- a/examples/Info.py +++ b/examples/Info.py @@ -23,13 +23,13 @@ async def on_ready(): @bot.command() async def userinfo(ctx, user: discord.Member): user = user or ctx.author - e = discord.Embed() + e = discord.Embed(colour=user.color) e.set_author(name=user.name) e.add_field(name='ID', value=user.id, inline=False) e.add_field(name='Joined', value=user.joined_at.strftime( "%A, %B %d %Y @ %H:%M:%S %p"), inline=False) e.add_field(name='Created', value=user.created_at.strftime( "%A, %B %d %Y @ %H:%M:%S %p"), inline=False) - await ctx.send(embed=e, colour=user.colour) + await ctx.send(embed=e) bot.run("token") From 90c4098b007413ee0ed94ddbc4ff54ce4723fd27 Mon Sep 17 00:00:00 2001 From: Empathy <84625385+EmpathyYT@users.noreply.github.com> Date: Mon, 4 Oct 2021 19:33:35 +0300 Subject: [PATCH 011/180] Update Info.py --- examples/Info.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/Info.py b/examples/Info.py index a4b7e144b8..60eb76a6ed 100644 --- a/examples/Info.py +++ b/examples/Info.py @@ -23,7 +23,7 @@ async def on_ready(): @bot.command() async def userinfo(ctx, user: discord.Member): user = user or ctx.author - e = discord.Embed(colour=user.color) + e = discord.Embed(colour=user.colour) e.set_author(name=user.name) e.add_field(name='ID', value=user.id, inline=False) e.add_field(name='Joined', value=user.joined_at.strftime( From 472cde8234913dab5bce026685471a992da7a9f0 Mon Sep 17 00:00:00 2001 From: Empathy <84625385+EmpathyYT@users.noreply.github.com> Date: Wed, 27 Oct 2021 15:54:08 +0300 Subject: [PATCH 012/180] Delete Info.py --- examples/Info.py | 35 ----------------------------------- 1 file changed, 35 deletions(-) delete mode 100644 examples/Info.py diff --git a/examples/Info.py b/examples/Info.py deleted file mode 100644 index 60eb76a6ed..0000000000 --- a/examples/Info.py +++ /dev/null @@ -1,35 +0,0 @@ -import discord -from discord.ext import commands - - -# An example to showcase how to extract info about users - -intents = discord.Intents( - members=True, - messages=True, - ) - -bot = commands.Bot(command_prefix=".", description="User info example", - intents=intents) - - -@bot.event -async def on_ready(): - print(f"Logged in as {bot.user} (ID: {bot.user.id})") - print("------") - - - -@bot.command() -async def userinfo(ctx, user: discord.Member): - user = user or ctx.author - e = discord.Embed(colour=user.colour) - e.set_author(name=user.name) - e.add_field(name='ID', value=user.id, inline=False) - e.add_field(name='Joined', value=user.joined_at.strftime( - "%A, %B %d %Y @ %H:%M:%S %p"), inline=False) - e.add_field(name='Created', value=user.created_at.strftime( - "%A, %B %d %Y @ %H:%M:%S %p"), inline=False) - await ctx.send(embed=e) - -bot.run("token") From e6c846eadc0cb9e9970193249ec8e56e039fb85b Mon Sep 17 00:00:00 2001 From: Empathy <84625385+EmpathyYT@users.noreply.github.com> Date: Wed, 27 Oct 2021 16:36:43 +0300 Subject: [PATCH 013/180] Create Info.py --- examples/app_commands/Info.py | 36 +++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) create mode 100644 examples/app_commands/Info.py diff --git a/examples/app_commands/Info.py b/examples/app_commands/Info.py new file mode 100644 index 0000000000..2bffe5ce58 --- /dev/null +++ b/examples/app_commands/Info.py @@ -0,0 +1,36 @@ +import discord +from discord.ext import commands + +intents = discord.Intents( + guilds=True, + members=True, + messages=True, + ) +bot = commands.Bot(command_prefix=".", description="An example to showcase how to extract info about users",intents=intents) + + + +@bot.slash_command(name="userinfo", description="gets the info of a user") +async def info(ctx, user: discord.Member = None): + user = user or ctx.author + e = discord.Embed() + e.set_author(name=user.name) + e.add_field(name='ID', value=user.id, inline=False) + e.add_field(name='Joined', + value=f"", inline=False) + e.add_field(name='Created', + value=f"", inline=False) + colour = user.colour + if colour.value: + + e.colour = colour + + if isinstance(user, discord.User): + e.set_footer(text='This member is not in this server.') + + await ctx.respond(embed=e) + + +bot.run("urtoken") + + From 85a0455ec915b065b6b65a34a1598de5e6d86287 Mon Sep 17 00:00:00 2001 From: Dorukyum <53639936+Dorukyum@users.noreply.github.com> Date: Fri, 29 Oct 2021 18:27:02 +0300 Subject: [PATCH 014/180] Document application commands (#308) * Document application command types * Document SlashCommandGroup * Document Option and OptionChoice * Document ApplicationContext * Document SlashCommandOptionType * Move SlashCommandOptionType to enums * Apply fixes from suggestions Co-authored-by: BobDotCom <71356958+BobDotCom@users.noreply.github.com> * Add docstrings to UserCommand and MessageCommand * Document OptionChoice * Move to a seperate file * Introduction to application commands Co-authored-by: BobDotCom <71356958+BobDotCom@users.noreply.github.com> --- discord/commands/commands.py | 55 ++++++++++++++++++++ docs/api.rst | 44 +++++++++++++--- docs/application_commands.rst | 94 +++++++++++++++++++++++++++++++++++ 3 files changed, 186 insertions(+), 7 deletions(-) create mode 100644 docs/application_commands.rst diff --git a/discord/commands/commands.py b/discord/commands/commands.py index 77d6db0453..5a4b637a66 100644 --- a/discord/commands/commands.py +++ b/discord/commands/commands.py @@ -604,6 +604,15 @@ def __repr__(self): class OptionChoice: + r"""Represents an option choice. + + Attributes + ----------- + name: :class:`str` + The name of the option choice. + value: Optional[Union[:class:`str`, :class:`int`, :class:`float`]] + The value of the option choice. If ``None`` is passed, this will be set to the name of the option choice. + """ def __init__(self, name: str, value: Optional[Union[str, int, float]] = None): self.name = name self.value = value or name @@ -825,6 +834,29 @@ def to_dict(self) -> Dict[str, Union[str, int]]: class UserCommand(ContextMenuCommand): + r"""A class that implements the protocol for user context menu commands. + + These are not created manually, instead they are created via the + decorator or functional interface. + + Attributes + ----------- + name: :class:`str` + The name of the command. + callback: :ref:`coroutine ` + The coroutine that is executed when the command is called. + guild_ids: Optional[List[:class:`int`]] + The ids of the guilds where this command will be registered. + cog: Optional[:class:`Cog`] + The cog that this command belongs to. ``None`` if there isn't one. + checks: List[Callable[[:class:`.ApplicationContext`], :class:`bool`]] + A list of predicates that verifies if the command could be executed + with the given :class:`.ApplicationContext` as the sole parameter. If an exception + is necessary to be thrown to signal failure, then one inherited from + :exc:`.CommandError` should be used. Note that if the checks fail then + :exc:`.CheckFailure` exception is raised to the :func:`.on_application_command_error` + event. + """ type = 2 def __new__(cls, *args, **kwargs) -> UserCommand: @@ -900,6 +932,29 @@ def _update_copy(self, kwargs: Dict[str, Any]): class MessageCommand(ContextMenuCommand): + r"""A class that implements the protocol for message context menu commands. + + These are not created manually, instead they are created via the + decorator or functional interface. + + Attributes + ----------- + name: :class:`str` + The name of the command. + callback: :ref:`coroutine ` + The coroutine that is executed when the command is called. + guild_ids: Optional[List[:class:`int`]] + The ids of the guilds where this command will be registered. + cog: Optional[:class:`Cog`] + The cog that this command belongs to. ``None`` if there isn't one. + checks: List[Callable[[:class:`.ApplicationContext`], :class:`bool`]] + A list of predicates that verifies if the command could be executed + with the given :class:`.ApplicationContext` as the sole parameter. If an exception + is necessary to be thrown to signal failure, then one inherited from + :exc:`.CommandError` should be used. Note that if the checks fail then + :exc:`.CheckFailure` exception is raised to the :func:`.on_application_command_error` + event. + """ type = 3 def __new__(cls, *args, **kwargs) -> MessageCommand: diff --git a/docs/api.rst b/docs/api.rst index 7a489dc560..175ef2d2e5 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -93,13 +93,6 @@ AutoShardedBot .. autoclass:: AutoShardedBot :members: -Application Commands ---------------------- -.. attributetable:: ApplicationCommandMixin - -.. autoclass:: ApplicationCommandMixin - :members: - Application Info ------------------ @@ -1203,6 +1196,43 @@ from being stringly typed in case the strings change in the future. All enumerations are subclasses of an internal class which mimics the behaviour of :class:`enum.Enum`. +.. class:: SlashCommandOptionType + + Specifies the input type of an option. + + .. versionadded:: 2.0 + + .. attribute:: sub_command + + A slash subcommand. + .. attribute:: sub_command_group + + A slash command group. + .. attribute:: string + + A string. + .. attribute:: integer + + An integer. + .. attribute:: boolean + + A boolean. + .. attribute:: user + + A user from the current channel. This will be converted to an instance of :class:`.User` in private channels, else :class:`.Member` + .. attribute:: channel + + A channel from the current guild. + .. attribute:: role + + A role from the current guild. + .. attribute:: mentionable + + A mentionable (user or role). + .. attribute:: number + + A floating number. + .. class:: ChannelType Specifies the type of channel. diff --git a/docs/application_commands.rst b/docs/application_commands.rst new file mode 100644 index 0000000000..47e5e20c0d --- /dev/null +++ b/docs/application_commands.rst @@ -0,0 +1,94 @@ +:orphan: + +.. currentmodule:: discord +.. versionadded:: 2.0 +.. _application_commands: + +Application Commands +===================== + +Application commands are commands that an application can register to Discord. They provide users a way of interacting +directly with your application that feels deeply integrated into Discord. + +Application commands can be used with either :class:`.Bot` or :class:`.ext.commands.Bot`. + +.. code-block:: python3 + import discord + bot = discord.Bot() + + @bot.command() # creates slash command by default + async def foo(ctx, arg): + await ctx.respond(arg) + + # or + + from discord.ext import commands + bot = commands.Bot() + + @bot.slash_command() + async def foo(ctx, arg): + await ctx.respond(arg) + +ApplicationCommand +~~~~~~~~~~~~~~~~~~~ + +.. attributetable:: ApplicationCommand + +.. autoclass:: ApplicationCommand + :members: + +SlashCommand +~~~~~~~~~~~~~ + +.. attributetable:: SlashCommand + +.. autoclass:: SlashCommand + :members: + +SlashCommandGroup +~~~~~~~~~~~~~~~~~~ + +.. attributetable:: SlashCommandGroup + +.. autoclass:: SlashCommandGroup + :members: + +Option +~~~~~~~ + +.. attributetable:: Option + +.. autoclass:: Option + :members: + +OptionChoice +~~~~~~~~~~~~~ + +.. attributetable:: OptionChoice + +.. autoclass:: OptionChoice + :members: + +UserCommand +~~~~~~~~~~~~ + +.. attributetable:: UserCommand + +.. autoclass:: UserCommand + :members: + +MessageCommand +~~~~~~~~~~~~~~~ + +.. attributetable:: MessageCommand + +.. autoclass:: MessageCommand + :members: + +ApplicationContext +~~~~~~~~~~~~~~~~~~~ + +.. attributetable:: ApplicationContext + +.. autoclass:: ApplicationContext + :members: From 275163f568896b4af81512063946691bb5907d40 Mon Sep 17 00:00:00 2001 From: BobDotCom <71356958+BobDotCom@users.noreply.github.com> Date: Sun, 31 Oct 2021 12:37:14 -0500 Subject: [PATCH 015/180] Fix documentation structure for application commands --- docs/api.rst | 67 +++++++++++++++++++++++++++++++++++ docs/application_commands.rst | 63 +------------------------------- 2 files changed, 68 insertions(+), 62 deletions(-) diff --git a/docs/api.rst b/docs/api.rst index 175ef2d2e5..3156363e7b 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -93,6 +93,73 @@ AutoShardedBot .. autoclass:: AutoShardedBot :members: +Application Commands +--------------------- + +ApplicationCommand +~~~~~~~~~~~~~~~~~~~ + +.. attributetable:: ApplicationCommand + +.. autoclass:: ApplicationCommand + :members: + +SlashCommand +~~~~~~~~~~~~~ + +.. attributetable:: SlashCommand + +.. autoclass:: SlashCommand + :members: + +SlashCommandGroup +~~~~~~~~~~~~~~~~~~ + +.. attributetable:: SlashCommandGroup + +.. autoclass:: SlashCommandGroup + :members: + +Option +~~~~~~~ + +.. attributetable:: Option + +.. autoclass:: Option + :members: + +OptionChoice +~~~~~~~~~~~~~ + +.. attributetable:: OptionChoice + +.. autoclass:: OptionChoice + :members: + +UserCommand +~~~~~~~~~~~~ + +.. attributetable:: UserCommand + +.. autoclass:: UserCommand + :members: + +MessageCommand +~~~~~~~~~~~~~~~ + +.. attributetable:: MessageCommand + +.. autoclass:: MessageCommand + :members: + +ApplicationContext +~~~~~~~~~~~~~~~~~~~ + +.. attributetable:: ApplicationContext + +.. autoclass:: ApplicationContext + :members: + Application Info ------------------ diff --git a/docs/application_commands.rst b/docs/application_commands.rst index 47e5e20c0d..8647c2de74 100644 --- a/docs/application_commands.rst +++ b/docs/application_commands.rst @@ -13,6 +13,7 @@ directly with your application that feels deeply integrated into Discord. Application commands can be used with either :class:`.Bot` or :class:`.ext.commands.Bot`. .. code-block:: python3 + import discord bot = discord.Bot() @@ -29,66 +30,4 @@ Application commands can be used with either :class:`.Bot` or :class:`.ext.comma async def foo(ctx, arg): await ctx.respond(arg) -ApplicationCommand -~~~~~~~~~~~~~~~~~~~ - -.. attributetable:: ApplicationCommand - -.. autoclass:: ApplicationCommand - :members: - -SlashCommand -~~~~~~~~~~~~~ - -.. attributetable:: SlashCommand - -.. autoclass:: SlashCommand - :members: - -SlashCommandGroup -~~~~~~~~~~~~~~~~~~ - -.. attributetable:: SlashCommandGroup - -.. autoclass:: SlashCommandGroup - :members: - -Option -~~~~~~~ - -.. attributetable:: Option - -.. autoclass:: Option - :members: - -OptionChoice -~~~~~~~~~~~~~ - -.. attributetable:: OptionChoice - -.. autoclass:: OptionChoice - :members: - -UserCommand -~~~~~~~~~~~~ - -.. attributetable:: UserCommand - -.. autoclass:: UserCommand - :members: - -MessageCommand -~~~~~~~~~~~~~~~ - -.. attributetable:: MessageCommand - -.. autoclass:: MessageCommand - :members: - -ApplicationContext -~~~~~~~~~~~~~~~~~~~ - -.. attributetable:: ApplicationContext -.. autoclass:: ApplicationContext - :members: From a738ac6e73bcdbacfcdc69257a7b7b07c88ebc52 Mon Sep 17 00:00:00 2001 From: Lucas Hardt Date: Sun, 7 Nov 2021 14:59:07 +0100 Subject: [PATCH 016/180] add type hints Took 1 hour 38 minutes --- discord/asset.py | 4 +- discord/commands/commands.py | 294 +++++++++++++++++++----------- discord/commands/permissions.py | 45 +++-- discord/ext/commands/bot.py | 2 +- discord/ext/commands/converter.py | 2 +- discord/ext/commands/help.py | 2 +- discord/ext/commands/view.py | 2 +- discord/flags.py | 2 +- discord/integrations.py | 2 +- discord/mentions.py | 4 +- discord/partial_emoji.py | 2 +- discord/types/interactions.py | 9 +- discord/utils.py | 4 +- discord/webhook/async_.py | 6 +- discord/webhook/sync.py | 2 +- discord/welcome_screen.py | 4 +- 16 files changed, 244 insertions(+), 142 deletions(-) diff --git a/discord/asset.py b/discord/asset.py index dade1397cd..5a705023ab 100644 --- a/discord/asset.py +++ b/discord/asset.py @@ -253,11 +253,11 @@ def __str__(self) -> str: def __len__(self) -> int: return len(self._url) - def __repr__(self): + def __repr__(self) -> str: shorten = self._url.replace(self.BASE, '') return f'' - def __eq__(self, other): + def __eq__(self, other) -> bool: return isinstance(other, Asset) and self._url == other._url def __hash__(self): diff --git a/discord/commands/commands.py b/discord/commands/commands.py index a0dc47f522..ceab154d37 100644 --- a/discord/commands/commands.py +++ b/discord/commands/commands.py @@ -30,8 +30,9 @@ import functools import inspect from collections import OrderedDict -from typing import Any, Callable, Dict, List, Optional, Union, TYPE_CHECKING +from typing import Any, Callable, Dict, List, Optional, Union, TYPE_CHECKING, Awaitable, overload +from .. import Cog, Interaction from ..enums import SlashCommandOptionType, ChannelType from ..member import Member from ..user import User @@ -42,6 +43,13 @@ from .errors import ApplicationCommandError, CheckFailure, ApplicationCommandInvokeError from .permissions import Permission +if TYPE_CHECKING: + from ..types.interactions import ( + ApplicationCommand as ApplicationCommandData, + ApplicationCommandOption, + ApplicationCommandOptionChoice + ) + __all__ = ( "_BaseCommand", "ApplicationCommand", @@ -60,12 +68,10 @@ "MessageCommand", ) -if TYPE_CHECKING: - from ..interactions import Interaction -def wrap_callback(coro): +def wrap_callback(coro): # TODO: Typehint Coro and Return Type Something with type vars @functools.wraps(coro) - async def wrapped(*args, **kwargs): + async def wrapped(*args, **kwargs): # TODO: Same here try: ret = await coro(*args, **kwargs) except ApplicationCommandError: @@ -75,11 +81,13 @@ async def wrapped(*args, **kwargs): except Exception as exc: raise ApplicationCommandInvokeError(exc) from exc return ret + return wrapped -def hooked_wrapped_callback(command, ctx, coro): + +def hooked_wrapped_callback(command: ApplicationCommand, ctx: ApplicationContext, coro): # TODO: Typehint coro & return type @functools.wraps(coro) - async def wrapped(arg): + async def wrapped(arg): # TODO: Same here try: ret = await coro(arg) except ApplicationCommandError: @@ -91,21 +99,34 @@ async def wrapped(arg): finally: await command.call_after_hooks(ctx) return ret + return wrapped + class _BaseCommand: __slots__ = () + +#finished class ApplicationCommand(_BaseCommand): - cog = None - - def __repr__(self): + cog: Optional[Cog] = None + name: str + description: str + callback: Callable[[ApplicationContext, ...], Awaitable[None]] + checks: List[Callable[[ApplicationContext], Awaitable[bool]]] + on_error: Callable[[ApplicationContext, Exception], Awaitable[None]] + _before_invoke: Optional[Callable[[ApplicationContext], Awaitable[None]]] + _after_invoke: Optional[Callable[[ApplicationContext], Awaitable[None]]] + default_permission: bool + permissions: List[Permission] + + def __repr__(self) -> str: return f"" - def __eq__(self, other): + def __eq__(self, other: Any) -> bool: return isinstance(other, self.__class__) - async def __call__(self, ctx, *args, **kwargs): + async def __call__(self, ctx: ApplicationContext, *args, **kwargs) -> None: """|coro| Calls the command's callback. @@ -113,7 +134,7 @@ async def __call__(self, ctx, *args, **kwargs): convert the arguments beforehand, so take care to pass the correct arguments in. """ - return await self.callback(ctx, *args, **kwargs) + await self.callback(ctx, *args, **kwargs) async def prepare(self, ctx: ApplicationContext) -> None: # This should be same across all 3 types @@ -142,8 +163,8 @@ async def can_run(self, ctx: ApplicationContext) -> bool: # since we have no checks, then we just return True. return True - return await async_all(predicate(ctx) for predicate in predicates) # type: ignore - + return await async_all(predicate(ctx) for predicate in predicates) # type: ignore + async def dispatch_error(self, ctx: ApplicationContext, error: Exception) -> None: ctx.command_failed = True cog = self.cog @@ -167,10 +188,13 @@ async def dispatch_error(self, ctx: ApplicationContext, error: Exception) -> Non finally: ctx.bot.dispatch('application_command_error', ctx, error) - def _get_signature_parameters(self): + def _get_signature_parameters(self) -> OrderedDict: # TODO: Maybe define Dict better return OrderedDict(inspect.signature(self.callback).parameters) - def error(self, coro): + def error( + self, + coro: Callable[[ApplicationContext, Exception], Awaitable[None]] + ) -> Callable[[ApplicationContext, Exception], Awaitable[None]]: """A decorator that registers a coroutine as a local error handler. A local error handler is an :func:`.on_command_error` event limited to @@ -199,7 +223,10 @@ def has_error_handler(self) -> bool: """ return hasattr(self, 'on_error') - def before_invoke(self, coro): + def before_invoke( + self, + coro: Callable[[ApplicationContext], Awaitable[None]] + ) -> Callable[[ApplicationContext], Awaitable[None]]: """A decorator that registers a coroutine as a pre-invoke hook. A pre-invoke hook is called directly before the command is called. This makes it a useful function to set up database @@ -221,7 +248,10 @@ def before_invoke(self, coro): self._before_invoke = coro return coro - def after_invoke(self, coro): + def after_invoke( + self, + coro: Callable[[ApplicationContext], Awaitable[None]] + ) -> Callable[[ApplicationContext], Awaitable[None]]: """A decorator that registers a coroutine as a post-invoke hook. A post-invoke hook is called directly after the command is called. This makes it a useful function to clean-up database @@ -317,6 +347,7 @@ def qualified_name(self) -> str: else: return self.name +#finished class SlashCommand(ApplicationCommand): r"""A class that implements the protocol for a slash command. @@ -357,7 +388,7 @@ class SlashCommand(ApplicationCommand): :exc:`.CheckFailure` exception is raised to the :func:`.on_application_command_error` event. """ - type = 1 + type: int = 1 def __new__(cls, *args, **kwargs) -> SlashCommand: self = super().__new__(cls) @@ -365,17 +396,32 @@ def __new__(cls, *args, **kwargs) -> SlashCommand: self.__original_kwargs__ = kwargs.copy() return self - def __init__(self, func: Callable, *args, **kwargs) -> None: + @overload + def __init__( + self, + func: Callable[[ApplicationContext, ...], Awaitable[None]], + *, + name: Optional[str] = None, + description: Optional[str] = None, + guild_ids: Optional[List[int]] = None, + parent: Optional[SlashCommandGroup] = None, + checks: Optional[List[Callable[[ApplicationContext], Awaitable[bool]]]] = None, + default_permission: bool = None, + permissions: Optional[List[Permission]] = None, + ) -> None: + ... + + def __init__(self, func: Callable[[ApplicationContext, ...], Awaitable[None]], *args, **kwargs) -> None: if not asyncio.iscoroutinefunction(func): raise TypeError("Callback must be a coroutine.") - self.callback = func + self.callback: Callable[[ApplicationContext, ...], Awaitable[None]] = func self.guild_ids: Optional[List[int]] = kwargs.get("guild_ids", None) name = kwargs.get("name") or func.__name__ validate_chat_input_name(name) self.name: str = name - self.id = None + self.id = None # TODO: typehint usage? description = kwargs.get("description") or ( inspect.cleandoc(func.__doc__).splitlines()[0] @@ -384,10 +430,10 @@ def __init__(self, func: Callable, *args, **kwargs) -> None: ) validate_chat_input_description(description) self.description: str = description - self.parent = kwargs.get('parent') + self.parent: SlashCommandGroup = kwargs.get('parent') self.is_subcommand: bool = self.parent is not None - self.cog = None + self.cog: Optional[Cog] = None params = self._get_signature_parameters() self.options: List[Option] = self._parse_options(params) @@ -409,10 +455,7 @@ def __init__(self, func: Callable, *args, **kwargs) -> None: if self.permissions and self.default_permission: self.default_permission = False - - def _parse_options(self, params) -> List[Option]: - final_options = [] - + def _parse_options(self, params: Dict) -> List[Option]: # TODO: Better typehint dict if list(params.items())[0][0] == "self": temp = list(params.items()) temp.pop(0) @@ -463,16 +506,16 @@ def _parse_options(self, params) -> List[Option]: return final_options - def _is_typing_union(self, annotation): + def _is_typing_union(self, annotation) -> bool: # TODO: Typehint annotation return ( - getattr(annotation, '__origin__', None) is Union - or type(annotation) is getattr(types, "UnionType", Union) - ) # type: ignore + getattr(annotation, '__origin__', None) is Union + or type(annotation) is getattr(types, "UnionType", Union) + ) # type: ignore - def _is_typing_optional(self, annotation): + def _is_typing_optional(self, annotation) -> bool: # TODO: Typehint annotation return self._is_typing_union(annotation) and type(None) in annotation.__args__ # type: ignore - def to_dict(self) -> Dict: + def to_dict(self) -> ApplicationCommandData: # TODO: Need to be improved? as_dict = { "name": self.name, "description": self.description, @@ -484,11 +527,11 @@ def to_dict(self) -> Dict: return as_dict - def __eq__(self, other) -> bool: + def __eq__(self, other: Any) -> bool: return ( - isinstance(other, SlashCommand) - and other.name == self.name - and other.description == self.description + isinstance(other, SlashCommand) + and other.name == self.name + and other.description == self.description ) async def _invoke(self, ctx: ApplicationContext) -> None: @@ -500,9 +543,9 @@ async def _invoke(self, ctx: ApplicationContext) -> None: # Checks if input_type is user, role or channel if ( - SlashCommandOptionType.user.value - <= op.input_type.value - <= SlashCommandOptionType.role.value + SlashCommandOptionType.user.value + <= op.input_type.value + <= SlashCommandOptionType.role.value ): name = "member" if op.input_type.name == "user" else op.input_type.name arg = await get_or_fetch(ctx.guild, name, int(arg), default=int(arg)) @@ -521,36 +564,36 @@ async def _invoke(self, ctx: ApplicationContext) -> None: for o in self.options: if o._parameter_name not in kwargs: kwargs[o._parameter_name] = o.default - + if self.cog is not None: await self.callback(self.cog, ctx, **kwargs) else: await self.callback(ctx, **kwargs) - async def invoke_autocomplete_callback(self, interaction: Interaction): - values = { i.name: i.default for i in self.options } - + async def invoke_autocomplete_callback(self, interaction: Interaction) -> None: + values = {i.name: i.default for i in self.options} + for op in interaction.data.get("options", []): if op.get("focused", False): option = find(lambda o: o.name == op["name"], self.options) values.update({ - i["name"]:i["value"] + i["name"]: i["value"] for i in interaction.data["options"] }) - ctx = AutocompleteContext(interaction, command=self, focused=option, value=op.get("value"), options=values) + ctx = AutocompleteContext(interaction, command=self, focused=option, value=op.get("value"), + options=values) if asyncio.iscoroutinefunction(option.autocomplete): result = await option.autocomplete(ctx) else: result = option.autocomplete(ctx) choices = [ - o if isinstance(o, OptionChoice) else OptionChoice(o) - for o in result - ][:25] + o if isinstance(o, OptionChoice) else OptionChoice(o) + for o in result + ][:25] return await interaction.response.send_autocomplete_result(choices=choices) - - def copy(self): + def copy(self) -> "SlashCommand": """Creates a copy of this command. Returns @@ -561,14 +604,14 @@ def copy(self): ret = self.__class__(self.callback, **self.__original_kwargs__) return self._ensure_assignment_on_copy(ret) - def _ensure_assignment_on_copy(self, other): + def _ensure_assignment_on_copy(self, other: "SlashCommand") -> "SlashCommand": other._before_invoke = self._before_invoke other._after_invoke = self._after_invoke if self.checks != other.checks: other.checks = self.checks.copy() - #if self._buckets.valid and not other._buckets.valid: + # if self._buckets.valid and not other._buckets.valid: # other._buckets = self._buckets.copy() - #if self._max_concurrency != other._max_concurrency: + # if self._max_concurrency != other._max_concurrency: # # _max_concurrency won't be None at this point # other._max_concurrency = self._max_concurrency.copy() # type: ignore @@ -578,7 +621,7 @@ def _ensure_assignment_on_copy(self, other): pass return other - def _update_copy(self, kwargs: Dict[str, Any]): + def _update_copy(self, kwargs: Dict[str, Any]) -> "SlashCommand": if kwargs: kw = kwargs.copy() kw.update(self.__original_kwargs__) @@ -587,6 +630,7 @@ def _update_copy(self, kwargs: Dict[str, Any]): else: return self.copy() + channel_type_map = { 'TextChannel': ChannelType.text, 'VoiceChannel': ChannelType.voice, @@ -594,14 +638,33 @@ def _update_copy(self, kwargs: Dict[str, Any]): 'CategoryChannel': ChannelType.category } +#finished class Option: + + @overload + def __int__( + self, + input_type: Any, + /, + description: str, + *, + name: Optional[str] = None, + channel_type: Optional[ChannelType] = None, + required: bool = None, + default: Any = None, + min_value: Optional[int] = None, + max_value: Optional[int] = None, + autocomplete: Optional[Callable[[AutocompleteContext], Awaitable[Any]]] = None, + ) -> None: + ... + def __init__( - self, input_type: Any, /, description: str = None, **kwargs + self, input_type: Any, /, description: str = None, **kwargs ) -> None: self.name: Optional[str] = kwargs.pop("name", None) - self.description = description or "No description provided" + self.description: str = description or "No description provided" self._converter = None - self.channel_types: List[SlashCommandOptionType] = kwargs.pop("channel_types", []) + self.channel_types: List[ChannelType] = kwargs.pop("channel_types", []) if not isinstance(input_type, SlashCommandOptionType): if hasattr(input_type, "convert"): self._converter = input_type @@ -618,36 +681,37 @@ def __init__( channel_type = channel_type_map[i.__name__] self.channel_types.append(channel_type) input_type = _type - self.input_type = input_type + self.input_type: Any = input_type self.required: bool = kwargs.pop("required", True) self.choices: List[OptionChoice] = [ o if isinstance(o, OptionChoice) else OptionChoice(o) for o in kwargs.pop("choices", list()) ] - self.default = kwargs.pop("default", None) + self.default: Any = kwargs.pop("default", None) if self.input_type == SlashCommandOptionType.integer: minmax_types = (int,) elif self.input_type == SlashCommandOptionType.number: minmax_types = (int, float) else: minmax_types = (type(None),) - minmax_typehint = Optional[Union[minmax_types]] # type: ignore + minmax_typehint = Optional[Union[minmax_types]] # type: ignore self.min_value: minmax_typehint = kwargs.pop("min_value", None) self.max_value: minmax_typehint = kwargs.pop("max_value", None) - + if not (isinstance(self.min_value, minmax_types) or self.min_value is None): raise TypeError(f"Expected {minmax_typehint} for min_value, got \"{type(self.min_value).__name__}\"") if not (isinstance(self.max_value, minmax_types) or self.min_value is None): raise TypeError(f"Expected {minmax_typehint} for max_value, got \"{type(self.max_value).__name__}\"") - self.autocomplete = kwargs.pop("autocomplete", None) + self.autocomplete: Callable[[AutocompleteContext], Awaitable[List[Union[OptionChoice, str]]]] \ + = kwargs.pop("autocomplete", None) - def to_dict(self) -> Dict: + def to_dict(self) -> ApplicationCommandOption: as_dict = { + "type": self.input_type.value, "name": self.name, "description": self.description, - "type": self.input_type.value, "required": self.required, "choices": [c.to_dict() for c in self.choices], "autocomplete": bool(self.autocomplete) @@ -661,28 +725,32 @@ def to_dict(self) -> Dict: return as_dict - - def __repr__(self): + def __repr__(self) -> str: return f"" +#finihsed class OptionChoice: def __init__(self, name: str, value: Optional[Union[str, int, float]] = None): - self.name = name - self.value = value or name + self.name: str = name + self.value: Union[str, int, float] = value or name - def to_dict(self) -> Dict[str, Union[str, int, float]]: + def to_dict(self) -> ApplicationCommandOptionChoice: return {"name": self.name, "value": self.value} -def option(name, type=None, **kwargs): - """A decorator that can be used instead of typehinting Option""" + +def option(name: str, option_type=None, **kwargs): # TODO: Typehint everything + """A decorator that can be used instead of type hinting Option""" + def decor(func): - nonlocal type - type = type or func.__annotations__.get(name, str) + nonlocal option_type + option_type = option_type or func.__annotations__.get(name, str) func.__annotations__[name] = Option(type, **kwargs) return func + return decor + class SlashCommandGroup(ApplicationCommand, Option): r"""A class that implements the protocol for a slash command group. @@ -712,7 +780,7 @@ class SlashCommandGroup(ApplicationCommand, Option): :exc:`.CheckFailure` exception is raised to the :func:`.on_application_command_error` event. """ - type = 1 + type: int = 1 def __new__(cls, *args, **kwargs) -> SlashCommandGroup: self = super().__new__(cls) @@ -720,13 +788,26 @@ def __new__(cls, *args, **kwargs) -> SlashCommandGroup: self.__original_kwargs__ = kwargs.copy() return self + @overload + def __init__( + self, + name: str, + description: str, + guild_ids: Optional[List[int]] = None, + parent: Optional[SlashCommandGroup] = None, + *, + default_permission: Optional[bool] = None, + permissions: Optional[List[Permission]] = None, + ): + ... + def __init__( - self, - name: str, - description: str, - guild_ids: Optional[List[int]] = None, - parent: Optional[SlashCommandGroup] = None, - **kwargs + self, + name: str, + description: str, + guild_ids: Optional[List[int]] = None, + parent: Optional[SlashCommandGroup] = None, + **kwargs ) -> None: validate_chat_input_name(name) validate_chat_input_description(description) @@ -736,8 +817,8 @@ def __init__( description=description, ) self.subcommands: List[Union[SlashCommand, SlashCommandGroup]] = [] - self.guild_ids = guild_ids - self.parent = parent + self.guild_ids: Optional[List[int]] = guild_ids + self.parent: Optional[SlashCommandGroup] = parent self.checks = [] self._before_invoke = None @@ -745,7 +826,7 @@ def __init__( self.cog = None # Permissions - self.default_permission = kwargs.get("default_permission", True) + self.default_permission: bool = kwargs.get("default_permission", True) self.permissions: List[Permission] = kwargs.get("permissions", []) if self.permissions and self.default_permission: self.default_permission = False @@ -816,6 +897,7 @@ class ContextMenuCommand(ApplicationCommand): :exc:`.CheckFailure` exception is raised to the :func:`.on_application_command_error` event. """ + def __new__(cls, *args, **kwargs) -> ContextMenuCommand: self = super().__new__(cls) @@ -847,7 +929,7 @@ def __init__(self, func: Callable, *args, **kwargs) -> None: self.checks = checks self._before_invoke = None self._after_invoke = None - + self.validate_parameters() # Context Menu commands don't have permissions @@ -889,7 +971,7 @@ def validate_parameters(self): ) except StopIteration: pass - + def qualified_name(self): return self.name @@ -928,12 +1010,12 @@ async def _invoke(self, ctx: ApplicationContext) -> None: guild=ctx.interaction._state._get_guild(ctx.interaction.guild_id), state=ctx.interaction._state, ) - + if self.cog is not None: await self.callback(self.cog, ctx, target) else: await self.callback(ctx, target) - + def copy(self): """Creates a copy of this command. @@ -950,9 +1032,9 @@ def _ensure_assignment_on_copy(self, other): other._after_invoke = self._after_invoke if self.checks != other.checks: other.checks = self.checks.copy() - #if self._buckets.valid and not other._buckets.valid: + # if self._buckets.valid and not other._buckets.valid: # other._buckets = self._buckets.copy() - #if self._max_concurrency != other._max_concurrency: + # if self._max_concurrency != other._max_concurrency: # # _max_concurrency won't be None at this point # other._max_concurrency = self._max_concurrency.copy() # type: ignore @@ -973,7 +1055,7 @@ def _update_copy(self, kwargs: Dict[str, Any]): class MessageCommand(ContextMenuCommand): - type = 3 + type: int = 3 def __new__(cls, *args, **kwargs) -> MessageCommand: self = super().__new__(cls) @@ -981,7 +1063,7 @@ def __new__(cls, *args, **kwargs) -> MessageCommand: self.__original_kwargs__ = kwargs.copy() return self - async def _invoke(self, ctx: ApplicationContext): + async def _invoke(self, ctx: ApplicationContext) -> None: _data = ctx.interaction.data["resolved"]["messages"] for i, v in _data.items(): v["id"] = int(i) @@ -994,13 +1076,13 @@ async def _invoke(self, ctx: ApplicationContext): channel = ctx.interaction._state.add_dm_channel(data) target = Message(state=ctx.interaction._state, channel=channel, data=message) - + if self.cog is not None: await self.callback(self.cog, ctx, target) else: await self.callback(ctx, target) - - def copy(self): + + def copy(self) -> MessageCommand: """Creates a copy of this command. Returns @@ -1011,14 +1093,14 @@ def copy(self): ret = self.__class__(self.callback, **self.__original_kwargs__) return self._ensure_assignment_on_copy(ret) - def _ensure_assignment_on_copy(self, other): + def _ensure_assignment_on_copy(self, other: MessageCommand) -> MessageCommand: other._before_invoke = self._before_invoke other._after_invoke = self._after_invoke if self.checks != other.checks: other.checks = self.checks.copy() - #if self._buckets.valid and not other._buckets.valid: + # if self._buckets.valid and not other._buckets.valid: # other._buckets = self._buckets.copy() - #if self._max_concurrency != other._max_concurrency: + # if self._max_concurrency != other._max_concurrency: # # _max_concurrency won't be None at this point # other._max_concurrency = self._max_concurrency.copy() # type: ignore @@ -1037,6 +1119,7 @@ def _update_copy(self, kwargs: Dict[str, Any]): else: return self.copy() + def slash_command(**kwargs): """Decorator for slash commands that invokes :func:`application_command`. .. versionadded:: 2.0 @@ -1047,6 +1130,7 @@ def slash_command(**kwargs): """ return application_command(cls=SlashCommand, **kwargs) + def user_command(**kwargs): """Decorator for user commands that invokes :func:`application_command`. .. versionadded:: 2.0 @@ -1057,6 +1141,7 @@ def user_command(**kwargs): """ return application_command(cls=UserCommand, **kwargs) + def message_command(**kwargs): """Decorator for message commands that invokes :func:`application_command`. .. versionadded:: 2.0 @@ -1067,6 +1152,7 @@ def message_command(**kwargs): """ return application_command(cls=MessageCommand, **kwargs) + def application_command(cls=SlashCommand, **attrs): """A decorator that transforms a function into an :class:`.ApplicationCommand`. More specifically, usually one of :class:`.SlashCommand`, :class:`.UserCommand`, or :class:`.MessageCommand`. The exact class @@ -1102,7 +1188,8 @@ def decorator(func: Callable) -> cls: return decorator -def command(**kwargs): + +def command(**kwargs): # TODO: typehint """There is an alias for :meth:`application_command`. .. note:: This decorator is overridden by :func:`commands.command`. @@ -1114,8 +1201,9 @@ def command(**kwargs): """ return application_command(**kwargs) + # Validation -def validate_chat_input_name(name: Any): +def validate_chat_input_name(name: Any) -> None: if not isinstance(name, str): raise TypeError("Name of a command must be a string.") if " " in name: @@ -1128,7 +1216,7 @@ def validate_chat_input_name(name: Any): ) -def validate_chat_input_description(description: Any): +def validate_chat_input_description(description: Any) -> None: if not isinstance(description, str): raise TypeError("Description of a command must be a string.") if len(description) > 100 or len(description) < 1: diff --git a/discord/commands/permissions.py b/discord/commands/permissions.py index 7c2e03b24f..7c9257d345 100644 --- a/discord/commands/permissions.py +++ b/discord/commands/permissions.py @@ -23,7 +23,14 @@ DEALINGS IN THE SOFTWARE. """ -from typing import Union, Dict, Callable +from typing import Union, Callable, Optional, TYPE_CHECKING + +if TYPE_CHECKING: + from ..types.interactions import ( + ApplicationCommandPermissions, + ApplicationCommandPermissionType + ) + from ..types.snowflake import Snowflake __all__ = ( "Permission", @@ -34,22 +41,24 @@ "permission", ) + class Permission: - def __init__(self, id: Union[int, str], type: int, permission: bool = True, guild_id: int = None): - self.id = id - self.type = type - self.permission = permission - self.guild_id = guild_id + def __init__(self, perm_id: Snowflake, perm_type: int, perm: bool = True, guild_id: Optional[int] = None): + self.id: Snowflake = perm_id + self.type: ApplicationCommandPermissionType = perm_type + self.permission: bool = perm + self.guild_id: Optional[int] = guild_id - def to_dict(self) -> Dict[str, Union[int, bool]]: + def to_dict(self) -> ApplicationCommandPermissions: return {"id": self.id, "type": self.type, "permission": self.permission} -def permission(role_id: int = None, user_id: int = None, permission: bool = True, guild_id: int = None): + +def permission(role_id: int = None, user_id: int = None, perm: bool = True, guild_id: int = None): def decorator(func: Callable): - if not role_id is None: - app_cmd_perm = Permission(role_id, 1, permission, guild_id) + if role_id is not None: + app_cmd_perm = Permission(role_id, 1, perm, guild_id) elif not user_id is None: - app_cmd_perm = Permission(user_id, 2, permission, guild_id) + app_cmd_perm = Permission(user_id, 2, perm, guild_id) else: raise ValueError("role_id or user_id must be specified!") @@ -64,6 +73,7 @@ def decorator(func: Callable): return decorator + def has_role(item: Union[int, str], guild_id: int = None): def decorator(func: Callable): # Create __app_cmd_perms__ @@ -71,7 +81,7 @@ def decorator(func: Callable): func.__app_cmd_perms__ = [] # Permissions (Will Convert ID later in register_commands if needed) - app_cmd_perm = Permission(item, 1, True, guild_id) #{"id": item, "type": 1, "permission": True} + app_cmd_perm = Permission(item, 1, True, guild_id) # {"id": item, "type": 1, "permission": True} # Append func.__app_cmd_perms__.append(app_cmd_perm) @@ -80,6 +90,7 @@ def decorator(func: Callable): return decorator + def has_any_role(*items: Union[int, str], guild_id: int = None): def decorator(func: Callable): # Create __app_cmd_perms__ @@ -88,7 +99,7 @@ def decorator(func: Callable): # Permissions (Will Convert ID later in register_commands if needed) for item in items: - app_cmd_perm = Permission(item, 1, True, guild_id) #{"id": item, "type": 1, "permission": True} + app_cmd_perm = Permission(item, 1, True, guild_id) # {"id": item, "type": 1, "permission": True} # Append func.__app_cmd_perms__.append(app_cmd_perm) @@ -97,6 +108,7 @@ def decorator(func: Callable): return decorator + def is_user(user: int, guild_id: int = None): def decorator(func: Callable): # Create __app_cmd_perms__ @@ -104,7 +116,7 @@ def decorator(func: Callable): func.__app_cmd_perms__ = [] # Permissions (Will Convert ID later in register_commands if needed) - app_cmd_perm = Permission(user, 2, True, guild_id) #{"id": user, "type": 2, "permission": True} + app_cmd_perm = Permission(user, 2, True, guild_id) # {"id": user, "type": 2, "permission": True} # Append func.__app_cmd_perms__.append(app_cmd_perm) @@ -113,6 +125,7 @@ def decorator(func: Callable): return decorator + def is_owner(guild_id: int = None): def decorator(func: Callable): # Create __app_cmd_perms__ @@ -120,11 +133,11 @@ def decorator(func: Callable): func.__app_cmd_perms__ = [] # Permissions (Will Convert ID later in register_commands if needed) - app_cmd_perm = Permission("owner", 2, True, guild_id) #{"id": "owner", "type": 2, "permission": True} + app_cmd_perm = Permission("owner", 2, True, guild_id) # {"id": "owner", "type": 2, "permission": True} # Append func.__app_cmd_perms__.append(app_cmd_perm) return func - return decorator \ No newline at end of file + return decorator diff --git a/discord/ext/commands/bot.py b/discord/ext/commands/bot.py index 4c36943796..f84e46405e 100644 --- a/discord/ext/commands/bot.py +++ b/discord/ext/commands/bot.py @@ -115,7 +115,7 @@ def _is_submodule(parent: str, child: str) -> bool: return parent == child or child.startswith(parent + ".") class _DefaultRepr: - def __repr__(self): + def __repr__(self) -> str: return '' _default = _DefaultRepr() diff --git a/discord/ext/commands/converter.py b/discord/ext/commands/converter.py index 2f42392e79..5b0bf61cd4 100644 --- a/discord/ext/commands/converter.py +++ b/discord/ext/commands/converter.py @@ -980,7 +980,7 @@ async def test(ctx, numbers: Greedy[int], reason: str): def __init__(self, *, converter: T): self.converter = converter - def __repr__(self): + def __repr__(self) -> str: converter = getattr(self.converter, '__name__', repr(self.converter)) return f'Greedy[{converter}]' diff --git a/discord/ext/commands/help.py b/discord/ext/commands/help.py index 163111f534..458c0c55b8 100644 --- a/discord/ext/commands/help.py +++ b/discord/ext/commands/help.py @@ -176,7 +176,7 @@ def pages(self): self.close_page() return self._pages - def __repr__(self): + def __repr__(self) -> str: fmt = '' return fmt.format(self) diff --git a/discord/ext/commands/view.py b/discord/ext/commands/view.py index 57d6439a5d..59076ca5bc 100644 --- a/discord/ext/commands/view.py +++ b/discord/ext/commands/view.py @@ -189,5 +189,5 @@ def get_quoted_word(self): result.append(current) - def __repr__(self): + def __repr__(self) -> str: return f'' diff --git a/discord/flags.py b/discord/flags.py index 294f536969..cb3fc6a2f7 100644 --- a/discord/flags.py +++ b/discord/flags.py @@ -63,7 +63,7 @@ def __get__(self, instance: Optional[BF], owner: Type[BF]) -> Any: def __set__(self, instance: BF, value: bool) -> None: instance._set_flag(self.flag, value) - def __repr__(self): + def __repr__(self) -> str: return f'' diff --git a/discord/integrations.py b/discord/integrations.py index 8548201826..8bd104e556 100644 --- a/discord/integrations.py +++ b/discord/integrations.py @@ -115,7 +115,7 @@ def __init__(self, *, data: IntegrationPayload, guild: Guild) -> None: self._state = guild._state self._from_data(data) - def __repr__(self): + def __repr__(self) -> str: return f"<{self.__class__.__name__} id={self.id} name={self.name!r}>" def _from_data(self, data: IntegrationPayload) -> None: diff --git a/discord/mentions.py b/discord/mentions.py index 81f80f9223..14156c064c 100644 --- a/discord/mentions.py +++ b/discord/mentions.py @@ -36,10 +36,10 @@ class _FakeBool: - def __repr__(self): + def __repr__(self) -> str: return 'True' - def __eq__(self, other): + def __eq__(self, other) -> bool: return other is True def __bool__(self): diff --git a/discord/partial_emoji.py b/discord/partial_emoji.py index 2eef74d54c..4310e88635 100644 --- a/discord/partial_emoji.py +++ b/discord/partial_emoji.py @@ -173,7 +173,7 @@ def __str__(self) -> str: return f'' return f'<:{self.name}:{self.id}>' - def __repr__(self): + def __repr__(self) -> str: return f'<{self.__class__.__name__} animated={self.animated} name={self.name!r} id={self.id}>' def __eq__(self, other: Any) -> bool: diff --git a/discord/types/interactions.py b/discord/types/interactions.py index 1c252d148b..499d40515e 100644 --- a/discord/types/interactions.py +++ b/discord/types/interactions.py @@ -65,11 +65,15 @@ class ApplicationCommandOption(_ApplicationCommandOptionOptional): name: str description: str required: bool + autocomplete: bool + channel_types: Optional[List[int]] + min_value: Optional[int] + max_value: Optional[int] class ApplicationCommandOptionChoice(TypedDict): name: str - value: Union[str, int] + value: Union[str, int, float] ApplicationCommandPermissionType = Literal[1, 2] @@ -223,9 +227,6 @@ class MessageInteraction(TypedDict): user: User - - - class _EditApplicationCommandOptional(TypedDict, total=False): description: str options: Optional[List[ApplicationCommandOption]] diff --git a/discord/utils.py b/discord/utils.py index 088e5f3a79..dc28157b4e 100644 --- a/discord/utils.py +++ b/discord/utils.py @@ -94,13 +94,13 @@ class _MissingSentinel: - def __eq__(self, other): + def __eq__(self, other) -> bool: return False def __bool__(self): return False - def __repr__(self): + def __repr__(self) -> str: return '...' diff --git a/discord/webhook/async_.py b/discord/webhook/async_.py index 9aa0488dec..5a576cdad2 100644 --- a/discord/webhook/async_.py +++ b/discord/webhook/async_.py @@ -580,7 +580,7 @@ def __init__(self, *, data): self.id = int(data['id']) self.name = data['name'] - def __repr__(self): + def __repr__(self) -> str: return f'' @@ -607,7 +607,7 @@ def __init__(self, *, data, state): self.name = data['name'] self._icon = data['icon'] - def __repr__(self): + def __repr__(self) -> str: return f'' @property @@ -985,7 +985,7 @@ def __init__(self, data: WebhookPayload, session: aiohttp.ClientSession, token: super().__init__(data, token, state) self.session = session - def __repr__(self): + def __repr__(self) -> str: return f'' @property diff --git a/discord/webhook/sync.py b/discord/webhook/sync.py index 802f692d06..1e3efe6f0f 100644 --- a/discord/webhook/sync.py +++ b/discord/webhook/sync.py @@ -553,7 +553,7 @@ def __init__(self, data: WebhookPayload, session: Session, token: Optional[str] super().__init__(data, token, state) self.session = session - def __repr__(self): + def __repr__(self) -> str: return f'' @property diff --git a/discord/welcome_screen.py b/discord/welcome_screen.py index 076ec1f15f..c8514e6ab0 100644 --- a/discord/welcome_screen.py +++ b/discord/welcome_screen.py @@ -65,7 +65,7 @@ def __init__(self, channel: Snowflake, description: str, emoji: Union[Emoji, Par self.description = description self.emoji = emoji - def __repr__(self): + def __repr__(self) -> str: return f'WelcomeScreenChannel(channel={self.channel} description={self.description})' def to_dict(self) -> WelcomeScreenChannelPayload: @@ -123,7 +123,7 @@ def __init__(self, data: WelcomeScreenPayload, guild: Guild): self._guild = guild self._update(data) - def __repr__(self): + def __repr__(self) -> str: return f' Date: Tue, 9 Nov 2021 00:00:48 +0100 Subject: [PATCH 017/180] type hinted the typehints --- discord/bot.py | 11 ++++-- discord/commands/_types.py | 16 +++++++++ discord/commands/commands.py | 70 +++++++++++++++++++++++------------- discord/commands/context.py | 32 +++++++++-------- 4 files changed, 88 insertions(+), 41 deletions(-) create mode 100644 discord/commands/_types.py diff --git a/discord/bot.py b/discord/bot.py index e7601d6283..0da052c08d 100644 --- a/discord/bot.py +++ b/discord/bot.py @@ -38,7 +38,7 @@ List, Optional, TypeVar, - Union, + Union, Type, ) import sys @@ -346,7 +346,11 @@ async def register_commands(self) -> None: ) raise - async def process_application_commands(self, interaction: Interaction) -> None: + async def process_application_commands( + self, + interaction: Interaction, + application_context_cls: Optional[Type[ApplicationContext]] = None + ) -> None: """|coro| This function processes the commands that have been registered @@ -367,6 +371,7 @@ async def process_application_commands(self, interaction: Interaction) -> None: ----------- interaction: :class:`discord.Interaction` The interaction to process + application_context_cls: """ if interaction.type not in ( InteractionType.application_command, @@ -382,7 +387,7 @@ async def process_application_commands(self, interaction: Interaction) -> None: if interaction.type is InteractionType.auto_complete: return await command.invoke_autocomplete_callback(interaction) - ctx = await self.get_application_context(interaction) + ctx = await self.get_application_context(interaction, cls=application_context_cls) ctx.command = command self.dispatch("application_command", ctx) try: diff --git a/discord/commands/_types.py b/discord/commands/_types.py new file mode 100644 index 0000000000..8fb0803232 --- /dev/null +++ b/discord/commands/_types.py @@ -0,0 +1,16 @@ +from typing import Callable, TYPE_CHECKING, Union, Coroutine, Any, TypeVar + +if TYPE_CHECKING: + from .. import Cog, ApplicationContext + +T = TypeVar('T') + +Coro = Coroutine[Any, Any, T] +MaybeCoro = Union[T, Coro[T]] +CoroFunc = Callable[..., Coro[Any]] + +Check = Union[Callable[["Cog", "ApplicationContext[Any]"], MaybeCoro[bool]], + Callable[["ApplicationContext[Any]"], MaybeCoro[bool]]] +Hook = Union[Callable[["Cog", "ApplicationContext[Any]"], Coro[Any]], Callable[["ApplicationContext[Any]"], Coro[Any]]] +Error = Union[Callable[["Cog", "ApplicationContext[Any]", "CommandError"], Coro[Any]], + Callable[["ApplicationContext[Any]", "CommandError"], Coro[Any]]] diff --git a/discord/commands/commands.py b/discord/commands/commands.py index ceab154d37..9bc53159b7 100644 --- a/discord/commands/commands.py +++ b/discord/commands/commands.py @@ -30,7 +30,8 @@ import functools import inspect from collections import OrderedDict -from typing import Any, Callable, Dict, List, Optional, Union, TYPE_CHECKING, Awaitable, overload +from typing import Any, Callable, Dict, List, Optional, Union, TYPE_CHECKING, Awaitable, overload, TypeVar, ParamSpec, \ + Generic, Type, Concatenate from .. import Cog, Interaction from ..enums import SlashCommandOptionType, ChannelType @@ -50,6 +51,13 @@ ApplicationCommandOptionChoice ) + from ._types import ( + Coro, + CoroFunc, + Hook, + Error + ) + __all__ = ( "_BaseCommand", "ApplicationCommand", @@ -69,9 +77,22 @@ ) -def wrap_callback(coro): # TODO: Typehint Coro and Return Type Something with type vars +T = TypeVar('T') +CogT = TypeVar("CogT", bound="Cog") +ApplicationCommandT = TypeVar("ApplicationCommandT", bound="ApplicationCommand") +ApplicationContextT = TypeVar("ApplicationContextT", bound="ApplicationContext") +HookT = TypeVar("HookT", bound="Hook") +ErrorT = TypeVar('ErrorT', bound='Error') + +if TYPE_CHECKING: + P = ParamSpec('P') +else: + P = TypeVar('P') + + +def wrap_callback(coro): # TODO: Maybe typehint @functools.wraps(coro) - async def wrapped(*args, **kwargs): # TODO: Same here + async def wrapped(*args, **kwargs): try: ret = await coro(*args, **kwargs) except ApplicationCommandError: @@ -85,9 +106,10 @@ async def wrapped(*args, **kwargs): # TODO: Same here return wrapped -def hooked_wrapped_callback(command: ApplicationCommand, ctx: ApplicationContext, coro): # TODO: Typehint coro & return type +def hooked_wrapped_callback(command: ApplicationCommandT, ctx: ApplicationContextT, coro): # TODO: Maybe Typehint coro & return type + @functools.wraps(coro) - async def wrapped(arg): # TODO: Same here + async def wrapped(arg): try: ret = await coro(arg) except ApplicationCommandError: @@ -108,11 +130,12 @@ class _BaseCommand: #finished -class ApplicationCommand(_BaseCommand): +class ApplicationCommand(_BaseCommand, Generic[CogT, P, T]): + __original_kwargs__: Dict[str, Any] cog: Optional[Cog] = None name: str description: str - callback: Callable[[ApplicationContext, ...], Awaitable[None]] + callback: HookT checks: List[Callable[[ApplicationContext], Awaitable[bool]]] on_error: Callable[[ApplicationContext, Exception], Awaitable[None]] _before_invoke: Optional[Callable[[ApplicationContext], Awaitable[None]]] @@ -126,7 +149,7 @@ def __repr__(self) -> str: def __eq__(self, other: Any) -> bool: return isinstance(other, self.__class__) - async def __call__(self, ctx: ApplicationContext, *args, **kwargs) -> None: + async def __call__(self, ctx: ApplicationContext, *args: P.args, **kwargs: P.kwargs) -> T: """|coro| Calls the command's callback. @@ -191,10 +214,7 @@ async def dispatch_error(self, ctx: ApplicationContext, error: Exception) -> Non def _get_signature_parameters(self) -> OrderedDict: # TODO: Maybe define Dict better return OrderedDict(inspect.signature(self.callback).parameters) - def error( - self, - coro: Callable[[ApplicationContext, Exception], Awaitable[None]] - ) -> Callable[[ApplicationContext, Exception], Awaitable[None]]: + def error(self, coro: ErrorT) -> ErrorT: """A decorator that registers a coroutine as a local error handler. A local error handler is an :func:`.on_command_error` event limited to @@ -223,10 +243,7 @@ def has_error_handler(self) -> bool: """ return hasattr(self, 'on_error') - def before_invoke( - self, - coro: Callable[[ApplicationContext], Awaitable[None]] - ) -> Callable[[ApplicationContext], Awaitable[None]]: + def before_invoke(self, coro: HookT) -> HookT: """A decorator that registers a coroutine as a pre-invoke hook. A pre-invoke hook is called directly before the command is called. This makes it a useful function to set up database @@ -248,10 +265,7 @@ def before_invoke( self._before_invoke = coro return coro - def after_invoke( - self, - coro: Callable[[ApplicationContext], Awaitable[None]] - ) -> Callable[[ApplicationContext], Awaitable[None]]: + def after_invoke(self, coro: HookT) -> HookT: """A decorator that registers a coroutine as a post-invoke hook. A post-invoke hook is called directly after the command is called. This makes it a useful function to clean-up database @@ -347,6 +361,7 @@ def qualified_name(self) -> str: else: return self.name + #finished class SlashCommand(ApplicationCommand): r"""A class that implements the protocol for a slash command. @@ -390,7 +405,7 @@ class SlashCommand(ApplicationCommand): """ type: int = 1 - def __new__(cls, *args, **kwargs) -> SlashCommand: + def __new__(cls: Type[ApplicationCommandT], *args: Any, **kwargs: Any) -> ApplicationCommandT: self = super().__new__(cls) self.__original_kwargs__ = kwargs.copy() @@ -399,7 +414,10 @@ def __new__(cls, *args, **kwargs) -> SlashCommand: @overload def __init__( self, - func: Callable[[ApplicationContext, ...], Awaitable[None]], + func: Union[ + Callable[Concatenate[CogT, ApplicationContextT, P], Coro[T]], + Callable[Concatenate[ApplicationContextT, P], Coro[T]] + ], *, name: Optional[str] = None, description: Optional[str] = None, @@ -411,10 +429,14 @@ def __init__( ) -> None: ... - def __init__(self, func: Callable[[ApplicationContext, ...], Awaitable[None]], *args, **kwargs) -> None: + def __init__( + self, + func: Callable[[ApplicationContext, ...], Awaitable[None]], + **kwargs: Any + ) -> None: if not asyncio.iscoroutinefunction(func): raise TypeError("Callback must be a coroutine.") - self.callback: Callable[[ApplicationContext, ...], Awaitable[None]] = func + self.callback = func self.guild_ids: Optional[List[int]] = kwargs.get("guild_ids", None) diff --git a/discord/commands/context.py b/discord/commands/context.py index d2a99d9258..526aabc8ac 100644 --- a/discord/commands/context.py +++ b/discord/commands/context.py @@ -24,23 +24,23 @@ """ from __future__ import annotations -from typing import TYPE_CHECKING, Optional, Union +from typing import TYPE_CHECKING, Optional, Union, TypeVar, Generic import discord.abc if TYPE_CHECKING: import discord - from discord import Bot + from discord import Bot, AutoShardedBot, VoiceProtocol from discord.state import ConnectionState - + from ..user import User from .commands import ApplicationCommand, Option from ..cog import Cog from ..guild import Guild -from ..interactions import Interaction, InteractionResponse +from ..interactions import Interaction, InteractionResponse, InteractionChannel from ..member import Member from ..message import Message -from ..user import User + from ..utils import cached_property __all__ = ( @@ -48,7 +48,11 @@ "AutocompleteContext" ) -class ApplicationContext(discord.abc.Messageable): +BotT = TypeVar("BotT", bound="Union[Bot, AutoShardedBot]") +CogT = TypeVar("CogT", bound="Cog") + + +class ApplicationContext(discord.abc.Messageable, Generic[BotT]): """Represents a Discord application command interaction context. This class is not created manually and is instead passed to application @@ -66,17 +70,17 @@ class ApplicationContext(discord.abc.Messageable): The command that this context belongs to. """ - def __init__(self, bot: Bot, interaction: Interaction): - self.bot = bot - self.interaction = interaction + def __init__(self, bot: BotT, interaction: Interaction): + self.bot: BotT = bot + self.interaction: Interaction = interaction self.command: ApplicationCommand = None # type: ignore self._state: ConnectionState = self.interaction._state - async def _get_channel(self) -> discord.abc.Messageable: + async def _get_channel(self) -> Optional[InteractionChannel]: return self.channel @cached_property - def channel(self): + def channel(self) -> Optional[InteractionChannel]: return self.interaction.channel @cached_property @@ -104,14 +108,14 @@ def user(self) -> Optional[Union[Member, User]]: return self.interaction.user @property - def voice_client(self): + def voice_client(self) -> Optional[VoiceProtocol]: return self.guild.voice_client @cached_property def response(self) -> InteractionResponse: return self.interaction.response - author = user + author: Union[Member, User] = user @property def respond(self): @@ -177,7 +181,7 @@ def __init__(self, interaction: Interaction, *, command: ApplicationCommand, foc self.options = options @property - def cog(self) -> Optional[Cog]: + def cog(self) -> Optional[CogT]: """Optional[:class:`.Cog`]: Returns the cog associated with this context's command. None if it does not exist.""" if self.command is None: return None From 65adfe7af2bbbc00f4c6e3776066805502a1fb3c Mon Sep 17 00:00:00 2001 From: ultrabear Date: Tue, 9 Nov 2021 17:04:30 -0800 Subject: [PATCH 018/180] add return type typing on discord.ui.* --- discord/ui/button.py | 17 +++++++++-------- discord/ui/item.py | 6 +++--- discord/ui/select.py | 14 +++++++------- discord/ui/view.py | 26 ++++++++++++++------------ 4 files changed, 33 insertions(+), 30 deletions(-) diff --git a/discord/ui/button.py b/discord/ui/button.py index 032dd33344..61efb61b27 100644 --- a/discord/ui/button.py +++ b/discord/ui/button.py @@ -25,7 +25,7 @@ from __future__ import annotations -from typing import Callable, Optional, TYPE_CHECKING, Tuple, Type, TypeVar, Union +from typing import Callable, Optional, TYPE_CHECKING, Tuple, Type, TypeVar, Union, Dict import inspect import os @@ -132,7 +132,7 @@ def style(self) -> ButtonStyle: return self._underlying.style @style.setter - def style(self, value: ButtonStyle): + def style(self, value: ButtonStyle) -> None: self._underlying.style = value @property @@ -144,7 +144,7 @@ def custom_id(self) -> Optional[str]: return self._underlying.custom_id @custom_id.setter - def custom_id(self, value: Optional[str]): + def custom_id(self, value: Optional[str]) -> None: if value is not None and not isinstance(value, str): raise TypeError('custom_id must be None or str') @@ -156,7 +156,7 @@ def url(self) -> Optional[str]: return self._underlying.url @url.setter - def url(self, value: Optional[str]): + def url(self, value: Optional[str]) -> None: if value is not None and not isinstance(value, str): raise TypeError('url must be None or str') self._underlying.url = value @@ -167,7 +167,7 @@ def disabled(self) -> bool: return self._underlying.disabled @disabled.setter - def disabled(self, value: bool): + def disabled(self, value: bool) -> None: self._underlying.disabled = bool(value) @property @@ -176,7 +176,7 @@ def label(self) -> Optional[str]: return self._underlying.label @label.setter - def label(self, value: Optional[str]): + def label(self, value: Optional[str]) -> None: self._underlying.label = str(value) if value is not None else value @property @@ -185,7 +185,7 @@ def emoji(self) -> Optional[PartialEmoji]: return self._underlying.emoji @emoji.setter - def emoji(self, value: Optional[Union[str, Emoji, PartialEmoji]]): # type: ignore + def emoji(self, value: Optional[Union[str, Emoji, PartialEmoji]]) -> None: if value is not None: if isinstance(value, str): self._underlying.emoji = PartialEmoji.from_str(value) @@ -212,7 +212,8 @@ def from_component(cls: Type[B], button: ButtonComponent) -> B: def type(self) -> ComponentType: return self._underlying.type - def to_component_dict(self): + # TODO(ultrabear) What is the type signature of the dict returned? + def to_component_dict(self) -> Dict: return self._underlying.to_dict() def is_dispatchable(self) -> bool: diff --git a/discord/ui/item.py b/discord/ui/item.py index 1fb168a6f7..c4cfa2c14a 100644 --- a/discord/ui/item.py +++ b/discord/ui/item.py @@ -56,7 +56,7 @@ class Item(Generic[V]): __item_repr_attributes__: Tuple[str, ...] = ('row',) - def __init__(self): + def __init__(self) -> None: self._view: Optional[V] = None self._row: Optional[int] = None self._rendered_row: Optional[int] = None @@ -100,7 +100,7 @@ def row(self) -> Optional[int]: return self._row @row.setter - def row(self, value: Optional[int]): + def row(self, value: Optional[int]) -> None: if value is None: self._row = None elif 5 > value >= 0: @@ -117,7 +117,7 @@ def view(self) -> Optional[V]: """Optional[:class:`View`]: The underlying view for this item.""" return self._view - async def callback(self, interaction: Interaction): + async def callback(self, interaction: Interaction) -> None: """|coro| The callback associated with this UI item. diff --git a/discord/ui/select.py b/discord/ui/select.py index 0241a3ddde..7b8a3650af 100644 --- a/discord/ui/select.py +++ b/discord/ui/select.py @@ -130,7 +130,7 @@ def custom_id(self) -> str: return self._underlying.custom_id @custom_id.setter - def custom_id(self, value: str): + def custom_id(self, value: str) -> None: if not isinstance(value, str): raise TypeError('custom_id must be None or str') @@ -142,7 +142,7 @@ def placeholder(self) -> Optional[str]: return self._underlying.placeholder @placeholder.setter - def placeholder(self, value: Optional[str]): + def placeholder(self, value: Optional[str]) -> None: if value is not None and not isinstance(value, str): raise TypeError('placeholder must be None or str') @@ -154,7 +154,7 @@ def min_values(self) -> int: return self._underlying.min_values @min_values.setter - def min_values(self, value: int): + def min_values(self, value: int) -> None: self._underlying.min_values = int(value) @property @@ -163,7 +163,7 @@ def max_values(self) -> int: return self._underlying.max_values @max_values.setter - def max_values(self, value: int): + def max_values(self, value: int) -> None: self._underlying.max_values = int(value) @property @@ -172,7 +172,7 @@ def options(self) -> List[SelectOption]: return self._underlying.options @options.setter - def options(self, value: List[SelectOption]): + def options(self, value: List[SelectOption]) -> None: if not isinstance(value, list): raise TypeError('options must be a list of SelectOption') if not all(isinstance(obj, SelectOption) for obj in value): @@ -228,7 +228,7 @@ def add_option( self.append_option(option) - def append_option(self, option: SelectOption): + def append_option(self, option: SelectOption) -> None: """Appends an option to the select menu. Parameters @@ -253,7 +253,7 @@ def disabled(self) -> bool: return self._underlying.disabled @disabled.setter - def disabled(self, value: bool): + def disabled(self, value: bool) -> None: self._underlying.disabled = bool(value) @property diff --git a/discord/ui/view.py b/discord/ui/view.py index 8ec2ee46cb..0fc9ddbee6 100644 --- a/discord/ui/view.py +++ b/discord/ui/view.py @@ -79,7 +79,7 @@ class _ViewWeights: 'weights', ) - def __init__(self, children: List[Item]): + def __init__(self, children: List[Item]) -> None: self.weights: List[int] = [0, 0, 0, 0, 0] key = lambda i: sys.maxsize if i.row is None else i.row @@ -155,7 +155,7 @@ def __init_subclass__(cls) -> None: cls.__view_children_items__ = children - def __init__(self, *items: Item, timeout: Optional[float] = 180.0): + def __init__(self, *items: Item, timeout: Optional[float] = 180.0) -> None: self.timeout = timeout self.children: List[Item] = [] for func in self.__view_children_items__: @@ -366,6 +366,8 @@ async def _scheduled_task(self, item: Item, interaction: Interaction): if not interaction.response._responded: await interaction.response.defer() except Exception as e: + # TODO(ultrabear) How to define this return type as what on_error returns? + # (as on_error can be reimplemented it seems) return await self.on_error(e, item, interaction) def _start_listening_from_store(self, store: ViewStore) -> None: @@ -378,20 +380,20 @@ def _start_listening_from_store(self, store: ViewStore) -> None: self.__timeout_expiry = time.monotonic() + self.timeout self.__timeout_task = loop.create_task(self.__timeout_task_impl()) - def _dispatch_timeout(self): + def _dispatch_timeout(self) -> None: if self.__stopped.done(): return self.__stopped.set_result(True) asyncio.create_task(self.on_timeout(), name=f'discord-ui-view-timeout-{self.id}') - def _dispatch_item(self, item: Item, interaction: Interaction): + def _dispatch_item(self, item: Item, interaction: Interaction) -> None: if self.__stopped.done(): return asyncio.create_task(self._scheduled_task(item, interaction), name=f'discord-ui-view-dispatch-{self.id}') - def refresh(self, components: List[Component]): + def refresh(self, components: List[Component]) -> None: # This is pretty hacky at the moment # fmt: off old_state: Dict[Tuple[int, str], Item] = { @@ -464,7 +466,7 @@ async def wait(self) -> bool: class ViewStore: - def __init__(self, state: ConnectionState): + def __init__(self, state: ConnectionState) -> None: # (component_type, message_id, custom_id): (View, Item) self._views: Dict[Tuple[int, Optional[int], str], Tuple[View, Item]] = {} # message_id: View @@ -482,7 +484,7 @@ def persistent_views(self) -> Sequence[View]: # fmt: on return list(views.values()) - def __verify_integrity(self): + def __verify_integrity(self) -> None: to_remove: List[Tuple[int, Optional[int], str]] = [] for (k, (view, _)) in self._views.items(): if view.is_finished(): @@ -491,7 +493,7 @@ def __verify_integrity(self): for k in to_remove: del self._views[k] - def add_view(self, view: View, message_id: Optional[int] = None): + def add_view(self, view: View, message_id: Optional[int] = None) -> None: self.__verify_integrity() view._start_listening_from_store(self) @@ -502,7 +504,7 @@ def add_view(self, view: View, message_id: Optional[int] = None): if message_id is not None: self._synced_message_views[message_id] = view - def remove_view(self, view: View): + def remove_view(self, view: View) -> None: for item in view.children: if item.is_dispatchable(): self._views.pop((item.type.value, item.custom_id), None) # type: ignore @@ -512,7 +514,7 @@ def remove_view(self, view: View): del self._synced_message_views[key] break - def dispatch(self, component_type: int, custom_id: str, interaction: Interaction): + def dispatch(self, component_type: int, custom_id: str, interaction: Interaction) -> None: self.__verify_integrity() message_id: Optional[int] = interaction.message and interaction.message.id key = (component_type, message_id, custom_id) @@ -526,13 +528,13 @@ def dispatch(self, component_type: int, custom_id: str, interaction: Interaction item.refresh_state(interaction) view._dispatch_item(item, interaction) - def is_message_tracked(self, message_id: int): + def is_message_tracked(self, message_id: int) -> bool: return message_id in self._synced_message_views def remove_message_tracking(self, message_id: int) -> Optional[View]: return self._synced_message_views.pop(message_id, None) - def update_from_message(self, message_id: int, components: List[ComponentPayload]): + def update_from_message(self, message_id: int, components: List[ComponentPayload]) -> None: # pre-req: is_message_tracked == true view = self._synced_message_views[message_id] view.refresh([_component_factory(d) for d in components]) From 67570ce50c09603c7b2c18d0be1299af5a28b50c Mon Sep 17 00:00:00 2001 From: Lucas Hardt Date: Wed, 10 Nov 2021 19:02:36 +0100 Subject: [PATCH 019/180] type hinting pain --- discord/commands/commands.py | 236 +++++++++++++++++++++++++++++----- discord/http.py | 12 +- discord/types/interactions.py | 37 ++++-- 3 files changed, 241 insertions(+), 44 deletions(-) diff --git a/discord/commands/commands.py b/discord/commands/commands.py index 9bc53159b7..f66368f0bd 100644 --- a/discord/commands/commands.py +++ b/discord/commands/commands.py @@ -46,8 +46,8 @@ if TYPE_CHECKING: from ..types.interactions import ( - ApplicationCommand as ApplicationCommandData, - ApplicationCommandOption, + CreateApplicationCommand, + ApplicationCommandOption as ApplicationCommandOptionData, ApplicationCommandOptionChoice ) @@ -76,7 +76,6 @@ "MessageCommand", ) - T = TypeVar('T') CogT = TypeVar("CogT", bound="Cog") ApplicationCommandT = TypeVar("ApplicationCommandT", bound="ApplicationCommand") @@ -129,7 +128,7 @@ class _BaseCommand: __slots__ = () -#finished +# finished class ApplicationCommand(_BaseCommand, Generic[CogT, P, T]): __original_kwargs__: Dict[str, Any] cog: Optional[Cog] = None @@ -362,7 +361,7 @@ def qualified_name(self) -> str: return self.name -#finished +# finished class SlashCommand(ApplicationCommand): r"""A class that implements the protocol for a slash command. @@ -477,7 +476,7 @@ def __init__( if self.permissions and self.default_permission: self.default_permission = False - def _parse_options(self, params: Dict) -> List[Option]: # TODO: Better typehint dict + def _parse_options(self, params: Dict) -> List[Option]: # TODO: Better typehint dict if list(params.items())[0][0] == "self": temp = list(params.items()) temp.pop(0) @@ -537,7 +536,7 @@ def _is_typing_union(self, annotation) -> bool: # TODO: Typehint annotation def _is_typing_optional(self, annotation) -> bool: # TODO: Typehint annotation return self._is_typing_union(annotation) and type(None) in annotation.__args__ # type: ignore - def to_dict(self) -> ApplicationCommandData: # TODO: Need to be improved? + def to_dict(self) -> CreateApplicationCommand: as_dict = { "name": self.name, "description": self.description, @@ -660,7 +659,8 @@ def _update_copy(self, kwargs: Dict[str, Any]) -> "SlashCommand": 'CategoryChannel': ChannelType.category } -#finished + +# finished class Option: @overload @@ -729,7 +729,7 @@ def __init__( self.autocomplete: Callable[[AutocompleteContext], Awaitable[List[Union[OptionChoice, str]]]] \ = kwargs.pop("autocomplete", None) - def to_dict(self) -> ApplicationCommandOption: + def to_dict(self) -> ApplicationCommandOptionData: as_dict = { "type": self.input_type.value, "name": self.name, @@ -751,7 +751,7 @@ def __repr__(self) -> str: return f"" -#finihsed +# finihsed class OptionChoice: def __init__(self, name: str, value: Optional[Union[str, int, float]] = None): self.name: str = name @@ -761,7 +761,7 @@ def to_dict(self) -> ApplicationCommandOptionChoice: return {"name": self.name, "value": self.value} -def option(name: str, option_type=None, **kwargs): # TODO: Typehint everything +def option(name: str, option_type=None, **kwargs): # TODO: Typehint everything """A decorator that can be used instead of type hinting Option""" def decor(func): @@ -853,7 +853,7 @@ def __init__( if self.permissions and self.default_permission: self.default_permission = False - def to_dict(self) -> Dict: + def to_dict(self) -> CreateApplicationCommand: as_dict = { "name": self.name, "description": self.description, @@ -994,17 +994,17 @@ def validate_parameters(self): except StopIteration: pass - def qualified_name(self): + def qualified_name(self) -> str: return self.name - def to_dict(self) -> Dict[str, Union[str, int]]: + def to_dict(self) -> CreateApplicationCommand: return {"name": self.name, "description": self.description, "type": self.type} class UserCommand(ContextMenuCommand): - type = 2 + type: int = 2 - def __new__(cls, *args, **kwargs) -> UserCommand: + def __new__(cls: Type[ApplicationCommandT], *args: Any, **kwargs: Any) -> ApplicationCommandT: self = super().__new__(cls) self.__original_kwargs__ = kwargs.copy() @@ -1038,7 +1038,7 @@ async def _invoke(self, ctx: ApplicationContext) -> None: else: await self.callback(ctx, target) - def copy(self): + def copy(self: ApplicationCommandT) -> ApplicationCommandT: """Creates a copy of this command. Returns @@ -1049,7 +1049,7 @@ def copy(self): ret = self.__class__(self.callback, **self.__original_kwargs__) return self._ensure_assignment_on_copy(ret) - def _ensure_assignment_on_copy(self, other): + def _ensure_assignment_on_copy(self, other: ApplicationCommandT) -> ApplicationCommandT: other._before_invoke = self._before_invoke other._after_invoke = self._after_invoke if self.checks != other.checks: @@ -1066,7 +1066,7 @@ def _ensure_assignment_on_copy(self, other): pass return other - def _update_copy(self, kwargs: Dict[str, Any]): + def _update_copy(self: ApplicationCommandT, kwargs: Dict[str, Any]) -> ApplicationCommandT: if kwargs: kw = kwargs.copy() kw.update(self.__original_kwargs__) @@ -1079,7 +1079,7 @@ def _update_copy(self, kwargs: Dict[str, Any]): class MessageCommand(ContextMenuCommand): type: int = 3 - def __new__(cls, *args, **kwargs) -> MessageCommand: + def __new__(cls: Type[ApplicationCommandT], *args: Any, **kwargs: Any) -> ApplicationCommandT: self = super().__new__(cls) self.__original_kwargs__ = kwargs.copy() @@ -1104,7 +1104,7 @@ async def _invoke(self, ctx: ApplicationContext) -> None: else: await self.callback(ctx, target) - def copy(self) -> MessageCommand: + def copy(self: ApplicationCommandT) -> ApplicationCommandT: """Creates a copy of this command. Returns @@ -1115,7 +1115,7 @@ def copy(self) -> MessageCommand: ret = self.__class__(self.callback, **self.__original_kwargs__) return self._ensure_assignment_on_copy(ret) - def _ensure_assignment_on_copy(self, other: MessageCommand) -> MessageCommand: + def _ensure_assignment_on_copy(self, other: ApplicationCommandT) -> ApplicationCommandT: other._before_invoke = self._before_invoke other._after_invoke = self._after_invoke if self.checks != other.checks: @@ -1132,7 +1132,7 @@ def _ensure_assignment_on_copy(self, other: MessageCommand) -> MessageCommand: pass return other - def _update_copy(self, kwargs: Dict[str, Any]): + def _update_copy(self: ApplicationCommandT, kwargs: Dict[str, Any]) -> ApplicationCommandT: if kwargs: kw = kwargs.copy() kw.update(self.__original_kwargs__) @@ -1142,7 +1142,41 @@ def _update_copy(self, kwargs: Dict[str, Any]): return self.copy() -def slash_command(**kwargs): +@overload +def slash_command( + **kwargs: Any +) -> Callable[ + [ + Union[ + Callable[Concatenate[ApplicationContextT, P], Coro[Any]], + Callable[Concatenate[CogT, ApplicationContextT, P], Coro[T]] + ] + ], ApplicationCommand[CogT, P, T]]: + ... + + +@overload +def slash_command( + **kwargs: Any +) -> Callable[ + [ + Union[ + Callable[Concatenate[ApplicationContextT, P], Coro[Any]], + Callable[Concatenate[CogT, ApplicationContextT, P], Coro[T]] + ] + ], ApplicationCommandT]: + ... + + +def slash_command( + **kwargs: Any +) -> Callable[ + [ + Union[ + Callable[Concatenate[ApplicationContextT, P], Coro[Any]], + Callable[Concatenate[CogT, ApplicationContextT, P], Coro[Any]] + ] + ], Union[ApplicationCommand[CogT, P, T], ApplicationCommandT]]: """Decorator for slash commands that invokes :func:`application_command`. .. versionadded:: 2.0 Returns @@ -1153,7 +1187,41 @@ def slash_command(**kwargs): return application_command(cls=SlashCommand, **kwargs) -def user_command(**kwargs): +@overload +def user_command( + **kwargs: Any +) -> Callable[ + [ + Union[ + Callable[Concatenate[ApplicationContextT, P], Coro[Any]], + Callable[Concatenate[CogT, ApplicationContextT, P], Coro[T]] + ] + ], ApplicationCommand[CogT, P, T]]: + ... + + +@overload +def user_command( + **kwargs: Any +) -> Callable[ + [ + Union[ + Callable[Concatenate[ApplicationContextT, P], Coro[Any]], + Callable[Concatenate[CogT, ApplicationContextT, P], Coro[T]] + ] + ], ApplicationCommandT]: + ... + + +def user_command( + **kwargs: Any +) -> Callable[ + [ + Union[ + Callable[Concatenate[ApplicationContextT, P], Coro[Any]], + Callable[Concatenate[CogT, ApplicationContextT, P], Coro[Any]] + ] + ], Union[ApplicationCommand[CogT, P, T], ApplicationCommandT]]: """Decorator for user commands that invokes :func:`application_command`. .. versionadded:: 2.0 Returns @@ -1164,7 +1232,41 @@ def user_command(**kwargs): return application_command(cls=UserCommand, **kwargs) -def message_command(**kwargs): +@overload +def message_command( + **kwargs: Any +) -> Callable[ + [ + Union[ + Callable[Concatenate[ApplicationContextT, P], Coro[Any]], + Callable[Concatenate[CogT, ApplicationContextT, P], Coro[T]] + ] + ], ApplicationCommand[CogT, P, T]]: + ... + + +@overload +def message_command( + **kwargs: Any +) -> Callable[ + [ + Union[ + Callable[Concatenate[ApplicationContextT, P], Coro[Any]], + Callable[Concatenate[CogT, ApplicationContextT, P], Coro[T]] + ] + ], ApplicationCommandT]: + ... + + +def message_command( + **kwargs: Any +) -> Callable[ + [ + Union[ + Callable[Concatenate[ApplicationContextT, P], Coro[Any]], + Callable[Concatenate[CogT, ApplicationContextT, P], Coro[Any]] + ] + ], Union[ApplicationCommand[CogT, P, T], ApplicationCommandT]]: """Decorator for message commands that invokes :func:`application_command`. .. versionadded:: 2.0 Returns @@ -1175,7 +1277,44 @@ def message_command(**kwargs): return application_command(cls=MessageCommand, **kwargs) -def application_command(cls=SlashCommand, **attrs): +@overload +def application_command( + cls: Type[ApplicationCommand] = SlashCommand, + **attrs: Any +) -> Callable[ + [ + Union[ + Callable[Concatenate[ApplicationContextT, P], Coro[Any]], + Callable[Concatenate[CogT, ApplicationContextT, P], Coro[Any]] + ] + ], ApplicationCommand[CogT, P, T]]: + ... + + +@overload +def application_command( + cls: Type[ApplicationCommand] = SlashCommand, + **attrs: Any +) -> Callable[ + [ + Union[ + Callable[Concatenate[ApplicationContextT, P], Coro[Any]], + Callable[Concatenate[CogT, ApplicationContextT, P], Coro[Any]] + ] + ], ApplicationCommandT]: + ... + + +def application_command( + cls: Type[ApplicationCommand] = SlashCommand, + **attrs: Any +) -> Callable[ + [ + Union[ + Callable[Concatenate[ApplicationContextT, P], Coro[Any]], + Callable[Concatenate[CogT, ApplicationContextT, P], Coro[Any]] + ] + ], Union[ApplicationCommand[CogT, P, T], ApplicationCommandT]]: """A decorator that transforms a function into an :class:`.ApplicationCommand`. More specifically, usually one of :class:`.SlashCommand`, :class:`.UserCommand`, or :class:`.MessageCommand`. The exact class depends on the ``cls`` parameter. @@ -1199,7 +1338,12 @@ def application_command(cls=SlashCommand, **attrs): If the function is not a coroutine or is already a command. """ - def decorator(func: Callable) -> cls: + def decorator( + func: Union[ + Callable[Concatenate[ApplicationContextT, P], Coro[Any]], + Callable[Concatenate[CogT, ApplicationContextT, P], Coro[Any]] + ] + ) -> ApplicationCommandT: if isinstance(func, ApplicationCommand): func = func.callback elif not callable(func): @@ -1211,7 +1355,41 @@ def decorator(func: Callable) -> cls: return decorator -def command(**kwargs): # TODO: typehint +@overload +def command( + **kwargs: Any +) -> Callable[ + [ + Union[ + Callable[Concatenate[ApplicationContextT, P], Coro[Any]], + Callable[Concatenate[CogT, ApplicationContextT, P], Coro[T]] + ] + ], ApplicationCommand[CogT, P, T]]: + ... + + +@overload +def command( + **kwargs: Any +) -> Callable[ + [ + Union[ + Callable[Concatenate[ApplicationContextT, P], Coro[Any]], + Callable[Concatenate[CogT, ApplicationContextT, P], Coro[T]] + ] + ], ApplicationCommandT]: + ... + + +def command( + **kwargs: Any +) -> Callable[ + [ + Union[ + Callable[Concatenate[ApplicationContextT, P], Coro[Any]], + Callable[Concatenate[CogT, ApplicationContextT, P], Coro[T]] + ] + ], Union[ApplicationCommand[CogT, P, T], ApplicationCommandT]]: """There is an alias for :meth:`application_command`. .. note:: This decorator is overridden by :func:`commands.command`. diff --git a/discord/http.py b/discord/http.py index cd45f25c55..128dfca169 100644 --- a/discord/http.py +++ b/discord/http.py @@ -1566,7 +1566,9 @@ def get_global_command( ) return self.request(r) - def upsert_global_command(self, application_id: Snowflake, payload) -> Response[interactions.ApplicationCommand]: + def upsert_global_command( + self, application_id: Snowflake, payload: interactions.CreateApplicationCommand + ) -> Response[interactions.ApplicationCommand]: r = Route('POST', '/applications/{application_id}/commands', application_id=application_id) return self.request(r, json=payload) @@ -1600,7 +1602,7 @@ def delete_global_command(self, application_id: Snowflake, command_id: Snowflake return self.request(r) def bulk_upsert_global_commands( - self, application_id: Snowflake, payload + self, application_id: Snowflake, payload: List[interactions.CreateApplicationCommand] ) -> Response[List[interactions.ApplicationCommand]]: r = Route('PUT', '/applications/{application_id}/commands', application_id=application_id) return self.request(r, json=payload) @@ -1637,7 +1639,7 @@ def upsert_guild_command( self, application_id: Snowflake, guild_id: Snowflake, - payload: interactions.EditApplicationCommand, + payload: interactions.CreateApplicationCommand, ) -> Response[interactions.ApplicationCommand]: r = Route( 'POST', @@ -1688,7 +1690,7 @@ def bulk_upsert_guild_commands( self, application_id: Snowflake, guild_id: Snowflake, - payload: List[interactions.EditApplicationCommand], + payload: List[interactions.CreateApplicationCommand], ) -> Response[List[interactions.ApplicationCommand]]: r = Route( 'PUT', @@ -1702,7 +1704,7 @@ def bulk_upsert_command_permissions( self, application_id: Snowflake, guild_id: Snowflake, - payload: List[interactions.EditApplicationCommand], + payload: List[interactions.BaseGuildApplicationCommandPermissions], ) -> Response[List[interactions.ApplicationCommand]]: r = Route( 'PUT', diff --git a/discord/types/interactions.py b/discord/types/interactions.py index 499d40515e..47e5c210b8 100644 --- a/discord/types/interactions.py +++ b/discord/types/interactions.py @@ -40,9 +40,12 @@ ApplicationCommandType = Literal[1, 2, 3] + class _ApplicationCommandOptional(TypedDict, total=False): - options: List[ApplicationCommandOption] type: ApplicationCommandType + guild_id: Snowflake + options: List[ApplicationCommandOption] + default_permission: bool class ApplicationCommand(_ApplicationCommandOptional): @@ -50,11 +53,17 @@ class ApplicationCommand(_ApplicationCommandOptional): application_id: Snowflake name: str description: str + version: Snowflake class _ApplicationCommandOptionOptional(TypedDict, total=False): + required: bool choices: List[ApplicationCommandOptionChoice] options: List[ApplicationCommandOption] + channel_types: List[ChannelType] + min_value: int + max_value: int + autocomplete: bool ApplicationCommandOptionType = Literal[1, 2, 3, 4, 5, 6, 7, 8, 9, 10] @@ -64,11 +73,6 @@ class ApplicationCommandOption(_ApplicationCommandOptionOptional): type: ApplicationCommandOptionType name: str description: str - required: bool - autocomplete: bool - channel_types: Optional[List[int]] - min_value: Optional[int] - max_value: Optional[int] class ApplicationCommandOptionChoice(TypedDict): @@ -98,7 +102,7 @@ class GuildApplicationCommandPermissions(PartialGuildApplicationCommandPermissio guild_id: Snowflake -InteractionType = Literal[1, 2, 3] +InteractionType = Literal[1, 2, 3, 4] class _ApplicationCommandInteractionDataOption(TypedDict): @@ -227,12 +231,25 @@ class MessageInteraction(TypedDict): user: User +class _CreateApplicationCommandOptional(TypedDict, total=False): + options: List[ApplicationCommandOption] + default_permission: bool + type: ApplicationCommandType + + +class CreateApplicationCommand(_CreateApplicationCommandOptional): + name: str + description: str + + class _EditApplicationCommandOptional(TypedDict, total=False): + name: str description: str - options: Optional[List[ApplicationCommandOption]] + options: List[ApplicationCommandOption] type: ApplicationCommandType + default_permission: bool class EditApplicationCommand(_EditApplicationCommandOptional): - name: str - default_permission: bool + pass + From 0bb8080355c4194f24a7ddad57667b939b88a6dc Mon Sep 17 00:00:00 2001 From: Lucas Hardt Date: Thu, 11 Nov 2021 12:06:35 +0100 Subject: [PATCH 020/180] Update discord/bot.py Implement requested change Co-authored-by: BobDotCom <71356958+BobDotCom@users.noreply.github.com> --- discord/bot.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/discord/bot.py b/discord/bot.py index 0da052c08d..fe0431fb44 100644 --- a/discord/bot.py +++ b/discord/bot.py @@ -38,7 +38,8 @@ List, Optional, TypeVar, - Union, Type, + Union, + Type, ) import sys From 5319d90fb158b0f69e7a3aad8a7d2cdef7d0be45 Mon Sep 17 00:00:00 2001 From: Lucas Hardt Date: Thu, 11 Nov 2021 12:09:17 +0100 Subject: [PATCH 021/180] remove code from #424 idk how it even came into this fork lol --- discord/bot.py | 9 ++------- 1 file changed, 2 insertions(+), 7 deletions(-) diff --git a/discord/bot.py b/discord/bot.py index fe0431fb44..4d4975886d 100644 --- a/discord/bot.py +++ b/discord/bot.py @@ -347,11 +347,7 @@ async def register_commands(self) -> None: ) raise - async def process_application_commands( - self, - interaction: Interaction, - application_context_cls: Optional[Type[ApplicationContext]] = None - ) -> None: + async def process_application_commands(self, interaction: Interaction) -> None: """|coro| This function processes the commands that have been registered @@ -372,7 +368,6 @@ async def process_application_commands( ----------- interaction: :class:`discord.Interaction` The interaction to process - application_context_cls: """ if interaction.type not in ( InteractionType.application_command, @@ -388,7 +383,7 @@ async def process_application_commands( if interaction.type is InteractionType.auto_complete: return await command.invoke_autocomplete_callback(interaction) - ctx = await self.get_application_context(interaction, cls=application_context_cls) + ctx = await self.get_application_context(interaction) ctx.command = command self.dispatch("application_command", ctx) try: From 00c0964a8cc3f23521d4c36d56455976ef6f87d5 Mon Sep 17 00:00:00 2001 From: Lucas Hardt Date: Thu, 11 Nov 2021 12:10:03 +0100 Subject: [PATCH 022/180] type hint non type hinted types --- discord/commands/commands.py | 23 ++++++++++++----------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/discord/commands/commands.py b/discord/commands/commands.py index ac1ad972c1..1e0e733702 100644 --- a/discord/commands/commands.py +++ b/discord/commands/commands.py @@ -210,7 +210,7 @@ async def dispatch_error(self, ctx: ApplicationContext, error: Exception) -> Non finally: ctx.bot.dispatch('application_command_error', ctx, error) - def _get_signature_parameters(self) -> OrderedDict: # TODO: Maybe define Dict better + def _get_signature_parameters(self) -> OrderedDict[str, inspect.Parameter]: return OrderedDict(inspect.signature(self.callback).parameters) def error(self, coro: ErrorT) -> ErrorT: @@ -361,7 +361,6 @@ def qualified_name(self) -> str: return self.name -# finished class SlashCommand(ApplicationCommand): r"""A class that implements the protocol for a slash command. @@ -476,7 +475,7 @@ def __init__( if self.permissions and self.default_permission: self.default_permission = False - def _parse_options(self, params: Dict) -> List[Option]: # TODO: Better typehint dict + def _parse_options(self, params: OrderedDict[str, inspect.Parameter]) -> List[Option]: if list(params.items())[0][0] == "self": temp = list(params.items()) temp.pop(0) @@ -527,13 +526,13 @@ def _parse_options(self, params: Dict) -> List[Option]: # TODO: Better typehint return final_options - def _is_typing_union(self, annotation) -> bool: # TODO: Typehint annotation + def _is_typing_union(self, annotation: Any) -> bool: # TODO: Typehint annotation return ( getattr(annotation, '__origin__', None) is Union or type(annotation) is getattr(types, "UnionType", Union) ) # type: ignore - def _is_typing_optional(self, annotation) -> bool: # TODO: Typehint annotation + def _is_typing_optional(self, annotation: Any) -> bool: # TODO: Typehint annotation return self._is_typing_union(annotation) and type(None) in annotation.__args__ # type: ignore def to_dict(self) -> CreateApplicationCommand: @@ -660,7 +659,6 @@ def _update_copy(self, kwargs: Dict[str, Any]) -> "SlashCommand": } -# finished class Option: @overload @@ -751,7 +749,6 @@ def __repr__(self) -> str: return f"" -# finihsed class OptionChoice: def __init__(self, name: str, value: Optional[Union[str, int, float]] = None): self.name: str = name @@ -761,7 +758,7 @@ def to_dict(self) -> ApplicationCommandOptionChoice: return {"name": self.name, "value": self.value} -def option(name: str, option_type=None, **kwargs): # TODO: Typehint everything +def option(name: str, option_type=None, **kwargs: Any): # TODO: Typehint everything """A decorator that can be used instead of type hinting Option""" def decor(func): @@ -773,6 +770,7 @@ def decor(func): return decor +# finished class SlashCommandGroup(ApplicationCommand, Option): r"""A class that implements the protocol for a slash command group. @@ -804,7 +802,7 @@ class SlashCommandGroup(ApplicationCommand, Option): """ type: int = 1 - def __new__(cls, *args, **kwargs) -> SlashCommandGroup: + def __new__(cls: ApplicationCommandT, *args: Any, **kwargs: Any) -> SlashCommandGroup: self = super().__new__(cls) self.__original_kwargs__ = kwargs.copy() @@ -895,6 +893,7 @@ async def invoke_autocomplete_callback(self, interaction: Interaction) -> None: await command.invoke_autocomplete_callback(interaction) +# finished class ContextMenuCommand(ApplicationCommand): r"""A class that implements the protocol for context menu commands. @@ -926,7 +925,7 @@ def __new__(cls, *args, **kwargs) -> ContextMenuCommand: self.__original_kwargs__ = kwargs.copy() return self - def __init__(self, func: Callable, *args, **kwargs) -> None: + def __init__(self, func: Callable, *args: Any, **kwargs: Any) -> None: if not asyncio.iscoroutinefunction(func): raise TypeError("Callback must be a coroutine.") self.callback = func @@ -960,7 +959,7 @@ def __init__(self, func: Callable, *args, **kwargs) -> None: # Context Menu commands can't have parents self.parent = None - def validate_parameters(self): + def validate_parameters(self) -> None: params = self._get_signature_parameters() if list(params.items())[0][0] == "self": temp = list(params.items()) @@ -1001,6 +1000,7 @@ def to_dict(self) -> CreateApplicationCommand: return {"name": self.name, "description": self.description, "type": self.type} +# finished class UserCommand(ContextMenuCommand): type: int = 2 @@ -1076,6 +1076,7 @@ def _update_copy(self: ApplicationCommandT, kwargs: Dict[str, Any]) -> Applicati return self.copy() +# finished class MessageCommand(ContextMenuCommand): type: int = 3 From fa105beda609b5ab9a73fe9dd67235357a6fa851 Mon Sep 17 00:00:00 2001 From: Lucas Hardt Date: Thu, 11 Nov 2021 14:16:33 +0100 Subject: [PATCH 023/180] type hinted the context --- discord/commands/context.py | 125 +++++++++++++++++++++++------------- 1 file changed, 80 insertions(+), 45 deletions(-) diff --git a/discord/commands/context.py b/discord/commands/context.py index 7a2f124ab4..d07f911408 100644 --- a/discord/commands/context.py +++ b/discord/commands/context.py @@ -24,33 +24,43 @@ """ from __future__ import annotations -from typing import TYPE_CHECKING, Optional, Union, TypeVar, Generic +from typing import TYPE_CHECKING, Optional, Union, TypeVar, Generic, ParamSpec, List, Any, Dict -import discord.abc +import discord.utils if TYPE_CHECKING: - import discord - from discord import Bot, AutoShardedBot, VoiceProtocol - from discord.state import ConnectionState - from ..user import User - from .commands import ApplicationCommand, Option from ..cog import Cog + from ..commands.commands import ApplicationCommand, Option + from ..embeds import Embed + from ..file import File + from ..guild import Guild + from ..interactions import Interaction, InteractionChannel, InteractionResponse, InteractionMessage + from ..member import Member + from ..mentions import AllowedMentions + from ..message import Message + from ..state import ConnectionState + from ..user import User + from ..ui import View + from ..voice_client import VoiceProtocol + from ..webhook import Webhook -from ..guild import Guild -from ..interactions import Interaction, InteractionResponse, InteractionChannel -from ..member import Member -from ..message import Message - -from ..utils import cached_property __all__ = ( "ApplicationContext", "AutocompleteContext" ) +MISSING: Any = discord.utils.MISSING + +T = TypeVar("T") BotT = TypeVar("BotT", bound="Union[Bot, AutoShardedBot]") CogT = TypeVar("CogT", bound="Cog") +if TYPE_CHECKING: + P = ParamSpec('P') +else: + P = TypeVar('P') + class ApplicationContext(discord.abc.Messageable, Generic[BotT]): """Represents a Discord application command interaction context. @@ -70,7 +80,7 @@ class ApplicationContext(discord.abc.Messageable, Generic[BotT]): The command that this context belongs to. """ - def __init__(self, bot: BotT, interaction: Interaction): + def __init__(self, bot: BotT, interaction: Interaction) -> None: self.bot: BotT = bot self.interaction: Interaction = interaction self.command: ApplicationCommand = None # type: ignore @@ -79,57 +89,65 @@ def __init__(self, bot: BotT, interaction: Interaction): async def _get_channel(self) -> Optional[InteractionChannel]: return self.channel - @cached_property + @discord.utils.cached_property def channel(self) -> Optional[InteractionChannel]: return self.interaction.channel - @cached_property + @discord.utils.cached_property def channel_id(self) -> Optional[int]: return self.interaction.channel_id - @cached_property + @discord.utils.cached_property def guild(self) -> Optional[Guild]: return self.interaction.guild - @cached_property + @discord.utils.cached_property def guild_id(self) -> Optional[int]: return self.interaction.guild_id - @cached_property + @discord.utils.cached_property def me(self) -> Union[Member, User]: return self.guild.me if self.guild is not None else self.bot.user - @cached_property + @discord.utils.cached_property def message(self) -> Optional[Message]: return self.interaction.message - @cached_property + @discord.utils.cached_property def user(self) -> Optional[Union[Member, User]]: return self.interaction.user + author: Optional[Union[Member, User]] = user + @property def voice_client(self) -> Optional[VoiceProtocol]: return self.guild.voice_client - @cached_property + @discord.utils.cached_property def response(self) -> InteractionResponse: return self.interaction.response - author: Union[Member, User] = user + @property + def cog(self) -> Optional[Cog]: + """Optional[:class:`.Cog`]: Returns the cog associated with this context's command. ``None`` if it does not exist.""" + if self.command is None: + return None + + return self.command.cog @property def respond(self): return self.followup.send if self.response.is_done() else self.interaction.response.send_message - @property - def defer(self): - return self.interaction.response.defer + @discord.utils.copy_doc(InteractionResponse.defer) + async def defer(self, *, ephemeral: bool = False) -> None: + return await self.interaction.response.defer(ephemeral=ephemeral) @property - def followup(self): + def followup(self) -> Webhook: return self.interaction.followup - async def delete(self): + async def delete(self) -> None: """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(): @@ -137,17 +155,26 @@ async def delete(self): return await self.interaction.delete_original_message() - @property - def edit(self): - return self.interaction.edit_original_message - - @property - def cog(self) -> Optional[Cog]: - """Optional[:class:`.Cog`]: Returns the cog associated with this context's command. ``None`` if it does not exist.""" - if self.command is None: - return None - - return self.command.cog + async def edit( + self, + *, + content: Optional[str] = MISSING, + embeds: List[Embed] = MISSING, + embed: Optional[Embed] = MISSING, + file: File = MISSING, + files: List[File] = MISSING, + view: Optional[View] = MISSING, + allowed_mentions: Optional[AllowedMentions] = None, + ) -> InteractionMessage: + return await self.interaction.edit_original_message( + content=content, + embeds=embeds, + embed=embed, + file=file, + files=files, + view=view, + allowed_mentions=allowed_mentions, + ) class AutocompleteContext: @@ -173,12 +200,20 @@ class AutocompleteContext: __slots__ = ("interaction", "command", "focused", "value", "options") - def __init__(self, interaction: Interaction, *, command: ApplicationCommand, focused: Option, value: str, options: dict) -> None: - self.interaction = interaction - self.command = command - self.focused = focused - self.value = value - self.options = options + def __init__( + self, + interaction: Interaction, + *, + command: ApplicationCommand, + focused: Option, + value: str, + options: Dict[str, Any], + ) -> None: + self.interaction: Interaction = interaction + self.command: ApplicationCommand = command + self.focused: Option = focused + self.value: str = value + self.options: Dict[str, Any] = options @property def cog(self) -> Optional[CogT]: From 656792ba43ebbced7322da5e007e81335af0345a Mon Sep 17 00:00:00 2001 From: Lucas Hardt Date: Thu, 11 Nov 2021 15:04:45 +0100 Subject: [PATCH 024/180] improved imports --- discord/commands/commands.py | 16 +++++++++------- discord/commands/errors.py | 4 ++++ 2 files changed, 13 insertions(+), 7 deletions(-) diff --git a/discord/commands/commands.py b/discord/commands/commands.py index 1e0e733702..526b925b07 100644 --- a/discord/commands/commands.py +++ b/discord/commands/commands.py @@ -33,16 +33,14 @@ from typing import Any, Callable, Dict, List, Optional, Union, TYPE_CHECKING, Awaitable, overload, TypeVar, ParamSpec, \ Generic, Type, Concatenate -from .. import Cog, Interaction from ..enums import SlashCommandOptionType, ChannelType from ..member import Member from ..user import User from ..message import Message -from .context import ApplicationContext, AutocompleteContext -from ..utils import find, get_or_fetch, async_all +from .context import AutocompleteContext +from ..utils import find, async_all, get_or_fetch from ..errors import ValidationError, ClientException from .errors import ApplicationCommandError, CheckFailure, ApplicationCommandInvokeError -from .permissions import Permission if TYPE_CHECKING: from ..types.interactions import ( @@ -50,13 +48,16 @@ ApplicationCommandOption as ApplicationCommandOptionData, ApplicationCommandOptionChoice ) - from ._types import ( Coro, CoroFunc, Hook, Error ) + from .context import ApplicationContext + from ..cog import Cog + from .permissions import Permission + from ..interactions import Interaction __all__ = ( "_BaseCommand", @@ -90,6 +91,7 @@ def wrap_callback(coro): # TODO: Maybe typehint + @functools.wraps(coro) async def wrapped(*args, **kwargs): try: @@ -802,7 +804,7 @@ class SlashCommandGroup(ApplicationCommand, Option): """ type: int = 1 - def __new__(cls: ApplicationCommandT, *args: Any, **kwargs: Any) -> SlashCommandGroup: + def __new__(cls: ApplicationCommandT, *args: Any, **kwargs: Any) -> ApplicationCommandT: self = super().__new__(cls) self.__original_kwargs__ = kwargs.copy() @@ -919,7 +921,7 @@ class ContextMenuCommand(ApplicationCommand): event. """ - def __new__(cls, *args, **kwargs) -> ContextMenuCommand: + def __new__(cls: ApplicationCommandT, *args: Any, **kwargs: Any) -> ApplicationCommandT: self = super().__new__(cls) self.__original_kwargs__ = kwargs.copy() diff --git a/discord/commands/errors.py b/discord/commands/errors.py index 794c34d82b..1f50679c57 100644 --- a/discord/commands/errors.py +++ b/discord/commands/errors.py @@ -30,6 +30,7 @@ "ApplicationCommandInvokeError", ) + class ApplicationCommandError(DiscordException): r"""The base exception type for all application command related errors. @@ -41,6 +42,7 @@ class ApplicationCommandError(DiscordException): """ pass + class CheckFailure(ApplicationCommandError): """Exception raised when the predicates in :attr:`.Command.checks` have failed. @@ -48,6 +50,7 @@ class CheckFailure(ApplicationCommandError): """ pass + class ApplicationCommandInvokeError(ApplicationCommandError): """Exception raised when the command being invoked raised an exception. @@ -59,6 +62,7 @@ class ApplicationCommandInvokeError(ApplicationCommandError): The original exception that was raised. You can also get this via the ``__cause__`` attribute. """ + def __init__(self, e: Exception) -> None: self.original: Exception = e super().__init__(f'Application Command raised an exception: {e.__class__.__name__}: {e}') From 48e66db045a052eee18cab8973ff5fafd183de3e Mon Sep 17 00:00:00 2001 From: Lucas Hardt Date: Fri, 12 Nov 2021 00:08:40 +0100 Subject: [PATCH 025/180] improved permissions.py --- discord/commands/permissions.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/discord/commands/permissions.py b/discord/commands/permissions.py index 6b46d8a006..4ae5c612c0 100644 --- a/discord/commands/permissions.py +++ b/discord/commands/permissions.py @@ -62,6 +62,7 @@ class Permission: The integer which represents the id of the guild that the permission may be tied to. """ + def __init__(self, perm_id: Snowflake, perm_type: int, permission: bool = True, guild_id: Optional[int] = None): self.id: Snowflake = perm_id self.type: ApplicationCommandPermissionType = perm_type @@ -71,6 +72,7 @@ def __init__(self, perm_id: Snowflake, perm_type: int, permission: bool = True, def to_dict(self) -> ApplicationCommandPermissions: return {"id": self.id, "type": self.type, "permission": self.permission} + def permission(role_id: int = None, user_id: int = None, permission: bool = True, guild_id: int = None): """The method used to specify application command permissions for specific users or roles using their id. @@ -93,11 +95,12 @@ def permission(role_id: int = None, user_id: int = None, permission: bool = True The integer which represents the id of the guild that the permission may be tied to. """ + def decorator(func: Callable): if role_id is not None: - app_cmd_perm = Permission(role_id, 1, perm, guild_id) - elif not user_id is None: - app_cmd_perm = Permission(user_id, 2, perm, guild_id) + app_cmd_perm = Permission(role_id, 1, permission, guild_id) + elif user_id is not None: + app_cmd_perm = Permission(user_id, 2, permission, guild_id) else: raise ValueError("role_id or user_id must be specified!") @@ -129,6 +132,7 @@ def has_role(item: Union[int, str], guild_id: int = None): The integer which represents the id of the guild that the permission may be tied to. """ + def decorator(func: Callable): # Create __app_cmd_perms__ if not hasattr(func, '__app_cmd_perms__'): @@ -162,6 +166,7 @@ def has_any_role(*items: Union[int, str], guild_id: int = None): The integer which represents the id of the guild that the permission may be tied to. """ + def decorator(func: Callable): # Create __app_cmd_perms__ if not hasattr(func, '__app_cmd_perms__'): @@ -194,6 +199,7 @@ def is_user(user: int, guild_id: int = None): The integer which represents the id of the guild that the permission may be tied to. """ + def decorator(func: Callable): # Create __app_cmd_perms__ if not hasattr(func, '__app_cmd_perms__'): @@ -224,6 +230,7 @@ def is_owner(guild_id: int = None): The integer which represents the id of the guild that the permission may be tied to. """ + def decorator(func: Callable): # Create __app_cmd_perms__ if not hasattr(func, '__app_cmd_perms__'): From b60688780812d25a88c465852f15e97191574c7b Mon Sep 17 00:00:00 2001 From: Dorukyum <53639936+Dorukyum@users.noreply.github.com> Date: Sat, 13 Nov 2021 14:04:29 +0300 Subject: [PATCH 026/180] Document application command types --- docs/application_commands.rst | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/docs/application_commands.rst b/docs/application_commands.rst index 8647c2de74..bacfd6b9dc 100644 --- a/docs/application_commands.rst +++ b/docs/application_commands.rst @@ -30,4 +30,33 @@ Application commands can be used with either :class:`.Bot` or :class:`.ext.comma async def foo(ctx, arg): await ctx.respond(arg) +Application Command Types +------------------------- +There are currently three types of application commands: slash, user and message commands. + +These have their corresponding decorators. + +.. code-block:: python3 + + @bot.slash_command() + async def foo(ctx): + await ctx.respond("Hello world!") + + @bot.user_command() + async def bar(ctx, user): + await ctx.respond(user.id) + + @bot.message_command() + async def foobar(ctx, message): + await ctx.respond(message.id) + +You can also use the :attr:`Bot.command` decorator by supplying an application command class. + +.. code-block:: python3 + + from discord import UserCommand + + @bot.command(..., cls=UserCommand) + # is the same as + @bot.user_command(...) From 662f2af145978102032e1de197f875a7183ad3ea Mon Sep 17 00:00:00 2001 From: capslock321 <69331371+capslock321@users.noreply.github.com> Date: Wed, 17 Nov 2021 17:14:01 -0500 Subject: [PATCH 027/180] Remove ids and grammar changes. --- examples/views/button_roles.py | 43 +++++++++++++++++----------------- 1 file changed, 21 insertions(+), 22 deletions(-) diff --git a/examples/views/button_roles.py b/examples/views/button_roles.py index fa738cae39..5ee098e09c 100644 --- a/examples/views/button_roles.py +++ b/examples/views/button_roles.py @@ -13,7 +13,7 @@ # this is the list of role IDs that will be added as buttons. role_ids = [ - 846383888003760217, 846383888036134932 + ] @@ -26,26 +26,25 @@ def __init__(self, role: discord.Role): style=discord.enums.ButtonStyle.primary, custom_id=str(role.id)) async def callback(self, interaction: discord.Interaction): - """This function will be called any time a user clicks on this button + """This function will be called any time a user clicks on this button. Parameters ---------- interaction : discord.Interaction - The interaction object that was created when the user clicked on the button + The interaction object that was created when the user clicked on the button. """ - # figure out who clicked the button + # Figure out who clicked the button. user = interaction.user - # get the role this button is for (stored in the custom ID) + # Get the role this button is for (stored in the custom ID). role = interaction.guild.get_role(int(self.custom_id)) if role is None: - # if this role doesn't exist, ignore - # you can do some error handling here + # If the specified error does not exist, return nothing. + # Error handling could be done here. return - # passed all checks - # add the role and send a response to the uesr ephemerally (hidden to other users) + # Add the role and send a response to the uesr ephemerally (hidden to other users). if role not in user.roles: # give the user the role if they don't already have it await user.add_roles(role) @@ -58,24 +57,24 @@ async def callback(self, interaction: discord.Interaction): class ButtonRoleCog(commands.Cog): """A cog with a slash command for posting the message with buttons - and to initialize the view again when the bot is restarted + and to initialize the view again when the bot is restarted. """ def __init__(self, bot): self.bot = bot - # make sure to set the guild ID here to whatever server you want the buttons in - @slash_command(guild_ids=[846383887973482516], description="Post the button role message") + # Make sure to provide a list of guild ids in the guild_ids kwarg argument. + @slash_command(guild_ids=[], description="Post the button role message") async def post(self, ctx: commands.Context): - """Slash command to post a new view with a button for each role + """Slash command to post a new view with a button for each role. """ - # timeout is None because we want this view to be persistent + # timeout is None because we want this view to be persistent. view = discord.ui.View(timeout=None) - # loop through the list of roles and add a new button to the view for each role + # Loop through the list of roles and add a new button to the view for each role. for role_id in role_ids: - # get the role the guild by ID + # Get the role from the guild by ID. role = ctx.guild.get_role(role_id) view.add_item(RoleButton(role)) @@ -83,20 +82,20 @@ async def post(self, ctx: commands.Context): @commands.Cog.listener() async def on_ready(self): - """This function is called every time the bot restarts. + """This method is called every time the bot restarts. If a view was already created before (with the same custom IDs for buttons) it will be loaded and the bot will start watching for button clicks again. """ - - # we recreate the view as we did in the /post command + + # We recreate the view as we did in the /post command. view = discord.ui.View(timeout=None) - # make sure to set the guild ID here to whatever server you want the buttons in - guild = self.bot.get_guild(846383887973482516) + # Make sure to set the guild ID here to whatever server you want the buttons in! + guild = self.bot.get_guild() for role_id in role_ids: role = guild.get_role(role_id) view.add_item(RoleButton(role)) - # add the view to the bot so it will watch for button interactions + # Add the view to the bot so it will watch for button interactions. self.bot.add_view(view) From 8616080e383a0c02a75ff461852bbbe0a9427400 Mon Sep 17 00:00:00 2001 From: capslock321 <69331371+capslock321@users.noreply.github.com> Date: Wed, 17 Nov 2021 17:28:32 -0500 Subject: [PATCH 028/180] more changes fixed a bit of mistakes I made. the last line is useless and self explanatory --- examples/views/button_roles.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/examples/views/button_roles.py b/examples/views/button_roles.py index 5ee098e09c..935349c53e 100644 --- a/examples/views/button_roles.py +++ b/examples/views/button_roles.py @@ -40,17 +40,17 @@ async def callback(self, interaction: discord.Interaction): role = interaction.guild.get_role(int(self.custom_id)) if role is None: - # If the specified error does not exist, return nothing. + # If the specified role does not exist, return nothing. # Error handling could be done here. return # Add the role and send a response to the uesr ephemerally (hidden to other users). if role not in user.roles: - # give the user the role if they don't already have it + # Give the user the role if they don't already have it. await user.add_roles(role) await interaction.response.send_message(f"🎉 You have been given the role {role.mention}", ephemeral=True) else: - # else, take the role from the user + # Else, take the role from the user. await user.remove_roles(role) await interaction.response.send_message(f"❌ The {role.mention} role has been taken from you", ephemeral=True) @@ -100,5 +100,4 @@ async def on_ready(self): def setup(bot): - # load the cog bot.add_cog(ButtonRoleCog(bot)) From 9e1e3dfb96a91fe5db745e9a47d0662b36894a0a Mon Sep 17 00:00:00 2001 From: Lala Sabathil Date: Wed, 17 Nov 2021 23:35:28 +0100 Subject: [PATCH 029/180] Update examples/views/button_roles.py --- examples/views/button_roles.py | 1 - 1 file changed, 1 deletion(-) diff --git a/examples/views/button_roles.py b/examples/views/button_roles.py index 935349c53e..9a404f5c32 100644 --- a/examples/views/button_roles.py +++ b/examples/views/button_roles.py @@ -86,7 +86,6 @@ async def on_ready(self): If a view was already created before (with the same custom IDs for buttons) it will be loaded and the bot will start watching for button clicks again. """ - # We recreate the view as we did in the /post command. view = discord.ui.View(timeout=None) # Make sure to set the guild ID here to whatever server you want the buttons in! From 313d9f28dbc5bb4c34dce6ff7734476175fcac25 Mon Sep 17 00:00:00 2001 From: Reset <77439837+ResetXD@users.noreply.github.com> Date: Mon, 22 Nov 2021 18:26:53 +0530 Subject: [PATCH 030/180] Add files via upload --- examples/interactionsBot/bot.py | 33 +++++++ examples/interactionsBot/cogs/button_cog.py | 89 +++++++++++++++++++ examples/interactionsBot/cogs/dropdown_cog.py | 69 ++++++++++++++ .../interactionsBot/cogs/slashGroup_cog.py | 36 ++++++++ examples/interactionsBot/cogs/slash_cog.py | 44 +++++++++ 5 files changed, 271 insertions(+) create mode 100644 examples/interactionsBot/bot.py create mode 100644 examples/interactionsBot/cogs/button_cog.py create mode 100644 examples/interactionsBot/cogs/dropdown_cog.py create mode 100644 examples/interactionsBot/cogs/slashGroup_cog.py create mode 100644 examples/interactionsBot/cogs/slash_cog.py diff --git a/examples/interactionsBot/bot.py b/examples/interactionsBot/bot.py new file mode 100644 index 0000000000..04fb74bcba --- /dev/null +++ b/examples/interactionsBot/bot.py @@ -0,0 +1,33 @@ +""" +with slash commands user permission it's better to check with property +""" + +import discord +from discord.ext import commands +import os +from cogs.button_cog import memeNavigator + +#inherits commands.Bot +class BotClass(commands.Bot): + def __init__(self): + super().__init__(command_prefix=">") + self.persistent_views_added = False + + # For making the intreaction Button works even after restart. + async def on_ready(self): + if not self.persistent_views_added: + + #adding memeNavigator class to the to make it work after restart + self.add_view(memeNavigator()) + + print(f'Connected as {self.user} with ID {self.user.id}') + print("------") + self.persistent_views_added = True + +client = BotClass() + +for filename in os.listdir('./cogs'): + if filename.endswith(".py"): + client.load_extension(f'cogs.{filename[:-3]}') + +client.run("token") diff --git a/examples/interactionsBot/cogs/button_cog.py b/examples/interactionsBot/cogs/button_cog.py new file mode 100644 index 0000000000..ef786d6ed5 --- /dev/null +++ b/examples/interactionsBot/cogs/button_cog.py @@ -0,0 +1,89 @@ +import discord +from discord.ext import commands +from discord.ext.commands.context import Context +from aiohttp import ClientSession +from discord.commands import slash_command + +async def getmeme(): + """ + using aiohttp for reddit random endpoint + """ + client = ClientSession() + resp = await client.get("https://www.reddit.com/r/memes/random.json") + resp = await resp.json() + await client.close() + return { + "title":resp[0]["data"]["children"][0]["data"]["title"], + "image":resp[0]["data"]["children"][0]["data"]["url_overridden_by_dest"], + "permalink": f'https://www.reddit.com{resp[0]["data"]["children"][0]["data"]["permalink"]}' + } + +class memeNavigator(discord.ui.View): + def __init__(self, ctx:Context=None): + # making None is important if you want the button work after restart! + super().__init__(timeout=None) + self.ctx = ctx + + #custom_id is required and should be unique + @discord.ui.button(style=discord.ButtonStyle.blurple,emoji="◀️",custom_id="meme:leftButton") + async def leftButton(self,button,interaction): + try: + self.ctx.pagenumber -=1 + resp = self.ctx.memearray[self.ctx.pagenumber] + self.ctx.embed.description = f"[{resp['title']}]({resp['permalink']})" + self.ctx.embed.set_image(url=resp["image"]) + await self.ctx.mememsg.edit_original_message(embed=self.ctx.embed) + except: + self.ctx.pagenumber +=1 + return + + #custom_id is required and should be unique + @discord.ui.button(style=discord.ButtonStyle.blurple,emoji="▶️",custom_id="meme:rightButton") + async def rightButton(self,button,interaction): + try: + self.ctx.pagenumber +=1 + resp = self.ctx.memearray[self.ctx.pagenumber] + self.ctx.embed.description = f"[{resp['title']}]({resp['permalink']})" + self.ctx.embed.set_image(url=resp["image"]) + await self.ctx.mememsg.edit_original_message(embed=self.ctx.embed) + + except: + resp = await getmeme() + self.ctx.embed.description = f"[{resp['title']}]({resp['permalink']})" + self.ctx.embed.set_image(url=resp["image"]) + await self.ctx.mememsg.edit_original_message(embed=self.ctx.embed) + self.ctx.memearray.append(resp) + + """ + timeout is used if there is a timeout on the button interaction with is None right now... + + async def on_timeout(self): + for child in self.children: + child.disabled = True + await self.ctx.mememsg.edit_original_message(view=None) + """ + +class MEME(commands.Cog): + def __init__(self,client): + self.client = client + + @slash_command(guild_ids=[...],name="meme",description="meme with slash and buttons!") + async def meme(self,ctx): + embed = discord.Embed(color=discord.Colour.dark_theme()) + ctx.embed = embed + navigator = memeNavigator(ctx) + resp = await getmeme() + ctx.memearray = [] + ctx.memearray.append(resp) + ctx.pagenumber = 0 + embed.description = f"[{resp['title']}]({resp['permalink']})" + embed.set_image(url=resp["image"]) + mememsg = await ctx.respond(embed=embed,view=navigator) + ctx.mememsg = mememsg + + @meme.error + async def meme_error(self, ctx:Context ,error): + return await ctx.respond(error,ephemeral=True) # ephemeral makes "Only you can see this" message + +def setup(client): + client.add_cog(MEME(client)) \ No newline at end of file diff --git a/examples/interactionsBot/cogs/dropdown_cog.py b/examples/interactionsBot/cogs/dropdown_cog.py new file mode 100644 index 0000000000..dd018b23cf --- /dev/null +++ b/examples/interactionsBot/cogs/dropdown_cog.py @@ -0,0 +1,69 @@ +import discord +from discord.ext import commands +from discord.ext.commands.context import Context +from discord.commands import slash_command + +# Defines a custom Select containing colour options +# that the user can choose. The callback function +# of this class is called when the user changes their choice +class Dropdown(discord.ui.Select): + def __init__(self,ctx=None): + + # Set the options that will be presented inside the dropdown + options = [ + discord.SelectOption( + label="Red", description="Your favourite colour is red", emoji="🟥" + ), + discord.SelectOption( + label="Green", description="Your favourite colour is green", emoji="🟩" + ), + discord.SelectOption( + label="Blue", description="Your favourite colour is blue", emoji="🟦" + ), + ] + + # The placeholder is what will be shown when no option is chosen + # The min and max values indicate we can only pick one of the three options + # The options parameter defines the dropdown options. We defined this above + super().__init__( + placeholder="Choose your favourite colour...", + min_values=1, + max_values=1, + options=options, + ) + self.ctx=ctx + + async def callback(self, interaction: discord.Interaction): + # Use the interaction object to send a response message containing + # the user's favourite colour or choice. The self object refers to the + # Select object, and the values attribute gets a list of the user's + # selected options. We only want the first one. + await self.ctx.botMessage.edit(f"Your favourite colour is {self.values[0]}") + + +class DropdownView(discord.ui.View): + def __init__(self,ctx=None): + super().__init__() + + # Adds the dropdown to our view object. + self.add_item(Dropdown(ctx)) + +class COLORTELLER(commands.Cog): + def __init__(self,client): + self.client = client + + @slash_command(guild_ids=[...],name="color",description="tell me your favourite color!") + async def whatcolor(self,ctx): + await ctx.respond("what is your favrouite color?",view=DropdownView(ctx)) + + # ephemeral makes "Only you can see this" message + """ + await ctx.respond("what is your favrouite color?",view=DropdownView(ctx),ephemeral=True) + """ + + @whatcolor.error + async def color_error(self, ctx:Context ,error): + return await ctx.respond(error,ephemeral=True) # ephemeral makes "Only you can see this" message + +def setup(client): + client.add_cog(COLORTELLER(client)) \ No newline at end of file diff --git a/examples/interactionsBot/cogs/slashGroup_cog.py b/examples/interactionsBot/cogs/slashGroup_cog.py new file mode 100644 index 0000000000..cc88f7b883 --- /dev/null +++ b/examples/interactionsBot/cogs/slashGroup_cog.py @@ -0,0 +1,36 @@ +import discord +from discord.commands.commands import Option, SlashCommandGroup +from discord.ext import commands +from discord.ext.commands.context import Context + +class MATH(commands.Cog): + def __init__(self, client): + self.client = client + moderation = SlashCommandGroup("moderation", "Commands related to moderation.") + + @moderation.command(guild_ids=[...],description="kick some people") + async def kick(self, ctx:Context, + member:Option(discord.Member), + reason:Option(str,description="reason") + ): + if ctx.author.guild_permissions.kick_members == True: + await member.kick(reason=reason) + await ctx.respond("hello") + else: + await ctx.respond("you dont have the permission to do so!",ephemeral=True) + + @moderation.command(guild_ids=[...],description="ban some people") + async def ban(self, ctx:Context, + member:Option(discord.Member), + reason:Option(str,description="reason") + ): + if ctx.author.guild_permissions.ban_members == True: + await member.ban(reason=reason) + await ctx.respond("done") + else: + await ctx.respond("you dont have the permission to do so!",ephemeral=True) + + client.add_application_command(moderation) + +def setup(client): + client.add_cog(MATH(client)) diff --git a/examples/interactionsBot/cogs/slash_cog.py b/examples/interactionsBot/cogs/slash_cog.py new file mode 100644 index 0000000000..ee76721d90 --- /dev/null +++ b/examples/interactionsBot/cogs/slash_cog.py @@ -0,0 +1,44 @@ +import discord +from discord.ext import commands +from discord.ext.commands.context import Context +from aiohttp import ClientSession +from discord.commands import slash_command +from discord.commands import Option + +class MISC_COMMANDS(commands.Cog): + def __init__(self,client): + self.client = client + + @slash_command(guild_ids=[...],name="ping",description="check the latency of the bot!") + async def ping(self,ctx): + return await ctx.respond(f"{round(self.client.latency * 1000)}ms") + # ephemeral makes "Only you can see this" message + """ + await ctx.respond(f"{round(self.client.latency * 1000)}ms",ephemeral=True) + """ + + @ping.error + async def ping_error(self, ctx:Context ,error): + return await ctx.respond(error,ephemeral=True) # ephemeral makes "Only you can see this" message + + + # slash commands with options + + @slash_command(guild_ids=[...],name="avatar",description="check someones avatar!") + async def av(self,ctx, + # + member: Option(discord.Member,description="the user you want the avatar of.") + ): + return await ctx.respond(embed=discord.Embed().set_image(url=str(member.avatar.url))) + + # ephemeral makes "Only you can see this" message + """ + await ctx.respond(embed=discord.Embed().set_image(url=str(member.avatar.url)),ephemeral=True) + """ + + @av.error + async def av_error(self, ctx:Context ,error): + return await ctx.respond(error,ephemeral=True) # ephemeral makes "Only you can see this" message + +def setup(client): + client.add_cog(MISC_COMMANDS(client)) \ No newline at end of file From 936254faedbce67978c2ef0cc38c864beb71cb5d Mon Sep 17 00:00:00 2001 From: Reset <77439837+ResetXD@users.noreply.github.com> Date: Mon, 22 Nov 2021 18:48:39 +0530 Subject: [PATCH 031/180] updated with better documentation --- examples/interactionsBot/bot.py | 6 ++--- examples/interactionsBot/cogs/button_cog.py | 23 +++++++++++-------- examples/interactionsBot/cogs/dropdown_cog.py | 4 ++-- .../interactionsBot/cogs/slashGroup_cog.py | 16 ++++++++++--- examples/interactionsBot/cogs/slash_cog.py | 5 ++-- 5 files changed, 34 insertions(+), 20 deletions(-) diff --git a/examples/interactionsBot/bot.py b/examples/interactionsBot/bot.py index 04fb74bcba..ca90e4d51e 100644 --- a/examples/interactionsBot/bot.py +++ b/examples/interactionsBot/bot.py @@ -5,7 +5,7 @@ import discord from discord.ext import commands import os -from cogs.button_cog import memeNavigator +from cogs.button_cog import MemeNavigator #inherits commands.Bot class BotClass(commands.Bot): @@ -17,8 +17,8 @@ def __init__(self): async def on_ready(self): if not self.persistent_views_added: - #adding memeNavigator class to the to make it work after restart - self.add_view(memeNavigator()) + #adding MemeNavigator class to the to make it work after restart + self.add_view(MemeNavigator()) print(f'Connected as {self.user} with ID {self.user.id}') print("------") diff --git a/examples/interactionsBot/cogs/button_cog.py b/examples/interactionsBot/cogs/button_cog.py index ef786d6ed5..d8b0931e26 100644 --- a/examples/interactionsBot/cogs/button_cog.py +++ b/examples/interactionsBot/cogs/button_cog.py @@ -7,18 +7,21 @@ async def getmeme(): """ using aiohttp for reddit random endpoint + endpoint - https://www.reddit.com/r/memes/random.json """ + # for more info https://docs.aiohttp.org/en/stable/ client = ClientSession() resp = await client.get("https://www.reddit.com/r/memes/random.json") resp = await resp.json() await client.close() + return { "title":resp[0]["data"]["children"][0]["data"]["title"], "image":resp[0]["data"]["children"][0]["data"]["url_overridden_by_dest"], "permalink": f'https://www.reddit.com{resp[0]["data"]["children"][0]["data"]["permalink"]}' } -class memeNavigator(discord.ui.View): +class MemeNavigator(discord.ui.View): def __init__(self, ctx:Context=None): # making None is important if you want the button work after restart! super().__init__(timeout=None) @@ -63,22 +66,22 @@ async def on_timeout(self): await self.ctx.mememsg.edit_original_message(view=None) """ -class MEME(commands.Cog): +class Meme(commands.Cog): def __init__(self,client): self.client = client @slash_command(guild_ids=[...],name="meme",description="meme with slash and buttons!") async def meme(self,ctx): embed = discord.Embed(color=discord.Colour.dark_theme()) - ctx.embed = embed - navigator = memeNavigator(ctx) - resp = await getmeme() - ctx.memearray = [] - ctx.memearray.append(resp) - ctx.pagenumber = 0 + ctx.embed = embed # assigning embed attr to ctx + navigator = MemeNavigator(ctx) # button View + resp = await getmeme() # method defined above + ctx.memearray = [] # array to store content that can be accessed afterwards with leftButton + ctx.memearray.append(resp) + ctx.pagenumber = 0 # pagination embed.description = f"[{resp['title']}]({resp['permalink']})" embed.set_image(url=resp["image"]) - mememsg = await ctx.respond(embed=embed,view=navigator) + mememsg = await ctx.respond(embed=embed,view=navigator) ctx.mememsg = mememsg @meme.error @@ -86,4 +89,4 @@ async def meme_error(self, ctx:Context ,error): return await ctx.respond(error,ephemeral=True) # ephemeral makes "Only you can see this" message def setup(client): - client.add_cog(MEME(client)) \ No newline at end of file + client.add_cog(Meme(client)) \ No newline at end of file diff --git a/examples/interactionsBot/cogs/dropdown_cog.py b/examples/interactionsBot/cogs/dropdown_cog.py index dd018b23cf..95643863ea 100644 --- a/examples/interactionsBot/cogs/dropdown_cog.py +++ b/examples/interactionsBot/cogs/dropdown_cog.py @@ -48,7 +48,7 @@ def __init__(self,ctx=None): # Adds the dropdown to our view object. self.add_item(Dropdown(ctx)) -class COLORTELLER(commands.Cog): +class ColorTeller(commands.Cog): def __init__(self,client): self.client = client @@ -66,4 +66,4 @@ async def color_error(self, ctx:Context ,error): return await ctx.respond(error,ephemeral=True) # ephemeral makes "Only you can see this" message def setup(client): - client.add_cog(COLORTELLER(client)) \ No newline at end of file + client.add_cog(ColorTeller(client)) \ No newline at end of file diff --git a/examples/interactionsBot/cogs/slashGroup_cog.py b/examples/interactionsBot/cogs/slashGroup_cog.py index cc88f7b883..dff145cc62 100644 --- a/examples/interactionsBot/cogs/slashGroup_cog.py +++ b/examples/interactionsBot/cogs/slashGroup_cog.py @@ -3,20 +3,26 @@ from discord.ext import commands from discord.ext.commands.context import Context -class MATH(commands.Cog): +class Math(commands.Cog): def __init__(self, client): self.client = client + + # moderation = SlashCommandGroup("moderation", "Commands related to moderation.") @moderation.command(guild_ids=[...],description="kick some people") async def kick(self, ctx:Context, - member:Option(discord.Member), + member:Option(discord.Member), reason:Option(str,description="reason") ): + + # check kick members permission for the author if ctx.author.guild_permissions.kick_members == True: + # https://docs.pycord.dev/en/master/api.html#discord.Member.kick await member.kick(reason=reason) await ctx.respond("hello") else: + await ctx.respond("you dont have the permission to do so!",ephemeral=True) @moderation.command(guild_ids=[...],description="ban some people") @@ -24,13 +30,17 @@ async def ban(self, ctx:Context, member:Option(discord.Member), reason:Option(str,description="reason") ): + + # check ban members permission for the author if ctx.author.guild_permissions.ban_members == True: + # https://docs.pycord.dev/en/master/api.html#discord.Member.ban await member.ban(reason=reason) await ctx.respond("done") else: await ctx.respond("you dont have the permission to do so!",ephemeral=True) + # adds the client.add_application_command(moderation) def setup(client): - client.add_cog(MATH(client)) + client.add_cog(Math(client)) diff --git a/examples/interactionsBot/cogs/slash_cog.py b/examples/interactionsBot/cogs/slash_cog.py index ee76721d90..036deffe43 100644 --- a/examples/interactionsBot/cogs/slash_cog.py +++ b/examples/interactionsBot/cogs/slash_cog.py @@ -5,12 +5,13 @@ from discord.commands import slash_command from discord.commands import Option -class MISC_COMMANDS(commands.Cog): +class MiscCommands(commands.Cog): def __init__(self,client): self.client = client @slash_command(guild_ids=[...],name="ping",description="check the latency of the bot!") async def ping(self,ctx): + return await ctx.respond(f"{round(self.client.latency * 1000)}ms") # ephemeral makes "Only you can see this" message """ @@ -41,4 +42,4 @@ async def av_error(self, ctx:Context ,error): return await ctx.respond(error,ephemeral=True) # ephemeral makes "Only you can see this" message def setup(client): - client.add_cog(MISC_COMMANDS(client)) \ No newline at end of file + client.add_cog(MiscCommands(client)) \ No newline at end of file From a8b0bc7140c16124538b45a25932e98cde23cee4 Mon Sep 17 00:00:00 2001 From: Reset <77439837+ResetXD@users.noreply.github.com> Date: Mon, 22 Nov 2021 22:09:33 +0530 Subject: [PATCH 032/180] improved button_cog.py examples made them a bit more user-friendly and easy to understand --- examples/interactionsBot/bot.py | 7 +- examples/interactionsBot/cogs/button_cog.py | 86 +++++-------------- examples/interactionsBot/cogs/dropdown_cog.py | 14 ++- examples/interactionsBot/cogs/slash_cog.py | 6 +- 4 files changed, 36 insertions(+), 77 deletions(-) diff --git a/examples/interactionsBot/bot.py b/examples/interactionsBot/bot.py index ca90e4d51e..a3a9812953 100644 --- a/examples/interactionsBot/bot.py +++ b/examples/interactionsBot/bot.py @@ -5,7 +5,8 @@ import discord from discord.ext import commands import os -from cogs.button_cog import MemeNavigator + +from discord.ui.view import View #inherits commands.Bot class BotClass(commands.Bot): @@ -17,8 +18,8 @@ def __init__(self): async def on_ready(self): if not self.persistent_views_added: - #adding MemeNavigator class to the to make it work after restart - self.add_view(MemeNavigator()) + #you can add classes to the to make it work after restart + # self.add_view() print(f'Connected as {self.user} with ID {self.user.id}') print("------") diff --git a/examples/interactionsBot/cogs/button_cog.py b/examples/interactionsBot/cogs/button_cog.py index d8b0931e26..94c6bd28d2 100644 --- a/examples/interactionsBot/cogs/button_cog.py +++ b/examples/interactionsBot/cogs/button_cog.py @@ -1,92 +1,48 @@ import discord from discord.ext import commands from discord.ext.commands.context import Context -from aiohttp import ClientSession -from discord.commands import slash_command - -async def getmeme(): - """ - using aiohttp for reddit random endpoint - endpoint - https://www.reddit.com/r/memes/random.json - """ - # for more info https://docs.aiohttp.org/en/stable/ - client = ClientSession() - resp = await client.get("https://www.reddit.com/r/memes/random.json") - resp = await resp.json() - await client.close() - return { - "title":resp[0]["data"]["children"][0]["data"]["title"], - "image":resp[0]["data"]["children"][0]["data"]["url_overridden_by_dest"], - "permalink": f'https://www.reddit.com{resp[0]["data"]["children"][0]["data"]["permalink"]}' - } +from discord.commands import slash_command -class MemeNavigator(discord.ui.View): +class ButtonView(discord.ui.View): def __init__(self, ctx:Context=None): # making None is important if you want the button work after restart! super().__init__(timeout=None) self.ctx = ctx - #custom_id is required and should be unique - @discord.ui.button(style=discord.ButtonStyle.blurple,emoji="◀️",custom_id="meme:leftButton") + #custom_id is required and should be unique for + # attribute emoji can be used to include emojis which can be default str emoji or str(<:emojiName:int(ID)>) + @discord.ui.button(style=discord.ButtonStyle.blurple,custom_id="counter:firstButton") async def leftButton(self,button,interaction): - try: - self.ctx.pagenumber -=1 - resp = self.ctx.memearray[self.ctx.pagenumber] - self.ctx.embed.description = f"[{resp['title']}]({resp['permalink']})" - self.ctx.embed.set_image(url=resp["image"]) - await self.ctx.mememsg.edit_original_message(embed=self.ctx.embed) - except: - self.ctx.pagenumber +=1 - return + await interaction.response.send_message(f"first button was pressed!") - #custom_id is required and should be unique - @discord.ui.button(style=discord.ButtonStyle.blurple,emoji="▶️",custom_id="meme:rightButton") + #custom_id is required and should be unique for + # attribute emoji can be used to include emojis which can be default str emoji or str(<:emojiName:int(ID)>) + @discord.ui.button(style=discord.ButtonStyle.blurple,custom_id="counter:secondButton") async def rightButton(self,button,interaction): - try: - self.ctx.pagenumber +=1 - resp = self.ctx.memearray[self.ctx.pagenumber] - self.ctx.embed.description = f"[{resp['title']}]({resp['permalink']})" - self.ctx.embed.set_image(url=resp["image"]) - await self.ctx.mememsg.edit_original_message(embed=self.ctx.embed) - - except: - resp = await getmeme() - self.ctx.embed.description = f"[{resp['title']}]({resp['permalink']})" - self.ctx.embed.set_image(url=resp["image"]) - await self.ctx.mememsg.edit_original_message(embed=self.ctx.embed) - self.ctx.memearray.append(resp) - + await interaction.response.send_message(f"second button was pressed!") + """ - timeout is used if there is a timeout on the button interaction with is None right now... + timeout is used if there is a timeout on the button interaction with is 180 by default async def on_timeout(self): for child in self.children: child.disabled = True - await self.ctx.mememsg.edit_original_message(view=None) + await interaction.edit_original_message(view=None) """ -class Meme(commands.Cog): +class ButtonExample(commands.Cog): def __init__(self,client): self.client = client - @slash_command(guild_ids=[...],name="meme",description="meme with slash and buttons!") - async def meme(self,ctx): - embed = discord.Embed(color=discord.Colour.dark_theme()) - ctx.embed = embed # assigning embed attr to ctx - navigator = MemeNavigator(ctx) # button View - resp = await getmeme() # method defined above - ctx.memearray = [] # array to store content that can be accessed afterwards with leftButton - ctx.memearray.append(resp) - ctx.pagenumber = 0 # pagination - embed.description = f"[{resp['title']}]({resp['permalink']})" - embed.set_image(url=resp["image"]) - mememsg = await ctx.respond(embed=embed,view=navigator) - ctx.mememsg = mememsg + @slash_command(guild_ids=[...],name="slash_command_name",description="command description!") + async def CommandName(self,ctx): + navigator = ButtonView(ctx) # button View + await ctx.respond("",view=navigator) - @meme.error - async def meme_error(self, ctx:Context ,error): + @CommandName.error + async def CommandName_error(self, ctx:Context ,error): return await ctx.respond(error,ephemeral=True) # ephemeral makes "Only you can see this" message def setup(client): - client.add_cog(Meme(client)) \ No newline at end of file + client.add_cog(ButtonExample(client)) \ No newline at end of file diff --git a/examples/interactionsBot/cogs/dropdown_cog.py b/examples/interactionsBot/cogs/dropdown_cog.py index 95643863ea..44f964ecb2 100644 --- a/examples/interactionsBot/cogs/dropdown_cog.py +++ b/examples/interactionsBot/cogs/dropdown_cog.py @@ -7,7 +7,7 @@ # that the user can choose. The callback function # of this class is called when the user changes their choice class Dropdown(discord.ui.Select): - def __init__(self,ctx=None): + def __init__(self): # Set the options that will be presented inside the dropdown options = [ @@ -31,22 +31,20 @@ def __init__(self,ctx=None): max_values=1, options=options, ) - self.ctx=ctx async def callback(self, interaction: discord.Interaction): # Use the interaction object to send a response message containing # the user's favourite colour or choice. The self object refers to the # Select object, and the values attribute gets a list of the user's # selected options. We only want the first one. - await self.ctx.botMessage.edit(f"Your favourite colour is {self.values[0]}") - + await interaction.response.send_message(f"Your favourite colour is {self.values[0]}") class DropdownView(discord.ui.View): - def __init__(self,ctx=None): + def __init__(self): super().__init__() # Adds the dropdown to our view object. - self.add_item(Dropdown(ctx)) + self.add_item(Dropdown()) class ColorTeller(commands.Cog): def __init__(self,client): @@ -54,11 +52,11 @@ def __init__(self,client): @slash_command(guild_ids=[...],name="color",description="tell me your favourite color!") async def whatcolor(self,ctx): - await ctx.respond("what is your favrouite color?",view=DropdownView(ctx)) + await ctx.respond("what is your favrouite color?",view=DropdownView()) # ephemeral makes "Only you can see this" message """ - await ctx.respond("what is your favrouite color?",view=DropdownView(ctx),ephemeral=True) + await ctx.respond("what is your favrouite color?",view=DropdownView(),ephemeral=True) """ @whatcolor.error diff --git a/examples/interactionsBot/cogs/slash_cog.py b/examples/interactionsBot/cogs/slash_cog.py index 036deffe43..71cd6ac52f 100644 --- a/examples/interactionsBot/cogs/slash_cog.py +++ b/examples/interactionsBot/cogs/slash_cog.py @@ -9,7 +9,11 @@ class MiscCommands(commands.Cog): def __init__(self,client): self.client = client - @slash_command(guild_ids=[...],name="ping",description="check the latency of the bot!") + @slash_command( + guild_ids=[...], + name="ping", + description="check the latency of the bot!" + ) async def ping(self,ctx): return await ctx.respond(f"{round(self.client.latency * 1000)}ms") From b51619253f3496b8d8c00dd563253541e84e8eb1 Mon Sep 17 00:00:00 2001 From: Reset <77439837+ResetXD@users.noreply.github.com> Date: Tue, 23 Nov 2021 08:31:26 +0530 Subject: [PATCH 033/180] simplified examples --- examples/interactionsBot/cogs/button_cog.py | 16 ++++------ examples/interactionsBot/cogs/dropdown_cog.py | 4 +-- .../interactionsBot/cogs/slashGroup_cog.py | 6 ++-- .../interactionsBot/cogs/slashOption_cog.py | 29 +++++++++++++++++++ examples/interactionsBot/cogs/slash_cog.py | 24 ++------------- 5 files changed, 42 insertions(+), 37 deletions(-) create mode 100644 examples/interactionsBot/cogs/slashOption_cog.py diff --git a/examples/interactionsBot/cogs/button_cog.py b/examples/interactionsBot/cogs/button_cog.py index 94c6bd28d2..1f99780301 100644 --- a/examples/interactionsBot/cogs/button_cog.py +++ b/examples/interactionsBot/cogs/button_cog.py @@ -5,26 +5,21 @@ from discord.commands import slash_command class ButtonView(discord.ui.View): - def __init__(self, ctx:Context=None): + def __init__(self): # making None is important if you want the button work after restart! super().__init__(timeout=None) - self.ctx = ctx #custom_id is required and should be unique for # attribute emoji can be used to include emojis which can be default str emoji or str(<:emojiName:int(ID)>) @discord.ui.button(style=discord.ButtonStyle.blurple,custom_id="counter:firstButton") async def leftButton(self,button,interaction): - await interaction.response.send_message(f"first button was pressed!") + await interaction.response.edit_message("button was pressed!") - #custom_id is required and should be unique for - # attribute emoji can be used to include emojis which can be default str emoji or str(<:emojiName:int(ID)>) - @discord.ui.button(style=discord.ButtonStyle.blurple,custom_id="counter:secondButton") - async def rightButton(self,button,interaction): - await interaction.response.send_message(f"second button was pressed!") """ timeout is used if there is a timeout on the button interaction with is 180 by default + the following example removes the button from the message rather than disabling them. async def on_timeout(self): for child in self.children: child.disabled = True @@ -37,9 +32,10 @@ def __init__(self,client): @slash_command(guild_ids=[...],name="slash_command_name",description="command description!") async def CommandName(self,ctx): - navigator = ButtonView(ctx) # button View - await ctx.respond("",view=navigator) + navigator = ButtonView() # button View + await ctx.respond("press the button.",view=navigator) + # for error handeling @CommandName.error async def CommandName_error(self, ctx:Context ,error): return await ctx.respond(error,ephemeral=True) # ephemeral makes "Only you can see this" message diff --git a/examples/interactionsBot/cogs/dropdown_cog.py b/examples/interactionsBot/cogs/dropdown_cog.py index 44f964ecb2..a74b5cc361 100644 --- a/examples/interactionsBot/cogs/dropdown_cog.py +++ b/examples/interactionsBot/cogs/dropdown_cog.py @@ -46,7 +46,7 @@ def __init__(self): # Adds the dropdown to our view object. self.add_item(Dropdown()) -class ColorTeller(commands.Cog): +class DropdownExample(commands.Cog): def __init__(self,client): self.client = client @@ -64,4 +64,4 @@ async def color_error(self, ctx:Context ,error): return await ctx.respond(error,ephemeral=True) # ephemeral makes "Only you can see this" message def setup(client): - client.add_cog(ColorTeller(client)) \ No newline at end of file + client.add_cog(DropdownExample(client)) \ No newline at end of file diff --git a/examples/interactionsBot/cogs/slashGroup_cog.py b/examples/interactionsBot/cogs/slashGroup_cog.py index dff145cc62..2c2c19f778 100644 --- a/examples/interactionsBot/cogs/slashGroup_cog.py +++ b/examples/interactionsBot/cogs/slashGroup_cog.py @@ -3,7 +3,7 @@ from discord.ext import commands from discord.ext.commands.context import Context -class Math(commands.Cog): +class SlashGroupExample(commands.Cog): def __init__(self, client): self.client = client @@ -39,8 +39,8 @@ async def ban(self, ctx:Context, else: await ctx.respond("you dont have the permission to do so!",ephemeral=True) - # adds the + # adds client.add_application_command(moderation) def setup(client): - client.add_cog(Math(client)) + client.add_cog(SlashGroupExample(client)) diff --git a/examples/interactionsBot/cogs/slashOption_cog.py b/examples/interactionsBot/cogs/slashOption_cog.py new file mode 100644 index 0000000000..d96a53ca1a --- /dev/null +++ b/examples/interactionsBot/cogs/slashOption_cog.py @@ -0,0 +1,29 @@ +import discord +from discord.ext import commands +from discord.ext.commands.context import Context +from discord.commands import slash_command +from discord.commands import Option + +class SlashOptionExample(commands.Cog): + def __init__(self,client): + self.client = client + + # slash commands with options + @slash_command(guild_ids=[...],name="avatar",description="check someones avatar!") + async def av(self,ctx, + # + member: Option(discord.Member,description="the user you want the avatar of.") + ): + return await ctx.respond(embed=discord.Embed().set_image(url=str(member.avatar.url))) + + # ephemeral makes "Only you can see this" message + """ + await ctx.respond(embed=discord.Embed().set_image(url=str(member.avatar.url)),ephemeral=True) + """ + + @av.error + async def av_error(self, ctx:Context ,error): + return await ctx.respond(error,ephemeral=True) # ephemeral makes "Only you can see this" message + +def setup(client): + client.add_cog(SlashOptionExample(client)) \ No newline at end of file diff --git a/examples/interactionsBot/cogs/slash_cog.py b/examples/interactionsBot/cogs/slash_cog.py index 71cd6ac52f..5b044ed4a4 100644 --- a/examples/interactionsBot/cogs/slash_cog.py +++ b/examples/interactionsBot/cogs/slash_cog.py @@ -1,11 +1,10 @@ import discord from discord.ext import commands from discord.ext.commands.context import Context -from aiohttp import ClientSession from discord.commands import slash_command from discord.commands import Option -class MiscCommands(commands.Cog): +class SlashExample(commands.Cog): def __init__(self,client): self.client = client @@ -26,24 +25,5 @@ async def ping(self,ctx): async def ping_error(self, ctx:Context ,error): return await ctx.respond(error,ephemeral=True) # ephemeral makes "Only you can see this" message - - # slash commands with options - - @slash_command(guild_ids=[...],name="avatar",description="check someones avatar!") - async def av(self,ctx, - # - member: Option(discord.Member,description="the user you want the avatar of.") - ): - return await ctx.respond(embed=discord.Embed().set_image(url=str(member.avatar.url))) - - # ephemeral makes "Only you can see this" message - """ - await ctx.respond(embed=discord.Embed().set_image(url=str(member.avatar.url)),ephemeral=True) - """ - - @av.error - async def av_error(self, ctx:Context ,error): - return await ctx.respond(error,ephemeral=True) # ephemeral makes "Only you can see this" message - def setup(client): - client.add_cog(MiscCommands(client)) \ No newline at end of file + client.add_cog(SlashExample(client)) \ No newline at end of file From c78313dec9588e53d397a822c51ec0fa75cc67e1 Mon Sep 17 00:00:00 2001 From: Reset <77439837+ResetXD@users.noreply.github.com> Date: Tue, 23 Nov 2021 16:53:04 +0530 Subject: [PATCH 034/180] Update button_cog.py --- examples/interactionsBot/cogs/button_cog.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/interactionsBot/cogs/button_cog.py b/examples/interactionsBot/cogs/button_cog.py index 1f99780301..f104ff9035 100644 --- a/examples/interactionsBot/cogs/button_cog.py +++ b/examples/interactionsBot/cogs/button_cog.py @@ -35,10 +35,10 @@ async def CommandName(self,ctx): navigator = ButtonView() # button View await ctx.respond("press the button.",view=navigator) - # for error handeling + # for error handling @CommandName.error async def CommandName_error(self, ctx:Context ,error): return await ctx.respond(error,ephemeral=True) # ephemeral makes "Only you can see this" message def setup(client): - client.add_cog(ButtonExample(client)) \ No newline at end of file + client.add_cog(ButtonExample(client)) From de7bced2d7a2539d944cab9d4001350b4d9938b4 Mon Sep 17 00:00:00 2001 From: Lala Sabathil Date: Fri, 26 Nov 2021 16:02:57 +0100 Subject: [PATCH 035/180] Apply suggestions from code review Co-authored-by: Dorukyum <53639936+Dorukyum@users.noreply.github.com> --- examples/views/button_roles.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/views/button_roles.py b/examples/views/button_roles.py index 9a404f5c32..d353514d15 100644 --- a/examples/views/button_roles.py +++ b/examples/views/button_roles.py @@ -13,7 +13,7 @@ # this is the list of role IDs that will be added as buttons. role_ids = [ - + ... ] @@ -64,7 +64,7 @@ def __init__(self, bot): self.bot = bot # Make sure to provide a list of guild ids in the guild_ids kwarg argument. - @slash_command(guild_ids=[], description="Post the button role message") + @slash_command(guild_ids=[...], description="Post the button role message") async def post(self, ctx: commands.Context): """Slash command to post a new view with a button for each role. """ @@ -89,7 +89,7 @@ async def on_ready(self): # We recreate the view as we did in the /post command. view = discord.ui.View(timeout=None) # Make sure to set the guild ID here to whatever server you want the buttons in! - guild = self.bot.get_guild() + guild = self.bot.get_guild(...) for role_id in role_ids: role = guild.get_role(role_id) view.add_item(RoleButton(role)) From 4e2d1a60702c1d3faf7083a2b01704efd6582ffd Mon Sep 17 00:00:00 2001 From: Dorukyum Date: Sat, 27 Nov 2021 22:19:23 +0300 Subject: [PATCH 036/180] Document options --- docs/application_commands.rst | 36 ++++++++++++++++++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/docs/application_commands.rst b/docs/application_commands.rst index bacfd6b9dc..256836fd2b 100644 --- a/docs/application_commands.rst +++ b/docs/application_commands.rst @@ -51,7 +51,7 @@ These have their corresponding decorators. async def foobar(ctx, message): await ctx.respond(message.id) -You can also use the :attr:`Bot.command` decorator by supplying an application command class. +You can also use the :attr:`.Bot.command` decorator by supplying an application command class. .. code-block:: python3 @@ -60,3 +60,37 @@ You can also use the :attr:`Bot.command` decorator by supplying an application c @bot.command(..., cls=UserCommand) # is the same as @bot.user_command(...) + +Options +------------------- + +Options are arguments passed into slash commands. + +These can be defined as normal function arguments: + +.. code-block:: python3 + + @bot.slash_command() + async def say_hello(ctx, name): + await ctx.respond(f"Hello {name}!") + +Typehints can be used to set option types. All option types are listed under :class:`.SlashCommandOptionType`. + +.. code-block:: python3 + + @bot.slash_command() + async def foo(ctx, number: int, member: discord.Member): + # command code + +All option fields can be set using :class:`.Option` as the type of the argument. + +.. code-block:: python3 + + from discord import Option + + @bot.slash_command() + async def show_color( + ctx, + color: Option(str, "Your color choice", choices=["red", "green"], required=False) + ): + # command code From 8d35ac0a46749bd3e291558c7114a2bdc6318b62 Mon Sep 17 00:00:00 2001 From: Dorukyum Date: Sat, 27 Nov 2021 22:21:27 +0300 Subject: [PATCH 037/180] Fix documentation syntax --- docs/application_commands.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/application_commands.rst b/docs/application_commands.rst index 256836fd2b..33800738bc 100644 --- a/docs/application_commands.rst +++ b/docs/application_commands.rst @@ -62,7 +62,7 @@ You can also use the :attr:`.Bot.command` decorator by supplying an application @bot.user_command(...) Options -------------------- +------- Options are arguments passed into slash commands. From 4ec23bd95086e7ff36c6e5c1f606e68eee9635c8 Mon Sep 17 00:00:00 2001 From: Reset <77439837+ResetXD@users.noreply.github.com> Date: Mon, 29 Nov 2021 14:57:45 +0530 Subject: [PATCH 038/180] examples --- examples/interactionsBot/bot.py | 7 ++++ .../interactionsBot/cog_group/__init__.py | 35 +++++++++++++++++++ examples/interactionsBot/cogs/button_cog.py | 12 +------ .../interactionsBot/cogs/slashOption_cog.py | 11 +++--- examples/interactionsBot/cogs/slash_cog.py | 9 ++--- 5 files changed, 55 insertions(+), 19 deletions(-) create mode 100644 examples/interactionsBot/cog_group/__init__.py diff --git a/examples/interactionsBot/bot.py b/examples/interactionsBot/bot.py index a3a9812953..42348c622e 100644 --- a/examples/interactionsBot/bot.py +++ b/examples/interactionsBot/bot.py @@ -31,4 +31,11 @@ async def on_ready(self): if filename.endswith(".py"): client.load_extension(f'cogs.{filename[:-3]}') +# using SlashCommandGroup +import cog_group +cog_group.addition() +# subtraction method is called last because of inside it. +# calling subtraction first then addition would most likely not work and wont register addition slash command. +cog_group.subtraction(client) + client.run("token") diff --git a/examples/interactionsBot/cog_group/__init__.py b/examples/interactionsBot/cog_group/__init__.py new file mode 100644 index 0000000000..507f1e36c2 --- /dev/null +++ b/examples/interactionsBot/cog_group/__init__.py @@ -0,0 +1,35 @@ +""" +This init file will be called in bot.py before or after of cog import. +client: or should be present for the last method defined here +for method. + +do note that the client.add_application_command should only be called in only one method and that method +should be called in the very last in the bot.py +""" + +import discord +from discord.commands.commands import Option, SlashCommandGroup +from discord.ext.commands.context import Context + +MathGroup = SlashCommandGroup("math", "maths!.",guild_ids=[...]) + +def addition(): # you can use whatever parameters needed for you command. + #the main decorator will be called inside the method. + @MathGroup.command(name= "add",guild_ids=[...],description="addition!") + async def add(ctx:Context, + number1:Option(int,"first integer"), # refer to slashOption.py + number2:Option(int,"second integer") # refer to slashOption.py + ): + await ctx.respond(f"{number1}+{number2}={number1+number2}") + + +def subtraction(client): + @MathGroup.command(name= "subtract",guild_ids=[...],description="subtraction!") + async def sub(ctx:Context, + number1:Option(int,"first integer"), # refer to slashOption.py + number2:Option(int,"second integer") # refer to slashOption.py + ): + await ctx.respond(f"{number1}-{number2}={number1-number2}") + + + client.add_application_command(MathGroup) \ No newline at end of file diff --git a/examples/interactionsBot/cogs/button_cog.py b/examples/interactionsBot/cogs/button_cog.py index f104ff9035..683a8ebf46 100644 --- a/examples/interactionsBot/cogs/button_cog.py +++ b/examples/interactionsBot/cogs/button_cog.py @@ -11,21 +11,11 @@ def __init__(self): #custom_id is required and should be unique for # attribute emoji can be used to include emojis which can be default str emoji or str(<:emojiName:int(ID)>) + # timeout can be used if there is a timeout on the button interaction. Default timeout is set to 180. @discord.ui.button(style=discord.ButtonStyle.blurple,custom_id="counter:firstButton") async def leftButton(self,button,interaction): await interaction.response.edit_message("button was pressed!") - - """ - timeout is used if there is a timeout on the button interaction with is 180 by default - - the following example removes the button from the message rather than disabling them. - async def on_timeout(self): - for child in self.children: - child.disabled = True - await interaction.edit_original_message(view=None) - """ - class ButtonExample(commands.Cog): def __init__(self,client): self.client = client diff --git a/examples/interactionsBot/cogs/slashOption_cog.py b/examples/interactionsBot/cogs/slashOption_cog.py index d96a53ca1a..cd3120d373 100644 --- a/examples/interactionsBot/cogs/slashOption_cog.py +++ b/examples/interactionsBot/cogs/slashOption_cog.py @@ -14,12 +14,15 @@ async def av(self,ctx, # member: Option(discord.Member,description="the user you want the avatar of.") ): - return await ctx.respond(embed=discord.Embed().set_image(url=str(member.avatar.url))) - - # ephemeral makes "Only you can see this" message """ - await ctx.respond(embed=discord.Embed().set_image(url=str(member.avatar.url)),ephemeral=True) + ephemeral makes "Only you can see this" message + + `await ctx.respond(embed=discord.Embed().set_image(url=str(member.avatar.url)),ephemeral=True)` + + embed docs - https://docs.pycord.dev/en/master/api.html#embed + member docs - https://docs.pycord.dev/en/master/api.html#discord.Member """ + return await ctx.respond(embed=discord.Embed().set_image(url=str(member.avatar.url))) @av.error async def av_error(self, ctx:Context ,error): diff --git a/examples/interactionsBot/cogs/slash_cog.py b/examples/interactionsBot/cogs/slash_cog.py index 5b044ed4a4..4be5673cfb 100644 --- a/examples/interactionsBot/cogs/slash_cog.py +++ b/examples/interactionsBot/cogs/slash_cog.py @@ -14,12 +14,13 @@ def __init__(self,client): description="check the latency of the bot!" ) async def ping(self,ctx): - - return await ctx.respond(f"{round(self.client.latency * 1000)}ms") - # ephemeral makes "Only you can see this" message """ - await ctx.respond(f"{round(self.client.latency * 1000)}ms",ephemeral=True) + ephemeral makes "Only you can see this" message + + `await ctx.respond(f"{round(self.client.latency * 1000)}ms",ephemeral=True)` """ + return await ctx.respond(f"{round(self.client.latency * 1000)}ms") + @ping.error async def ping_error(self, ctx:Context ,error): From 9863fcb783307301ba7773413a8e8c3c622064a2 Mon Sep 17 00:00:00 2001 From: Reset <77439837+ResetXD@users.noreply.github.com> Date: Mon, 29 Nov 2021 16:38:53 +0530 Subject: [PATCH 039/180] spelling correction --- examples/interactionsBot/bot.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/interactionsBot/bot.py b/examples/interactionsBot/bot.py index 42348c622e..6b3b5c0c98 100644 --- a/examples/interactionsBot/bot.py +++ b/examples/interactionsBot/bot.py @@ -35,7 +35,7 @@ async def on_ready(self): import cog_group cog_group.addition() # subtraction method is called last because of inside it. -# calling subtraction first then addition would most likely not work and wont register addition slash command. +# calling subtraction first then addition would most likely not work and won't register addition slash command. cog_group.subtraction(client) client.run("token") From 5f1b7a6587268ca67a900fd57e21eb40c03939c8 Mon Sep 17 00:00:00 2001 From: BobDotCom <71356958+BobDotCom@users.noreply.github.com> Date: Mon, 29 Nov 2021 12:49:06 -0600 Subject: [PATCH 040/180] Fix documentation bug --- docs/intents.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/intents.rst b/docs/intents.rst index 486b6150fd..ce065add1c 100644 --- a/docs/intents.rst +++ b/docs/intents.rst @@ -110,7 +110,7 @@ Member Intent .. _need_message_content_intent: Message Content Intent -++++++++++++++++ +++++++++++++++++++++++++ - Whether you have a message based command system using ext.commands - Whether you use the :func:`on_message` event for anything, such as auto-moderation. From 37b7297d3eac6ebe24aaf3da40065e971da51564 Mon Sep 17 00:00:00 2001 From: BobDotCom <71356958+BobDotCom@users.noreply.github.com> Date: Mon, 29 Nov 2021 12:49:06 -0600 Subject: [PATCH 041/180] Fix documentation bug and move migrating file --- docs/intents.rst | 2 +- docs/migrating_to_v1.rst | 1172 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 1173 insertions(+), 1 deletion(-) create mode 100644 docs/migrating_to_v1.rst diff --git a/docs/intents.rst b/docs/intents.rst index 486b6150fd..ce065add1c 100644 --- a/docs/intents.rst +++ b/docs/intents.rst @@ -110,7 +110,7 @@ Member Intent .. _need_message_content_intent: Message Content Intent -++++++++++++++++ +++++++++++++++++++++++++ - Whether you have a message based command system using ext.commands - Whether you use the :func:`on_message` event for anything, such as auto-moderation. diff --git a/docs/migrating_to_v1.rst b/docs/migrating_to_v1.rst new file mode 100644 index 0000000000..baf97160f0 --- /dev/null +++ b/docs/migrating_to_v1.rst @@ -0,0 +1,1172 @@ +.. currentmodule:: discord + +.. _migrating_1_0: + +Migrating to v1.0 +====================== + +v1.0 is one of the biggest breaking changes in the library due to a complete +redesign. + +The amount of changes are so massive and long that for all intents and purposes, it is a completely +new library. + +Part of the redesign involves making things more easy to use and natural. Things are done on the +:ref:`models ` instead of requiring a :class:`Client` instance to do any work. + +Python Version Change +----------------------- + +In order to make development easier and also to allow for our dependencies to upgrade to allow usage of 3.7 or higher, +the library had to remove support for Python versions lower than 3.5.3, which essentially means that **support for Python 3.4 +is dropped**. + +Major Model Changes +--------------------- + +Below are major model changes that have happened in v1.0 + +Snowflakes are int +~~~~~~~~~~~~~~~~~~~~ + +Before v1.0, all snowflakes (the ``id`` attribute) were strings. This has been changed to :class:`int`. + +Quick example: :: + + # before + ch = client.get_channel('84319995256905728') + if message.author.id == '80528701850124288': + ... + + # after + ch = client.get_channel(84319995256905728) + if message.author.id == 80528701850124288: + ... + +This change allows for fewer errors when using the Copy ID feature in the official client since you no longer have +to wrap it in quotes and allows for optimisation opportunities by allowing ETF to be used instead of JSON internally. + +Server is now Guild +~~~~~~~~~~~~~~~~~~~~~ + +The official API documentation calls the "Server" concept a "Guild" instead. In order to be more consistent with the +API documentation when necessary, the model has been renamed to :class:`Guild` and all instances referring to it has +been changed as well. + +A list of changes is as follows: + ++-------------------------------+----------------------------------+ +| Before | After | ++-------------------------------+----------------------------------+ +| ``Message.server`` | :attr:`Message.guild` | ++-------------------------------+----------------------------------+ +| ``Channel.server`` | :attr:`.GuildChannel.guild` | ++-------------------------------+----------------------------------+ +| ``Client.servers`` | :attr:`Client.guilds` | ++-------------------------------+----------------------------------+ +| ``Client.get_server`` | :meth:`Client.get_guild` | ++-------------------------------+----------------------------------+ +| ``Emoji.server`` | :attr:`Emoji.guild` | ++-------------------------------+----------------------------------+ +| ``Role.server`` | :attr:`Role.guild` | ++-------------------------------+----------------------------------+ +| ``Invite.server`` | :attr:`Invite.guild` | ++-------------------------------+----------------------------------+ +| ``Member.server`` | :attr:`Member.guild` | ++-------------------------------+----------------------------------+ +| ``Permissions.manage_server`` | :attr:`Permissions.manage_guild` | ++-------------------------------+----------------------------------+ +| ``VoiceClient.server`` | :attr:`VoiceClient.guild` | ++-------------------------------+----------------------------------+ +| ``Client.create_server`` | :meth:`Client.create_guild` | ++-------------------------------+----------------------------------+ + +.. _migrating_1_0_model_state: + +Models are Stateful +~~~~~~~~~~~~~~~~~~~~~ + +As mentioned earlier, a lot of functionality was moved out of :class:`Client` and +put into their respective :ref:`model `. + +A list of these changes is enumerated below. + ++---------------------------------------+------------------------------------------------------------------------------+ +| Before | After | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.add_reaction`` | :meth:`Message.add_reaction` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.add_roles`` | :meth:`Member.add_roles` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.ban`` | :meth:`Member.ban` or :meth:`Guild.ban` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.change_nickname`` | :meth:`Member.edit` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.clear_reactions`` | :meth:`Message.clear_reactions` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.create_channel`` | :meth:`Guild.create_text_channel` and :meth:`Guild.create_voice_channel` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.create_custom_emoji`` | :meth:`Guild.create_custom_emoji` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.create_invite`` | :meth:`abc.GuildChannel.create_invite` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.create_role`` | :meth:`Guild.create_role` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.delete_channel`` | :meth:`abc.GuildChannel.delete` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.delete_channel_permissions`` | :meth:`abc.GuildChannel.set_permissions` with ``overwrite`` set to ``None`` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.delete_custom_emoji`` | :meth:`Emoji.delete` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.delete_invite`` | :meth:`Invite.delete` or :meth:`Client.delete_invite` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.delete_message`` | :meth:`Message.delete` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.delete_messages`` | :meth:`TextChannel.delete_messages` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.delete_role`` | :meth:`Role.delete` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.delete_server`` | :meth:`Guild.delete` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.edit_channel`` | :meth:`TextChannel.edit` or :meth:`VoiceChannel.edit` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.edit_channel_permissions`` | :meth:`abc.GuildChannel.set_permissions` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.edit_custom_emoji`` | :meth:`Emoji.edit` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.edit_message`` | :meth:`Message.edit` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.edit_profile`` | :meth:`ClientUser.edit` (you get this from :attr:`Client.user`) | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.edit_role`` | :meth:`Role.edit` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.edit_server`` | :meth:`Guild.edit` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.estimate_pruned_members`` | :meth:`Guild.estimate_pruned_members` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.get_all_emojis`` | :attr:`Client.emojis` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.get_bans`` | :meth:`Guild.bans` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.get_invite`` | :meth:`Client.fetch_invite` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.get_message`` | :meth:`abc.Messageable.fetch_message` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.get_reaction_users`` | :meth:`Reaction.users` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.get_user_info`` | :meth:`Client.fetch_user` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.invites_from`` | :meth:`abc.GuildChannel.invites` or :meth:`Guild.invites` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.join_voice_channel`` | :meth:`VoiceChannel.connect` (see :ref:`migrating_1_0_voice`) | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.kick`` | :meth:`Guild.kick` or :meth:`Member.kick` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.leave_server`` | :meth:`Guild.leave` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.logs_from`` | :meth:`abc.Messageable.history` (see :ref:`migrating_1_0_async_iter`) | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.move_channel`` | :meth:`TextChannel.edit` or :meth:`VoiceChannel.edit` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.move_member`` | :meth:`Member.edit` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.move_role`` | :meth:`Role.edit` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.pin_message`` | :meth:`Message.pin` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.pins_from`` | :meth:`abc.Messageable.pins` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.prune_members`` | :meth:`Guild.prune_members` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.purge_from`` | :meth:`TextChannel.purge` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.remove_reaction`` | :meth:`Message.remove_reaction` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.remove_roles`` | :meth:`Member.remove_roles` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.replace_roles`` | :meth:`Member.edit` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.send_file`` | :meth:`abc.Messageable.send` (see :ref:`migrating_1_0_sending_messages`) | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.send_message`` | :meth:`abc.Messageable.send` (see :ref:`migrating_1_0_sending_messages`) | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.send_typing`` | :meth:`abc.Messageable.trigger_typing` (use :meth:`abc.Messageable.typing`) | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.server_voice_state`` | :meth:`Member.edit` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.start_private_message`` | :meth:`User.create_dm` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.unban`` | :meth:`Guild.unban` or :meth:`Member.unban` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.unpin_message`` | :meth:`Message.unpin` | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.wait_for_message`` | :meth:`Client.wait_for` (see :ref:`migrating_1_0_wait_for`) | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.wait_for_reaction`` | :meth:`Client.wait_for` (see :ref:`migrating_1_0_wait_for`) | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.wait_until_login`` | Removed | ++---------------------------------------+------------------------------------------------------------------------------+ +| ``Client.wait_until_ready`` | No change | ++---------------------------------------+------------------------------------------------------------------------------+ + +Property Changes +~~~~~~~~~~~~~~~~~~ + +In order to be a bit more consistent, certain things that were properties were changed to methods instead. + +The following are now methods instead of properties (requires parentheses): + +- :meth:`Role.is_default` +- :meth:`Client.is_ready` +- :meth:`Client.is_closed` + +Dict Value Change +~~~~~~~~~~~~~~~~~~~~~ + +Prior to v1.0 some aggregating properties that retrieved models would return "dict view" objects. + +As a consequence, when the dict would change size while you would iterate over it, a RuntimeError would +be raised and crash the task. To alleviate this, the "dict view" objects were changed into lists. + +The following views were changed to a list: + +- :attr:`Client.guilds` +- :attr:`Client.users` (new in v1.0) +- :attr:`Client.emojis` (new in v1.0) +- :attr:`Guild.channels` +- :attr:`Guild.text_channels` (new in v1.0) +- :attr:`Guild.voice_channels` (new in v1.0) +- :attr:`Guild.emojis` +- :attr:`Guild.members` + +Voice State Changes +~~~~~~~~~~~~~~~~~~~~~ + +Earlier, in v0.11.0 a :class:`VoiceState` class was added to refer to voice states along with a +:attr:`Member.voice` attribute to refer to it. + +However, it was transparent to the user. In an effort to make the library save more memory, the +voice state change is now more visible. + +The only way to access voice attributes is via the :attr:`Member.voice` attribute. Note that if +the member does not have a voice state this attribute can be ``None``. + +Quick example: :: + + # before + member.deaf + member.voice.voice_channel + + # after + if member.voice: # can be None + member.voice.deaf + member.voice.channel + + +User and Member Type Split +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +In v1.0 to save memory, :class:`User` and :class:`Member` are no longer inherited. Instead, they are "flattened" +by having equivalent properties that map out to the functional underlying :class:`User`. Thus, there is no functional +change in how they are used. However this breaks :func:`isinstance` checks and thus is something to keep in mind. + +These memory savings were accomplished by having a global :class:`User` cache, and as a positive consequence you +can now easily fetch a :class:`User` by their ID by using the new :meth:`Client.get_user`. You can also get a list +of all :class:`User` your client can see with :attr:`Client.users`. + +.. _migrating_1_0_channel_split: + +Channel Type Split +~~~~~~~~~~~~~~~~~~~~~ + +Prior to v1.0, channels were two different types, ``Channel`` and ``PrivateChannel`` with a ``is_private`` +property to help differentiate between them. + +In order to save memory the channels have been split into 4 different types: + +- :class:`TextChannel` for guild text channels. +- :class:`VoiceChannel` for guild voice channels. +- :class:`DMChannel` for DM channels with members. +- :class:`GroupChannel` for Group DM channels with members. + +With this split came the removal of the ``is_private`` attribute. You should now use :func:`isinstance`. + +The types are split into two different :ref:`discord_api_abcs`: + +- :class:`abc.GuildChannel` for guild channels. +- :class:`abc.PrivateChannel` for private channels (DMs and group DMs). + +So to check if something is a guild channel you would do: :: + + isinstance(channel, discord.abc.GuildChannel) + +And to check if it's a private channel you would do: :: + + isinstance(channel, discord.abc.PrivateChannel) + +Of course, if you're looking for only a specific type you can pass that too, e.g. :: + + isinstance(channel, discord.TextChannel) + +With this type split also came event changes, which are enumerated in :ref:`migrating_1_0_event_changes`. + + +Miscellaneous Model Changes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +There were lots of other things added or removed in the models in general. + +They will be enumerated here. + +**Removed** + +- :meth:`Client.login` no longer accepts email and password logins. + + - Use a token and ``bot=False``. + +- ``Client.get_all_emojis`` + + - Use :attr:`Client.emojis` instead. + +- ``Client.messages`` + + - Use read-only :attr:`Client.cached_messages` instead. + +- ``Client.wait_for_message`` and ``Client.wait_for_reaction`` are gone. + + - Use :meth:`Client.wait_for` instead. + +- ``Channel.voice_members`` + + - Use :attr:`VoiceChannel.members` instead. + +- ``Channel.is_private`` + + - Use ``isinstance`` instead with one of the :ref:`discord_api_abcs` instead. + - e.g. ``isinstance(channel, discord.abc.GuildChannel)`` will check if it isn't a private channel. + +- ``Client.accept_invite`` + + - There is no replacement for this one. This functionality is deprecated API wise. + +- ``Guild.default_channel`` / ``Server.default_channel`` and ``Channel.is_default`` + + - The concept of a default channel was removed from Discord. + See `#329 `_. + +- ``Message.edited_timestamp`` + + - Use :attr:`Message.edited_at` instead. + +- ``Message.timestamp`` + + - Use :attr:`Message.created_at` instead. + +- ``Colour.to_tuple()`` + + - Use :meth:`Colour.to_rgb` instead. + +- ``Permissions.view_audit_logs`` + + - Use :attr:`Permissions.view_audit_log` instead. + +- ``Member.game`` + + - Use :attr:`Member.activities` instead. + +- ``Guild.role_hierarchy`` / ``Server.role_hierarchy`` + + - Use :attr:`Guild.roles` instead. Note that while sorted, it is in the opposite order + of what the old ``Guild.role_hierarchy`` used to be. + +**Changed** + +- :attr:`Member.avatar_url` and :attr:`User.avatar_url` now return the default avatar if a custom one is not set. +- :attr:`Message.embeds` is now a list of :class:`Embed` instead of :class:`dict` objects. +- :attr:`Message.attachments` is now a list of :class:`Attachment` instead of :class:`dict` object. +- :attr:`Guild.roles` is now sorted through hierarchy. The first element is always the ``@everyone`` role. + +**Added** + +- :class:`Attachment` to represent a discord attachment. +- :class:`CategoryChannel` to represent a channel category. +- :attr:`VoiceChannel.members` for fetching members connected to a voice channel. +- :attr:`TextChannel.members` for fetching members that can see the channel. +- :attr:`Role.members` for fetching members that have the role. +- :attr:`Guild.text_channels` for fetching text channels only. +- :attr:`Guild.voice_channels` for fetching voice channels only. +- :attr:`Guild.categories` for fetching channel categories only. +- :attr:`TextChannel.category` and :attr:`VoiceChannel.category` to get the category a channel belongs to. +- :meth:`Guild.by_category` to get channels grouped by their category. +- :attr:`Guild.chunked` to check member chunking status. +- :attr:`Guild.explicit_content_filter` to fetch the content filter. +- :attr:`Guild.shard_id` to get a guild's Shard ID if you're sharding. +- :attr:`Client.users` to get all visible :class:`User` instances. +- :meth:`Client.get_user` to get a :class:`User` by ID. +- :meth:`User.avatar_url_as` to get an avatar in a specific size or format. +- :meth:`Guild.vanity_invite` to fetch the guild's vanity invite. +- :meth:`Guild.audit_logs` to fetch the guild's audit logs. +- :attr:`Message.webhook_id` to fetch the message's webhook ID. +- :attr:`Message.activity` and :attr:`Message.application` for Rich Presence related information. +- :meth:`TextChannel.is_nsfw` to check if a text channel is NSFW. +- :meth:`Colour.from_rgb` to construct a :class:`Colour` from RGB tuple. +- :meth:`Guild.get_role` to get a role by its ID. + +.. _migrating_1_0_sending_messages: + +Sending Messages +------------------ + +One of the changes that were done was the merger of the previous ``Client.send_message`` and ``Client.send_file`` +functionality into a single method, :meth:`~abc.Messageable.send`. + +Basically: :: + + # before + await client.send_message(channel, 'Hello') + + # after + await channel.send('Hello') + +This supports everything that the old ``send_message`` supported such as embeds: :: + + e = discord.Embed(title='foo') + await channel.send('Hello', embed=e) + +There is a caveat with sending files however, as this functionality was expanded to support multiple +file attachments, you must now use a :class:`File` pseudo-namedtuple to upload a single file. :: + + # before + await client.send_file(channel, 'cool.png', filename='testing.png', content='Hello') + + # after + await channel.send('Hello', file=discord.File('cool.png', 'testing.png')) + +This change was to facilitate multiple file uploads: :: + + my_files = [ + discord.File('cool.png', 'testing.png'), + discord.File(some_fp, 'cool_filename.png'), + ] + + await channel.send('Your images:', files=my_files) + +.. _migrating_1_0_async_iter: + +Asynchronous Iterators +------------------------ + +Prior to v1.0, certain functions like ``Client.logs_from`` would return a different type if done in Python 3.4 or 3.5+. + +In v1.0, this change has been reverted and will now return a singular type meeting an abstract concept called +:class:`AsyncIterator`. + +This allows you to iterate over it like normal: :: + + async for message in channel.history(): + print(message) + +Or turn it into a list: :: + + messages = await channel.history().flatten() + for message in messages: + print(message) + +A handy aspect of returning :class:`AsyncIterator` is that it allows you to chain functions together such as +:meth:`AsyncIterator.map` or :meth:`AsyncIterator.filter`: :: + + async for m_id in channel.history().filter(lambda m: m.author == client.user).map(lambda m: m.id): + print(m_id) + +The functions passed to :meth:`AsyncIterator.map` or :meth:`AsyncIterator.filter` can be either coroutines or regular +functions. + +You can also get single elements a la :func:`discord.utils.find` or :func:`discord.utils.get` via +:meth:`AsyncIterator.get` or :meth:`AsyncIterator.find`: :: + + my_last_message = await channel.history().get(author=client.user) + +The following return :class:`AsyncIterator`: + +- :meth:`abc.Messageable.history` +- :meth:`Guild.audit_logs` +- :meth:`Reaction.users` + +.. _migrating_1_0_event_changes: + +Event Changes +-------------- + +A lot of events have gone through some changes. + +Many events with ``server`` in the name were changed to use ``guild`` instead. + +Before: + +- ``on_server_join`` +- ``on_server_remove`` +- ``on_server_update`` +- ``on_server_role_create`` +- ``on_server_role_delete`` +- ``on_server_role_update`` +- ``on_server_emojis_update`` +- ``on_server_available`` +- ``on_server_unavailable`` + +After: + +- :func:`on_guild_join` +- :func:`on_guild_remove` +- :func:`on_guild_update` +- :func:`on_guild_role_create` +- :func:`on_guild_role_delete` +- :func:`on_guild_role_update` +- :func:`on_guild_emojis_update` +- :func:`on_guild_available` +- :func:`on_guild_unavailable` + + +The :func:`on_voice_state_update` event has received an argument change. + +Before: :: + + async def on_voice_state_update(before, after) + +After: :: + + async def on_voice_state_update(member, before, after) + +Instead of two :class:`Member` objects, the new event takes one :class:`Member` object and two :class:`VoiceState` objects. + +The :func:`on_guild_emojis_update` event has received an argument change. + +Before: :: + + async def on_guild_emojis_update(before, after) + +After: :: + + async def on_guild_emojis_update(guild, before, after) + +The first argument is now the :class:`Guild` that the emojis were updated from. + +The :func:`on_member_ban` event has received an argument change as well: + +Before: :: + + async def on_member_ban(member) + +After: :: + + async def on_member_ban(guild, user) + +As part of the change, the event can either receive a :class:`User` or :class:`Member`. To help in the cases that have +:class:`User`, the :class:`Guild` is provided as the first parameter. + +The ``on_channel_`` events have received a type level split (see :ref:`migrating_1_0_channel_split`). + +Before: + +- ``on_channel_delete`` +- ``on_channel_create`` +- ``on_channel_update`` + +After: + +- :func:`on_guild_channel_delete` +- :func:`on_guild_channel_create` +- :func:`on_guild_channel_update` +- :func:`on_private_channel_delete` +- :func:`on_private_channel_create` +- :func:`on_private_channel_update` + +The ``on_guild_channel_`` events correspond to :class:`abc.GuildChannel` being updated (i.e. :class:`TextChannel` +and :class:`VoiceChannel`) and the ``on_private_channel_`` events correspond to :class:`abc.PrivateChannel` being +updated (i.e. :class:`DMChannel` and :class:`GroupChannel`). + +.. _migrating_1_0_voice: + +Voice Changes +--------------- + +Voice sending has gone through a complete redesign. + +In particular: + +- Connection is done through :meth:`VoiceChannel.connect` instead of ``Client.join_voice_channel``. +- You no longer create players and operate on them (you no longer store them). +- You instead request :class:`VoiceClient` to play an :class:`AudioSource` via :meth:`VoiceClient.play`. +- There are different built-in :class:`AudioSource`\s. + + - :class:`FFmpegPCMAudio` is the equivalent of ``create_ffmpeg_player`` + +- create_ffmpeg_player/create_stream_player/create_ytdl_player have all been removed. + + - The goal is to create :class:`AudioSource` instead. + +- Using :meth:`VoiceClient.play` will not return an ``AudioPlayer``. + + - Instead, it's "flattened" like :class:`User` -> :class:`Member` is. + +- The ``after`` parameter now takes a single parameter (the error). + +Basically: + +Before: :: + + vc = await client.join_voice_channel(channel) + player = vc.create_ffmpeg_player('testing.mp3', after=lambda: print('done')) + player.start() + + player.is_playing() + player.pause() + player.resume() + player.stop() + # ... + +After: :: + + vc = await channel.connect() + vc.play(discord.FFmpegPCMAudio('testing.mp3'), after=lambda e: print('done', e)) + vc.is_playing() + vc.pause() + vc.resume() + vc.stop() + # ... + +With the changed :class:`AudioSource` design, you can now change the source that the :class:`VoiceClient` is +playing at runtime via :attr:`VoiceClient.source`. + +For example, you can add a :class:`PCMVolumeTransformer` to allow changing the volume: :: + + vc.source = discord.PCMVolumeTransformer(vc.source) + vc.source.volume = 0.6 + +An added benefit of the redesign is that it will be much more resilient towards reconnections: + +- The voice websocket will now automatically re-connect and re-do the handshake when disconnected. +- The initial connect handshake will now retry up to 5 times so you no longer get as many ``asyncio.TimeoutError``. +- Audio will now stop and resume when a disconnect is found. + + - This includes changing voice regions etc. + + +.. _migrating_1_0_wait_for: + +Waiting For Events +-------------------- + +Prior to v1.0, the machinery for waiting for an event outside of the event itself was done through two different +functions, ``Client.wait_for_message`` and ``Client.wait_for_reaction``. One problem with one such approach is that it did +not allow you to wait for events outside of the ones provided by the library. + +In v1.0 the concept of waiting for another event has been generalised to work with any event as :meth:`Client.wait_for`. + +For example, to wait for a message: :: + + # before + msg = await client.wait_for_message(author=message.author, channel=message.channel) + + # after + def pred(m): + return m.author == message.author and m.channel == message.channel + + msg = await client.wait_for('message', check=pred) + +To facilitate multiple returns, :meth:`Client.wait_for` returns either a single argument, no arguments, or a tuple of +arguments. + +For example, to wait for a reaction: :: + + reaction, user = await client.wait_for('reaction_add', check=lambda r, u: u.id == 176995180300206080) + + # use user and reaction + +Since this function now can return multiple arguments, the ``timeout`` parameter will now raise a :exc:`asyncio.TimeoutError` +when reached instead of setting the return to ``None``. For example: + +.. code-block:: python3 + + def pred(m): + return m.author == message.author and m.channel == message.channel + + try: + + msg = await client.wait_for('message', check=pred, timeout=60.0) + except asyncio.TimeoutError: + await channel.send('You took too long...') + else: + await channel.send('You said {0.content}, {0.author}.'.format(msg)) + +Upgraded Dependencies +----------------------- + +Following v1.0 of the library, we've updated our requirements to :doc:`aiohttp ` v2.0 or higher. + +Since this is a backwards incompatible change, it is recommended that you see the +`changes `_ +and the :doc:`aio:migration_to_2xx` pages for details on the breaking changes in +:doc:`aiohttp `. + +Of the most significant for common users is the removal of helper functions such as: + +- ``aiohttp.get`` +- ``aiohttp.post`` +- ``aiohttp.delete`` +- ``aiohttp.patch`` +- ``aiohttp.head`` +- ``aiohttp.put`` +- ``aiohttp.request`` + +It is recommended that you create a session instead: :: + + async with aiohttp.ClientSession() as sess: + async with sess.get('url') as resp: + # work with resp + +Since it is better to not create a session for every request, you should store it in a variable and then call +``session.close`` on it when it needs to be disposed. + +Sharding +---------- + +The library has received significant changes on how it handles sharding and now has sharding as a first-class citizen. + +If using a Bot account and you want to shard your bot in a single process then you can use the :class:`AutoShardedClient`. + +This class allows you to use sharding without having to launch multiple processes or deal with complicated IPC. + +It should be noted that **the sharded client does not support user accounts**. This is due to the changes in connection +logic and state handling. + +Usage is as simple as doing: :: + + client = discord.AutoShardedClient() + +instead of using :class:`Client`. + +This will launch as many shards as your bot needs using the ``/gateway/bot`` endpoint, which allocates about 1000 guilds +per shard. + +If you want more control over the sharding you can specify ``shard_count`` and ``shard_ids``. :: + + # launch 10 shards regardless + client = discord.AutoShardedClient(shard_count=10) + + # launch specific shard IDs in this process + client = discord.AutoShardedClient(shard_count=10, shard_ids=(1, 2, 5, 6)) + +For users of the command extension, there is also :class:`~ext.commands.AutoShardedBot` which behaves similarly. + +Connection Improvements +------------------------- + +In v1.0, the auto reconnection logic has been powered up significantly. + +:meth:`Client.connect` has gained a new keyword argument, ``reconnect`` that defaults to ``True`` which controls +the reconnect logic. When enabled, the client will automatically reconnect in all instances of your internet going +offline or Discord going offline with exponential back-off. + +:meth:`Client.run` and :meth:`Client.start` gains this keyword argument as well, but for most cases you will not +need to specify it unless turning it off. + +.. _migrating_1_0_commands: + +Command Extension Changes +-------------------------- + +Due to the :ref:`migrating_1_0_model_state` changes, some of the design of the extension module had to +undergo some design changes as well. + +Context Changes +~~~~~~~~~~~~~~~~~ + +In v1.0, the :class:`.Context` has received a lot of changes with how it's retrieved and used. + +The biggest change is that ``pass_context=True`` no longer exists, :class:`.Context` is always passed. Ergo: + +.. code-block:: python3 + + # before + @bot.command() + async def foo(): + await bot.say('Hello') + + # after + @bot.command() + async def foo(ctx): + await ctx.send('Hello') + +The reason for this is because :class:`~ext.commands.Context` now meets the requirements of :class:`abc.Messageable`. This +makes it have similar functionality to :class:`TextChannel` or :class:`DMChannel`. Using :meth:`~.Context.send` +will either DM the user in a DM context or send a message in the channel it was in, similar to the old ``bot.say`` +functionality. The old helpers have been removed in favour of the new :class:`abc.Messageable` interface. See +:ref:`migrating_1_0_removed_helpers` for more information. + +Since the :class:`~ext.commands.Context` is now passed by default, several shortcuts have been added: + +**New Shortcuts** + +- :attr:`ctx.author ` is a shortcut for ``ctx.message.author``. +- :attr:`ctx.guild ` is a shortcut for ``ctx.message.guild``. +- :attr:`ctx.channel ` is a shortcut for ``ctx.message.channel``. +- :attr:`ctx.me ` is a shortcut for ``ctx.message.guild.me`` or ``ctx.bot.user``. +- :attr:`ctx.voice_client ` is a shortcut for ``ctx.message.guild.voice_client``. + +**New Functionality** + +- :meth:`.Context.reinvoke` to invoke a command again. + + - This is useful for bypassing cooldowns. +- :attr:`.Context.valid` to check if a context can be invoked with :meth:`.Bot.invoke`. +- :meth:`.Context.send_help` to show the help command for an entity using the new :class:`~.ext.commands.HelpCommand` system. + + - This is useful if you want to show the user help if they misused a command. + +Subclassing Context +++++++++++++++++++++ + +In v1.0, there is now the ability to subclass :class:`~ext.commands.Context` and use it instead of the default +provided one. + +For example, if you want to add some functionality to the context: + +.. code-block:: python3 + + class MyContext(commands.Context): + @property + def secret(self): + return 'my secret here' + +Then you can use :meth:`~ext.commands.Bot.get_context` inside :func:`on_message` with combination with +:meth:`~ext.commands.Bot.invoke` to use your custom context: + +.. code-block:: python3 + + class MyBot(commands.Bot): + async def on_message(self, message): + ctx = await self.get_context(message, cls=MyContext) + await self.invoke(ctx) + +Now inside your commands you will have access to your custom context: + +.. code-block:: python3 + + @bot.command() + async def secret(ctx): + await ctx.send(ctx.secret) + +.. _migrating_1_0_removed_helpers: + +Removed Helpers ++++++++++++++++++ + +With the new :class:`.Context` changes, a lot of message sending helpers have been removed. + +For a full list of changes, see below: + ++-----------------+------------------------------------------------------------+ +| Before | After | ++-----------------+------------------------------------------------------------+ +| ``Bot.say`` | :meth:`.Context.send` | ++-----------------+------------------------------------------------------------+ +| ``Bot.upload`` | :meth:`.Context.send` | ++-----------------+------------------------------------------------------------+ +| ``Bot.whisper`` | ``ctx.author.send`` | ++-----------------+------------------------------------------------------------+ +| ``Bot.type`` | :meth:`.Context.typing` or :meth:`.Context.trigger_typing` | ++-----------------+------------------------------------------------------------+ +| ``Bot.reply`` | No replacement. | ++-----------------+------------------------------------------------------------+ + +Command Changes +~~~~~~~~~~~~~~~~~ + +As mentioned earlier, the first command change is that ``pass_context=True`` no longer +exists, so there is no need to pass this as a parameter. + +Another change is the removal of ``no_pm=True``. Instead, use the new :func:`~ext.commands.guild_only` built-in +check. + +The ``commands`` attribute of :class:`~ext.commands.Bot` and :class:`~ext.commands.Group` have been changed from a +dictionary to a set that does not have aliases. To retrieve the previous dictionary behaviour, use ``all_commands`` instead. + +Command instances have gained new attributes and properties: + +1. :attr:`~ext.commands.Command.signature` to get the signature of the command. +2. :attr:`~.Command.usage`, an attribute to override the default signature. +3. :attr:`~.Command.root_parent` to get the root parent group of a subcommand. + +For :class:`~ext.commands.Group` and :class:`~ext.commands.Bot` the following changed: + +- Changed :attr:`~.GroupMixin.commands` to be a :class:`set` without aliases. + + - Use :attr:`~.GroupMixin.all_commands` to get the old :class:`dict` with all commands. + +Check Changes +~~~~~~~~~~~~~~~ + +Prior to v1.0, :func:`~ext.commands.check`\s could only be synchronous. As of v1.0 checks can now be coroutines. + +Along with this change, a couple new checks were added. + +- :func:`~ext.commands.guild_only` replaces the old ``no_pm=True`` functionality. +- :func:`~ext.commands.is_owner` uses the :meth:`Client.application_info` endpoint by default to fetch owner ID. + + - This is actually powered by a different function, :meth:`~ext.commands.Bot.is_owner`. + - You can set the owner ID yourself by setting :attr:`.Bot.owner_id`. + +- :func:`~ext.commands.is_nsfw` checks if the channel the command is in is a NSFW channel. + + - This is powered by the new :meth:`TextChannel.is_nsfw` method. + +Event Changes +~~~~~~~~~~~~~~~ + +All command extension events have changed. + +Before: :: + + on_command(command, ctx) + on_command_completion(command, ctx) + on_command_error(error, ctx) + +After: :: + + on_command(ctx) + on_command_completion(ctx) + on_command_error(ctx, error) + +The extraneous ``command`` parameter in :func:`.on_command` and :func:`.on_command_completion` +have been removed. The :class:`~ext.commands.Command` instance was not kept up-to date so it was incorrect. In order to get +the up to date :class:`~ext.commands.Command` instance, use the :attr:`.Context.command` +attribute. + +The error handlers, either :meth:`.Command.error` or :func:`.on_command_error`, +have been re-ordered to use the :class:`~ext.commands.Context` as its first parameter to be consistent with other events +and commands. + +HelpFormatter and Help Command Changes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +The ``HelpFormatter`` class has been removed. It has been replaced with a :class:`~.commands.HelpCommand` class. This class now stores all the command handling and processing of the help command. + +The help command is now stored in the :attr:`.Bot.help_command` attribute. As an added extension, you can disable the help command completely by assigning the attribute to ``None`` or passing it at ``__init__`` as ``help_command=None``. + +The new interface allows the help command to be customised through special methods that can be overridden. + +- :meth:`.HelpCommand.send_bot_help` + - Called when the user requested for help with the entire bot. +- :meth:`.HelpCommand.send_cog_help` + - Called when the user requested for help with a specific cog. +- :meth:`.HelpCommand.send_group_help` + - Called when the user requested for help with a :class:`~.commands.Group` +- :meth:`.HelpCommand.send_command_help` + - Called when the user requested for help with a :class:`~.commands.Command` +- :meth:`.HelpCommand.get_destination` + - Called to know where to send the help messages. Useful for deciding whether to DM or not. +- :meth:`.HelpCommand.command_not_found` + - A function (or coroutine) that returns a presentable no command found string. +- :meth:`.HelpCommand.subcommand_not_found` + - A function (or coroutine) that returns a string when a subcommand is not found. +- :meth:`.HelpCommand.send_error_message` + - A coroutine that gets passed the result of :meth:`.HelpCommand.command_not_found` and :meth:`.HelpCommand.subcommand_not_found`. + - By default it just sends the message. But you can, for example, override it to put it in an embed. +- :meth:`.HelpCommand.on_help_command_error` + - The :ref:`error handler ` for the help command if you want to add one. +- :meth:`.HelpCommand.prepare_help_command` + - A coroutine that is called right before the help command processing is done. + +Certain subclasses can implement more customisable methods. + +The old ``HelpFormatter`` was replaced with :class:`~.commands.DefaultHelpCommand`\, which implements all of the logic of the old help command. The customisable methods can be found in the accompanying documentation. + +The library now provides a new more minimalistic :class:`~.commands.HelpCommand` implementation that doesn't take as much space, :class:`~.commands.MinimalHelpCommand`. The customisable methods can also be found in the accompanying documentation. + +A frequent request was if you could associate a help command with a cog. The new design allows for dynamically changing of cog through binding it to the :attr:`.HelpCommand.cog` attribute. After this assignment the help command will pretend to be part of the cog and everything should work as expected. When the cog is unloaded then the help command will be "unbound" from the cog. + +For example, to implement a :class:`~.commands.HelpCommand` in a cog, the following snippet can be used. + +.. code-block:: python3 + + class MyHelpCommand(commands.MinimalHelpCommand): + def get_command_signature(self, command): + return '{0.clean_prefix}{1.qualified_name} {1.signature}'.format(self, command) + + class MyCog(commands.Cog): + def __init__(self, bot): + self._original_help_command = bot.help_command + bot.help_command = MyHelpCommand() + bot.help_command.cog = self + + def cog_unload(self): + self.bot.help_command = self._original_help_command + +For more information, check out the relevant :ref:`documentation `. + +Cog Changes +~~~~~~~~~~~~~ + +Cogs have completely been revamped. They are documented in :ref:`ext_commands_cogs` as well. + +Cogs are now required to have a base class, :class:`~.commands.Cog` for future proofing purposes. This comes with special methods to customise some behaviour. + +* :meth:`.Cog.cog_unload` + - This is called when a cog needs to do some cleanup, such as cancelling a task. +* :meth:`.Cog.bot_check_once` + - This registers a :meth:`.Bot.check_once` check. +* :meth:`.Cog.bot_check` + - This registers a regular :meth:`.Bot.check` check. +* :meth:`.Cog.cog_check` + - This registers a check that applies to every command in the cog. +* :meth:`.Cog.cog_command_error` + - This is a special error handler that is called whenever an error happens inside the cog. +* :meth:`.Cog.cog_before_invoke` and :meth:`.Cog.cog_after_invoke` + - A special method that registers a cog before and after invoke hook. More information can be found in :ref:`migrating_1_0_before_after_hook`. + +Those that were using listeners, such as ``on_message`` inside a cog will now have to explicitly mark them as such using the :meth:`.commands.Cog.listener` decorator. + +Along with that, cogs have gained the ability to have custom names through specifying it in the class definition line. More options can be found in the metaclass that facilitates all this, :class:`.commands.CogMeta`. + +An example cog with every special method registered and a custom name is as follows: + +.. code-block:: python3 + + class MyCog(commands.Cog, name='Example Cog'): + def cog_unload(self): + print('cleanup goes here') + + def bot_check(self, ctx): + print('bot check') + return True + + def bot_check_once(self, ctx): + print('bot check once') + return True + + async def cog_check(self, ctx): + print('cog local check') + return await ctx.bot.is_owner(ctx.author) + + async def cog_command_error(self, ctx, error): + print('Error in {0.command.qualified_name}: {1}'.format(ctx, error)) + + async def cog_before_invoke(self, ctx): + print('cog local before: {0.command.qualified_name}'.format(ctx)) + + async def cog_after_invoke(self, ctx): + print('cog local after: {0.command.qualified_name}'.format(ctx)) + + @commands.Cog.listener() + async def on_message(self, message): + pass + + +.. _migrating_1_0_before_after_hook: + +Before and After Invocation Hooks +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Commands have gained new before and after invocation hooks that allow you to do an action before and after a command is +run. + +They take a single parameter, :class:`~ext.commands.Context` and they must be a coroutine. + +They are on a global, per-cog, or per-command basis. + +Basically: :: + + + # global hooks: + + @bot.before_invoke + async def before_any_command(ctx): + # do something before a command is called + pass + + @bot.after_invoke + async def after_any_command(ctx): + # do something after a command is called + pass + +The after invocation is hook always called, **regardless of an error in the command**. This makes it ideal for some error +handling or clean up of certain resources such a database connection. + +The per-command registration is as follows: :: + + @bot.command() + async def foo(ctx): + await ctx.send('foo') + + @foo.before_invoke + async def before_foo_command(ctx): + # do something before the foo command is called + pass + + @foo.after_invoke + async def after_foo_command(ctx): + # do something after the foo command is called + pass + +The special cog method for these is :meth:`.Cog.cog_before_invoke` and :meth:`.Cog.cog_after_invoke`, e.g.: + +.. code-block:: python3 + + class MyCog(commands.Cog): + async def cog_before_invoke(self, ctx): + ctx.secret_cog_data = 'foo' + + async def cog_after_invoke(self, ctx): + print('{0.command} is done...'.format(ctx)) + + @commands.command() + async def foo(self, ctx): + await ctx.send(ctx.secret_cog_data) + +To check if a command failed in the after invocation hook, you can use +:attr:`.Context.command_failed`. + +The invocation order is as follows: + +1. Command local before invocation hook +2. Cog local before invocation hook +3. Global before invocation hook +4. The actual command +5. Command local after invocation hook +6. Cog local after invocation hook +7. Global after invocation hook + +Converter Changes +~~~~~~~~~~~~~~~~~~~ + +Prior to v1.0, a converter was a type hint that could be a callable that could be invoked +with a singular argument denoting the argument passed by the user as a string. + +This system was eventually expanded to support a :class:`~ext.commands.Converter` system to +allow plugging in the :class:`~ext.commands.Context` and do more complicated conversions such +as the built-in "discord" converters. + +In v1.0 this converter system was revamped to allow instances of :class:`~ext.commands.Converter` derived +classes to be passed. For consistency, the :meth:`~ext.commands.Converter.convert` method was changed to +always be a coroutine and will now take the two arguments as parameters. + +Essentially, before: :: + + class MyConverter(commands.Converter): + def convert(self): + return self.ctx.message.server.me + +After: :: + + class MyConverter(commands.Converter): + async def convert(self, ctx, argument): + return ctx.me + +The command framework also got a couple new converters: + +- :class:`~ext.commands.clean_content` this is akin to :attr:`Message.clean_content` which scrubs mentions. +- :class:`~ext.commands.UserConverter` will now appropriately convert :class:`User` only. +- ``ChannelConverter`` is now split into two different converters. + + - :class:`~ext.commands.TextChannelConverter` for :class:`TextChannel`. + - :class:`~ext.commands.VoiceChannelConverter` for :class:`VoiceChannel`. From d12155cc644a871ddbb23a70d36df56ed9ec7e29 Mon Sep 17 00:00:00 2001 From: BobDotCom <71356958+BobDotCom@users.noreply.github.com> Date: Mon, 29 Nov 2021 13:49:27 -0600 Subject: [PATCH 042/180] First commit for 2.0 migration guide Signed-off-by: BobDotCom <71356958+BobDotCom@users.noreply.github.com> --- docs/migrating.rst | 375 ++++++++++++++++++++++++++++++++++++++------- 1 file changed, 323 insertions(+), 52 deletions(-) diff --git a/docs/migrating.rst b/docs/migrating.rst index baf97160f0..e9ec2a5f41 100644 --- a/docs/migrating.rst +++ b/docs/migrating.rst @@ -1,35 +1,306 @@ .. currentmodule:: discord -.. _migrating_1_0: +.. _migrating_2_0: -Migrating to v1.0 +Migrating to v2.0 ====================== -v1.0 is one of the biggest breaking changes in the library due to a complete -redesign. +v2.0 includes many breaking changes and added features. -The amount of changes are so massive and long that for all intents and purposes, it is a completely -new library. +This update adds new features from the discord API such as application commands (slash, user, and message), as well as +message components and much more. -Part of the redesign involves making things more easy to use and natural. Things are done on the -:ref:`models ` instead of requiring a :class:`Client` instance to do any work. +Since Pycord is still relatively new, we have attempted to make the migration from discord.py and v1 to pycord and v2 as +smooth as possible. Python Version Change ----------------------- -In order to make development easier and also to allow for our dependencies to upgrade to allow usage of 3.7 or higher, -the library had to remove support for Python versions lower than 3.5.3, which essentially means that **support for Python 3.4 -is dropped**. +In order to make development easier and also to allow for our dependencies to upgrade to allow usage of 3.10 or higher, +the library had to remove support for Python versions lower than 3.8, which essentially means that **support for Python +3.7 is dropped**. +Migration to Pycord +--------------------- + +We have tried to make the migration as smooth as possible. The only breaking changes that we have made are improvements, +not deletions in favor of a new style. We're going to provide as much backwards support as possible, though there will +be some changes to the API as is to be expected in major releases. + +New Package Name +~~~~~~~~~~~~~~~~~~ +The package name has been changed from ``discord.py`` to ``py-cord``, because our package is a fork of the original +discord.py package. + +Breaking Changes +------------------ +The following changes are breaking changes, and will cause your code to stop working if you use any of these features. + +User Account Support Removed +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +User account ("userbot") is no longer supported. Thus, many features that were only applicable to them have been +removed. Please note, this means that detection of Nitro is no longer possible. + +**Removed** + +The following features have been removed due to being solely related to user account support + +- The ``bot`` parameter of :meth:`Client.start`/:meth:`Client.run` +- The ``afk`` parameter of :meth:`Client.change_presence` +- All of the following classes and types: + - ``Profile`` + - ``Relationship`` + - ``CallMessage`` + - ``GroupCall`` + - ``RelationshipType`` + - ``HypeSquadHouse`` + - ``PremiumType`` + - ``UserContentFilter`` + - ``FriendFlags`` + - ``Theme`` + - ``RelationshipType`` +- The following methods of :class:`GroupChannel`: + - ``add_recipients`` + - ``remove_recipients`` + - ``edit`` +- The ``ack`` method of :class:`Guild` +- The ``call`` and ``ack`` methods of :class:`Message` +- The ``fetch_user_profile`` method of :class:`Client` + +Use of timezone-aware datetime +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Datetime objects are now required to be timezone-aware by the library internals. This means that you will need to +convert your datetime objects to a timezone-aware datetime object (or make them timezone-aware from the beginning) +before passing them to the library. Instead of ``datetime.datetime.utcnow``, you should use +``datetime.datetime.now(datetime.timezone.utc)``. If you are constructing a datetime object yourself, you should pass +``datetime.timezone.utc`` to the ``tzinfo`` parameter. + +.. code-block:: python + + embed = discord.Embed( + title = "Pi Day 2021 in UTC", + timestamp = datetime(2021, 3, 14, 15, 9, 2, tzinfo=timezone.utc) + ) + + +Methods of :class:`Client` +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +- ``request_offline_members`` + This has been depreciated since v1.5. +- ``logout`` + This was an alias for :meth:`Client.close`, which is now the preferred method. + +Embed __bool__ method changed +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +The ``__bool__`` method of :class:`Embed` has been changed (affects ``bool(Embed)``). It will now always return truthy +values. Previously it only considered text fields. + +Duplicate registration of cogs +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +:meth:`Bot.add_cog` now raises when a cog with the same name is already registered. The ``override`` argument can be +used to bring back the 1.x behavior. + +ExtensionNotFound.original removed +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +The ``original`` attribute of :class:`ExtensionNotFound` has been removed. This previously returned ``None`` for +compatibility. + +MemberCacheFlags.online removed +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Due to a Discord limitation, the ``online`` attribute of :class:`MemberCacheFlags` has been removed. + +Message.type for replies changed +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +:attr:`Message.type` has been changed for replies. It now returns :attr:`MessageType.reply` instead of +:attr:`MessageType.default`. + +Private channel events removed +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +``private_channel_create`` and ``private_channel_delete`` events will no longer be dispatched due to Discord +limitations. + +Command clean_params type changed +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +The :attr:`~.ext.commands.Command.clean_params` attribute of :class:`ext.commands.Command` has been changed to return a +:class:`dict` instead of an ``OrderedDict``. + +DMChannel recipient changed +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +:attr:`DMChannel.recipient` is now optional, and will return ``None`` in many cases. + +User and Member permissions_in +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Use :meth:`abc.GuildChannel.permissions_for` instead. + +GuildChannel permissions_for changed +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +The :meth:`abc.GuildChannel.permissions_for` method's first argument is now positional only. + +Client guild_subscriptions removed +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +The ``guild_subscriptions`` attribute of :class:`Client` has been removed, as it has been replaced by the +:ref:`intents ` system. + +Webhook changes +~~~~~~~~~~~~~~~~~ + +:class:`Webhook` was overhauled. + +- :class:`Webhook` and :class:`WebhookMessage` are now always asynchronous. For synchronous usage (requests), use :class:`SyncWebhook` and :class:`SyncWebhookMessage`. +- ``WebhookAdapter``, ``AsyncWebhookAdapter``, and ``RequestsWebhookAdapter`` have been removed as they are unnecessary. +- ``adapter`` arguments of :meth:`Webhook.partial` and :meth:`Webhook.from_url` have been removed. Sessions are now passed directly to these methods. + +.. code-block:: python + + webhook = discord.SyncWebhook.from_url( + f"https://discord.com/api/webhooks/{id}/{token}" + ) + webhook.send("Hello from pycord 2.0") + + +.. code-block:: python + + async with aiohttp.ClientSession() as session: + webhook = discord.Webhook.partial( + id, + token, + session=session + ) + await webhook.send("Hello from pycord 2.0") + + +HelpCommand clean_prefix removed +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +The ``clean_prefix`` attribute of :class:`HelpCommand` has been removed. This was moved to +:attr:`ext.commands.Context.clean_prefix` + + +Sticker preview image removed +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +The ``preview_image`` attribute of :class:`Sticker` has been removed, as Discord no longer provides the data needed for +this. + + +Asset Changes +~~~~~~~~~~~~~~~ +Assets have been changed. + +- Asset-related attributes that previously returned hash strings (e.g. :attr:`User.avatar`) now return :class:`Asset`. + :attr:`Asset.key` returns the hash from now on. +- ``Class.x_url`` and ``Class.x_url_as`` (e.g. ``User.avatar_url`` and ``Guild.icon_url_as``) have been removed. + :meth:`Asset.replace` or :class:`Asset`.with_x (e.g. :meth:`Asset.with_size`) methods can be used to get specific + asset sizes or types. +- :attr:`Emoji.url` and :attr:`PartialEmoji.url` are now :class:`str`. :meth:`Emoji.save` and :meth:`Emoji.read` are + added to save or read emojis. +- :meth:`Emoji.url_as` and :meth:`PartialEmoji.url_as` have been removed. +- The :attr:`~.AuditLogDiff.splash`, :attr:`~.AuditLogDiff.icon`, and :attr:`~.AuditLogDiff.avatar` attributes of + :class:`AuditLogDiff` now return :class:`Asset` instead of :class:`str`. +- :attr:`User.avatar` now returns ``None`` if the avatar is not set and is instead the default avatar; + use :attr:`User.display_avatar` for pre-2.0 behavior. + + +.. code-block:: python + + avatar_url = user.display_avatar.url # previously str(avatar_url) + avatar_128x128_url = user.display_avatar.with_size(128).url # previously str(avatar_url_as(size=128)) + avatar_128x128_png_url = user.display_avatar.replace(size=128, static_format="png").url + # previously str(avatar_url_as(size=128, static_format="png")) + # The code above can also be written as: + avatar_128x128_png_url = user.display_avatar.with_size(128).with_static_format("png").url + + avatar_bytes = await user.display_avatar.read() # previously avatar_url.read + + # Emoji and Sticker are special case: + emoji_url = emoji.url # previously str(emoji.url) + emoji_32x32_url = emoji.with_size(32).url # previously str(emoji.url_as(size=32)) + emoji_32x32_png_url = emoji.replace(size=32, static_format="png").url + # previously str(url_as(size=128, static_format="png")) + + emoji_bytes = await emoji.read() # previously emoji.url.read + # Same applies to Sticker and PartialEmoji. + + + +Color blurple changed +~~~~~~~~~~~~~~~~~~~~~~~ +The ``Colour.blurple`` method has been changed to :meth:`Colour.og_blurple`, and :meth:`Colour.blurple` now returns +the new theme color. + +``self_bot`` argument +~~~~~~~~~~~~~~~~~~~~~~~ +The ``self_bot`` argument of :class:`~.ext.commands.Bot` has been removed, since user bots are no longer supported. + +VerificationLevel attributes +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +The ``table_flip`` (alias of :attr:`~.VerificationLevel.high`) attribute of :class:`VerificationLevel` has been removed. +The ``extreme``, ``very_high``, and ``double_table_flip`` attributes were removed and have been replaced with +:attr:`~.VerificationLevel.highest`. + + +Arguments of ``oauth_url`` changed +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +The ``permissions``, ``guild``, ``redirect_uri``, and ``scopes`` arguments of :func:`utils.oauth_url` have been changed +to be keyword only. + + +StageChannel changes +~~~~~~~~~~~~~~~~~~~~~~ +Due to the introduction of :class:`StageInstance`, which represents the current session of a :class:`StageChannel`; + +- :meth:`StageChannel.edit` can no longer be used to edit :attr:`~.StageChannel.topic`. Use :meth:`StageInstance.edit` + instead. +- :meth:`StageChannel.clone` no longer clones its topic. + + +Message channel attribute changed +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +:attr:`Message.channel` can now return :class:`Thread`. + + +Guild methods changed +~~~~~~~~~~~~~~~~~~~~~~~ +The :meth:`~.Guild.get_channel`, :meth:`~.Guild.get_role`, :meth:`~.Guild.get_member_named`, +:meth:`~.Guild.fetch_member`, and :meth:`~.Guild.fetch_emoji` methods' first arguments are now positional only. + + +Guild create_text_channel topic argument +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +The ``topic`` argument of :meth:`Guild.create_text_channel` no longer accepts ``None``. + + +Reaction custom emoji +~~~~~~~~~~~~~~~~~~~~~~~ +The ``custom_emoji`` attribute of :class:`Reaction` has been replaced with the :meth:`Reaction.is_custom_emoji` method +for consistency. + + +Reaction users arguments changed +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +Arguments of :meth:`Reaction.users` have been changed to be keyword only. + + +IntegrationAccount id attribute changed +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +:attr:`IntegrationAccount.id` is now a :class:`str` instead of an :class:`int`, due to Discord changes. + + +BadInviteArgument arguments changed +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +: + + +BEGIN OLD DOCS +================ Major Model Changes --------------------- -Below are major model changes that have happened in v1.0 +Below are major model changes that have happened in v2.0 + Snowflakes are int ~~~~~~~~~~~~~~~~~~~~ -Before v1.0, all snowflakes (the ``id`` attribute) were strings. This has been changed to :class:`int`. +Before v2.0, all snowflakes (the ``id`` attribute) were strings. This has been changed to :class:`int`. Quick example: :: @@ -81,7 +352,7 @@ A list of changes is as follows: | ``Client.create_server`` | :meth:`Client.create_guild` | +-------------------------------+----------------------------------+ -.. _migrating_1_0_model_state: +.. _migrating_2_0_model_state: Models are Stateful ~~~~~~~~~~~~~~~~~~~~~ @@ -158,13 +429,13 @@ A list of these changes is enumerated below. +---------------------------------------+------------------------------------------------------------------------------+ | ``Client.invites_from`` | :meth:`abc.GuildChannel.invites` or :meth:`Guild.invites` | +---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.join_voice_channel`` | :meth:`VoiceChannel.connect` (see :ref:`migrating_1_0_voice`) | +| ``Client.join_voice_channel`` | :meth:`VoiceChannel.connect` (see :ref:`migrating_2_0_voice`) | +---------------------------------------+------------------------------------------------------------------------------+ | ``Client.kick`` | :meth:`Guild.kick` or :meth:`Member.kick` | +---------------------------------------+------------------------------------------------------------------------------+ | ``Client.leave_server`` | :meth:`Guild.leave` | +---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.logs_from`` | :meth:`abc.Messageable.history` (see :ref:`migrating_1_0_async_iter`) | +| ``Client.logs_from`` | :meth:`abc.Messageable.history` (see :ref:`migrating_2_0_async_iter`) | +---------------------------------------+------------------------------------------------------------------------------+ | ``Client.move_channel`` | :meth:`TextChannel.edit` or :meth:`VoiceChannel.edit` | +---------------------------------------+------------------------------------------------------------------------------+ @@ -186,9 +457,9 @@ A list of these changes is enumerated below. +---------------------------------------+------------------------------------------------------------------------------+ | ``Client.replace_roles`` | :meth:`Member.edit` | +---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.send_file`` | :meth:`abc.Messageable.send` (see :ref:`migrating_1_0_sending_messages`) | +| ``Client.send_file`` | :meth:`abc.Messageable.send` (see :ref:`migrating_2_0_sending_messages`) | +---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.send_message`` | :meth:`abc.Messageable.send` (see :ref:`migrating_1_0_sending_messages`) | +| ``Client.send_message`` | :meth:`abc.Messageable.send` (see :ref:`migrating_2_0_sending_messages`) | +---------------------------------------+------------------------------------------------------------------------------+ | ``Client.send_typing`` | :meth:`abc.Messageable.trigger_typing` (use :meth:`abc.Messageable.typing`) | +---------------------------------------+------------------------------------------------------------------------------+ @@ -200,9 +471,9 @@ A list of these changes is enumerated below. +---------------------------------------+------------------------------------------------------------------------------+ | ``Client.unpin_message`` | :meth:`Message.unpin` | +---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.wait_for_message`` | :meth:`Client.wait_for` (see :ref:`migrating_1_0_wait_for`) | +| ``Client.wait_for_message`` | :meth:`Client.wait_for` (see :ref:`migrating_2_0_wait_for`) | +---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.wait_for_reaction`` | :meth:`Client.wait_for` (see :ref:`migrating_1_0_wait_for`) | +| ``Client.wait_for_reaction`` | :meth:`Client.wait_for` (see :ref:`migrating_2_0_wait_for`) | +---------------------------------------+------------------------------------------------------------------------------+ | ``Client.wait_until_login`` | Removed | +---------------------------------------+------------------------------------------------------------------------------+ @@ -223,7 +494,7 @@ The following are now methods instead of properties (requires parentheses): Dict Value Change ~~~~~~~~~~~~~~~~~~~~~ -Prior to v1.0 some aggregating properties that retrieved models would return "dict view" objects. +Prior to v2.0 some aggregating properties that retrieved models would return "dict view" objects. As a consequence, when the dict would change size while you would iterate over it, a RuntimeError would be raised and crash the task. To alleviate this, the "dict view" objects were changed into lists. @@ -231,11 +502,11 @@ be raised and crash the task. To alleviate this, the "dict view" objects were ch The following views were changed to a list: - :attr:`Client.guilds` -- :attr:`Client.users` (new in v1.0) -- :attr:`Client.emojis` (new in v1.0) +- :attr:`Client.users` (new in v2.0) +- :attr:`Client.emojis` (new in v2.0) - :attr:`Guild.channels` -- :attr:`Guild.text_channels` (new in v1.0) -- :attr:`Guild.voice_channels` (new in v1.0) +- :attr:`Guild.text_channels` (new in v2.0) +- :attr:`Guild.voice_channels` (new in v2.0) - :attr:`Guild.emojis` - :attr:`Guild.members` @@ -266,7 +537,7 @@ Quick example: :: User and Member Type Split ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -In v1.0 to save memory, :class:`User` and :class:`Member` are no longer inherited. Instead, they are "flattened" +In v2.0 to save memory, :class:`User` and :class:`Member` are no longer inherited. Instead, they are "flattened" by having equivalent properties that map out to the functional underlying :class:`User`. Thus, there is no functional change in how they are used. However this breaks :func:`isinstance` checks and thus is something to keep in mind. @@ -274,12 +545,12 @@ These memory savings were accomplished by having a global :class:`User` cache, a can now easily fetch a :class:`User` by their ID by using the new :meth:`Client.get_user`. You can also get a list of all :class:`User` your client can see with :attr:`Client.users`. -.. _migrating_1_0_channel_split: +.. _migrating_2_0_channel_split: Channel Type Split ~~~~~~~~~~~~~~~~~~~~~ -Prior to v1.0, channels were two different types, ``Channel`` and ``PrivateChannel`` with a ``is_private`` +Prior to v2.0, channels were two different types, ``Channel`` and ``PrivateChannel`` with a ``is_private`` property to help differentiate between them. In order to save memory the channels have been split into 4 different types: @@ -308,7 +579,7 @@ Of course, if you're looking for only a specific type you can pass that too, e.g isinstance(channel, discord.TextChannel) -With this type split also came event changes, which are enumerated in :ref:`migrating_1_0_event_changes`. +With this type split also came event changes, which are enumerated in :ref:`migrating_2_0_event_changes`. Miscellaneous Model Changes @@ -412,7 +683,7 @@ They will be enumerated here. - :meth:`Colour.from_rgb` to construct a :class:`Colour` from RGB tuple. - :meth:`Guild.get_role` to get a role by its ID. -.. _migrating_1_0_sending_messages: +.. _migrating_2_0_sending_messages: Sending Messages ------------------ @@ -451,14 +722,14 @@ This change was to facilitate multiple file uploads: :: await channel.send('Your images:', files=my_files) -.. _migrating_1_0_async_iter: +.. _migrating_2_0_async_iter: Asynchronous Iterators ------------------------ -Prior to v1.0, certain functions like ``Client.logs_from`` would return a different type if done in Python 3.4 or 3.5+. +Prior to v2.0, certain functions like ``Client.logs_from`` would return a different type if done in Python 3.4 or 3.5+. -In v1.0, this change has been reverted and will now return a singular type meeting an abstract concept called +In v2.0, this change has been reverted and will now return a singular type meeting an abstract concept called :class:`AsyncIterator`. This allows you to iterate over it like normal: :: @@ -492,7 +763,7 @@ The following return :class:`AsyncIterator`: - :meth:`Guild.audit_logs` - :meth:`Reaction.users` -.. _migrating_1_0_event_changes: +.. _migrating_2_0_event_changes: Event Changes -------------- @@ -563,7 +834,7 @@ After: :: As part of the change, the event can either receive a :class:`User` or :class:`Member`. To help in the cases that have :class:`User`, the :class:`Guild` is provided as the first parameter. -The ``on_channel_`` events have received a type level split (see :ref:`migrating_1_0_channel_split`). +The ``on_channel_`` events have received a type level split (see :ref:`migrating_2_0_channel_split`). Before: @@ -584,7 +855,7 @@ The ``on_guild_channel_`` events correspond to :class:`abc.GuildChannel` being u and :class:`VoiceChannel`) and the ``on_private_channel_`` events correspond to :class:`abc.PrivateChannel` being updated (i.e. :class:`DMChannel` and :class:`GroupChannel`). -.. _migrating_1_0_voice: +.. _migrating_2_0_voice: Voice Changes --------------- @@ -651,16 +922,16 @@ An added benefit of the redesign is that it will be much more resilient towards - This includes changing voice regions etc. -.. _migrating_1_0_wait_for: +.. _migrating_2_0_wait_for: Waiting For Events -------------------- -Prior to v1.0, the machinery for waiting for an event outside of the event itself was done through two different +Prior to v2.0, the machinery for waiting for an event outside of the event itself was done through two different functions, ``Client.wait_for_message`` and ``Client.wait_for_reaction``. One problem with one such approach is that it did not allow you to wait for events outside of the ones provided by the library. -In v1.0 the concept of waiting for another event has been generalised to work with any event as :meth:`Client.wait_for`. +In v2.0 the concept of waiting for another event has been generalised to work with any event as :meth:`Client.wait_for`. For example, to wait for a message: :: @@ -701,7 +972,7 @@ when reached instead of setting the return to ``None``. For example: Upgraded Dependencies ----------------------- -Following v1.0 of the library, we've updated our requirements to :doc:`aiohttp ` v2.0 or higher. +Following v2.0 of the library, we've updated our requirements to :doc:`aiohttp ` v2.0 or higher. Since this is a backwards incompatible change, it is recommended that you see the `changes `_ @@ -761,7 +1032,7 @@ For users of the command extension, there is also :class:`~ext.commands.AutoShar Connection Improvements ------------------------- -In v1.0, the auto reconnection logic has been powered up significantly. +In v2.0, the auto reconnection logic has been powered up significantly. :meth:`Client.connect` has gained a new keyword argument, ``reconnect`` that defaults to ``True`` which controls the reconnect logic. When enabled, the client will automatically reconnect in all instances of your internet going @@ -770,18 +1041,18 @@ offline or Discord going offline with exponential back-off. :meth:`Client.run` and :meth:`Client.start` gains this keyword argument as well, but for most cases you will not need to specify it unless turning it off. -.. _migrating_1_0_commands: +.. _migrating_2_0_commands: Command Extension Changes -------------------------- -Due to the :ref:`migrating_1_0_model_state` changes, some of the design of the extension module had to +Due to the :ref:`migrating_2_0_model_state` changes, some of the design of the extension module had to undergo some design changes as well. Context Changes ~~~~~~~~~~~~~~~~~ -In v1.0, the :class:`.Context` has received a lot of changes with how it's retrieved and used. +In v2.0, the :class:`.Context` has received a lot of changes with how it's retrieved and used. The biggest change is that ``pass_context=True`` no longer exists, :class:`.Context` is always passed. Ergo: @@ -801,7 +1072,7 @@ The reason for this is because :class:`~ext.commands.Context` now meets the requ makes it have similar functionality to :class:`TextChannel` or :class:`DMChannel`. Using :meth:`~.Context.send` will either DM the user in a DM context or send a message in the channel it was in, similar to the old ``bot.say`` functionality. The old helpers have been removed in favour of the new :class:`abc.Messageable` interface. See -:ref:`migrating_1_0_removed_helpers` for more information. +:ref:`migrating_2_0_removed_helpers` for more information. Since the :class:`~ext.commands.Context` is now passed by default, several shortcuts have been added: @@ -826,7 +1097,7 @@ Since the :class:`~ext.commands.Context` is now passed by default, several short Subclassing Context ++++++++++++++++++++ -In v1.0, there is now the ability to subclass :class:`~ext.commands.Context` and use it instead of the default +In v2.0, there is now the ability to subclass :class:`~ext.commands.Context` and use it instead of the default provided one. For example, if you want to add some functionality to the context: @@ -856,7 +1127,7 @@ Now inside your commands you will have access to your custom context: async def secret(ctx): await ctx.send(ctx.secret) -.. _migrating_1_0_removed_helpers: +.. _migrating_2_0_removed_helpers: Removed Helpers +++++++++++++++++ @@ -906,7 +1177,7 @@ For :class:`~ext.commands.Group` and :class:`~ext.commands.Bot` the following ch Check Changes ~~~~~~~~~~~~~~~ -Prior to v1.0, :func:`~ext.commands.check`\s could only be synchronous. As of v1.0 checks can now be coroutines. +Prior to v2.0, :func:`~ext.commands.check`\s could only be synchronous. As of v2.0 checks can now be coroutines. Along with this change, a couple new checks were added. @@ -1022,7 +1293,7 @@ Cogs are now required to have a base class, :class:`~.commands.Cog` for future p * :meth:`.Cog.cog_command_error` - This is a special error handler that is called whenever an error happens inside the cog. * :meth:`.Cog.cog_before_invoke` and :meth:`.Cog.cog_after_invoke` - - A special method that registers a cog before and after invoke hook. More information can be found in :ref:`migrating_1_0_before_after_hook`. + - A special method that registers a cog before and after invoke hook. More information can be found in :ref:`migrating_2_0_before_after_hook`. Those that were using listeners, such as ``on_message`` inside a cog will now have to explicitly mark them as such using the :meth:`.commands.Cog.listener` decorator. @@ -1062,7 +1333,7 @@ An example cog with every special method registered and a custom name is as foll pass -.. _migrating_1_0_before_after_hook: +.. _migrating_2_0_before_after_hook: Before and After Invocation Hooks ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ @@ -1139,14 +1410,14 @@ The invocation order is as follows: Converter Changes ~~~~~~~~~~~~~~~~~~~ -Prior to v1.0, a converter was a type hint that could be a callable that could be invoked +Prior to v2.0, a converter was a type hint that could be a callable that could be invoked with a singular argument denoting the argument passed by the user as a string. This system was eventually expanded to support a :class:`~ext.commands.Converter` system to allow plugging in the :class:`~ext.commands.Context` and do more complicated conversions such as the built-in "discord" converters. -In v1.0 this converter system was revamped to allow instances of :class:`~ext.commands.Converter` derived +In v2.0 this converter system was revamped to allow instances of :class:`~ext.commands.Converter` derived classes to be passed. For consistency, the :meth:`~ext.commands.Converter.convert` method was changed to always be a coroutine and will now take the two arguments as parameters. From 53322d4f267f1d16b3f58e278afbe8310c9db3a1 Mon Sep 17 00:00:00 2001 From: Reset <77439837+ResetXD@users.noreply.github.com> Date: Tue, 30 Nov 2021 13:39:18 +0530 Subject: [PATCH 043/180] Update examples/interactionsBot/bot.py Co-authored-by: RPS --- examples/interactionsBot/bot.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/interactionsBot/bot.py b/examples/interactionsBot/bot.py index 6b3b5c0c98..93e248433e 100644 --- a/examples/interactionsBot/bot.py +++ b/examples/interactionsBot/bot.py @@ -18,7 +18,7 @@ def __init__(self): async def on_ready(self): if not self.persistent_views_added: - #you can add classes to the to make it work after restart + # You can add classes to the to make it work after restart # self.add_view() print(f'Connected as {self.user} with ID {self.user.id}') From faa979ce3da76c1a12b071d0ab6c5292e052074b Mon Sep 17 00:00:00 2001 From: Vincent Date: Tue, 30 Nov 2021 16:14:31 +0800 Subject: [PATCH 044/180] Initial Refresh --- README.ja.rst | 119 - docs/conf.py | 8 +- docs/locale/ja/LC_MESSAGES/api.po | 19686 ---------------- docs/locale/ja/LC_MESSAGES/discord.po | 179 - .../locale/ja/LC_MESSAGES/ext/commands/api.po | 6780 ------ .../ja/LC_MESSAGES/ext/commands/cogs.po | 179 - .../ja/LC_MESSAGES/ext/commands/commands.po | 901 - .../ja/LC_MESSAGES/ext/commands/extensions.po | 83 - .../ja/LC_MESSAGES/ext/commands/index.po | 27 - docs/locale/ja/LC_MESSAGES/ext/tasks/index.po | 417 - docs/locale/ja/LC_MESSAGES/faq.po | 582 - docs/locale/ja/LC_MESSAGES/index.po | 83 - docs/locale/ja/LC_MESSAGES/intents.po | 429 - docs/locale/ja/LC_MESSAGES/intro.po | 127 - docs/locale/ja/LC_MESSAGES/logging.po | 77 - docs/locale/ja/LC_MESSAGES/migrating.po | 2548 -- .../ja/LC_MESSAGES/migrating_to_async.po | 363 - docs/locale/ja/LC_MESSAGES/quickstart.po | 91 - docs/locale/ja/LC_MESSAGES/sphinx.po | 23 - .../ja/LC_MESSAGES/version_guarantees.po | 79 - docs/locale/ja/LC_MESSAGES/whats_new.po | 2937 --- docs/migrating.rst | 1172 +- docs/migrating_to_async.rst | 322 - docs/quickstart.rst | 6 +- docs/whats_new.rst | 381 +- 25 files changed, 23 insertions(+), 37576 deletions(-) delete mode 100644 README.ja.rst delete mode 100644 docs/locale/ja/LC_MESSAGES/api.po delete mode 100644 docs/locale/ja/LC_MESSAGES/discord.po delete mode 100644 docs/locale/ja/LC_MESSAGES/ext/commands/api.po delete mode 100644 docs/locale/ja/LC_MESSAGES/ext/commands/cogs.po delete mode 100644 docs/locale/ja/LC_MESSAGES/ext/commands/commands.po delete mode 100644 docs/locale/ja/LC_MESSAGES/ext/commands/extensions.po delete mode 100644 docs/locale/ja/LC_MESSAGES/ext/commands/index.po delete mode 100644 docs/locale/ja/LC_MESSAGES/ext/tasks/index.po delete mode 100644 docs/locale/ja/LC_MESSAGES/faq.po delete mode 100644 docs/locale/ja/LC_MESSAGES/index.po delete mode 100644 docs/locale/ja/LC_MESSAGES/intents.po delete mode 100644 docs/locale/ja/LC_MESSAGES/intro.po delete mode 100644 docs/locale/ja/LC_MESSAGES/logging.po delete mode 100644 docs/locale/ja/LC_MESSAGES/migrating.po delete mode 100644 docs/locale/ja/LC_MESSAGES/migrating_to_async.po delete mode 100644 docs/locale/ja/LC_MESSAGES/quickstart.po delete mode 100644 docs/locale/ja/LC_MESSAGES/sphinx.po delete mode 100644 docs/locale/ja/LC_MESSAGES/version_guarantees.po delete mode 100644 docs/locale/ja/LC_MESSAGES/whats_new.po delete mode 100644 docs/migrating_to_async.rst diff --git a/README.ja.rst b/README.ja.rst deleted file mode 100644 index 4c13043a59..0000000000 --- a/README.ja.rst +++ /dev/null @@ -1,119 +0,0 @@ -pycord -========== - -.. image:: https://discord.com/api/guilds/881207955029110855/embed.png - :target: https://pycord.dev/discord - :alt: Discordサーバーの招待 -.. image:: https://img.shields.io/pypi/v/py-cord.svg - :target: https://pypi.python.org/pypi/py-cord - :alt: PyPIのバージョン情報 -.. image:: https://img.shields.io/pypi/pyversions/py-cord.svg - :target: https://pypi.python.org/pypi/py-cord - :alt: PyPIのサポートしているPythonのバージョン -.. image:: https://img.shields.io/pypi/dm/py-cord?color=blue - :target: https://pypi.python.org/pypi/py-cord - :alt: PyPIダウンロード - -discord.pyのフォークです。PyCordはPythonで書かれたDiscordのモダンで使いやすく、豊富な機能を持ち、非同期に対応したAPIラッパーです。 - -主な特徴 -------------- - -- ``async`` と ``await`` を使ったモダンなPythonらしいAPI。 -- 適切なレート制限の処理。 -- 速度とメモリ使用量の両方が最適化されています。 -- スラッシュコマンド、コンテキストメニュー、メッセージコンポーネントをサポート。 - -インストール ----------- - -**Python 3.8 以降のバージョンが必須です** - -完全な音声サポートなしでライブラリをインストールする場合は次のコマンドを実行してください: - -.. code:: sh - - # Linux/macOS - python3 -m pip install -U py-cord - - # Windows - py -3 -m pip install -U py-cord - -音声サポートが必要なら、次のコマンドを実行しましょう: - -.. code:: sh - - # Linux/macOS - python3 -m pip install -U "py-cord[voice]" - - # Windows - py -3 -m pip install -U py-cord[voice] - - -開発版をインストールしたいのならば、次の手順に従ってください: -.. code:: sh - - $ git clone https://github.com/Pycord-Development/pycord - $ cd pycord - $ python3 -m pip install -U .[voice] - - -オプションパッケージ -~~~~~~~~~~~~~~~~~~ - -* `PyNaCl `__ (音声サポート用) - -なお、Linuxで音声サポートをインストールする場合は、上記のコマンドを実行する前に、お好みのパッケージマネージャー(apt、dnfなど)を使って以下のパッケージをインストールしておく必要があります。 - -* libffi-dev (システムによっては ``libffi-devel``) -* python-dev (例えばPython 3.6用の ``python3.6-dev``) - -簡単な例 --------------- - -.. code:: py - - import discord - - class MyClient(discord.Client): - async def on_ready(self): - print('Logged on as', self.user) - - async def on_message(self, message): - # don't respond to ourselves - if message.author == self.user: - return - - if message.content == 'ping': - await message.channel.send('pong') - - client = MyClient() - client.run('token') - -Botの例 -~~~~~~~~~~~~~ - -.. code:: py - - import discord - from discord.ext import commands - - bot = commands.Bot(command_prefix='>') - - @bot.command() - async def ping(ctx): - await ctx.send('pong') - - bot.run('token') - -その他の例は、examples ディレクトリにあります。 - -注意: ボットトークンを誰にも見せないようにしてください。 - -リンク ------- - -- `ドキュメント `_ -- `公式Discordサーバー `_ -- `Discord開発者 `_ -- `Discord API `_ diff --git a/docs/conf.py b/docs/conf.py index ffa6a4946f..f5dd030042 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -352,10 +352,4 @@ #texinfo_show_urls = 'footnote' # If true, do not generate a @detailmenu in the "Top" node's menu. -#texinfo_no_detailmenu = False - -def setup(app): - if app.config.language == 'ja': - app.config.intersphinx_mapping['py'] = ('https://docs.python.org/ja/3', None) - app.config.html_context['discord_invite'] = 'https://pycord.dev/discord' - app.config.resource_links['discord'] = 'https://pycord.dev/discord' +#texinfo_no_detailmenu = False \ No newline at end of file diff --git a/docs/locale/ja/LC_MESSAGES/api.po b/docs/locale/ja/LC_MESSAGES/api.po deleted file mode 100644 index 6b70149c5e..0000000000 --- a/docs/locale/ja/LC_MESSAGES/api.po +++ /dev/null @@ -1,19686 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: discordpy\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-10-23 22:41-0400\n" -"PO-Revision-Date: 2020-10-24 02:41+0000\n" -"Last-Translator: \n" -"Language: ja_JP\n" -"Language-Team: Japanese\n" -"Plural-Forms: nplurals=1; plural=0\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.5.3\n" - -#: ../../api.rst:4 -msgid "API Reference" -msgstr "APIリファレンス" - -#: ../../api.rst:6 -msgid "The following section outlines the API of discord.py." -msgstr "ここではdiscord.pyのAPIについて解説します。" - -#: ../../api.rst:10 -msgid "" -"This module uses the Python logging module to log diagnostic and errors " -"in an output independent way. If the logging module is not configured, " -"these logs will not be output anywhere. See :ref:`logging_setup` for " -"more information on how to set up and use the logging module with " -"discord.py." -msgstr "" -"このモジュールはPythonのloggingモジュールを使用して、出力に依存しない方法でエラーや診断の内容を記録します。loggingモジュールが設定されていない場合、これらのログはどこにも出力されません。discord.pyでloggingモジュールを使用する方法の詳細は" -" :ref:`logging_setup` を参照してください。" - -#: ../../api.rst:17 -msgid "Version Related Info" -msgstr "バージョン関連情報" - -#: ../../api.rst:19 -msgid "" -"There are two main ways to query version information about the library. " -"For guarantees, check :ref:`version_guarantees`." -msgstr "" -"ライブラリに関するバージョン情報を問い合わせる方法は主に二つあります。保証については :ref:`version_guarantees` " -"を参照してください。" - -#: ../../api.rst:23 -msgid "A named tuple that is similar to :obj:`py:sys.version_info`." -msgstr ":obj:`py:sys.version_info` に似た名前付きタプル。" - -#: ../../api.rst:25 -msgid "" -"Just like :obj:`py:sys.version_info` the valid values for " -"``releaselevel`` are 'alpha', 'beta', 'candidate' and 'final'." -msgstr "" -":obj:`py:sys.version_info` と同じように ``releaselevel`` の有効値は " -"'alpha'、'beta'、'candidate'、そして 'final' です。" - -#: ../../api.rst:30 -msgid "" -"A string representation of the version. e.g. ``'1.0.0rc1'``. This is " -"based off of :pep:`440`." -msgstr "``'1.0.0rc1'`` のようなバージョンの文字列表現。これは :pep:`440` に基づいています。" - -#: ../../api.rst:34 -msgid "Client" -msgstr "クライアント" - -#: discord.Client:1 of -msgid "" -"Represents a client connection that connects to Discord. This class is " -"used to interact with the Discord WebSocket and API." -msgstr "Discordに接続するクライアント接続を表します。このクラスは、DiscordのWebSocket、及びAPIとの対話に使用されます。" - -#: discord.Client:4 of -msgid "A number of options can be passed to the :class:`Client`." -msgstr "多くのオプションを :class:`Client` に渡すことが可能です。" - -#: ../../api.rst discord.Asset.save discord.AsyncWebhookAdapter -#: discord.AsyncWebhookAdapter.handle_execution_response -#: discord.AsyncWebhookAdapter.request discord.Attachment.read -#: discord.Attachment.save discord.Attachment.to_file -#: discord.AutoShardedClient.change_presence discord.AutoShardedClient.connect -#: discord.AutoShardedClient.request_offline_members -#: discord.CategoryChannel.clone discord.CategoryChannel.create_invite -#: discord.CategoryChannel.delete discord.CategoryChannel.edit -#: discord.CategoryChannel.overwrites_for -#: discord.CategoryChannel.permissions_for -#: discord.CategoryChannel.set_permissions discord.Client -#: discord.Client.before_identify_hook discord.Client.change_presence -#: discord.Client.connect discord.Client.create_guild -#: discord.Client.delete_invite discord.Client.fetch_guild -#: discord.Client.fetch_guilds discord.Client.fetch_invite -#: discord.Client.fetch_template discord.Client.fetch_user -#: discord.Client.fetch_user_profile discord.Client.fetch_widget -#: discord.Client.get_channel discord.Client.get_emoji discord.Client.get_guild -#: discord.Client.get_user discord.Client.login -#: discord.Client.request_offline_members discord.Client.wait_for -#: discord.ClientUser.avatar_url_as discord.ClientUser.create_group -#: discord.ClientUser.edit discord.ClientUser.edit_settings -#: discord.ClientUser.get_relationship discord.ClientUser.mentioned_in -#: discord.ClientUser.permissions_in discord.DMChannel.fetch_message -#: discord.DMChannel.history discord.DMChannel.permissions_for -#: discord.DMChannel.send discord.Embed.add_field discord.Embed.from_dict -#: discord.Embed.insert_field_at discord.Embed.remove_field -#: discord.Embed.set_author discord.Embed.set_field_at discord.Embed.set_footer -#: discord.Embed.set_image discord.Embed.set_thumbnail discord.Emoji.delete -#: discord.Emoji.edit discord.FFmpegOpusAudio -#: discord.FFmpegOpusAudio.from_probe discord.FFmpegOpusAudio.probe -#: discord.FFmpegPCMAudio discord.Game discord.GroupCall.voice_state_for -#: discord.GroupChannel.add_recipients discord.GroupChannel.edit -#: discord.GroupChannel.fetch_message discord.GroupChannel.history -#: discord.GroupChannel.permissions_for discord.GroupChannel.remove_recipients -#: discord.GroupChannel.send discord.Guild.audit_logs discord.Guild.ban -#: discord.Guild.banner_url_as discord.Guild.change_voice_state -#: discord.Guild.chunk discord.Guild.create_custom_emoji -#: discord.Guild.create_integration discord.Guild.create_role -#: discord.Guild.create_text_channel discord.Guild.create_voice_channel -#: discord.Guild.discovery_splash_url_as discord.Guild.edit -#: discord.Guild.edit_role_positions discord.Guild.estimate_pruned_members -#: discord.Guild.fetch_ban discord.Guild.fetch_emoji discord.Guild.fetch_member -#: discord.Guild.fetch_members discord.Guild.get_channel -#: discord.Guild.get_member discord.Guild.get_member_named -#: discord.Guild.get_role discord.Guild.icon_url_as discord.Guild.kick -#: discord.Guild.prune_members discord.Guild.query_members -#: discord.Guild.splash_url_as discord.Guild.unban discord.Integration.edit -#: discord.Invite.delete discord.Member.add_roles discord.Member.avatar_url_as -#: discord.Member.edit discord.Member.fetch_message discord.Member.history -#: discord.Member.mentioned_in discord.Member.move_to -#: discord.Member.permissions_in discord.Member.remove_roles -#: discord.Member.send discord.MemberCacheFlags.from_intents -#: discord.Message.add_reaction discord.Message.clear_reaction -#: discord.Message.delete discord.Message.edit discord.Message.pin -#: discord.Message.remove_reaction discord.Message.unpin -#: discord.PCMVolumeTransformer discord.PermissionOverwrite -#: discord.PermissionOverwrite.update discord.Permissions.update -#: discord.Reaction.remove discord.Reaction.users -#: discord.RequestsWebhookAdapter -#: discord.RequestsWebhookAdapter.handle_execution_response -#: discord.RequestsWebhookAdapter.request discord.Role.delete discord.Role.edit -#: discord.Template.create_guild discord.TextChannel.clone -#: discord.TextChannel.create_invite discord.TextChannel.create_webhook -#: discord.TextChannel.delete discord.TextChannel.delete_messages -#: discord.TextChannel.edit discord.TextChannel.fetch_message -#: discord.TextChannel.follow discord.TextChannel.history -#: discord.TextChannel.overwrites_for discord.TextChannel.permissions_for -#: discord.TextChannel.purge discord.TextChannel.send -#: discord.TextChannel.set_permissions discord.User.avatar_url_as -#: discord.User.fetch_message discord.User.history discord.User.mentioned_in -#: discord.User.permissions_in discord.User.send discord.VoiceChannel.clone -#: discord.VoiceChannel.connect discord.VoiceChannel.create_invite -#: discord.VoiceChannel.delete discord.VoiceChannel.edit -#: discord.VoiceChannel.overwrites_for discord.VoiceChannel.permissions_for -#: discord.VoiceChannel.set_permissions discord.VoiceClient.connect -#: discord.VoiceClient.move_to discord.VoiceClient.on_voice_server_update -#: discord.VoiceClient.on_voice_state_update discord.VoiceClient.play -#: discord.VoiceClient.send_audio_packet discord.VoiceProtocol -#: discord.VoiceProtocol.connect discord.VoiceProtocol.disconnect -#: discord.VoiceProtocol.on_voice_server_update -#: discord.VoiceProtocol.on_voice_state_update discord.Webhook.avatar_url_as -#: discord.Webhook.delete discord.Webhook.edit discord.Webhook.from_url -#: discord.Webhook.partial discord.Webhook.send -#: discord.WebhookAdapter.handle_execution_response -#: discord.WebhookAdapter.request discord.Widget.fetch_invite -#: discord.WidgetMember.avatar_url_as discord.WidgetMember.mentioned_in -#: discord.WidgetMember.permissions_in discord.abc.GuildChannel.clone -#: discord.abc.GuildChannel.create_invite discord.abc.GuildChannel.delete -#: discord.abc.GuildChannel.overwrites_for -#: discord.abc.GuildChannel.permissions_for -#: discord.abc.GuildChannel.set_permissions -#: discord.abc.Messageable.fetch_message discord.abc.Messageable.history -#: discord.abc.Messageable.send discord.opus.load_opus -#: discord.utils.escape_markdown discord.utils.escape_mentions -#: discord.utils.find discord.utils.get discord.utils.oauth_url -#: discord.utils.resolve_invite discord.utils.resolve_template -#: discord.utils.sleep_until discord.utils.snowflake_time of -msgid "Parameters" -msgstr "パラメータ" - -#: discord.Client:6 of -msgid "" -"The maximum number of messages to store in the internal message cache. " -"This defaults to ``1000``. Passing in ``None`` disables the message " -"cache. .. versionchanged:: 1.3 Allow disabling the message cache and" -" change the default size to ``1000``." -msgstr "" - -#: discord.Client:6 of -#, fuzzy -msgid "" -"The maximum number of messages to store in the internal message cache. " -"This defaults to ``1000``. Passing in ``None`` disables the message " -"cache." -msgstr "" -"内部のメッセージキャッシュに格納するメッセージの最大数。デフォルトでは5000に設定されています。 ``None`` " -"あるいは100未満の値を渡すと、渡された値の代わりにデフォルトの値が使用されます。" - -#: discord.Client:9 of -msgid "Allow disabling the message cache and change the default size to ``1000``." -msgstr "" - -#: discord.Client:12 of -msgid "" -"The :class:`asyncio.AbstractEventLoop` to use for asynchronous " -"operations. Defaults to ``None``, in which case the default event loop is" -" used via :func:`asyncio.get_event_loop()`." -msgstr "" -"非同期操作に使用する :class:`asyncio.AbstractEventLoop` 。デフォルトは ``None`` " -"です。この場合、デフォルトのイベントループは :func:`asyncio.get_event_loop()` を介して使用されます。" - -#: discord.Client:16 of -msgid "The connector to use for connection pooling." -msgstr "コネクションプーリングに使用するコネクタ。" - -#: discord.Client:18 of -msgid "Proxy URL." -msgstr "プロキシのURL。" - -#: discord.Client:20 of -msgid "An object that represents proxy HTTP Basic Authorization." -msgstr "プロキシのHTTP Basic認証を表すオブジェクト。" - -#: discord.Client:22 of -#, fuzzy -msgid "Integer starting at ``0`` and less than :attr:`.shard_count`." -msgstr "0から始まり、 :attr:`.shard_count` より小さい整数。" - -#: discord.Client:24 of -msgid "The total number of shards." -msgstr "Shardの総数。" - -#: discord.Client:26 of -msgid "" -"The intents that you want to enable for the session. This is a way of " -"disabling and enabling certain gateway events from triggering and being " -"sent. If not given, defaults to a regularly constructed :class:`Intents` " -"class. .. versionadded:: 1.5" -msgstr "" - -#: discord.Client:26 of -msgid "" -"The intents that you want to enable for the session. This is a way of " -"disabling and enabling certain gateway events from triggering and being " -"sent. If not given, defaults to a regularly constructed :class:`Intents` " -"class." -msgstr "" - -#: discord.Client:32 of -msgid "" -"Allows for finer control over how the library caches members. If not " -"given, defaults to cache as much as possible with the currently selected " -"intents. .. versionadded:: 1.5" -msgstr "" - -#: discord.Client:32 of -msgid "" -"Allows for finer control over how the library caches members. If not " -"given, defaults to cache as much as possible with the currently selected " -"intents." -msgstr "" - -#: discord.Client:38 of -msgid "A deprecated alias of ``chunk_guilds_at_startup``." -msgstr "" - -#: discord.Client:40 of -msgid "" -"Indicates if :func:`.on_ready` should be delayed to chunk all guilds at " -"start-up if necessary. This operation is incredibly slow for large " -"amounts of guilds. The default is ``True`` if :attr:`Intents.members` is " -"``True``. .. versionadded:: 1.5" -msgstr "" - -#: discord.Client:40 of -msgid "" -"Indicates if :func:`.on_ready` should be delayed to chunk all guilds at " -"start-up if necessary. This operation is incredibly slow for large " -"amounts of guilds. The default is ``True`` if :attr:`Intents.members` is " -"``True``." -msgstr "" - -#: discord.Client:47 of -msgid "A status to start your presence with upon logging on to Discord." -msgstr "Discordにログインした際の、開始時ステータス。" - -#: discord.Client:49 of -msgid "An activity to start your presence with upon logging on to Discord." -msgstr "Discordにログインした際の、開始時アクティビティ。" - -#: discord.Client:51 of -msgid "" -"Control how the client handles mentions by default on every message sent." -" .. versionadded:: 1.4" -msgstr "" - -#: discord.Client:51 of -msgid "Control how the client handles mentions by default on every message sent." -msgstr "" - -#: discord.Client:55 of -msgid "" -"The maximum numbers of seconds before timing out and restarting the " -"WebSocket in the case of not receiving a HEARTBEAT_ACK. Useful if " -"processing the initial packets take too long to the point of " -"disconnecting you. The default timeout is 60 seconds." -msgstr "HEARTBEAT_ACKを受信できない際に、WebSocketをタイムアウトさせて再起動するまでの最大秒数。最初のパケットの処理に時間がかかり、接続を切断できないというような状況時に便利です。デフォルトでは60秒に設定されています。" - -#: discord.Client:60 of -msgid "" -"The maximum number of seconds to wait for the GUILD_CREATE stream to end " -"before preparing the member cache and firing READY. The default timeout " -"is 2 seconds. .. versionadded:: 1.4" -msgstr "" - -#: discord.Client:60 of -msgid "" -"The maximum number of seconds to wait for the GUILD_CREATE stream to end " -"before preparing the member cache and firing READY. The default timeout " -"is 2 seconds." -msgstr "" - -#: discord.Client:65 of -msgid "" -"Whether to dispatch presence or typing events. Defaults to ``True``. .. " -"versionadded:: 1.3 .. warning:: If this is set to ``False`` then " -"the following features will be disabled: - No user related " -"updates (:func:`on_user_update` will not dispatch) - All member " -"related events will be disabled. - :func:`on_member_update`" -" - :func:`on_member_join` - " -":func:`on_member_remove` - Typing events will be disabled " -"(:func:`on_typing`). - If ``fetch_offline_members`` is set to " -"``False`` then the user cache will not exist. This makes it " -"difficult or impossible to do many things, for example: - " -"Computing permissions - Querying members in a voice channel " -"via :attr:`VoiceChannel.members` will be empty. - Most forms " -"of receiving :class:`Member` will be receiving " -":class:`User` instead, except for message events. - " -":attr:`Guild.owner` will usually resolve to ``None``. - " -":meth:`Guild.get_member` will usually be unavailable. - " -"Anything that involves using :class:`Member`. - :attr:`users`" -" will not be as populated. - etc. In short, this makes " -"it so the only member you can reliably query is the message author. " -"Useful for bots that do not require any state." -msgstr "" - -#: discord.Client:65 of -msgid "Whether to dispatch presence or typing events. Defaults to ``True``." -msgstr "" - -#: discord.Client:71 of -msgid "If this is set to ``False`` then the following features will be disabled:" -msgstr "" - -#: discord.Client:73 of -msgid "No user related updates (:func:`on_user_update` will not dispatch)" -msgstr "" - -#: discord.Client:77 of -msgid "All member related events will be disabled." -msgstr "" - -#: discord.Client:75 of -msgid ":func:`on_member_update`" -msgstr "" - -#: discord.Client:76 discord.Intents.members:5 of -msgid ":func:`on_member_join`" -msgstr "" - -#: discord.Client:77 discord.Intents.members:6 of -msgid ":func:`on_member_remove`" -msgstr "" - -#: discord.Client:79 of -msgid "Typing events will be disabled (:func:`on_typing`)." -msgstr "" - -#: discord.Client:80 of -msgid "" -"If ``fetch_offline_members`` is set to ``False`` then the user cache will" -" not exist. This makes it difficult or impossible to do many things, for " -"example:" -msgstr "" - -#: discord.Client:83 of -msgid "Computing permissions" -msgstr "" - -#: discord.Client:84 of -msgid "" -"Querying members in a voice channel via :attr:`VoiceChannel.members` will" -" be empty." -msgstr "" - -#: discord.Client:85 of -msgid "" -"Most forms of receiving :class:`Member` will be receiving :class:`User` " -"instead, except for message events." -msgstr "" - -#: discord.Client:87 of -msgid ":attr:`Guild.owner` will usually resolve to ``None``." -msgstr "" - -#: discord.Client:88 of -msgid ":meth:`Guild.get_member` will usually be unavailable." -msgstr "" - -#: discord.Client:89 of -msgid "Anything that involves using :class:`Member`." -msgstr "" - -#: discord.Client:90 of -msgid ":attr:`users` will not be as populated." -msgstr "" - -#: discord.Client:91 of -#, fuzzy -msgid "etc." -msgstr "その他" - -#: discord.Client:93 of -msgid "" -"In short, this makes it so the only member you can reliably query is the " -"message author. Useful for bots that do not require any state." -msgstr "" - -#: discord.Client:96 of -msgid "" -"Whether to assume the system clock is unsynced. This applies to the " -"ratelimit handling code. If this is set to ``True``, the default, then " -"the library uses the time to reset a rate limit bucket given by Discord. " -"If this is ``False`` then your system clock is used to calculate how long" -" to sleep for. If this is set to ``False`` it is recommended to sync your" -" system clock to Google's NTP server. .. versionadded:: 1.3" -msgstr "" - -#: discord.Client:96 of -msgid "" -"Whether to assume the system clock is unsynced. This applies to the " -"ratelimit handling code. If this is set to ``True``, the default, then " -"the library uses the time to reset a rate limit bucket given by Discord. " -"If this is ``False`` then your system clock is used to calculate how long" -" to sleep for. If this is set to ``False`` it is recommended to sync your" -" system clock to Google's NTP server." -msgstr "" - -#: discord.Client:107 of -msgid "" -"The websocket gateway the client is currently connected to. Could be " -"``None``." -msgstr "クライアントが現在接続しているWebSocketゲートウェイ。 ``None`` でもかまいません。" - -#: discord.Client:111 of -#, fuzzy -msgid "" -"The event loop that the client uses for HTTP requests and websocket " -"operations." -msgstr "" -":class:`asyncio.AbstractEventLoop` -- " -"クライアントのHTTPリクエストとWebSocket操作に使われるイベントループ。" - -#: ../../api.rst discord.Activity discord.Activity.end -#: discord.Activity.large_image_text discord.Activity.large_image_url -#: discord.Activity.small_image_text discord.Activity.small_image_url -#: discord.Activity.start discord.AllowedMentions discord.AppInfo -#: discord.AppInfo.cover_image_url discord.AppInfo.guild -#: discord.AppInfo.icon_url discord.Attachment discord.AuditLogEntry -#: discord.AuditLogEntry.after discord.AuditLogEntry.before -#: discord.AuditLogEntry.category discord.AuditLogEntry.changes -#: discord.AuditLogEntry.created_at discord.AutoShardedClient -#: discord.AutoShardedClient.latencies discord.AutoShardedClient.latency -#: discord.AutoShardedClient.shards discord.BaseActivity.created_at -#: discord.CallMessage discord.CallMessage.call_ended -#: discord.CallMessage.channel discord.CategoryChannel -#: discord.CategoryChannel.category discord.CategoryChannel.changed_roles -#: discord.CategoryChannel.channels discord.CategoryChannel.created_at -#: discord.CategoryChannel.mention discord.CategoryChannel.permissions_synced -#: discord.CategoryChannel.text_channels discord.CategoryChannel.type -#: discord.CategoryChannel.voice_channels discord.Client -#: discord.Client.activity discord.Client.allowed_mentions -#: discord.Client.cached_messages discord.Client.emojis discord.Client.guilds -#: discord.Client.intents discord.Client.latency -#: discord.Client.private_channels discord.Client.user discord.Client.users -#: discord.Client.voice_clients discord.ClientUser -#: discord.ClientUser.avatar_url discord.ClientUser.blocked -#: discord.ClientUser.color discord.ClientUser.colour -#: discord.ClientUser.created_at discord.ClientUser.default_avatar -#: discord.ClientUser.default_avatar_url discord.ClientUser.display_name -#: discord.ClientUser.friends discord.ClientUser.mention -#: discord.ClientUser.public_flags discord.ClientUser.relationships -#: discord.Colour discord.Colour.b discord.Colour.g discord.Colour.r -#: discord.ConnectionClosed discord.CustomActivity discord.CustomActivity.type -#: discord.DMChannel discord.DMChannel.created_at discord.DMChannel.type -#: discord.Embed discord.Embed.author discord.Embed.fields discord.Embed.footer -#: discord.Embed.image discord.Embed.provider discord.Embed.thumbnail -#: discord.Embed.video discord.Emoji discord.Emoji.created_at -#: discord.Emoji.guild discord.Emoji.roles discord.Emoji.url discord.File -#: discord.Game discord.Game.end discord.Game.start discord.Game.type -#: discord.GroupCall discord.GroupCall.channel discord.GroupCall.connected -#: discord.GroupChannel discord.GroupChannel.created_at -#: discord.GroupChannel.icon_url discord.GroupChannel.type discord.Guild -#: discord.Guild.banner_url discord.Guild.bitrate_limit -#: discord.Guild.categories discord.Guild.channels discord.Guild.chunked -#: discord.Guild.created_at discord.Guild.default_role -#: discord.Guild.discovery_splash_url discord.Guild.emoji_limit -#: discord.Guild.filesize_limit discord.Guild.icon_url discord.Guild.large -#: discord.Guild.me discord.Guild.member_count discord.Guild.members -#: discord.Guild.owner discord.Guild.premium_subscribers -#: discord.Guild.public_updates_channel discord.Guild.roles -#: discord.Guild.rules_channel discord.Guild.shard_id discord.Guild.splash_url -#: discord.Guild.system_channel discord.Guild.system_channel_flags -#: discord.Guild.text_channels discord.Guild.voice_channels -#: discord.Guild.voice_client discord.HTTPException discord.Integration -#: discord.IntegrationAccount discord.Intents discord.Intents.bans -#: discord.Intents.dm_messages discord.Intents.dm_reactions -#: discord.Intents.dm_typing discord.Intents.emojis -#: discord.Intents.guild_messages discord.Intents.guild_reactions -#: discord.Intents.guild_typing discord.Intents.guilds -#: discord.Intents.integrations discord.Intents.invites discord.Intents.members -#: discord.Intents.messages discord.Intents.presences discord.Intents.reactions -#: discord.Intents.typing discord.Intents.voice_states discord.Intents.webhooks -#: discord.Invite discord.Invite.id discord.Invite.url discord.Member -#: discord.Member.activity discord.Member.color discord.Member.colour -#: discord.Member.desktop_status discord.Member.display_name -#: discord.Member.guild_permissions discord.Member.mention -#: discord.Member.mobile_status discord.Member.raw_status discord.Member.roles -#: discord.Member.status discord.Member.top_role discord.Member.voice -#: discord.Member.web_status discord.MemberCacheFlags -#: discord.MemberCacheFlags.joined discord.MemberCacheFlags.online -#: discord.MemberCacheFlags.voice discord.Message discord.Message.clean_content -#: discord.Message.created_at discord.Message.edited_at discord.Message.guild -#: discord.Message.jump_url discord.Message.raw_channel_mentions -#: discord.Message.raw_mentions discord.Message.raw_role_mentions -#: discord.Message.system_content discord.MessageFlags -#: discord.MessageFlags.crossposted discord.MessageFlags.is_crossposted -#: discord.MessageFlags.source_message_deleted -#: discord.MessageFlags.suppress_embeds discord.MessageFlags.urgent -#: discord.MessageReference discord.MessageReference.cached_message -#: discord.Object discord.Object.created_at discord.PCMAudio -#: discord.PartialEmoji discord.PartialEmoji.url discord.PartialInviteChannel -#: discord.PartialInviteChannel.created_at discord.PartialInviteChannel.mention -#: discord.PartialInviteGuild discord.PartialInviteGuild.banner_url -#: discord.PartialInviteGuild.created_at discord.PartialInviteGuild.icon_url -#: discord.PartialInviteGuild.splash_url discord.Permissions -#: discord.Permissions.add_reactions discord.Permissions.administrator -#: discord.Permissions.attach_files discord.Permissions.ban_members -#: discord.Permissions.change_nickname discord.Permissions.connect -#: discord.Permissions.create_instant_invite discord.Permissions.deafen_members -#: discord.Permissions.embed_links discord.Permissions.external_emojis -#: discord.Permissions.kick_members discord.Permissions.manage_channels -#: discord.Permissions.manage_emojis discord.Permissions.manage_guild -#: discord.Permissions.manage_messages discord.Permissions.manage_nicknames -#: discord.Permissions.manage_permissions discord.Permissions.manage_roles -#: discord.Permissions.manage_webhooks discord.Permissions.mention_everyone -#: discord.Permissions.move_members discord.Permissions.mute_members -#: discord.Permissions.priority_speaker -#: discord.Permissions.read_message_history discord.Permissions.read_messages -#: discord.Permissions.send_messages discord.Permissions.send_tts_messages -#: discord.Permissions.speak discord.Permissions.stream -#: discord.Permissions.use_external_emojis -#: discord.Permissions.use_voice_activation discord.Permissions.view_audit_log -#: discord.Permissions.view_channel discord.Permissions.view_guild_insights -#: discord.PrivilegedIntentsRequired discord.PublicUserFlags -#: discord.PublicUserFlags.bug_hunter -#: discord.PublicUserFlags.bug_hunter_level_2 -#: discord.PublicUserFlags.early_supporter -#: discord.PublicUserFlags.early_verified_bot_developer -#: discord.PublicUserFlags.hypesquad discord.PublicUserFlags.hypesquad_balance -#: discord.PublicUserFlags.hypesquad_bravery -#: discord.PublicUserFlags.hypesquad_brilliance discord.PublicUserFlags.partner -#: discord.PublicUserFlags.staff discord.PublicUserFlags.system -#: discord.PublicUserFlags.team_user discord.PublicUserFlags.verified_bot -#: discord.PublicUserFlags.verified_bot_developer -#: discord.RawBulkMessageDeleteEvent discord.RawMessageDeleteEvent -#: discord.RawMessageUpdateEvent discord.RawReactionActionEvent -#: discord.RawReactionClearEmojiEvent discord.RawReactionClearEvent -#: discord.Reaction discord.Reaction.custom_emoji discord.Relationship -#: discord.Role discord.Role.color discord.Role.colour discord.Role.created_at -#: discord.Role.members discord.Role.mention discord.Role.permissions -#: discord.ShardInfo discord.ShardInfo.latency discord.Spotify.album -#: discord.Spotify.album_cover_url discord.Spotify.artist -#: discord.Spotify.artists discord.Spotify.color discord.Spotify.colour -#: discord.Spotify.created_at discord.Spotify.duration discord.Spotify.end -#: discord.Spotify.name discord.Spotify.party_id discord.Spotify.start -#: discord.Spotify.title discord.Spotify.track_id discord.Spotify.type -#: discord.Streaming discord.Streaming.twitch_name discord.Streaming.type -#: discord.SystemChannelFlags discord.SystemChannelFlags.join_notifications -#: discord.SystemChannelFlags.premium_subscriptions discord.Team -#: discord.Team.icon_url discord.Team.owner discord.TeamMember discord.Template -#: discord.TextChannel discord.TextChannel.category -#: discord.TextChannel.changed_roles discord.TextChannel.created_at -#: discord.TextChannel.members discord.TextChannel.mention -#: discord.TextChannel.permissions_synced discord.TextChannel.type discord.User -#: discord.User.avatar_url discord.User.color discord.User.colour -#: discord.User.created_at discord.User.default_avatar -#: discord.User.default_avatar_url discord.User.display_name -#: discord.User.dm_channel discord.User.mention discord.User.public_flags -#: discord.User.relationship discord.VoiceChannel discord.VoiceChannel.category -#: discord.VoiceChannel.changed_roles discord.VoiceChannel.created_at -#: discord.VoiceChannel.members discord.VoiceChannel.mention -#: discord.VoiceChannel.permissions_synced discord.VoiceChannel.type -#: discord.VoiceClient discord.VoiceClient.average_latency -#: discord.VoiceClient.guild discord.VoiceClient.latency -#: discord.VoiceClient.source discord.VoiceClient.user discord.VoiceState -#: discord.Webhook discord.Webhook.avatar_url discord.Webhook.channel -#: discord.Webhook.created_at discord.Webhook.guild discord.Webhook.url -#: discord.WebhookAdapter discord.Widget discord.Widget.created_at -#: discord.Widget.invite_url discord.Widget.json_url discord.WidgetChannel -#: discord.WidgetChannel.created_at discord.WidgetChannel.mention -#: discord.WidgetMember discord.WidgetMember.avatar_url -#: discord.WidgetMember.color discord.WidgetMember.colour -#: discord.WidgetMember.created_at discord.WidgetMember.default_avatar -#: discord.WidgetMember.default_avatar_url discord.WidgetMember.display_name -#: discord.WidgetMember.mention discord.WidgetMember.public_flags -#: discord.abc.GuildChannel discord.abc.GuildChannel.category -#: discord.abc.GuildChannel.changed_roles discord.abc.GuildChannel.created_at -#: discord.abc.GuildChannel.mention discord.abc.GuildChannel.permissions_synced -#: discord.abc.PrivateChannel discord.abc.Snowflake -#: discord.abc.Snowflake.created_at discord.abc.User -#: discord.abc.User.display_name discord.abc.User.mention -#: discord.opus.OpusError of -msgid "type" -msgstr "" - -#: discord.Client:113 discord.VoiceClient:41 of -msgid ":class:`asyncio.AbstractEventLoop`" -msgstr "" - -#: discord.AutoShardedClient.latency:1 discord.Client.latency:1 of -msgid "Measures latency between a HEARTBEAT and a HEARTBEAT_ACK in seconds." -msgstr "" - -#: discord.Client.latency:3 of -msgid "This could be referred to as the Discord WebSocket protocol latency." -msgstr "これはDiscord WebSocketプロトコルの待ち時間とも言えます。" - -#: discord.AutoShardedClient.latency:7 discord.Client.latency:5 -#: discord.Guild.bitrate_limit:3 discord.ShardInfo.latency:3 -#: discord.VoiceClient.average_latency:5 discord.VoiceClient.latency:8 of -#, fuzzy -msgid ":class:`float`" -msgstr ":class:`str`" - -#: discord.Client.user:1 of -#, fuzzy -msgid "Represents the connected client. ``None`` if not logged in." -msgstr "Optional[:class:`.ClientUser`] -- 接続しているクライアントを表します。接続していない場合はNoneです。" - -#: discord.Client.user:3 of -#, fuzzy -msgid "Optional[:class:`.ClientUser`]" -msgstr ":class:`~discord.ClientUser`" - -#: discord.Client.guilds:1 of -#, fuzzy -msgid "The guilds that the connected client is a member of." -msgstr "List[:class:`.Guild`] -- 接続したクライアントがメンバーであるギルド。" - -#: discord.Client.guilds:3 of -#, fuzzy -msgid "List[:class:`.Guild`]" -msgstr ":class:`.Guild`" - -#: discord.Client.emojis:1 of -#, fuzzy -msgid "The emojis that the connected client has." -msgstr "List[:class:`.Emoji`] -- 接続したクライアントがアクセスできる絵文字。" - -#: discord.Client.emojis:3 of -#, fuzzy -msgid "List[:class:`.Emoji`]" -msgstr ":class:`.Webhook`" - -#: discord.Client.cached_messages:1 of -#, fuzzy -msgid "Read-only list of messages the connected client has cached." -msgstr "Sequence[:class:`.Message`] -- 接続されたクライアントにキャッシュされたメッセージの読み取り専用リスト。" - -#: discord.Client.cached_messages:5 of -msgid "Sequence[:class:`.Message`]" -msgstr "" - -#: discord.Client.private_channels:1 of -#, fuzzy -msgid "The private channels that the connected client is participating on." -msgstr "List[:class:`.abc.PrivateChannel`] -- 接続されたクライアントが参加しているプライベートチャンネル。" - -#: discord.Client.private_channels:5 of -msgid "" -"This returns only up to 128 most recent private channels due to an " -"internal working on how Discord deals with private channels." -msgstr "Discordでのプライベートチャンネルの取扱いは内部的に処理されているため、これは最新のプライベートチャンネルから最大128個までしか取得できません。" - -#: discord.Client.private_channels:8 of -msgid "List[:class:`.abc.PrivateChannel`]" -msgstr "" - -#: discord.Client.voice_clients:1 of -#, fuzzy -msgid "Represents a list of voice connections." -msgstr "Discordの音声接続を表します。" - -#: discord.Client.voice_clients:3 of -msgid "These are usually :class:`.VoiceClient` instances." -msgstr "" - -#: discord.Client.voice_clients:5 of -msgid "List[:class:`.VoiceProtocol`]" -msgstr "" - -#: discord.Client.is_ready:1 of -#, fuzzy -msgid ":class:`bool`: Specifies if the client's internal cache is ready for use." -msgstr "クライアントの内部キャッシュを使用できる状態にするかどうかを指定します。" - -#: ../../api.rst:2025 ../../api.rst:2033 ../../api.rst:2044 ../../api.rst:2064 -#: discord.Asset.read:1 discord.Asset.save:1 discord.Attachment.read:1 -#: discord.Attachment.save:1 discord.Attachment.to_file:1 -#: discord.AutoShardedClient.change_presence:1 -#: discord.AutoShardedClient.close:1 discord.AutoShardedClient.connect:1 -#: discord.AutoShardedClient.request_offline_members:1 -#: discord.CategoryChannel.clone:1 discord.CategoryChannel.create_invite:1 -#: discord.CategoryChannel.create_text_channel:1 -#: discord.CategoryChannel.create_voice_channel:1 -#: discord.CategoryChannel.delete:1 discord.CategoryChannel.edit:1 -#: discord.CategoryChannel.invites:1 discord.CategoryChannel.set_permissions:1 -#: discord.Client.application_info:1 discord.Client.before_identify_hook:1 -#: discord.Client.change_presence:1 discord.Client.close:1 -#: discord.Client.connect:1 discord.Client.create_guild:1 -#: discord.Client.delete_invite:1 discord.Client.fetch_channel:1 -#: discord.Client.fetch_guild:1 discord.Client.fetch_guilds:1 -#: discord.Client.fetch_invite:1 discord.Client.fetch_template:1 -#: discord.Client.fetch_user:1 discord.Client.fetch_user_profile:1 -#: discord.Client.fetch_webhook:1 discord.Client.fetch_widget:1 -#: discord.Client.login:1 discord.Client.logout:1 discord.Client.on_error:1 -#: discord.Client.request_offline_members:1 discord.Client.start:1 -#: discord.Client.wait_for:1 discord.Client.wait_until_ready:1 -#: discord.ClientUser.create_group:1 discord.ClientUser.edit:1 -#: discord.ClientUser.edit_settings:1 discord.DMChannel.fetch_message:1 -#: discord.DMChannel.pins:1 discord.DMChannel.send:1 -#: discord.DMChannel.trigger_typing:1 discord.Emoji.delete:1 -#: discord.Emoji.edit:1 discord.FFmpegOpusAudio.from_probe:1 -#: discord.FFmpegOpusAudio.probe:1 discord.GroupChannel.add_recipients:1 -#: discord.GroupChannel.edit:1 discord.GroupChannel.fetch_message:1 -#: discord.GroupChannel.leave:1 discord.GroupChannel.pins:1 -#: discord.GroupChannel.remove_recipients:1 discord.GroupChannel.send:1 -#: discord.GroupChannel.trigger_typing:1 discord.Guild.ack:1 -#: discord.Guild.ban:1 discord.Guild.bans:1 discord.Guild.change_voice_state:1 -#: discord.Guild.chunk:1 discord.Guild.create_category:1 -#: discord.Guild.create_category_channel:1 discord.Guild.create_custom_emoji:1 -#: discord.Guild.create_integration:1 discord.Guild.create_role:1 -#: discord.Guild.create_text_channel:1 discord.Guild.create_voice_channel:1 -#: discord.Guild.delete:1 discord.Guild.edit:1 -#: discord.Guild.edit_role_positions:1 discord.Guild.estimate_pruned_members:1 -#: discord.Guild.fetch_ban:1 discord.Guild.fetch_channels:1 -#: discord.Guild.fetch_emoji:1 discord.Guild.fetch_emojis:1 -#: discord.Guild.fetch_member:1 discord.Guild.fetch_members:1 -#: discord.Guild.fetch_roles:1 discord.Guild.integrations:1 -#: discord.Guild.invites:1 discord.Guild.kick:1 discord.Guild.leave:1 -#: discord.Guild.prune_members:1 discord.Guild.query_members:1 -#: discord.Guild.unban:1 discord.Guild.vanity_invite:1 discord.Guild.webhooks:1 -#: discord.Guild.widget:1 discord.Integration.delete:1 -#: discord.Integration.edit:1 discord.Integration.sync:1 -#: discord.Invite.delete:1 discord.Member.add_roles:1 discord.Member.ban:1 -#: discord.Member.block:1 discord.Member.edit:1 discord.Member.fetch_message:1 -#: discord.Member.kick:1 discord.Member.move_to:1 -#: discord.Member.mutual_friends:1 discord.Member.pins:1 -#: discord.Member.profile:1 discord.Member.remove_friend:1 -#: discord.Member.remove_roles:1 discord.Member.send:1 -#: discord.Member.send_friend_request:1 discord.Member.trigger_typing:1 -#: discord.Member.unban:1 discord.Member.unblock:1 discord.Message.ack:1 -#: discord.Message.add_reaction:1 discord.Message.clear_reaction:1 -#: discord.Message.clear_reactions:1 discord.Message.delete:1 -#: discord.Message.edit:1 discord.Message.pin:1 discord.Message.publish:1 -#: discord.Message.remove_reaction:1 discord.Message.unpin:1 -#: discord.Reaction.clear:1 discord.Reaction.remove:1 -#: discord.Relationship.accept:1 discord.Relationship.delete:1 -#: discord.Role.delete:1 discord.Role.edit:1 discord.ShardInfo.connect:1 -#: discord.ShardInfo.disconnect:1 discord.ShardInfo.reconnect:1 -#: discord.Template.create_guild:1 discord.TextChannel.clone:1 -#: discord.TextChannel.create_invite:1 discord.TextChannel.create_webhook:1 -#: discord.TextChannel.delete:1 discord.TextChannel.delete_messages:1 -#: discord.TextChannel.edit:1 discord.TextChannel.fetch_message:1 -#: discord.TextChannel.invites:1 discord.TextChannel.pins:1 -#: discord.TextChannel.purge:1 discord.TextChannel.send:1 -#: discord.TextChannel.set_permissions:1 discord.TextChannel.trigger_typing:1 -#: discord.TextChannel.webhooks:1 discord.User.block:1 -#: discord.User.fetch_message:1 discord.User.mutual_friends:1 -#: discord.User.pins:1 discord.User.profile:1 discord.User.remove_friend:1 -#: discord.User.send:1 discord.User.send_friend_request:1 -#: discord.User.trigger_typing:1 discord.User.unblock:1 -#: discord.VoiceChannel.clone:1 discord.VoiceChannel.connect:1 -#: discord.VoiceChannel.create_invite:1 discord.VoiceChannel.delete:1 -#: discord.VoiceChannel.edit:1 discord.VoiceChannel.invites:1 -#: discord.VoiceChannel.set_permissions:1 discord.VoiceClient.connect:1 -#: discord.VoiceClient.disconnect:1 discord.VoiceClient.move_to:1 -#: discord.VoiceClient.on_voice_server_update:1 -#: discord.VoiceClient.on_voice_state_update:1 discord.VoiceProtocol.connect:1 -#: discord.VoiceProtocol.disconnect:1 -#: discord.VoiceProtocol.on_voice_server_update:1 -#: discord.VoiceProtocol.on_voice_state_update:1 discord.Widget.fetch_invite:1 -#: discord.abc.GuildChannel.clone:1 discord.abc.GuildChannel.create_invite:1 -#: discord.abc.GuildChannel.delete:1 discord.abc.GuildChannel.invites:1 -#: discord.abc.GuildChannel.set_permissions:1 -#: discord.abc.Messageable.fetch_message:1 discord.abc.Messageable.pins:1 -#: discord.abc.Messageable.send:1 discord.abc.Messageable.trigger_typing:1 -#: discord.utils.sleep_until:1 of -msgid "|coro|" -msgstr "|coro|" - -#: discord.Client.on_error:3 of -msgid "The default error handler provided by the client." -msgstr "クライアントによって提供されるデフォルトのエラーハンドラ。" - -#: discord.Client.on_error:5 of -msgid "" -"By default this prints to :data:`sys.stderr` however it could be " -"overridden to have a different implementation. Check " -":func:`~discord.on_error` for more details." -msgstr "" -"デフォルトでは、これは :data:`sys.stderr` に出力されますが、異なる実装によって上書きされる可能性があります。詳細については " -":func:`~discord.on_error` を確認してください。" - -#: discord.Client.request_offline_members:3 of -msgid "" -"Requests previously offline members from the guild to be filled up into " -"the :attr:`.Guild.members` cache. This function is usually not called. It" -" should only be used if you have the ``fetch_offline_members`` parameter " -"set to ``False``." -msgstr "" -"ギルドのオフラインメンバーを :attr:`.Guild.members` " -"キャッシュへ書き込むよう要求します。この関数は通常呼び出されることはありません。 ``fetch_offline_members`` パラメータが" -" ``False`` の場合にのみ使用してください。" - -#: discord.Client.request_offline_members:8 of -msgid "" -"When the client logs on and connects to the websocket, Discord does not " -"provide the library with offline members if the number of members in the " -"guild is larger than 250. You can check if a guild is large if " -":attr:`.Guild.large` is ``True``." -msgstr "" -"クライアントがWebSocketに接続し、ログインするとき、ギルド内のメンバー数が250よりも大きいならば、Discordはライブラリにオフラインメンバーを提供しません。" -" :attr:`.Guild.large` が ``True`` かどうかでギルドが大きいかどうかを確認することができます。" - -#: discord.AutoShardedClient.request_offline_members:15 -#: discord.Client.request_offline_members:15 of -#, fuzzy -msgid "This method is deprecated. Use :meth:`Guild.chunk` instead." -msgstr "このメソッドはAPIを呼び出します。通常は :meth:`get_guild` を代わりとして使用してください。" - -#: discord.AutoShardedClient.request_offline_members:17 -#: discord.Client.request_offline_members:17 of -msgid "An argument list of guilds to request offline members for." -msgstr "オフラインメンバーを要求したいギルドのリスト。" - -#: discord.Asset.read discord.Asset.save discord.Attachment.read -#: discord.Attachment.save discord.Attachment.to_file -#: discord.AutoShardedClient.change_presence discord.AutoShardedClient.connect -#: discord.AutoShardedClient.request_offline_members -#: discord.CategoryChannel.clone discord.CategoryChannel.create_invite -#: discord.CategoryChannel.delete discord.CategoryChannel.edit -#: discord.CategoryChannel.invites discord.CategoryChannel.set_permissions -#: discord.Client.application_info discord.Client.change_presence -#: discord.Client.connect discord.Client.create_guild -#: discord.Client.delete_invite discord.Client.event -#: discord.Client.fetch_channel discord.Client.fetch_guild -#: discord.Client.fetch_guilds discord.Client.fetch_invite -#: discord.Client.fetch_template discord.Client.fetch_user -#: discord.Client.fetch_user_profile discord.Client.fetch_webhook -#: discord.Client.fetch_widget discord.Client.login -#: discord.Client.request_offline_members discord.Client.start -#: discord.Client.wait_for discord.ClientUser.avatar_url_as -#: discord.ClientUser.create_group discord.ClientUser.edit -#: discord.ClientUser.edit_settings discord.DMChannel.fetch_message -#: discord.DMChannel.history discord.DMChannel.pins discord.DMChannel.send -#: discord.Embed.set_field_at discord.Emoji.delete discord.Emoji.edit -#: discord.FFmpegOpusAudio discord.FFmpegOpusAudio.from_probe -#: discord.FFmpegOpusAudio.probe discord.FFmpegPCMAudio -#: discord.GroupChannel.add_recipients discord.GroupChannel.edit -#: discord.GroupChannel.fetch_message discord.GroupChannel.history -#: discord.GroupChannel.leave discord.GroupChannel.pins -#: discord.GroupChannel.remove_recipients discord.GroupChannel.send -#: discord.Guild.ack discord.Guild.audit_logs discord.Guild.ban -#: discord.Guild.banner_url_as discord.Guild.bans discord.Guild.chunk -#: discord.Guild.create_category discord.Guild.create_category_channel -#: discord.Guild.create_custom_emoji discord.Guild.create_integration -#: discord.Guild.create_role discord.Guild.create_text_channel -#: discord.Guild.create_voice_channel discord.Guild.delete -#: discord.Guild.discovery_splash_url_as discord.Guild.edit -#: discord.Guild.edit_role_positions discord.Guild.estimate_pruned_members -#: discord.Guild.fetch_ban discord.Guild.fetch_channels -#: discord.Guild.fetch_emoji discord.Guild.fetch_emojis -#: discord.Guild.fetch_member discord.Guild.fetch_members -#: discord.Guild.fetch_roles discord.Guild.icon_url_as -#: discord.Guild.integrations discord.Guild.invites discord.Guild.kick -#: discord.Guild.leave discord.Guild.prune_members discord.Guild.query_members -#: discord.Guild.splash_url_as discord.Guild.unban discord.Guild.vanity_invite -#: discord.Guild.webhooks discord.Guild.widget discord.Integration.delete -#: discord.Integration.edit discord.Integration.sync discord.Invite.delete -#: discord.Member.add_roles discord.Member.avatar_url_as discord.Member.block -#: discord.Member.edit discord.Member.fetch_message discord.Member.history -#: discord.Member.mutual_friends discord.Member.pins discord.Member.profile -#: discord.Member.remove_friend discord.Member.remove_roles discord.Member.send -#: discord.Member.send_friend_request discord.Member.unblock -#: discord.Message.ack discord.Message.add_reaction -#: discord.Message.clear_reaction discord.Message.clear_reactions -#: discord.Message.delete discord.Message.edit discord.Message.pin -#: discord.Message.publish discord.Message.remove_reaction -#: discord.Message.unpin discord.PCMVolumeTransformer discord.Reaction.clear -#: discord.Reaction.remove discord.Reaction.users discord.Relationship.accept -#: discord.Relationship.delete discord.Role.delete discord.Role.edit -#: discord.Template.create_guild discord.TextChannel.clone -#: discord.TextChannel.create_invite discord.TextChannel.create_webhook -#: discord.TextChannel.delete discord.TextChannel.delete_messages -#: discord.TextChannel.edit discord.TextChannel.fetch_message -#: discord.TextChannel.follow discord.TextChannel.history -#: discord.TextChannel.invites discord.TextChannel.pins -#: discord.TextChannel.purge discord.TextChannel.send -#: discord.TextChannel.set_permissions discord.TextChannel.webhooks -#: discord.User.avatar_url_as discord.User.block discord.User.fetch_message -#: discord.User.history discord.User.mutual_friends discord.User.pins -#: discord.User.profile discord.User.remove_friend discord.User.send -#: discord.User.send_friend_request discord.User.unblock -#: discord.VoiceChannel.clone discord.VoiceChannel.connect -#: discord.VoiceChannel.create_invite discord.VoiceChannel.delete -#: discord.VoiceChannel.edit discord.VoiceChannel.invites -#: discord.VoiceChannel.set_permissions discord.VoiceClient.play -#: discord.VoiceClient.send_audio_packet discord.Webhook.avatar_url_as -#: discord.Webhook.delete discord.Webhook.edit discord.Webhook.from_url -#: discord.Webhook.send discord.WidgetMember.avatar_url_as -#: discord.abc.GuildChannel.clone discord.abc.GuildChannel.create_invite -#: discord.abc.GuildChannel.delete discord.abc.GuildChannel.invites -#: discord.abc.GuildChannel.set_permissions -#: discord.abc.Messageable.fetch_message discord.abc.Messageable.history -#: discord.abc.Messageable.pins discord.abc.Messageable.send of -#, fuzzy -msgid "Raises" -msgstr "例外" - -#: discord.AutoShardedClient.request_offline_members:20 -#: discord.Client.request_offline_members:20 of -#, fuzzy -msgid "If any guild is unavailable in the collection." -msgstr ":exc:`InvalidArgument` -- いずれかのギルドが利用できない、またはコレクション内のギルドが大きくない。" - -#: discord.Client.before_identify_hook:3 of -msgid "" -"A hook that is called before IDENTIFYing a session. This is useful if you" -" wish to have more control over the synchronization of multiple " -"IDENTIFYing clients." -msgstr "" - -#: discord.Client.before_identify_hook:7 of -msgid "The default implementation sleeps for 5 seconds." -msgstr "" - -#: discord.Client.before_identify_hook:11 of -msgid "The shard ID that requested being IDENTIFY'd" -msgstr "" - -#: discord.Client.before_identify_hook:13 of -msgid "Whether this IDENTIFY is the first initial IDENTIFY." -msgstr "" - -#: discord.Client.login:3 of -msgid "Logs in the client with the specified credentials." -msgstr "指定された資格情報を使用してクライアントにログインします。" - -#: discord.Client.login:5 of -msgid "This function can be used in two different ways." -msgstr "この関数は、異なる二通りの方法で使用することができます。" - -#: discord.Client.login:9 of -#, fuzzy -msgid "" -"Logging on with a user token is against the Discord `Terms of Service " -"`_ and doing " -"so might potentially get your account banned. Use this at your own risk." -msgstr "" -"ユーザートークンを用いてのログインはDiscordの `利用規約 `_ に違反しているため、アカウントを停止される可能性があります。自己責任で使用してください。" - -#: discord.Client.login:14 of -msgid "" -"The authentication token. Do not prefix this token with anything as the " -"library will do it for you." -msgstr "認証用のトークン。このライブラリが処理するため、トークンの頭に何も付けないでください。" - -#: discord.Client.login:17 of -msgid "" -"Keyword argument that specifies if the account logging on is a bot token " -"or not." -msgstr "ログインに使用しているアカウントがBotのトークンであるかを指定するキーワード引数。" - -#: discord.Client.login:21 of -#, fuzzy -msgid "The wrong credentials are passed." -msgstr ":exc:`.LoginFailure` -- 誤った資格情報が渡された。" - -#: discord.Client.login:22 of -#, fuzzy -msgid "" -"An unknown HTTP related error occurred, usually when it isn't 200 or " -"the known incorrect credentials passing status code." -msgstr "" -":exc:`.HTTPException` -- " -"不明なHTTP関連のエラーが発生した。通常、ステータスコードが200でないか、既知の誤った資格情報がステータスコードを渡しています。" - -#: discord.Client.logout:3 of -msgid "Logs out of Discord and closes all connections." -msgstr "Discordからログアウトし、すべての接続を終了します。" - -#: discord.Client.logout:7 of -msgid "" -"This is just an alias to :meth:`close`. If you want to do extraneous " -"cleanup when subclassing, it is suggested to override :meth:`close` " -"instead." -msgstr "" -"これは :meth:`close` の別名です。サブクラス化する場合に外部のクリーンアップを行いたい場合は、代わりに :meth:`close` " -"を上書きすることをお勧めします。" - -#: discord.AutoShardedClient.connect:3 discord.Client.connect:3 of -msgid "" -"Creates a websocket connection and lets the websocket listen to messages " -"from Discord. This is a loop that runs the entire event system and " -"miscellaneous aspects of the library. Control is not resumed until the " -"WebSocket connection is terminated." -msgstr "WebSocket接続を作成し、Discordからのメッセージをリッスンできるようにします。これはイベントシステム全体とライブラリの様々な機能を実行するループです。WebSocket接続が終了するまで、制御は再開されません。" - -#: discord.AutoShardedClient.connect:8 discord.Client.connect:8 of -msgid "" -"If we should attempt reconnecting, either due to internet failure or a " -"specific failure on Discord's part. Certain disconnects that lead to bad " -"state will not be handled (such as invalid sharding payloads or bad " -"tokens)." -msgstr "インターネットの障害やDiscord側の特定の障害が発生した際に再接続を試みるかどうかを表します。不正な状態へつながることによる特定の切断(無効なシャーディングペイロードや不正なトークンなど)は処理されません。" - -#: discord.AutoShardedClient.connect:14 discord.Client.connect:14 of -#, fuzzy -msgid "" -"If the gateway to connect to Discord is not found. Usually if this is" -" thrown then there is a Discord API outage." -msgstr "" -":exc:`.GatewayNotFound` -- " -"Discordに接続するゲートウェイが見つからない。通常、これが発生した場合はAPIの停止が考えられます。" - -#: discord.AutoShardedClient.connect:15 discord.Client.connect:15 of -#, fuzzy -msgid "The websocket connection has been terminated." -msgstr ":exc:`.ConnectionClosed` -- WebSocket接続が終了した。" - -#: discord.AutoShardedClient.close:3 discord.Client.close:3 of -msgid "Closes the connection to Discord." -msgstr "Discordとの接続を閉じます。" - -#: discord.Client.clear:1 of -msgid "Clears the internal state of the bot." -msgstr "Botの内部状態をクリアします。" - -#: discord.Client.clear:3 of -msgid "" -"After this, the bot can be considered \"re-opened\", i.e. " -":meth:`is_closed` and :meth:`is_ready` both return ``False`` along with " -"the bot's internal cache cleared." -msgstr "" -"これが実行されると、Botは「再オープン」されたとみなされます。そのため、 :meth:`is_closed` や " -":meth:`is_ready` は ``False`` を返し、内部のキャッシュもクリアされます。" - -#: discord.Client.start:3 of -msgid "A shorthand coroutine for :meth:`login` + :meth:`connect`." -msgstr ":meth:`login` + :meth:`connect` を簡略化したコルーチン。" - -#: discord.Client.start:5 of -#, fuzzy -msgid "An unexpected keyword argument was received." -msgstr ":exc:`TypeError` -- 予期しないキーワード引数を受け取った。" - -#: discord.Client.run:1 of -msgid "" -"A blocking call that abstracts away the event loop initialisation from " -"you." -msgstr "イベントループの初期化を抽象化するブロッキングコール。" - -#: discord.Client.run:4 of -msgid "" -"If you want more control over the event loop then this function should " -"not be used. Use :meth:`start` coroutine or :meth:`connect` + " -":meth:`login`." -msgstr "" -"イベントループをより詳細に制御するには、この関数を使用しないでください。 :meth:`start` または :meth:`connect` + " -":meth:`login` を使用してください。" - -#: discord.Client.run:8 of -msgid "Roughly Equivalent to: ::" -msgstr "おおよそ次のものに相当:" - -#: discord.Client.run:20 of -msgid "" -"This function must be the last function to call due to the fact that it " -"is blocking. That means that registration of events or anything being " -"called after this function call will not execute until it returns." -msgstr "この関数はブロッキングを行うため、必ず最後に呼び出してください。この関数を呼び出した後に呼び出されるイベントや関数は、Botが停止するまで実行されません。" - -#: discord.Client.is_closed:1 of -#, fuzzy -msgid ":class:`bool`: Indicates if the websocket connection is closed." -msgstr "WebSocketが閉じられているかどうかを表します。" - -#: discord.Client.activity:1 of -msgid "The activity being used upon logging in." -msgstr "" - -#: discord.Client.activity:4 of -msgid "Optional[:class:`.BaseActivity`]" -msgstr "" - -#: discord.Client.allowed_mentions:1 of -msgid "The allowed mention configuration." -msgstr "" - -#: discord.Client.allowed_mentions:5 of -#, fuzzy -msgid "Optional[:class:`~discord.AllowedMentions`]" -msgstr ":class:`~discord.ClientUser`" - -#: discord.Client.intents:1 of -msgid "The intents configured for this connection." -msgstr "" - -#: discord.Client.intents:5 of -#, fuzzy -msgid ":class:`Intents`" -msgstr ":class:`bytes`" - -#: discord.Client.users:1 of -#, fuzzy -msgid "Returns a list of all the users the bot can see." -msgstr "List[:class:`~discord.User`] -- ボットが見ることができるすべてのユーザーのリストを返します。" - -#: discord.Client.users:3 of -#, fuzzy -msgid "List[:class:`~discord.User`]" -msgstr ":class:`~discord.User`" - -#: discord.Client.get_channel:1 discord.Guild.get_channel:1 of -#, fuzzy -msgid "Returns a channel with the given ID." -msgstr "このユーザーと :class:`DMChannel` を作ります。" - -#: discord.Client.get_channel:3 discord.Client.get_emoji:3 -#: discord.Client.get_guild:3 discord.Client.get_user:3 -#: discord.Guild.get_channel:3 discord.Guild.get_member:3 -#: discord.Guild.get_role:3 of -#, fuzzy -msgid "The ID to search for." -msgstr "検索するイテラブル。" - -#: ../../api.rst discord.Asset.read discord.Asset.save discord.Attachment.read -#: discord.Attachment.save discord.Attachment.to_file discord.AudioSource.read -#: discord.CallMessage.duration discord.CategoryChannel.clone -#: discord.CategoryChannel.create_invite -#: discord.CategoryChannel.create_text_channel -#: discord.CategoryChannel.create_voice_channel discord.CategoryChannel.invites -#: discord.CategoryChannel.overwrites discord.CategoryChannel.overwrites_for -#: discord.CategoryChannel.permissions_for discord.Client.application_info -#: discord.Client.create_guild discord.Client.fetch_channel -#: discord.Client.fetch_guild discord.Client.fetch_invite -#: discord.Client.fetch_template discord.Client.fetch_user -#: discord.Client.fetch_user_profile discord.Client.fetch_webhook -#: discord.Client.fetch_widget discord.Client.get_channel -#: discord.Client.get_emoji discord.Client.get_guild discord.Client.get_user -#: discord.Client.wait_for discord.ClientUser.avatar_url_as -#: discord.ClientUser.create_group discord.ClientUser.edit_settings -#: discord.ClientUser.get_relationship discord.ClientUser.mentioned_in -#: discord.DMChannel.fetch_message discord.DMChannel.permissions_for -#: discord.DMChannel.pins discord.DMChannel.send -#: discord.FFmpegOpusAudio.from_probe discord.FFmpegOpusAudio.probe -#: discord.FFmpegOpusAudio.read discord.FFmpegPCMAudio.read -#: discord.GroupCall.voice_state_for discord.GroupChannel.fetch_message -#: discord.GroupChannel.permissions_for discord.GroupChannel.pins -#: discord.GroupChannel.send discord.Guild.banner_url_as discord.Guild.bans -#: discord.Guild.by_category discord.Guild.create_category -#: discord.Guild.create_category_channel discord.Guild.create_custom_emoji -#: discord.Guild.create_role discord.Guild.create_text_channel -#: discord.Guild.create_voice_channel discord.Guild.discovery_splash_url_as -#: discord.Guild.edit_role_positions discord.Guild.estimate_pruned_members -#: discord.Guild.fetch_ban discord.Guild.fetch_channels -#: discord.Guild.fetch_emoji discord.Guild.fetch_emojis -#: discord.Guild.fetch_member discord.Guild.fetch_roles -#: discord.Guild.get_channel discord.Guild.get_member -#: discord.Guild.get_member_named discord.Guild.get_role -#: discord.Guild.icon_url_as discord.Guild.integrations discord.Guild.invites -#: discord.Guild.prune_members discord.Guild.query_members -#: discord.Guild.splash_url_as discord.Guild.vanity_invite -#: discord.Guild.webhooks discord.Guild.widget discord.Member.avatar_url_as -#: discord.Member.create_dm discord.Member.fetch_message -#: discord.Member.mentioned_in discord.Member.mutual_friends -#: discord.Member.permissions_in discord.Member.pins discord.Member.profile -#: discord.Member.send discord.MemberCacheFlags.from_intents -#: discord.PCMAudio.read discord.PCMVolumeTransformer.read -#: discord.PartialInviteGuild.banner_url_as -#: discord.PartialInviteGuild.icon_url_as -#: discord.PartialInviteGuild.splash_url_as -#: discord.PermissionOverwrite.is_empty discord.Template.create_guild -#: discord.TextChannel.clone discord.TextChannel.create_invite -#: discord.TextChannel.create_webhook discord.TextChannel.fetch_message -#: discord.TextChannel.follow discord.TextChannel.invites -#: discord.TextChannel.last_message discord.TextChannel.overwrites -#: discord.TextChannel.overwrites_for discord.TextChannel.permissions_for -#: discord.TextChannel.pins discord.TextChannel.purge discord.TextChannel.send -#: discord.TextChannel.webhooks discord.User.avatar_url_as -#: discord.User.create_dm discord.User.fetch_message discord.User.mentioned_in -#: discord.User.mutual_friends discord.User.pins discord.User.profile -#: discord.User.send discord.VoiceChannel.clone discord.VoiceChannel.connect -#: discord.VoiceChannel.create_invite discord.VoiceChannel.invites -#: discord.VoiceChannel.overwrites discord.VoiceChannel.overwrites_for -#: discord.VoiceChannel.permissions_for discord.VoiceChannel.voice_states -#: discord.Webhook.avatar_url_as discord.Webhook.from_url -#: discord.Webhook.partial discord.Webhook.send discord.Widget.fetch_invite -#: discord.WidgetMember.avatar_url_as discord.WidgetMember.mentioned_in -#: discord.abc.GuildChannel.clone discord.abc.GuildChannel.create_invite -#: discord.abc.GuildChannel.invites discord.abc.GuildChannel.overwrites -#: discord.abc.GuildChannel.overwrites_for -#: discord.abc.GuildChannel.permissions_for -#: discord.abc.Messageable.fetch_message discord.abc.Messageable.pins -#: discord.abc.Messageable.send discord.opus.is_loaded -#: discord.utils.escape_markdown discord.utils.escape_mentions -#: discord.utils.oauth_url discord.utils.resolve_invite -#: discord.utils.resolve_template discord.utils.snowflake_time of -msgid "Returns" -msgstr "戻り値" - -#: discord.Client.get_channel:6 discord.Guild.get_channel:6 of -msgid "The returned channel or ``None`` if not found." -msgstr "" - -#: ../../api.rst discord.Asset.read discord.Asset.save discord.Attachment.read -#: discord.Attachment.save discord.Attachment.to_file discord.AudioSource.read -#: discord.CallMessage.duration discord.CategoryChannel.clone -#: discord.CategoryChannel.create_invite -#: discord.CategoryChannel.create_text_channel -#: discord.CategoryChannel.create_voice_channel discord.CategoryChannel.invites -#: discord.CategoryChannel.overwrites discord.CategoryChannel.overwrites_for -#: discord.CategoryChannel.permissions_for discord.Client.application_info -#: discord.Client.create_guild discord.Client.fetch_channel -#: discord.Client.fetch_guild discord.Client.fetch_invite -#: discord.Client.fetch_template discord.Client.fetch_user -#: discord.Client.fetch_user_profile discord.Client.fetch_webhook -#: discord.Client.fetch_widget discord.Client.get_channel -#: discord.Client.get_emoji discord.Client.get_guild discord.Client.get_user -#: discord.Client.wait_for discord.ClientUser.avatar_url_as -#: discord.ClientUser.create_group discord.ClientUser.edit_settings -#: discord.ClientUser.get_relationship discord.ClientUser.mentioned_in -#: discord.DMChannel.fetch_message discord.DMChannel.permissions_for -#: discord.DMChannel.pins discord.DMChannel.send -#: discord.FFmpegOpusAudio.from_probe discord.FFmpegOpusAudio.probe -#: discord.FFmpegOpusAudio.read discord.FFmpegPCMAudio.read -#: discord.GroupCall.voice_state_for discord.GroupChannel.fetch_message -#: discord.GroupChannel.permissions_for discord.GroupChannel.pins -#: discord.GroupChannel.send discord.Guild.banner_url_as discord.Guild.bans -#: discord.Guild.by_category discord.Guild.create_category -#: discord.Guild.create_category_channel discord.Guild.create_custom_emoji -#: discord.Guild.create_role discord.Guild.create_text_channel -#: discord.Guild.create_voice_channel discord.Guild.discovery_splash_url_as -#: discord.Guild.edit_role_positions discord.Guild.estimate_pruned_members -#: discord.Guild.fetch_ban discord.Guild.fetch_channels -#: discord.Guild.fetch_emoji discord.Guild.fetch_emojis -#: discord.Guild.fetch_member discord.Guild.fetch_roles -#: discord.Guild.get_channel discord.Guild.get_member -#: discord.Guild.get_member_named discord.Guild.get_role -#: discord.Guild.icon_url_as discord.Guild.integrations discord.Guild.invites -#: discord.Guild.prune_members discord.Guild.query_members -#: discord.Guild.splash_url_as discord.Guild.vanity_invite -#: discord.Guild.webhooks discord.Guild.widget discord.Member.avatar_url_as -#: discord.Member.create_dm discord.Member.fetch_message -#: discord.Member.mentioned_in discord.Member.mutual_friends -#: discord.Member.permissions_in discord.Member.pins discord.Member.profile -#: discord.Member.send discord.MemberCacheFlags.from_intents -#: discord.PCMAudio.read discord.PCMVolumeTransformer.read -#: discord.PartialInviteGuild.banner_url_as -#: discord.PartialInviteGuild.icon_url_as -#: discord.PartialInviteGuild.splash_url_as -#: discord.PermissionOverwrite.is_empty discord.Template.create_guild -#: discord.TextChannel.clone discord.TextChannel.create_invite -#: discord.TextChannel.create_webhook discord.TextChannel.fetch_message -#: discord.TextChannel.follow discord.TextChannel.invites -#: discord.TextChannel.last_message discord.TextChannel.overwrites -#: discord.TextChannel.overwrites_for discord.TextChannel.permissions_for -#: discord.TextChannel.pins discord.TextChannel.purge discord.TextChannel.send -#: discord.TextChannel.webhooks discord.User.avatar_url_as -#: discord.User.create_dm discord.User.fetch_message discord.User.mentioned_in -#: discord.User.mutual_friends discord.User.pins discord.User.profile -#: discord.User.send discord.VoiceChannel.clone discord.VoiceChannel.connect -#: discord.VoiceChannel.create_invite discord.VoiceChannel.invites -#: discord.VoiceChannel.overwrites discord.VoiceChannel.overwrites_for -#: discord.VoiceChannel.permissions_for discord.VoiceChannel.voice_states -#: discord.Webhook.avatar_url_as discord.Webhook.from_url -#: discord.Webhook.partial discord.Webhook.send discord.Widget.fetch_invite -#: discord.WidgetMember.avatar_url_as discord.WidgetMember.mentioned_in -#: discord.abc.GuildChannel.clone discord.abc.GuildChannel.create_invite -#: discord.abc.GuildChannel.invites discord.abc.GuildChannel.overwrites -#: discord.abc.GuildChannel.overwrites_for -#: discord.abc.GuildChannel.permissions_for -#: discord.abc.Messageable.fetch_message discord.abc.Messageable.pins -#: discord.abc.Messageable.send discord.opus.is_loaded -#: discord.utils.escape_markdown discord.utils.escape_mentions -#: discord.utils.oauth_url discord.utils.resolve_invite -#: discord.utils.resolve_template discord.utils.snowflake_time of -msgid "Return type" -msgstr "戻り値の型" - -#: discord.Client.get_channel:7 of -#, fuzzy -msgid "Optional[Union[:class:`.abc.GuildChannel`, :class:`.Thread`, :class:`.abc.PrivateChannel`]]" -msgstr "Union[:class:`.abc.GuildChannel`, :class:`.Thread`, :class:`.abc.PrivateChannel`]" - -#: discord.Client.get_guild:1 of -#, fuzzy -msgid "Returns a guild with the given ID." -msgstr "Optional[:class:`.Guild`]: 与えられたIDを持つギルドを返します。" - -#: discord.Client.get_guild:6 of -msgid "The guild or ``None`` if not found." -msgstr "" - -#: discord.Client.get_guild:7 of -#, fuzzy -msgid "Optional[:class:`.Guild`]" -msgstr ":class:`.Guild`" - -#: discord.Client.get_user:1 of -#, fuzzy -msgid "Returns a user with the given ID." -msgstr "Optional[:class:`~discord.User`]: 与えられたIDを持つユーザーを返します。" - -#: discord.Client.get_user:6 of -msgid "The user or ``None`` if not found." -msgstr "" - -#: discord.Client.get_user:7 of -#, fuzzy -msgid "Optional[:class:`~discord.User`]" -msgstr ":class:`~discord.User`" - -#: discord.Client.get_emoji:1 of -#, fuzzy -msgid "Returns an emoji with the given ID." -msgstr "Optional[:class:`.Emoji`]: 与えられたIDを持つ絵文字を返します。" - -#: discord.Client.get_emoji:6 of -msgid "The custom emoji or ``None`` if not found." -msgstr "" - -#: discord.Client.get_emoji:7 of -msgid "Optional[:class:`.Emoji`]" -msgstr "" - -#: discord.Client.get_all_channels:1 of -msgid "" -"A generator that retrieves every :class:`.abc.GuildChannel` the client " -"can 'access'." -msgstr "クライアントが「アクセス」できるすべての :class:`.abc.GuildChannel` のジェネレータを取得します。" - -#: discord.Client.get_all_channels:3 discord.Client.get_all_members:3 of -msgid "This is equivalent to: ::" -msgstr "使用例:" - -#: discord.Client.get_all_channels:11 of -msgid "" -"Just because you receive a :class:`.abc.GuildChannel` does not mean that " -"you can communicate in said channel. " -":meth:`.abc.GuildChannel.permissions_for` should be used for that." -msgstr "" -":class:`.abc.GuildChannel` " -"を受け取ったからと言って、そのチャンネルで発言ができるという意味ではありません。発言可能なチャンネルのみを取得したいのなら、 " -":meth:`.abc.GuildChannel.permissions_for` を使いましょう。" - -#: discord.Client.fetch_guilds discord.Client.get_all_channels -#: discord.Client.get_all_members discord.DMChannel.history -#: discord.GroupChannel.history discord.Guild.audit_logs -#: discord.Guild.fetch_members discord.Member.history discord.Reaction.users -#: discord.TextChannel.history discord.User.history -#: discord.abc.Messageable.history of -msgid "Yields" -msgstr "Yieldする値" - -#: discord.Client.get_all_channels:15 of -#, fuzzy -msgid ":class:`.abc.GuildChannel` -- A channel the client can 'access'." -msgstr "クライアントが「アクセス」できるすべての :class:`.abc.GuildChannel` のジェネレータを取得します。" - -#: discord.Client.get_all_members:1 of -msgid "Returns a generator with every :class:`.Member` the client can see." -msgstr "クライアントが参照可能なすべての :class:`.Member` のジェネレータを返します。" - -#: discord.Client.get_all_members:9 of -#, fuzzy -msgid ":class:`.Member` -- A member the client can see." -msgstr "クライアントが参照可能なすべての :class:`.Member` のジェネレータを返します。" - -#: discord.Client.wait_until_ready:3 of -msgid "Waits until the client's internal cache is all ready." -msgstr "クライアントの内部キャッシュの準備が完了するまで待機します。" - -#: discord.Client.wait_for:3 of -msgid "Waits for a WebSocket event to be dispatched." -msgstr "WebSocketイベントがディスパッチされるまで待機します。" - -#: discord.Client.wait_for:5 of -msgid "" -"This could be used to wait for a user to reply to a message, or to react " -"to a message, or to edit a message in a self-contained way." -msgstr "メッセージの送信者が、メッセージに返信したり、リアクションをつけたり、編集したりする、自己完結型の処理に利用できます。" - -#: discord.Client.wait_for:9 of -msgid "" -"The ``timeout`` parameter is passed onto :func:`asyncio.wait_for`. By " -"default, it does not timeout. Note that this does propagate the " -":exc:`asyncio.TimeoutError` for you in case of timeout and is provided " -"for ease of use." -msgstr "" -"``timeout`` パラメータは :func:`asyncio.wait_for` " -"に渡されます。デフォルトではタイムアウトしません。タイムアウトした際に :exc:`asyncio.TimeoutError` " -"が発生するのは、使いやすさを考慮したためです。" - -#: discord.Client.wait_for:14 of -msgid "" -"In case the event returns multiple arguments, a :class:`tuple` containing" -" those arguments is returned instead. Please check the " -":ref:`documentation ` for a list of events and their " -"parameters." -msgstr "" -"イベントが複数の引数を返す場合は、それらを含む :class:`tuple` が代わりに返ります。イベントとそのパラメーターについては " -":ref:`ドキュメント ` を参照してください。" - -#: discord.Client.wait_for:19 of -msgid "This function returns the **first event that meets the requirements**." -msgstr "この関数は **条件を満たす最初のイベント** を返します。" - -#: discord.CategoryChannel.set_permissions:21 discord.Client.fetch_guilds:15 -#: discord.Client.wait_for:22 discord.DMChannel.history:6 -#: discord.FFmpegOpusAudio.from_probe:7 discord.GroupChannel.history:6 -#: discord.Guild.audit_logs:6 discord.Guild.create_text_channel:20 -#: discord.Guild.fetch_members:25 discord.Member.history:6 -#: discord.Reaction.users:7 discord.TextChannel.history:6 -#: discord.TextChannel.purge:17 discord.TextChannel.set_permissions:21 -#: discord.User.history:6 discord.VoiceChannel.set_permissions:21 -#: discord.abc.GuildChannel.set_permissions:21 -#: discord.abc.Messageable.history:6 discord.utils.get:16 of -msgid "Examples" -msgstr "例" - -#: discord.Client.wait_for:23 of -msgid "Waiting for a user reply: ::" -msgstr "ユーザーからの返信を待つ場合: ::" - -#: discord.Client.wait_for:37 of -msgid "Waiting for a thumbs up reaction from the message author: ::" -msgstr "メッセージ送信者がサムズアップリアクションを付けるのを待つ場合: ::" - -#: discord.Client.wait_for:55 of -msgid "" -"The event name, similar to the :ref:`event reference `, but without the ``on_`` prefix, to wait for." -msgstr "" -"イベント名は :ref:`イベントリファレンス ` に似ていますが接頭詞の ``on_`` " -"が必要ありません。" - -#: discord.Client.wait_for:58 of -msgid "" -"A predicate to check what to wait for. The arguments must meet the " -"parameters of the event being waited for." -msgstr "待っているものに該当するかを確認する関数。引数は待機しているイベントのパラメータを満たしている必要があります。" - -#: discord.Client.wait_for:61 of -msgid "" -"The number of seconds to wait before timing out and raising " -":exc:`asyncio.TimeoutError`." -msgstr "タイムアウトして :exc:`asyncio.TimeoutError` が発生するまでの秒数。" - -#: discord.Client.wait_for:65 of -#, fuzzy -msgid "If a timeout is provided and it was reached." -msgstr ":exc:`asyncio.TimeoutError` -- タイムアウト値が設定されていて、かつその時間が経過した。" - -#: discord.Client.wait_for:67 of -msgid "" -"Returns no arguments, a single argument, or a :class:`tuple` of multiple " -"arguments that mirrors the parameters passed in the :ref:`event reference" -" `." -msgstr "" -"単一の引数、あるいは :ref:`イベントリファレンス ` のパラメータを反映した複数の引数の値を含む " -":class:`tuple` が返ります。返る引数がない場合もあります。" - -#: discord.Client.event:1 of -msgid "A decorator that registers an event to listen to." -msgstr "リッスンするイベントを登録するデコレータ。" - -#: discord.Client.event:3 of -msgid "" -"You can find more info about the events on the :ref:`documentation below " -"`." -msgstr "イベントの詳細については :ref:`以下のドキュメント ` を参照してください。" - -#: discord.Client.event:5 of -msgid "" -"The events must be a :ref:`coroutine `, if not, " -":exc:`TypeError` is raised." -msgstr "イベントは :ref:`コルーチン ` でなければいけません。違う場合は :exc:`TypeError` が発生します。" - -#: discord.Client.change_presence:6 discord.Client.event:8 of -msgid "Example" -msgstr "例" - -#: discord.Client.event:15 of -#, fuzzy -msgid "The coroutine passed is not actually a coroutine." -msgstr ":exc:`TypeError` -- 渡されたコルーチンが実際にはコルーチンではない。" - -#: discord.AutoShardedClient.change_presence:3 discord.Client.change_presence:3 -#: of -msgid "Changes the client's presence." -msgstr "クライアントのプレゼンスを変更します。" - -#: discord.AutoShardedClient.change_presence:10 -#: discord.Client.change_presence:12 of -msgid "The activity being done. ``None`` if no currently active activity is done." -msgstr "実行中のアクティビティ。何も実行していない場合は ``None`` です。" - -#: discord.Client.change_presence:14 of -msgid "" -"Indicates what status to change to. If ``None``, then " -":attr:`.Status.online` is used." -msgstr "変更するステータスを示します。 ``None`` の場合、:attr:`.Status.online`となります。" - -#: discord.AutoShardedClient.change_presence:15 -#: discord.Client.change_presence:17 of -msgid "" -"Indicates if you are going AFK. This allows the discord client to know " -"how to handle push notifications better for you in case you are actually " -"idle and not lying." -msgstr "AFKの状態にするかを示します。これによって、実際に退席中の場合に、Discordクライアントにプッシュ通知をよりよく扱わせることができます。" - -#: discord.Client.change_presence:22 of -#, fuzzy -msgid "If the ``activity`` parameter is not the proper type." -msgstr ":exc:`.InvalidArgument` -- ``activity`` に渡された値が適切な型でない。" - -#: discord.Client.fetch_guilds:3 of -msgid "Retrieves an :class:`.AsyncIterator` that enables receiving your guilds." -msgstr "Botが所属するGuildを取得できる、 :class:`AsyncIterator` を取得します。" - -#: discord.Client.fetch_guilds:7 of -msgid "" -"Using this, you will only receive :attr:`.Guild.owner`, " -":attr:`.Guild.icon`, :attr:`.Guild.id`, and :attr:`.Guild.name` per " -":class:`.Guild`." -msgstr "" -"これを使った場合、各 :class:`Guild` の :attr:`Guild.owner` 、 :attr:`Guild.icon` 、 " -":attr:`Guild.id` 、 :attr:`Guild.name` のみ取得できます。" - -#: discord.Client.fetch_guilds:12 of -msgid "" -"This method is an API call. For general usage, consider :attr:`guilds` " -"instead." -msgstr "これはAPIを呼び出します。通常は :attr:`guilds` を代わりに使用してください。" - -#: discord.Client.fetch_guilds:16 discord.DMChannel.history:7 -#: discord.GroupChannel.history:7 discord.Guild.fetch_members:26 -#: discord.Member.history:7 discord.Reaction.users:8 -#: discord.TextChannel.history:7 discord.User.history:7 -#: discord.abc.Messageable.history:7 of -msgid "Usage ::" -msgstr "使い方 ::" - -#: discord.Client.fetch_guilds:21 discord.Guild.fetch_members:31 of -msgid "Flattening into a list ::" -msgstr "リストへフラット化 ::" - -#: discord.Client.fetch_guilds:26 discord.DMChannel.history:19 -#: discord.GroupChannel.history:19 discord.Guild.fetch_members:11 -#: discord.Member.edit:21 discord.Member.history:19 -#: discord.TextChannel.history:19 discord.User.history:19 -#: discord.abc.Messageable.history:19 of -msgid "All parameters are optional." -msgstr "すべてのパラメータがオプションです。" - -#: discord.Client.fetch_guilds:28 of -#, fuzzy -msgid "" -"The number of guilds to retrieve. If ``None``, it retrieves every guild " -"you have access to. Note, however, that this would make it a slow " -"operation. Defaults to ``100``." -msgstr "" -"取得するギルドの数。 ``None`` " -"の場合、あなたがアクセスできるギルドすべてを取得します。ただし、これには時間がかかります。デフォルトは100です。" - -#: discord.Client.fetch_guilds:33 of -msgid "" -"Retrieves guilds before this date or object. If a date is provided it " -"must be a timezone-naive datetime representing UTC time." -msgstr "" -"この日付またはオブジェクトの前のGuildを取得します。もし日付が与えられた場合は、それはUTC時刻を表し、timezone " -"naiveであるdatetimeでないといけません。" - -#: discord.Client.fetch_guilds:36 of -msgid "" -"Retrieve guilds after this date or object. If a date is provided it must " -"be a timezone-naive datetime representing UTC time." -msgstr "" -"この日付またはオブジェクトの後のGuildを取得します。もし日付が与えられた場合は、それはUTC時刻を表し、timezone " -"naiveであるdatetimeでないといけません。" - -#: discord.Client.fetch_guilds:40 of -#, fuzzy -msgid "Getting the guilds failed." -msgstr "ギルドのアイコンの変更" - -#: discord.Client.fetch_guilds:42 of -msgid ":class:`.Guild` -- The guild with the guild data parsed." -msgstr ":class:`.Guild` -- データを解析したGuild。" - -#: discord.Client.fetch_template:3 of -#, fuzzy -msgid "Gets a :class:`.Template` from a discord.new URL or code." -msgstr ":class:`.Invite` をdiscord.gg URLやIDから取得します。" - -#: discord.Client.fetch_template:5 of -#, fuzzy -msgid "The Discord Template Code or URL (must be a discord.new URL)." -msgstr "Discordの招待ID、またはURL(discord.gg URLである必要があります)。" - -#: discord.Client.fetch_template:8 of -#, fuzzy -msgid "The template is invalid." -msgstr "メンバーがオンライン。" - -#: discord.Client.fetch_template:9 of -msgid "Getting the template failed." -msgstr "" - -#: discord.Client.fetch_template:11 of -#, fuzzy -msgid "The template from the URL/code." -msgstr "ギルドの名前。" - -#: discord.Client.fetch_template:12 of -#, fuzzy -msgid ":class:`.Template`" -msgstr ":class:`.Widget`" - -#: discord.Client.fetch_guild:3 of -msgid "Retrieves a :class:`.Guild` from an ID." -msgstr "IDから :class:`.Guild` を取得します。" - -#: discord.Client.fetch_guild:7 of -#, fuzzy -msgid "" -"Using this, you will **not** receive :attr:`.Guild.channels`, " -":attr:`.Guild.members`, :attr:`.Member.activity` and " -":attr:`.Member.voice` per :class:`.Member`." -msgstr "" -"これを使用した場合、 :attr:`.Guild.channels`、 :class:`.Guild.members` 、そして各 " -":class:`.Member` ごとの :attr:`.Member.activity` 、 :attr:`.Member.voice` " -"を取得することは **できません** 。" - -#: discord.Client.fetch_guild:12 of -msgid "" -"This method is an API call. For general usage, consider :meth:`get_guild`" -" instead." -msgstr "このメソッドはAPIを呼び出します。通常は :meth:`get_guild` を代わりとして使用してください。" - -#: discord.Client.fetch_guild:14 of -msgid "The guild's ID to fetch from." -msgstr "取得したいギルドのID。" - -#: discord.Client.fetch_guild:17 discord.Guild.fetch_member:12 of -#, fuzzy -msgid "You do not have access to the guild." -msgstr ":exc:`.Forbidden` -- ギルドにアクセスできない。" - -#: discord.Client.fetch_guild:18 of -#, fuzzy -msgid "Getting the guild failed." -msgstr "ギルドのアイコンの変更" - -#: discord.Client.fetch_guild:20 of -msgid "The guild from the ID." -msgstr "IDから取得したギルド。" - -#: discord.Client.create_guild:25 discord.Client.fetch_guild:21 -#: discord.Template.create_guild:21 of -msgid ":class:`.Guild`" -msgstr ":class:`.Guild`" - -#: discord.Client.create_guild:3 of -msgid "Creates a :class:`.Guild`." -msgstr ":class:`.Guild` を作成します。" - -#: discord.Client.create_guild:5 discord.Template.create_guild:5 of -msgid "Bot accounts in more than 10 guilds are not allowed to create guilds." -msgstr "10以上のギルドに参加しているBotアカウントはギルドの作成ができません。" - -#: discord.Client.create_guild:7 discord.Template.create_guild:7 of -msgid "The name of the guild." -msgstr "ギルドの名前。" - -#: discord.Client.create_guild:9 discord.Template.create_guild:9 of -msgid "" -"The region for the voice communication server. Defaults to " -":attr:`.VoiceRegion.us_west`." -msgstr "ボイスチャンネルの通信サーバーのリージョンです。デフォルトは :attr:`.VoiceRegion.us_west` です。" - -#: discord.Client.create_guild:12 discord.Template.create_guild:12 of -msgid "" -"The :term:`py:bytes-like object` representing the icon. See " -":meth:`.ClientUser.edit` for more details on what is expected." -msgstr "" -"アイコンを表す :term:`py:bytes-like object` です。 :meth:`.ClientUser.edit` " -"で、予期されるデータの詳細を確認してください。" - -#: discord.Client.create_guild:15 of -msgid "The code for a template to create the guild with. .. versionadded:: 1.4" -msgstr "" - -#: discord.Client.create_guild:15 of -msgid "The code for a template to create the guild with." -msgstr "" - -#: discord.Client.create_guild:20 discord.Template.create_guild:16 of -#, fuzzy -msgid "Guild creation failed." -msgstr ":exc:`.HTTPException` -- ギルドの作成に失敗した。" - -#: discord.Client.create_guild:21 discord.Template.create_guild:17 of -#, fuzzy -msgid "Invalid icon image format given. Must be PNG or JPG." -msgstr ":exc:`.InvalidArgument` -- アイコン画像として無効なフォーマットの画像が渡された。PNGかJPGで指定してください。" - -#: discord.Client.create_guild:23 discord.Template.create_guild:19 of -msgid "The guild created. This is not the same guild that is added to cache." -msgstr "作成されたギルド。キャッシュに追加されるギルドとは別物です。" - -#: discord.Client.fetch_invite:3 of -msgid "Gets an :class:`.Invite` from a discord.gg URL or ID." -msgstr ":class:`.Invite` をdiscord.gg URLやIDから取得します。" - -#: discord.Client.fetch_invite:7 of -#, fuzzy -msgid "" -"If the invite is for a guild you have not joined, the guild and channel " -"attributes of the returned :class:`.Invite` will be " -":class:`.PartialInviteGuild` and :class:`.PartialInviteChannel` " -"respectively." -msgstr "" -"もしあなたがInviteのGuildに参加していない場合、 :class:`.Invite` のguildとchannel属性はそれぞれ " -":class:`.PartialInviteGuild` と :class:`PartialInviteChannel` になります。" - -#: discord.Client.fetch_invite:11 of -msgid "The Discord invite ID or URL (must be a discord.gg URL)." -msgstr "Discordの招待ID、またはURL(discord.gg URLである必要があります)。" - -#: discord.Client.fetch_invite:13 of -msgid "" -"Whether to include count information in the invite. This fills the " -":attr:`.Invite.approximate_member_count` and " -":attr:`.Invite.approximate_presence_count` fields." -msgstr "" -"招待にカウントの情報を含めるかどうか。これにより :attr:`.Invite.approximate_member_count` と " -":attr:`.Invite.approximate_presence_count` が追加されます。" - -#: discord.Client.fetch_invite:18 of -#, fuzzy -msgid "The invite has expired or is invalid." -msgstr ":exc:`.NotFound` -- 招待の有効期限が切れている、または無効。" - -#: discord.Client.fetch_invite:19 of -#, fuzzy -msgid "Getting the invite failed." -msgstr ":exc:`.HTTPException` -- 招待の取得に失敗した。" - -#: discord.Client.fetch_invite:21 discord.Widget.fetch_invite:12 of -msgid "The invite from the URL/ID." -msgstr "URL/IDから取得した招待。" - -#: discord.Client.fetch_invite:22 of -msgid ":class:`.Invite`" -msgstr ":class:`.Invite`" - -#: discord.Client.delete_invite:3 of -msgid "Revokes an :class:`.Invite`, URL, or ID to an invite." -msgstr ":class:`.Invite` や、招待のURL、IDを削除します。" - -#: discord.Client.delete_invite:5 of -msgid "" -"You must have the :attr:`~.Permissions.manage_channels` permission in the" -" associated guild to do this." -msgstr "これを行うには、関連付けられたGuildにて、 :attr:`~.Permissions.manage_channels` 権限が必要です。" - -#: discord.Client.delete_invite:8 of -msgid "The invite to revoke." -msgstr "取り消す招待。" - -#: discord.Client.delete_invite:11 discord.Invite.delete:10 of -#, fuzzy -msgid "You do not have permissions to revoke invites." -msgstr ":exc:`.Forbidden` -- 招待を取り消す権限が無い。" - -#: discord.Client.delete_invite:12 discord.Invite.delete:11 of -#, fuzzy -msgid "The invite is invalid or expired." -msgstr ":exc:`.NotFound` -- 招待が無効、あるいは期限切れになっている。" - -#: discord.Client.delete_invite:13 discord.Invite.delete:12 of -#, fuzzy -msgid "Revoking the invite failed." -msgstr ":exc:`.HTTPException` -- 招待の取り消しに失敗した。" - -#: discord.Client.fetch_widget:3 of -msgid "Gets a :class:`.Widget` from a guild ID." -msgstr "ギルドIDから :class:`.Widget` を取得します。" - -#: discord.Client.fetch_widget:7 discord.Guild.widget:7 of -msgid "The guild must have the widget enabled to get this information." -msgstr "この情報を取得するためには、ギルドのウィジェットを有効化しておく必要があります。" - -#: discord.Client.fetch_widget:9 of -msgid "The ID of the guild." -msgstr "ギルドのID。" - -#: discord.Client.fetch_widget:12 discord.Guild.widget:9 of -#, fuzzy -msgid "The widget for this guild is disabled." -msgstr ":exc:`.Forbidden` -- ギルドのウィジェットが有効化されていない。" - -#: discord.Client.fetch_widget:13 discord.Guild.widget:10 of -#, fuzzy -msgid "Retrieving the widget failed." -msgstr ":exc:`.HTTPException` -- ウィジェットの取得に失敗した。" - -#: discord.Client.fetch_widget:15 discord.Guild.widget:12 of -msgid "The guild's widget." -msgstr "ギルドのウィジェット。" - -#: discord.Client.fetch_widget:16 of -msgid ":class:`.Widget`" -msgstr ":class:`.Widget`" - -#: discord.Client.application_info:3 of -msgid "Retrieves the bot's application information." -msgstr "Botのアプリケーション情報を取得します。" - -#: discord.Client.application_info:5 of -#, fuzzy -msgid "Retrieving the information failed somehow." -msgstr ":exc:`.HTTPException` -- 何らかの要因で情報の取得に失敗した。" - -#: discord.Client.application_info:7 of -msgid "The bot's application information." -msgstr "Botのアプリケーション情報。" - -#: discord.Client.application_info:8 of -msgid ":class:`.AppInfo`" -msgstr ":class:`.AppInfo`" - -#: discord.Client.fetch_user:3 of -msgid "" -"Retrieves a :class:`~discord.User` based on their ID. This can only be " -"used by bot accounts. You do not have to share any guilds with the user " -"to get this information, however many operations do require that you do." -msgstr "" -"IDをもとに :class:`~discord.User` " -"を取得します。Botアカウントでのみ使用できます。そのユーザーとギルドを共有する必要はありませんが、操作の多くはそれを必要とします。" - -#: discord.Client.fetch_user:10 of -msgid "" -"This method is an API call. For general usage, consider :meth:`get_user` " -"instead." -msgstr "このメソッドはAPIを呼び出します。通常は :meth:`get_user` を代わりとして使用してください。" - -#: discord.Client.fetch_user:12 of -msgid "The user's ID to fetch from." -msgstr "取得したいユーザーのID。" - -#: discord.Client.fetch_user:15 of -#, fuzzy -msgid "A user with this ID does not exist." -msgstr ":exc:`.NotFound` -- 指定のIDを持つユーザーが存在しない。" - -#: discord.Client.fetch_user:16 of -#, fuzzy -msgid "Fetching the user failed." -msgstr ":exc:`.HTTPException` -- ユーザーの取得に失敗した。" - -#: discord.Client.fetch_user:18 of -msgid "The user you requested." -msgstr "あなたがリクエストしたユーザー。" - -#: discord.Client.fetch_user:19 discord.abc.Messageable:8 discord.abc.User:5 of -msgid ":class:`~discord.User`" -msgstr ":class:`~discord.User`" - -#: discord.Client.fetch_user_profile:3 of -msgid "Gets an arbitrary user's profile." -msgstr "" - -#: discord.Client.fetch_user_profile:7 discord.ClientUser.blocked:5 -#: discord.ClientUser.create_group:9 discord.ClientUser.edit_settings:7 -#: discord.ClientUser.friends:5 discord.ClientUser.get_relationship:5 -#: discord.ClientUser.relationships:5 discord.Member.block:7 -#: discord.Member.is_blocked:5 discord.Member.is_friend:5 -#: discord.Member.mutual_friends:7 discord.Member.profile:7 -#: discord.Member.remove_friend:7 discord.Member.send_friend_request:7 -#: discord.Member.unblock:7 discord.User.block:7 discord.User.is_blocked:5 -#: discord.User.is_friend:5 discord.User.mutual_friends:7 -#: discord.User.profile:7 discord.User.relationship:5 -#: discord.User.remove_friend:7 discord.User.send_friend_request:7 -#: discord.User.unblock:7 of -#, fuzzy -msgid "This can only be used by non-bot accounts." -msgstr "これは非Botアカウントのみに適用されます。" - -#: discord.Client.fetch_user_profile:9 of -msgid "The ID of the user to fetch their profile for." -msgstr "プロフィールを取得したいユーザーのID。" - -#: discord.Client.fetch_user_profile:12 discord.Member.profile:9 -#: discord.User.profile:9 of -#, fuzzy -msgid "Not allowed to fetch profiles." -msgstr ":exc:`.Forbidden` -- プロフィールを取得することが許可されていない。" - -#: discord.Client.fetch_user_profile:13 discord.Member.profile:10 -#: discord.User.profile:10 of -#, fuzzy -msgid "Fetching the profile failed." -msgstr ":exc:`.HTTPException` -- プロフィールの取得に失敗した。" - -#: discord.Client.fetch_user_profile:15 discord.Member.profile:12 -#: discord.User.profile:12 of -msgid "The profile of the user." -msgstr "ユーザーのプロフィール。" - -#: discord.Client.fetch_user_profile:16 of -msgid ":class:`.Profile`" -msgstr ":class:`.Profile`" - -#: discord.Client.fetch_channel:3 of -msgid "" -"Retrieves a :class:`.abc.GuildChannel` or :class:`.abc.PrivateChannel` " -"with the specified ID." -msgstr "" -"指定されたIDを持つ :class:`.abc.GuildChannel` または :class:`.abc.PrivateChannel` " -"を取得します。" - -#: discord.Client.fetch_channel:7 of -msgid "" -"This method is an API call. For general usage, consider " -":meth:`get_channel` instead." -msgstr "このメソッドはAPIを呼び出します。通常は :meth:`get_channel` を代わりとして使用してください。" - -#: discord.Client.fetch_channel:11 discord.Guild.fetch_channels:11 of -#, fuzzy -msgid "An unknown channel type was received from Discord." -msgstr ":exc:`.InvalidData` -- 不明なチャンネルタイプをDiscordから受信した。" - -#: discord.Client.fetch_channel:12 of -#, fuzzy -msgid "Retrieving the channel failed." -msgstr ":exc:`.HTTPException` -- チャンネルの取得に失敗した。" - -#: discord.Client.fetch_channel:13 of -#, fuzzy -msgid "Invalid Channel ID." -msgstr "ボイスチャンネル。" - -#: discord.Client.fetch_channel:14 of -#, fuzzy -msgid "You do not have permission to fetch this channel." -msgstr ":exc:`.Forbidden` -- 指定のチャンネルを取得する権限がない。" - -#: discord.Client.fetch_channel:16 of -msgid "The channel from the ID." -msgstr "IDから取得したチャンネル。" - -#: discord.Client.fetch_channel:17 of -msgid "Union[:class:`.abc.GuildChannel`, :class:`.abc.PrivateChannel`]" -msgstr "Union[:class:`.abc.GuildChannel`, :class:`.abc.PrivateChannel`]" - -#: discord.Client.fetch_webhook:3 of -msgid "Retrieves a :class:`.Webhook` with the specified ID." -msgstr "特定のIDの :class:`.Webhook` を取得します。" - -#: discord.Client.fetch_webhook:5 of -#, fuzzy -msgid "Retrieving the webhook failed." -msgstr ":exc:`.HTTPException` -- Webhookの取得に失敗した。" - -#: discord.Client.fetch_webhook:6 of -msgid "Invalid webhook ID." -msgstr "" - -#: discord.Client.fetch_webhook:7 of -#, fuzzy -msgid "You do not have permission to fetch this webhook." -msgstr ":exc:`.Forbidden` -- このWebhookを取得する権限がない。" - -#: discord.Client.fetch_webhook:9 of -msgid "The webhook you requested." -msgstr "要求したWebhook。" - -#: discord.Client.fetch_webhook:10 of -msgid ":class:`.Webhook`" -msgstr ":class:`.Webhook`" - -#: discord.AutoShardedClient:1 of -msgid "" -"A client similar to :class:`Client` except it handles the complications " -"of sharding for the user into a more manageable and transparent single " -"process bot." -msgstr "" -"このクライアントは :class:`Client` " -"に似ていますが、管理しやすく、かつ透過的なシングルプロセスのBotに分割するという複雑な処理を行います。" - -#: discord.AutoShardedClient:5 of -msgid "" -"When using this client, you will be able to use it as-if it was a regular" -" :class:`Client` with a single shard when implementation wise internally " -"it is split up into multiple shards. This allows you to not have to deal " -"with IPC or other complicated infrastructure." -msgstr "" -"このクライアントは、実装に関して内部的に複数のシャードに分割されていても、単一のシャードの通常の :class:`Client` " -"のように使用することができます。これにより、IPCやその他の複雑なインフラストラクチャへの対処を行う必要がなくなります。" - -#: discord.AutoShardedClient:10 of -msgid "" -"It is recommended to use this client only if you have surpassed at least " -"1000 guilds." -msgstr "少なくとも1000を超えるギルドで使用される場合にのみ、このクライアントを使用することをおすすめします。" - -#: discord.AutoShardedClient:13 of -msgid "" -"If no :attr:`.shard_count` is provided, then the library will use the Bot" -" Gateway endpoint call to figure out how many shards to use." -msgstr "" -":attr:`.shard_count` が指定されていない場合、ライブラリはBot " -"Gatewayのエンドポイント呼び出しを使用して使用するシャードの数を見つけ出します。" - -#: discord.AutoShardedClient:16 of -msgid "" -"If a ``shard_ids`` parameter is given, then those shard IDs will be used " -"to launch the internal shards. Note that :attr:`.shard_count` must be " -"provided if this is used. By default, when omitted, the client will " -"launch shards from 0 to ``shard_count - 1``." -msgstr "" -"``shard_ids`` パラメータが指定されている場合、それらのシャードIDが内部シャードの起動時に使用されます。これを使用する場合 " -":attr:`.shard_count` の指定が必須です。このパラメータを省略した場合は、クライアントは0から ``shard_count - " -"1`` までのシャードを起動します。" - -#: discord.AutoShardedClient:23 of -#, fuzzy -msgid "An optional list of shard_ids to launch the shards with." -msgstr "Optional[List[:class:`int`]] -- シャードの起動時に使用するshard_idsのオプションリスト。" - -#: discord.AutoShardedClient:25 of -msgid "Optional[List[:class:`int`]]" -msgstr "" - -#: discord.AutoShardedClient.latency:3 of -msgid "" -"This operates similarly to :meth:`Client.latency` except it uses the " -"average latency of every shard's latency. To get a list of shard latency," -" check the :attr:`latencies` property. Returns ``nan`` if there are no " -"shards ready." -msgstr "" -"これは :meth:`Client.latency` " -"と同様に機能しますが、すべてのシャードの平均待ち時間を使用する点が異なります。シャードの待ち時間のリストを取得するには " -":attr:`latencies` プロパティを参照してください。準備ができていない場合は ``nan`` を返します。" - -#: discord.AutoShardedClient.latencies:1 of -msgid "A list of latencies between a HEARTBEAT and a HEARTBEAT_ACK in seconds." -msgstr "" - -#: discord.AutoShardedClient.latencies:3 of -msgid "This returns a list of tuples with elements ``(shard_id, latency)``." -msgstr "これは、 ``(shard_id, latency)`` の要素を持つタプルのリストを返します。" - -#: discord.AutoShardedClient.latencies:5 of -msgid "List[Tuple[:class:`int`, :class:`float`]]" -msgstr "" - -#: discord.AutoShardedClient.get_shard:1 of -msgid "" -"Optional[:class:`ShardInfo`]: Gets the shard information at a given shard" -" ID or ``None`` if not found." -msgstr "" - -#: discord.AutoShardedClient.shards:1 of -msgid "Returns a mapping of shard IDs to their respective info object." -msgstr "" - -#: discord.AutoShardedClient.shards:3 of -msgid "Mapping[int, :class:`ShardInfo`]" -msgstr "" - -#: discord.AutoShardedClient.request_offline_members:3 of -msgid "" -"Requests previously offline members from the guild to be filled up into " -"the :attr:`Guild.members` cache. This function is usually not called. It " -"should only be used if you have the ``fetch_offline_members`` parameter " -"set to ``False``." -msgstr "" -"ギルドのオフラインメンバーを :attr:`Guild.members` " -"キャッシュへ書き込むよう要求します。この関数は通常呼び出されることはありません。 ``fetch_offline_members`` パラメータが" -" ``False`` の場合にのみ使用してください。" - -#: discord.AutoShardedClient.request_offline_members:8 of -msgid "" -"When the client logs on and connects to the websocket, Discord does not " -"provide the library with offline members if the number of members in the " -"guild is larger than 250. You can check if a guild is large if " -":attr:`Guild.large` is ``True``." -msgstr "" -"クライアントがWebSocketに接続し、ログインするとき、ギルド内のメンバー数が250よりも大きいならば、Discordはライブラリにオフラインメンバーを提供しません。" -" :attr:`Guild.large` が ``True`` かどうかでギルドが大きいかどうかを確認することができます。" - -#: discord.AutoShardedClient.change_presence:5 of -msgid "Example: ::" -msgstr "例: ::" - -#: discord.AutoShardedClient.change_presence:12 of -msgid "" -"Indicates what status to change to. If ``None``, then " -":attr:`Status.online` is used." -msgstr "変更するステータスを示します。 ``None`` の場合、 :attr:`Status.online` となります。" - -#: discord.AutoShardedClient.change_presence:19 of -msgid "" -"The shard_id to change the presence to. If not specified or ``None``, " -"then it will change the presence of every shard the bot can see." -msgstr "" -"プレゼンスを変更したいシャードのshard_id。指定されていない、または ``None`` " -"が渡された場合はBotがアクセスできるすべてのシャードのプレゼンスが変更されます。" - -#: discord.AutoShardedClient.change_presence:24 of -#, fuzzy -msgid "If the ``activity`` parameter is not of proper type." -msgstr ":exc:`InvalidArgument` -- ``activity`` に渡された値が適切な型でない。" - -#: discord.AppInfo:1 of -msgid "Represents the application info for the bot provided by Discord." -msgstr "Discordが提供するBotのアプリケーション情報を表します。" - -#: discord.AppInfo:6 of -#, fuzzy -msgid "The application ID." -msgstr "Botのアプリケーション情報。" - -#: ../../api.rst:2238 ../../api.rst:2244 ../../api.rst:2289 ../../api.rst:2303 -#: ../../api.rst:2331 ../../api.rst:2443 ../../api.rst:2451 ../../api.rst:2459 -#: ../../api.rst:2480 ../../api.rst:2497 discord.Activity:16 discord.AppInfo:8 -#: discord.Asset.save:15 discord.Attachment:7 discord.Attachment:13 -#: discord.Attachment.save:24 discord.AuditLogEntry:22 -#: discord.CategoryChannel:39 discord.CategoryChannel:46 discord.ClientUser:31 -#: discord.Colour:28 discord.Colour.b:3 discord.Colour.g:3 discord.Colour.r:3 -#: discord.ConnectionClosed:8 discord.DMChannel:37 discord.Emoji:39 -#: discord.Emoji:63 discord.GroupChannel:37 discord.Guild:46 discord.Guild:64 -#: discord.Guild:70 discord.Guild:124 discord.Guild:178 discord.Guild:184 -#: discord.Guild.emoji_limit:3 discord.Guild.estimate_pruned_members:15 -#: discord.Guild.filesize_limit:3 discord.Guild.member_count:8 -#: discord.Guild.shard_id:3 discord.HTTPException:21 discord.HTTPException:27 -#: discord.Integration:9 discord.Integration:63 discord.IntegrationAccount:9 -#: discord.Intents:37 discord.Invite:50 discord.Invite:87 discord.Invite:93 -#: discord.MemberCacheFlags:40 discord.Message:112 discord.MessageFlags:29 -#: discord.MessageReference:15 discord.Object:32 -#: discord.PartialInviteChannel:34 discord.PartialInviteGuild:34 -#: discord.Permissions:46 discord.PublicUserFlags:28 -#: discord.RawBulkMessageDeleteEvent:13 discord.RawMessageDeleteEvent:7 -#: discord.RawMessageDeleteEvent:19 discord.RawMessageUpdateEvent:7 -#: discord.RawMessageUpdateEvent:15 discord.RawReactionActionEvent:8 -#: discord.RawReactionActionEvent:14 discord.RawReactionActionEvent:20 -#: discord.RawReactionClearEmojiEvent:9 discord.RawReactionClearEmojiEvent:15 -#: discord.RawReactionClearEvent:7 discord.RawReactionClearEvent:13 -#: discord.Reaction:36 discord.Role:41 discord.Role:66 discord.ShardInfo:12 -#: discord.SystemChannelFlags:32 discord.Team:7 discord.Team:25 -#: discord.TeamMember:33 discord.Template:15 discord.TextChannel:37 -#: discord.TextChannel:56 discord.TextChannel:72 discord.User:31 -#: discord.VoiceChannel:37 discord.VoiceChannel:50 discord.VoiceChannel:56 -#: discord.VoiceChannel:62 discord.Webhook:62 discord.Widget:21 -#: discord.WidgetChannel:25 discord.WidgetChannel:37 discord.WidgetMember:25 -#: discord.abc.GuildChannel:28 discord.abc.Snowflake:13 -#: discord.opus.OpusError:7 of -msgid ":class:`int`" -msgstr "" - -#: discord.AppInfo:12 of -#, fuzzy -msgid "The application name." -msgstr ":class:`str` -- アプリケーションの名前。" - -#: ../../api.rst:2186 ../../api.rst:2192 ../../api.rst:2198 ../../api.rst:2297 -#: ../../api.rst:2323 ../../api.rst:2418 ../../api.rst:2488 discord.Activity:22 -#: discord.Activity:28 discord.Activity:40 discord.Activity:46 -#: discord.AppInfo:14 discord.AppInfo:69 discord.AppInfo:77 -#: discord.Attachment:31 discord.Attachment:38 discord.Attachment:46 -#: discord.CategoryChannel:27 discord.CategoryChannel.mention:3 -#: discord.ClientUser:25 discord.ClientUser:37 -#: discord.ClientUser.display_name:7 discord.ClientUser.mention:3 -#: discord.ConnectionClosed:14 discord.Embed:24 discord.Embed:31 -#: discord.Embed:38 discord.Embed:45 discord.Emoji:33 discord.Game:34 -#: discord.Guild:27 discord.Guild:199 discord.HTTPException:15 -#: discord.Integration:15 discord.Integration:27 discord.IntegrationAccount:15 -#: discord.Invite:56 discord.Invite.id:3 discord.Invite.url:3 -#: discord.Member.display_name:7 discord.Member.mention:3 -#: discord.Member.raw_status:5 discord.Message:31 -#: discord.Message.clean_content:15 discord.Message.jump_url:3 -#: discord.Message.system_content:8 discord.PartialInviteChannel:28 -#: discord.PartialInviteChannel.mention:3 discord.PartialInviteGuild:28 -#: discord.RawReactionActionEvent:50 discord.Role:47 discord.Role.mention:3 -#: discord.Spotify.album:3 discord.Spotify.album_cover_url:3 -#: discord.Spotify.artist:6 discord.Spotify.name:3 discord.Spotify.party_id:3 -#: discord.Spotify.title:3 discord.Spotify.track_id:3 discord.Streaming:29 -#: discord.Streaming:55 discord.Team:13 discord.TeamMember:27 -#: discord.TeamMember:39 discord.Template:9 discord.Template:21 -#: discord.Template:27 discord.TextChannel:25 discord.TextChannel.mention:3 -#: discord.User:25 discord.User:37 discord.User.display_name:7 -#: discord.User.mention:3 discord.VoiceChannel:25 -#: discord.VoiceChannel.mention:3 discord.VoiceClient:17 discord.VoiceClient:23 -#: discord.VoiceClient:29 discord.Webhook.url:3 discord.Widget:27 -#: discord.Widget.json_url:3 discord.WidgetChannel:31 -#: discord.WidgetChannel.mention:3 discord.WidgetMember:31 -#: discord.WidgetMember:37 discord.WidgetMember.display_name:3 -#: discord.WidgetMember.mention:3 discord.abc.GuildChannel:15 -#: discord.abc.GuildChannel.mention:3 discord.abc.User:15 discord.abc.User:21 -#: discord.abc.User.display_name:3 discord.abc.User.mention:3 -#: discord.utils.escape_markdown:18 discord.utils.escape_mentions:17 -#: discord.utils.oauth_url:15 discord.utils.resolve_invite:7 -#: discord.utils.resolve_template:9 of -msgid ":class:`str`" -msgstr ":class:`str`" - -#: discord.AppInfo:18 of -#, fuzzy -msgid "The application owner." -msgstr ":class:`User` -- アプリケーションの所有者。" - -#: ../../api.rst:864 ../../api.rst:2435 discord.AppInfo:20 discord.DMChannel:25 -#: discord.GroupChannel:43 discord.Integration:69 discord.Invite:99 -#: discord.Relationship:10 discord.Template:33 of -#, fuzzy -msgid ":class:`User`" -msgstr ":class:`str`" - -#: discord.AppInfo:24 of -#, fuzzy -msgid "The application's team." -msgstr ":class:`str` -- アプリケーションの名前。" - -#: discord.AppInfo:28 of -msgid "Optional[:class:`Team`]" -msgstr "" - -#: discord.AppInfo:32 discord.Team:17 of -#, fuzzy -msgid "The icon hash, if it exists." -msgstr "Optional[:class:`str`] -- アイコンのハッシュ。(存在する場合)" - -#: ../../api.rst:2361 discord.Activity.large_image_text:3 -#: discord.Activity.large_image_url:3 discord.Activity.small_image_text:3 -#: discord.Activity.small_image_url:3 discord.AppInfo:34 discord.AppInfo:40 -#: discord.AppInfo:104 discord.AppInfo:113 discord.AuditLogEntry:35 -#: discord.ClientUser:43 discord.ClientUser:69 discord.ClientUser:75 -#: discord.CustomActivity:27 discord.File:30 discord.GroupChannel:49 -#: discord.GroupChannel:55 discord.Guild:58 discord.Guild:110 discord.Guild:116 -#: discord.Guild:171 discord.Guild:191 discord.Member:48 -#: discord.PartialEmoji:32 discord.PartialInviteGuild:52 -#: discord.PartialInviteGuild:58 discord.PartialInviteGuild:64 -#: discord.PartialInviteGuild:70 discord.Streaming:35 discord.Streaming:41 -#: discord.Streaming:49 discord.Streaming.twitch_name:6 discord.Team:19 -#: discord.TeamMember:45 discord.TextChannel:49 discord.User:43 -#: discord.Webhook:77 discord.Webhook:102 discord.Webhook:108 -#: discord.Widget.invite_url:3 discord.WidgetMember:55 discord.WidgetMember:61 -#: discord.abc.User:27 of -#, fuzzy -msgid "Optional[:class:`str`]" -msgstr ":class:`str`" - -#: discord.AppInfo:38 of -#, fuzzy -msgid "The application description." -msgstr "Optional[:class:`str`] -- アプリケーションの説明。" - -#: discord.AppInfo:44 of -#, fuzzy -msgid "" -"Whether the bot can be invited by anyone or if it is locked to the " -"application owner." -msgstr ":class:`bool` -- 誰でもBotを招待することができるか、それともアプリケーション所有者のみに限定されているか。" - -#: ../../api.rst:869 ../../api.rst:883 ../../api.rst:888 ../../api.rst:893 -#: ../../api.rst:898 ../../api.rst:903 ../../api.rst:915 ../../api.rst:923 -#: ../../api.rst:2250 ../../api.rst:2369 ../../api.rst:2377 ../../api.rst:2402 -#: ../../api.rst:2410 ../../api.rst:2467 discord.AllowedMentions:11 -#: discord.AppInfo:47 discord.AppInfo:54 discord.CallMessage.call_ended:3 -#: discord.CategoryChannel.permissions_synced:8 discord.ClientUser:49 -#: discord.ClientUser:57 discord.ClientUser:63 discord.ClientUser:81 -#: discord.ClientUser:87 discord.ClientUser.mentioned_in:7 discord.Emoji:45 -#: discord.Emoji:51 discord.Emoji:57 discord.Emoji:69 discord.File:36 -#: discord.GroupCall:15 discord.Guild:80 discord.Guild.chunked:9 -#: discord.Guild.large:6 discord.Integration:33 discord.Integration:39 -#: discord.Intents.bans:10 discord.Intents.dm_messages:25 -#: discord.Intents.dm_reactions:18 discord.Intents.dm_typing:11 -#: discord.Intents.emojis:14 discord.Intents.guild_messages:24 -#: discord.Intents.guild_reactions:18 discord.Intents.guild_typing:11 -#: discord.Intents.guilds:23 discord.Intents.integrations:9 -#: discord.Intents.invites:10 discord.Intents.members:31 -#: discord.Intents.messages:25 discord.Intents.presences:20 -#: discord.Intents.reactions:18 discord.Intents.typing:11 -#: discord.Intents.voice_states:13 discord.Intents.webhooks:9 discord.Invite:68 -#: discord.Invite:81 discord.Member.mentioned_in:7 -#: discord.MemberCacheFlags.joined:8 discord.MemberCacheFlags.online:8 -#: discord.MemberCacheFlags.voice:7 discord.Message:11 discord.Message:78 -#: discord.Message:131 discord.MessageFlags.crossposted:3 -#: discord.MessageFlags.is_crossposted:3 -#: discord.MessageFlags.source_message_deleted:3 -#: discord.MessageFlags.suppress_embeds:3 discord.MessageFlags.urgent:5 -#: discord.PartialEmoji:38 discord.PermissionOverwrite.is_empty:7 -#: discord.Permissions.add_reactions:3 discord.Permissions.administrator:5 -#: discord.Permissions.attach_files:3 discord.Permissions.ban_members:3 -#: discord.Permissions.change_nickname:3 discord.Permissions.connect:3 -#: discord.Permissions.create_instant_invite:3 -#: discord.Permissions.deafen_members:3 discord.Permissions.embed_links:3 -#: discord.Permissions.external_emojis:3 discord.Permissions.kick_members:3 -#: discord.Permissions.manage_channels:5 discord.Permissions.manage_emojis:3 -#: discord.Permissions.manage_guild:3 discord.Permissions.manage_messages:7 -#: discord.Permissions.manage_nicknames:3 -#: discord.Permissions.manage_permissions:5 discord.Permissions.manage_roles:5 -#: discord.Permissions.manage_webhooks:3 discord.Permissions.mention_everyone:3 -#: discord.Permissions.move_members:3 discord.Permissions.mute_members:3 -#: discord.Permissions.priority_speaker:3 -#: discord.Permissions.read_message_history:3 -#: discord.Permissions.read_messages:3 discord.Permissions.send_messages:3 -#: discord.Permissions.send_tts_messages:3 discord.Permissions.speak:3 -#: discord.Permissions.stream:3 discord.Permissions.use_external_emojis:5 -#: discord.Permissions.use_voice_activation:3 -#: discord.Permissions.view_audit_log:3 discord.Permissions.view_channel:5 -#: discord.Permissions.view_guild_insights:5 -#: discord.PublicUserFlags.bug_hunter:3 -#: discord.PublicUserFlags.bug_hunter_level_2:3 -#: discord.PublicUserFlags.early_supporter:3 -#: discord.PublicUserFlags.early_verified_bot_developer:5 -#: discord.PublicUserFlags.hypesquad:3 -#: discord.PublicUserFlags.hypesquad_balance:3 -#: discord.PublicUserFlags.hypesquad_bravery:3 -#: discord.PublicUserFlags.hypesquad_brilliance:3 -#: discord.PublicUserFlags.partner:3 discord.PublicUserFlags.staff:3 -#: discord.PublicUserFlags.system:3 discord.PublicUserFlags.team_user:3 -#: discord.PublicUserFlags.verified_bot:3 -#: discord.PublicUserFlags.verified_bot_developer:3 discord.Reaction:42 -#: discord.Reaction.custom_emoji:3 discord.Role:59 discord.Role:73 -#: discord.Role:79 discord.SystemChannelFlags.join_notifications:3 -#: discord.SystemChannelFlags.premium_subscriptions:3 discord.TeamMember:51 -#: discord.TextChannel.permissions_synced:8 discord.User:49 discord.User:55 -#: discord.User.mentioned_in:7 discord.VoiceChannel.permissions_synced:8 -#: discord.VoiceState:7 discord.VoiceState:13 discord.VoiceState:19 -#: discord.VoiceState:25 discord.VoiceState:33 discord.VoiceState:39 -#: discord.VoiceState:45 discord.WidgetMember:43 -#: discord.WidgetMember.mentioned_in:7 -#: discord.abc.GuildChannel.permissions_synced:8 discord.abc.User:33 -#: discord.opus.is_loaded:7 of -msgid ":class:`bool`" -msgstr ":class:`bool`" - -#: discord.AppInfo:51 of -#, fuzzy -msgid "" -"Whether the bot requires the completion of the full oauth2 code grant " -"flow to join." -msgstr ":class:`bool` -- Botの参加に、完全なOAuth2認可コードフローの完了を必要とするかどうか。" - -#: discord.AppInfo:58 of -msgid "A list of RPC origin URLs, if RPC is enabled." -msgstr "" - -#: discord.AppInfo:60 of -#, fuzzy -msgid "Optional[List[:class:`str`]]" -msgstr ":class:`str`" - -#: discord.AppInfo:64 of -msgid "" -"If this application is a game sold on Discord, this field will be the " -"summary field for the store page of its primary SKU" -msgstr "" - -#: discord.AppInfo:73 of -msgid "The base64 encoded key for the GameSDK's GetTicket" -msgstr "" - -#: discord.AppInfo:81 discord.AppInfo.guild:1 of -msgid "" -"If this application is a game sold on Discord, this field will be the " -"guild to which it has been linked" -msgstr "" - -#: discord.AppInfo:86 discord.AppInfo:95 discord.Attachment:19 -#: discord.Attachment:25 discord.ConnectionClosed:20 discord.Guild:86 -#: discord.Guild:96 discord.Guild:104 discord.Guild.prune_members:38 -#: discord.Invite:105 discord.Invite:112 discord.Message:119 -#: discord.MessageReference:9 discord.MessageReference:21 -#: discord.PartialEmoji:44 discord.PrivilegedIntentsRequired:14 -#: discord.RawBulkMessageDeleteEvent:19 discord.RawMessageDeleteEvent:13 -#: discord.RawReactionActionEvent:26 discord.RawReactionClearEmojiEvent:21 -#: discord.RawReactionClearEvent:19 discord.ShardInfo:18 discord.TextChannel:43 -#: discord.TextChannel:63 discord.VoiceChannel:43 discord.Webhook:83 -#: discord.Webhook:89 of -msgid "Optional[:class:`int`]" -msgstr "" - -#: discord.AppInfo:90 of -msgid "" -"If this application is a game sold on Discord, this field will be the id " -"of the \"Game SKU\" that is created, if exists" -msgstr "" - -#: discord.AppInfo:99 of -msgid "" -"If this application is a game sold on Discord, this field will be the URL" -" slug that links to the store page" -msgstr "" - -#: discord.AppInfo:108 of -msgid "" -"If this application is a game sold on Discord, this field will be the " -"hash of the image on store embeds" -msgstr "" - -#: discord.AppInfo.icon_url:1 of -#, fuzzy -msgid "Retrieves the application's icon asset." -msgstr ":class:`.Asset` -- アプリケーションのアイコンアセット。" - -#: discord.AppInfo.cover_image_url:5 discord.AppInfo.icon_url:5 -#: discord.Team.icon_url:3 of -#, fuzzy -msgid ":class:`.Asset`" -msgstr ":class:`str`" - -#: discord.AppInfo.cover_image_url:1 of -msgid "Retrieves the cover image on a store embed." -msgstr "" - -#: discord.AppInfo.guild:6 discord.Message.guild:3 discord.VoiceClient.guild:3 -#: discord.Webhook.guild:5 of -#, fuzzy -msgid "Optional[:class:`Guild`]" -msgstr ":class:`.Guild`" - -#: discord.Team:1 of -#, fuzzy -msgid "Represents an application team for a bot provided by Discord." -msgstr "Discordが提供するBotのアプリケーション情報を表します。" - -#: discord.Team:5 of -#, fuzzy -msgid "The team ID." -msgstr "アムステルダムリージョン。" - -#: discord.Team:11 of -msgid "The team name" -msgstr "" - -#: discord.Team:23 of -msgid "The team's owner ID." -msgstr "" - -#: discord.Team:29 of -msgid "A list of the members in the team" -msgstr "" - -#: discord.Team:33 of -msgid "List[:class:`TeamMember`]" -msgstr "" - -#: discord.Team.icon_url:1 of -#, fuzzy -msgid "Retrieves the team's icon asset." -msgstr "Botのアプリケーション情報を取得します。" - -#: discord.Team.owner:1 of -msgid "The team's owner." -msgstr "" - -#: discord.Team.owner:3 of -msgid "Optional[:class:`TeamMember`]" -msgstr "" - -#: discord.TeamMember:1 of -#, fuzzy -msgid "Represents a team member in a team." -msgstr "オーディオストリームを表します。" - -#: discord.TeamMember:7 of -#, fuzzy -msgid "Checks if two team members are equal." -msgstr "二つのユーザーが等しいかを比較します。" - -#: discord.TeamMember:11 of -#, fuzzy -msgid "Checks if two team members are not equal." -msgstr "二つのユーザーが等しいものではないか比較します。" - -#: discord.TeamMember:15 of -#, fuzzy -msgid "Return the team member's hash." -msgstr "ユーザーのハッシュ値を返します。" - -#: discord.TeamMember:19 of -#, fuzzy -msgid "Returns the team member's name with discriminator." -msgstr "ユーザー名とディスクリミネータを返します。" - -#: discord.TeamMember:25 of -#, fuzzy -msgid "The team member's username." -msgstr "更新されたメンバーの更新後情報。" - -#: discord.TeamMember:31 of -#, fuzzy -msgid "The team member's unique ID." -msgstr "更新されたメンバーの更新後情報。" - -#: discord.TeamMember:37 of -#, fuzzy -msgid "" -"The team member's discriminator. This is given when the username has " -"conflicts." -msgstr ":class:`str` -- ユーザーの識別子。これはユーザー名が重複しているときに与えられます。" - -#: discord.TeamMember:43 of -#, fuzzy -msgid "The avatar hash the team member has. Could be None." -msgstr "Optional[:class:`str`] -- ユーザーのアバターハッシュ。 Noneが返る場合もあります。" - -#: discord.ClientUser:47 discord.TeamMember:49 discord.User:47 of -#, fuzzy -msgid "Specifies if the user is a bot account." -msgstr ":class:`bool` -- ユーザーがBotアカウントであるかを表します。" - -#: discord.TeamMember:55 of -#, fuzzy -msgid "The team that the member is from." -msgstr "メンションが削除されたテキスト。" - -#: discord.TeamMember:57 of -#, fuzzy -msgid ":class:`Team`" -msgstr ":class:`bytes`" - -#: discord.TeamMember:61 of -msgid "The membership state of the member (e.g. invited or accepted)" -msgstr "" - -#: discord.TeamMember:63 of -msgid ":class:`TeamMembershipState`" -msgstr "" - -#: ../../api.rst:52 -msgid "Voice" -msgstr "ボイス" - -#: discord.VoiceClient:1 of -msgid "Represents a Discord voice connection." -msgstr "Discordの音声接続を表します。" - -#: discord.VoiceClient:3 of -msgid "" -"You do not create these, you typically get them from e.g. " -":meth:`VoiceChannel.connect`." -msgstr "これを意図的に生成することはできません。通常、 :meth:`VoiceChannel.connect` などを使用した際に、取得できます。" - -#: discord.VoiceClient:8 of -msgid "" -"In order to use PCM based AudioSources, you must have the opus library " -"installed on your system and loaded through :func:`opus.load_opus`. " -"Otherwise, your AudioSources must be opus encoded (e.g. using " -":class:`FFmpegOpusAudio`) or the library will not be able to transmit " -"audio." -msgstr "" - -#: discord.VoiceClient:15 of -#, fuzzy -msgid "The voice connection session ID." -msgstr ":class:`str` -- 音声接続のセッションID。" - -#: discord.VoiceClient:21 of -#, fuzzy -msgid "The voice connection token." -msgstr ":class:`str` -- 音声接続のトークン." - -#: discord.VoiceClient:27 of -#, fuzzy -msgid "The endpoint we are connecting to." -msgstr ":class:`str` -- 接続先のエンドポイント。" - -#: discord.VoiceClient:33 of -#, fuzzy -msgid "The voice channel connected to." -msgstr ":class:`abc.Connectable` -- 接続しているボイスチャンネル。" - -#: discord.VoiceClient:35 of -#, fuzzy -msgid ":class:`abc.Connectable`" -msgstr ":class:`.Invite`" - -#: discord.VoiceClient:39 of -#, fuzzy -msgid "The event loop that the voice client is running on." -msgstr ":class:`asyncio.AbstractEventLoop` -- ボイスクライアントが実行されているイベントループ。" - -#: discord.VoiceClient.guild:1 of -#, fuzzy -msgid "The guild we're connected to, if applicable." -msgstr "Optional[:class:`Guild`] -- 存在する場合は、接続しているギルドを返します。" - -#: discord.VoiceClient.user:1 of -#, fuzzy -msgid "The user connected to voice (i.e. ourselves)." -msgstr ":class:`ClientUser` -- ボイスチャンネルに接続しているユーザー。(つまり、自分自身)" - -#: discord.DMChannel:31 discord.GroupChannel:31 discord.VoiceClient.user:3 of -#, fuzzy -msgid ":class:`ClientUser`" -msgstr ":class:`~discord.ClientUser`" - -#: discord.VoiceClient.on_voice_state_update:3 -#: discord.VoiceProtocol.on_voice_state_update:3 of -msgid "" -"An abstract method that is called when the client's voice state has " -"changed. This corresponds to ``VOICE_STATE_UPDATE``." -msgstr "" - -#: discord.VoiceClient.on_voice_state_update:6 -#: discord.VoiceProtocol.on_voice_state_update:6 of -msgid "" -"The raw `voice state payload`__. .. _voice_state_update_payload: " -"https://discord.com/developers/docs/resources/voice#voice-state-object " -"__ voice_state_update_payload_" -msgstr "" - -#: discord.VoiceClient.on_voice_state_update:6 -#: discord.VoiceProtocol.on_voice_state_update:6 of -#, fuzzy -msgid "The raw `voice state payload`__." -msgstr "生のイベントペイロードデータ。" - -#: discord.VoiceClient.on_voice_server_update:3 -#: discord.VoiceProtocol.on_voice_server_update:3 of -msgid "" -"An abstract method that is called when initially connecting to voice. " -"This corresponds to ``VOICE_SERVER_UPDATE``." -msgstr "" - -#: discord.VoiceClient.on_voice_server_update:6 -#: discord.VoiceProtocol.on_voice_server_update:6 of -msgid "" -"The raw `voice server update payload`__. .. " -"_voice_server_update_payload: " -"https://discord.com/developers/docs/topics/gateway#voice-server-update-" -"voice-server-update-event-fields __ voice_server_update_payload_" -msgstr "" - -#: discord.VoiceClient.on_voice_server_update:6 -#: discord.VoiceProtocol.on_voice_server_update:6 of -msgid "The raw `voice server update payload`__." -msgstr "" - -#: discord.VoiceClient.connect:3 discord.VoiceProtocol.connect:3 of -msgid "" -"An abstract method called when the client initiates the connection " -"request." -msgstr "" - -#: discord.VoiceClient.connect:5 discord.VoiceProtocol.connect:5 of -msgid "" -"When a connection is requested initially, the library calls the " -"constructor under ``__init__`` and then calls :meth:`connect`. If " -":meth:`connect` fails at some point then :meth:`disconnect` is called." -msgstr "" - -#: discord.VoiceClient.connect:9 discord.VoiceProtocol.connect:9 of -msgid "" -"Within this method, to start the voice connection flow it is recommended " -"to use :meth:`Guild.change_voice_state` to start the flow. After which, " -":meth:`on_voice_server_update` and :meth:`on_voice_state_update` will be " -"called. The order that these two are called is unspecified." -msgstr "" - -#: discord.VoiceClient.connect:14 discord.VoiceProtocol.connect:14 of -msgid "The timeout for the connection." -msgstr "" - -#: discord.VoiceClient.connect:16 discord.VoiceProtocol.connect:16 of -#, fuzzy -msgid "Whether reconnection is expected." -msgstr "Discordとの接続を閉じます。" - -#: discord.VoiceClient.latency:1 of -msgid "Latency between a HEARTBEAT and a HEARTBEAT_ACK in seconds." -msgstr "" - -#: discord.VoiceClient.latency:3 of -msgid "" -"This could be referred to as the Discord Voice WebSocket latency and is " -"an analogue of user's voice latencies as seen in the Discord client." -msgstr "" - -#: discord.VoiceClient.average_latency:1 of -msgid "Average of most recent 20 HEARTBEAT latencies in seconds." -msgstr "" - -#: discord.VoiceClient.disconnect:3 of -msgid "Disconnects this voice client from voice." -msgstr "ボイスクライアントをボイスチャンネルから切断します。" - -#: discord.VoiceClient.move_to:3 of -msgid "Moves you to a different voice channel." -msgstr "別のボイスチャンネルへ移動させます。" - -#: discord.VoiceClient.move_to:5 of -msgid "The channel to move to. Must be a voice channel." -msgstr "移動先のチャンネル。ボイスチャンネルである必要があります。" - -#: discord.VoiceClient.is_connected:1 of -msgid "Indicates if the voice client is connected to voice." -msgstr "ボイスチャンネルに接続しているかどうかを表します。" - -#: discord.VoiceClient.play:1 of -msgid "Plays an :class:`AudioSource`." -msgstr ":class:`AudioSource` を再生します。" - -#: discord.VoiceClient.play:3 of -msgid "" -"The finalizer, ``after`` is called after the source has been exhausted or" -" an error occurred." -msgstr "ファイナライザーである ``after`` はソースがなくなったか、エラーが発生した後に呼び出されます。" - -#: discord.VoiceClient.play:6 of -#, fuzzy -msgid "" -"If an error happens while the audio player is running, the exception is " -"caught and the audio player is then stopped. If no after callback is " -"passed, any caught exception will be displayed as if it were raised." -msgstr "オーディオプレイヤーの実行中にエラーが発生した場合、例外はキャッチされ、プレイヤーは停止します。" - -#: discord.VoiceClient.play:10 of -msgid "The audio source we're reading from." -msgstr "読み込むオーディオソース。" - -#: discord.VoiceClient.play:12 of -#, fuzzy -msgid "" -"The finalizer that is called after the stream is exhausted. This function" -" must have a single parameter, ``error``, that denotes an optional " -"exception that was raised during playing." -msgstr "" -"ファイナライザーはストリームが空になると呼び出されます。発生した例外はすべて破棄されます。この関数には再生中に発生したオプションの例外を表す一つのパラメータ" -" ``error`` が必要です。" - -#: discord.VoiceClient.play:17 of -#, fuzzy -msgid "Already playing audio or not connected." -msgstr ":exc:`ClientException` -- すでにオーディオを再生しているか、VCに接続していない。" - -#: discord.VoiceClient.play:18 of -#, fuzzy -msgid "Source is not a :class:`AudioSource` or after is not a callable." -msgstr ":exc:`TypeError` -- sourceが :class:`AudioSource` でないか、afterが呼び出し可能でない。" - -#: discord.VoiceClient.play:19 of -msgid "Source is not opus encoded and opus is not loaded." -msgstr "" - -#: discord.VoiceClient.is_playing:1 of -msgid "Indicates if we're currently playing audio." -msgstr "現在オーディオを再生しているかを表します。" - -#: discord.VoiceClient.is_paused:1 of -msgid "Indicates if we're playing audio, but if we're paused." -msgstr "再生中のオーディオを一時停止しているかを表します。" - -#: discord.VoiceClient.stop:1 of -msgid "Stops playing audio." -msgstr "音声の再生を停止します。" - -#: discord.VoiceClient.pause:1 of -msgid "Pauses the audio playing." -msgstr "音声の再生を一時的に停止します。" - -#: discord.VoiceClient.resume:1 of -msgid "Resumes the audio playing." -msgstr "音声の再生を再開します。" - -#: discord.VoiceClient.source:1 of -#, fuzzy -msgid "The audio source being played, if playing." -msgstr "Optional[:class:`AudioSource`] -- 再生中の場合、再生しているオーディオソースを返します。" - -#: discord.VoiceClient.source:3 of -msgid "" -"This property can also be used to change the audio source currently being" -" played." -msgstr "このプロパティは現在再生しているオーディオソースの変更にも使うことが出来ます。" - -#: discord.VoiceClient.source:5 of -#, fuzzy -msgid "Optional[:class:`AudioSource`]" -msgstr ":class:`AudioSource` を再生します。" - -#: discord.VoiceClient.send_audio_packet:1 of -msgid "Sends an audio packet composed of the data." -msgstr "データで構成されるオーディオパケットを送信します。" - -#: discord.VoiceClient.send_audio_packet:3 of -msgid "You must be connected to play audio." -msgstr "オーディオを再生するには、ボイスチャンネルに接続している必要があります。" - -#: discord.VoiceClient.send_audio_packet:5 of -msgid "The :term:`py:bytes-like object` denoting PCM or Opus voice data." -msgstr "PCM、またはOpusボイスデータを表す :term:`py:bytes-like object` 。" - -#: discord.VoiceClient.send_audio_packet:7 of -msgid "Indicates if ``data`` should be encoded into Opus." -msgstr "``data`` をOpusにエンコードする必要があるかを表します。" - -#: discord.VoiceClient.send_audio_packet:10 of -#, fuzzy -msgid "You are not connected." -msgstr ":exc:`ClientException` -- ボイスチャンネルに接続していない。" - -#: discord.VoiceClient.send_audio_packet:11 of -#, fuzzy -msgid "Encoding the data failed." -msgstr ":exc:`opus.OpusError` -- dataのエンコードに失敗した。" - -#: discord.VoiceProtocol:1 of -#, fuzzy -msgid "A class that represents the Discord voice protocol." -msgstr "Discordの音声接続を表します。" - -#: discord.VoiceProtocol:3 of -msgid "" -"This is an abstract class. The library provides a concrete implementation" -" under :class:`VoiceClient`." -msgstr "" - -#: discord.VoiceProtocol:6 of -msgid "" -"This class allows you to implement a protocol to allow for an external " -"method of sending voice, such as Lavalink_ or a native library " -"implementation." -msgstr "" - -#: discord.VoiceProtocol:9 of -msgid "These classes are passed to :meth:`abc.Connectable.connect`." -msgstr "" - -#: discord.VoiceProtocol:13 of -msgid "The client (or its subclasses) that started the connection request." -msgstr "" - -#: discord.VoiceProtocol:15 of -#, fuzzy -msgid "The voice channel that is being connected to." -msgstr "ピン留めが更新されたプライベートチャンネル。" - -#: discord.VoiceProtocol.disconnect:3 of -msgid "An abstract method called when the client terminates the connection." -msgstr "" - -#: discord.VoiceProtocol.disconnect:5 of -msgid "See :meth:`cleanup`." -msgstr "" - -#: discord.VoiceProtocol.disconnect:7 of -#, fuzzy -msgid "Whether the disconnection was forced." -msgstr "Discordとの接続を閉じます。" - -#: discord.VoiceProtocol.cleanup:1 of -msgid "" -"This method *must* be called to ensure proper clean-up during a " -"disconnect." -msgstr "" - -#: discord.VoiceProtocol.cleanup:3 of -msgid "" -"It is advisable to call this from within :meth:`disconnect` when you are " -"completely done with the voice protocol instance." -msgstr "" - -#: discord.VoiceProtocol.cleanup:6 of -msgid "" -"This method removes it from the internal state cache that keeps track of " -"currently alive voice clients. Failure to clean-up will cause subsequent " -"connections to report that it's still connected." -msgstr "" - -#: discord.AudioSource:1 of -msgid "Represents an audio stream." -msgstr "オーディオストリームを表します。" - -#: discord.AudioSource:3 of -msgid "" -"The audio stream can be Opus encoded or not, however if the audio stream " -"is not Opus encoded then the audio format must be 16-bit 48KHz stereo " -"PCM." -msgstr "オーディオストリームはOpusにエンコードされていなくても構いませんが、エンコードされていない場合、オーディオフォーマットは16ビットの48KHzステレオPCMである必要があります。" - -#: discord.AudioSource:8 of -msgid "The audio source reads are done in a separate thread." -msgstr "オーディオソースの読み込みは別スレッドで行われます。" - -#: discord.AudioSource.read:1 discord.FFmpegOpusAudio.read:1 -#: discord.FFmpegPCMAudio.read:1 discord.PCMAudio.read:1 -#: discord.PCMVolumeTransformer.read:1 of -msgid "Reads 20ms worth of audio." -msgstr "20ms分のオーディオを読み込みます。" - -#: discord.AsyncWebhookAdapter.handle_execution_response:7 -#: discord.AsyncWebhookAdapter.request:3 discord.AudioSource.read:3 -#: discord.FFmpegOpusAudio.read:3 discord.FFmpegPCMAudio.read:3 -#: discord.PCMAudio.read:3 discord.PCMVolumeTransformer.read:3 -#: discord.RequestsWebhookAdapter.handle_execution_response:7 -#: discord.RequestsWebhookAdapter.request:3 -#: discord.WebhookAdapter.handle_execution_response:7 -#: discord.WebhookAdapter.request:3 of -msgid "Subclasses must implement this." -msgstr "サブクラスはこれを実装する必要があります。" - -#: discord.AudioSource.read:5 discord.FFmpegOpusAudio.read:5 -#: discord.FFmpegPCMAudio.read:5 discord.PCMAudio.read:5 -#: discord.PCMVolumeTransformer.read:5 of -msgid "" -"If the audio is complete, then returning an empty :term:`py:bytes-like " -"object` to signal this is the way to do so." -msgstr "オーディオの読み取りが終了すると、空の :term:`py:bytes-like object` を返してこれを通知します。" - -#: discord.AudioSource.read:8 discord.FFmpegOpusAudio.read:8 -#: discord.FFmpegPCMAudio.read:8 discord.PCMAudio.read:8 -#: discord.PCMVolumeTransformer.read:8 of -msgid "" -"If :meth:`is_opus` method returns ``True``, then it must return 20ms " -"worth of Opus encoded audio. Otherwise, it must be 20ms worth of 16-bit " -"48KHz stereo PCM, which is about 3,840 bytes per frame (20ms worth of " -"audio)." -msgstr "" -":meth:`is_opus` が ``True`` " -"を返す場合、20ms分のOpusにエンコードされたオーディオを返さなければいけません。それ以外の場合は、フレームあたり約3,840バイトの20ms相当の16ビット48KHzステレオPCM(20ms分のオーディオ)が必要です。" - -#: discord.AudioSource.read:13 discord.FFmpegOpusAudio.read:13 -#: discord.FFmpegPCMAudio.read:13 discord.PCMAudio.read:13 -#: discord.PCMVolumeTransformer.read:13 of -msgid "A bytes like object that represents the PCM or Opus data." -msgstr "PCMまたはOpusデータを表すバイトライクオブジェクト。" - -#: discord.Asset.read:18 discord.Attachment.read:20 discord.AudioSource.read:14 -#: discord.FFmpegOpusAudio.read:14 discord.FFmpegPCMAudio.read:14 -#: discord.PCMAudio.read:14 discord.PCMVolumeTransformer.read:14 of -msgid ":class:`bytes`" -msgstr ":class:`bytes`" - -#: discord.AudioSource.is_opus:1 discord.FFmpegOpusAudio.is_opus:1 -#: discord.FFmpegPCMAudio.is_opus:1 of -msgid "Checks if the audio source is already encoded in Opus." -msgstr "オーディオソースがOpusにエンコードされているかを表します。" - -#: discord.AudioSource.cleanup:1 discord.FFmpegAudio.cleanup:1 -#: discord.PCMVolumeTransformer.cleanup:1 of -msgid "Called when clean-up is needed to be done." -msgstr "クリーンアップが必要な時に呼び出されます。" - -#: discord.AudioSource.cleanup:3 discord.FFmpegAudio.cleanup:3 -#: discord.PCMVolumeTransformer.cleanup:3 of -msgid "" -"Useful for clearing buffer data or processes after it is done playing " -"audio." -msgstr "オーディオの再生が終了した後にバッファデータやプロセスをクリアするのに便利です。" - -#: discord.PCMAudio:1 of -msgid "Represents raw 16-bit 48KHz stereo PCM audio source." -msgstr "生の16ビット48KHzステレオPCMオーディオソースを表します。" - -#: discord.PCMAudio:5 of -#, fuzzy -msgid "A file-like object that reads byte data representing raw PCM." -msgstr ":term:`py:file object` -- 生のPCMを表したバイトデータを読み取るファイルライクオブジェクト。" - -#: discord.PCMAudio:7 of -msgid ":term:`py:file object`" -msgstr "" - -#: discord.FFmpegAudio:1 of -msgid "Represents an FFmpeg (or AVConv) based AudioSource." -msgstr "" - -#: discord.FFmpegAudio:3 of -msgid "" -"User created AudioSources using FFmpeg differently from how " -":class:`FFmpegPCMAudio` and :class:`FFmpegOpusAudio` work should subclass" -" this." -msgstr "" - -#: discord.FFmpegOpusAudio:1 discord.FFmpegPCMAudio:1 of -msgid "An audio source from FFmpeg (or AVConv)." -msgstr "FFmpeg(またはAVConv)のオーディオソース。" - -#: discord.FFmpegPCMAudio:3 of -msgid "This launches a sub-process to a specific input file given." -msgstr "与えられた特定の入力ファイルに対してサブプロセスを起動します。" - -#: discord.FFmpegOpusAudio:18 discord.FFmpegPCMAudio:7 of -msgid "" -"You must have the ffmpeg or avconv executable in your path environment " -"variable in order for this to work." -msgstr "環境変数にffmpegまたはavconv実行可能ファイルがなければなりません。" - -#: discord.FFmpegPCMAudio:10 of -#, fuzzy -msgid "" -"The input that ffmpeg will take and convert to PCM bytes. If ``pipe`` is " -"``True`` then this is a file-like object that is passed to the stdin of " -"ffmpeg." -msgstr "" -"ffmpegが受け取り、PCMバイトへ変換する入力。 ``pipe`` " -"がTrueの場合、これはffmpegの標準入力に渡されるファイルライクオブジェクトです。" - -#: discord.FFmpegOpusAudio:39 discord.FFmpegPCMAudio:14 of -msgid "The executable name (and path) to use. Defaults to ``ffmpeg``." -msgstr "使用する実行可能ファイルの名前 (およびパス)。デフォルトでは ``ffmpeg`` です。" - -#: discord.FFmpegOpusAudio:41 discord.FFmpegPCMAudio:16 of -msgid "" -"If ``True``, denotes that ``source`` parameter will be passed to the " -"stdin of ffmpeg. Defaults to ``False``." -msgstr "``True`` の場合、 ``source`` パラメータがffmpegの標準入力に渡されます。デフォルトでは ``False`` です。" - -#: discord.FFmpegOpusAudio:44 discord.FFmpegPCMAudio:19 of -msgid "" -"A file-like object to pass to the Popen constructor. Could also be an " -"instance of ``subprocess.PIPE``." -msgstr "Popenのコンストラクタに渡すファイルライクオブジェクト。 ``subprocess.PIPE`` のようなインスタンスにすることも可能です。" - -#: discord.FFmpegOpusAudio:47 discord.FFmpegPCMAudio:22 of -msgid "Extra command line arguments to pass to ffmpeg before the ``-i`` flag." -msgstr "``-i`` フラグのまえにffmepgに渡す追加のコマンドライン引数。" - -#: discord.FFmpegOpusAudio:49 discord.FFmpegPCMAudio:24 of -msgid "Extra command line arguments to pass to ffmpeg after the ``-i`` flag." -msgstr "``-i`` フラグのあとにffmepgに渡す追加のコマンドライン引数。" - -#: discord.FFmpegOpusAudio:52 discord.FFmpegPCMAudio:27 of -#, fuzzy -msgid "The subprocess failed to be created." -msgstr ":exc:`ClientException` -- サブプロセスの作成に失敗した。" - -#: discord.FFmpegOpusAudio:3 of -msgid "" -"This launches a sub-process to a specific input file given. However, " -"rather than producing PCM packets like :class:`FFmpegPCMAudio` does that " -"need to be encoded to Opus, this class produces Opus packets, skipping " -"the encoding step done by the library." -msgstr "" - -#: discord.FFmpegOpusAudio:7 of -msgid "" -"Alternatively, instead of instantiating this class directly, you can use " -":meth:`FFmpegOpusAudio.from_probe` to probe for bitrate and codec " -"information. This can be used to opportunistically skip pointless re-" -"encoding of existing Opus audio data for a boost in performance at the " -"cost of a short initial delay to gather the information. The same can be " -"achieved by passing ``copy`` to the ``codec`` parameter, but only if you " -"know that the input source is Opus encoded beforehand." -msgstr "" - -#: discord.FFmpegOpusAudio:21 of -#, fuzzy -msgid "" -"The input that ffmpeg will take and convert to Opus bytes. If ``pipe`` is" -" ``True`` then this is a file-like object that is passed to the stdin of " -"ffmpeg." -msgstr "" -"ffmpegが受け取り、PCMバイトへ変換する入力。 ``pipe`` " -"がTrueの場合、これはffmpegの標準入力に渡されるファイルライクオブジェクトです。" - -#: discord.FFmpegOpusAudio:25 of -msgid "The bitrate in kbps to encode the output to. Defaults to ``128``." -msgstr "" - -#: discord.FFmpegOpusAudio:27 of -msgid "" -"The codec to use to encode the audio data. Normally this would be just " -"``libopus``, but is used by :meth:`FFmpegOpusAudio.from_probe` to " -"opportunistically skip pointlessly re-encoding Opus audio data by passing" -" ``copy`` as the codec value. Any values other than ``copy``, ``opus``, " -"or ``libopus`` will be considered ``libopus``. Defaults to ``libopus``." -" .. warning:: Do not provide this parameter unless you are certain " -"that the audio input is already Opus encoded. For typical use " -":meth:`FFmpegOpusAudio.from_probe` should be used to determine the " -"proper value for this parameter." -msgstr "" - -#: discord.FFmpegOpusAudio:27 of -msgid "" -"The codec to use to encode the audio data. Normally this would be just " -"``libopus``, but is used by :meth:`FFmpegOpusAudio.from_probe` to " -"opportunistically skip pointlessly re-encoding Opus audio data by passing" -" ``copy`` as the codec value. Any values other than ``copy``, ``opus``, " -"or ``libopus`` will be considered ``libopus``. Defaults to ``libopus``." -msgstr "" - -#: discord.FFmpegOpusAudio:35 of -msgid "" -"Do not provide this parameter unless you are certain that the audio input" -" is already Opus encoded. For typical use " -":meth:`FFmpegOpusAudio.from_probe` should be used to determine the proper" -" value for this parameter." -msgstr "" - -#: discord.FFmpegOpusAudio.from_probe:3 of -msgid "" -"A factory method that creates a :class:`FFmpegOpusAudio` after probing " -"the input source for audio codec and bitrate information." -msgstr "" - -#: discord.FFmpegOpusAudio.from_probe:8 of -msgid "" -"Use this function to create an :class:`FFmpegOpusAudio` instance instead " -"of the constructor: ::" -msgstr "" - -#: discord.FFmpegOpusAudio.from_probe:13 of -msgid "" -"If you are on Windows and don't have ffprobe installed, use the " -"``fallback`` method to probe using ffmpeg instead: ::" -msgstr "" - -#: discord.FFmpegOpusAudio.from_probe:19 of -msgid "Using a custom method of determining codec and bitrate: ::" -msgstr "" - -#: discord.FFmpegOpusAudio.from_probe:29 of -msgid "Identical to the ``source`` parameter for the constructor." -msgstr "" - -#: discord.FFmpegOpusAudio.from_probe:30 of -msgid "" -"The probing method used to determine bitrate and codec information. As a " -"string, valid values are ``native`` to use ffprobe (or avprobe) and " -"``fallback`` to use ffmpeg (or avconv). As a callable, it must take two " -"string arguments, ``source`` and ``executable``. Both parameters are the" -" same values passed to this factory function. ``executable`` will default" -" to ``ffmpeg`` if not provided as a keyword argument." -msgstr "" - -#: discord.FFmpegOpusAudio.from_probe:36 of -msgid "" -"The remaining parameters to be passed to the :class:`FFmpegOpusAudio` " -"constructor, excluding ``bitrate`` and ``codec``." -msgstr "" - -#: discord.FFmpegOpusAudio.from_probe:39 discord.FFmpegOpusAudio.probe:10 of -msgid "Invalid probe method, must be ``'native'`` or ``'fallback'``." -msgstr "" - -#: discord.FFmpegOpusAudio.from_probe:40 discord.FFmpegOpusAudio.probe:11 of -msgid "Invalid value for ``probe`` parameter, must be :class:`str` or a callable." -msgstr "" - -#: discord.FFmpegOpusAudio.from_probe:42 of -msgid "An instance of this class." -msgstr "" - -#: discord.FFmpegOpusAudio.from_probe:43 of -msgid ":class:`FFmpegOpusAudio`" -msgstr "" - -#: discord.FFmpegOpusAudio.probe:3 of -msgid "Probes the input source for bitrate and codec information." -msgstr "" - -#: discord.FFmpegOpusAudio.probe:5 of -msgid "Identical to the ``source`` parameter for :class:`FFmpegOpusAudio`." -msgstr "" - -#: discord.FFmpegOpusAudio.probe:6 of -msgid "" -"Identical to the ``method`` parameter for " -":meth:`FFmpegOpusAudio.from_probe`." -msgstr "" - -#: discord.FFmpegOpusAudio.probe:7 of -msgid "Identical to the ``executable`` parameter for :class:`FFmpegOpusAudio`." -msgstr "" - -#: discord.FFmpegOpusAudio.probe:13 of -msgid "A 2-tuple with the codec and bitrate of the input source." -msgstr "" - -#: discord.FFmpegOpusAudio.probe:14 of -msgid "Tuple[Optional[:class:`str`], Optional[:class:`int`]]" -msgstr "" - -#: discord.PCMVolumeTransformer:1 of -msgid "Transforms a previous :class:`AudioSource` to have volume controls." -msgstr "前述の :class:`AudioSource` をボリュームコントロールを持つものに変換します。" - -#: discord.PCMVolumeTransformer:3 of -msgid "" -"This does not work on audio sources that have :meth:`AudioSource.is_opus`" -" set to ``True``." -msgstr "これは :meth:`AudioSource.is_opus` が ``True`` になっているオーディオソースでは動作しません。" - -#: discord.PCMVolumeTransformer:6 of -msgid "The original AudioSource to transform." -msgstr "変換する元のAudioSource。" - -#: discord.PCMVolumeTransformer:8 of -msgid "The initial volume to set it to. See :attr:`volume` for more info." -msgstr "設定する初期ボリューム。詳細は :attr:`volume` を参照してください。" - -#: discord.PCMVolumeTransformer:12 of -#, fuzzy -msgid "Not an audio source." -msgstr "オーディオストリームを表します。" - -#: discord.PCMVolumeTransformer:13 of -#, fuzzy -msgid "The audio source is opus encoded." -msgstr ":exc:`ClientException` -- オーディオソースがopusエンコード済み。" - -#: discord.PCMVolumeTransformer.volume:1 of -#, fuzzy -msgid "" -"Retrieves or sets the volume as a floating point percentage (e.g. ``1.0``" -" for 100%)." -msgstr "ボリュームを浮動小数点数パーセンテージ (100%の場合は1.0)として取得、または設定します。" - -#: ../../api.rst:79 -msgid "Opus Library" -msgstr "Opusライブラリ" - -#: discord.opus.load_opus:1 of -msgid "Loads the libopus shared library for use with voice." -msgstr "libopus共有ライブラリを音声用にロードします。" - -#: discord.opus.load_opus:3 of -msgid "" -"If this function is not called then the library uses the function " -":func:`ctypes.util.find_library` and then loads that one if available." -msgstr "" -"この関数が呼び出されない場合、ライブラリは :func:`ctypes.util.find_library` " -"関数を使用して利用可能であればロードします。" - -#: discord.opus.load_opus:6 of -#, fuzzy -msgid "" -"Not loading a library and attempting to use PCM based AudioSources will " -"lead to voice not working." -msgstr "ライブラリをロードしないと音声が機能しなくなります。" - -#: discord.opus.load_opus:9 of -msgid "This function propagates the exceptions thrown." -msgstr "この関数は、スローされた例外を伝播します。" - -#: discord.opus.load_opus:13 of -msgid "" -"The bitness of the library must match the bitness of your python " -"interpreter. If the library is 64-bit then your python interpreter must " -"be 64-bit as well. Usually if there's a mismatch in bitness then the load" -" will throw an exception." -msgstr "ライブラリのbit数は、あなたのPythonインタプリタのbit数と一致していなければなりません。ライブラリが64bitの場合は、Pythonインタプリタも64bitである必要があります。bit数が一致しない場合は、ロード時に例外を投げます。" - -#: discord.opus.load_opus:20 of -msgid "" -"On Windows, this function should not need to be called as the binaries " -"are automatically loaded." -msgstr "Windowsでは、バイナリが自動的に読み込まれるため、この関数を呼び出す必要はありません。" - -#: discord.opus.load_opus:25 of -msgid "" -"On Windows, the .dll extension is not necessary. However, on Linux the " -"full extension is required to load the library, e.g. ``libopus.so.1``. On" -" Linux however, :func:`ctypes.util.find_library` will usually find the " -"library automatically without you having to call this." -msgstr "" -"Windowsでは .dll拡張は必要ありませんが、Linuxではライブラリをロードするために ``libopus.so.1`` " -"のような完全な拡張ライブラリが必要です。しかしながら、Linux上でも通常の場合は " -":func:`ctypes.util.find_library` が自動的にライブラリを検出します。" - -#: discord.opus.load_opus:30 of -msgid "The filename of the shared library." -msgstr "共有ライブラリのファイル名。" - -#: discord.opus.is_loaded:1 of -msgid "" -"Function to check if opus lib is successfully loaded either via the " -":func:`ctypes.util.find_library` call of :func:`load_opus`." -msgstr "" -":func:`load_opus` の :func:`ctypes.util.find_library` " -"呼び出しで、opusライブラリが正常にロードされたかどうかをチェックする関数。" - -#: discord.opus.is_loaded:4 of -msgid "This must return ``True`` for voice to work." -msgstr "ボイス関連の機能を動かすためには、これが ``True`` を返す必要があります。" - -#: discord.opus.is_loaded:6 of -msgid "Indicates if the opus library has been loaded." -msgstr "opusライブラリがロードされているかを表します。" - -#: ../../api.rst:88 -msgid "Event Reference" -msgstr "イベントリファレンス" - -#: ../../api.rst:90 -msgid "" -"This page outlines the different types of events listened by " -":class:`Client`." -msgstr "この項目では :class:`Client` が受け取る様々なイベントについて説明します。" - -#: ../../api.rst:92 -msgid "" -"There are two ways to register an event, the first way is through the use" -" of :meth:`Client.event`. The second way is through subclassing " -":class:`Client` and overriding the specific events. For example: ::" -msgstr "" -"イベントを登録する方法は二通りあります。一つ目は :meth:`Client.event` を使用する方法です。二つ目は " -":class:`Client` を継承してサブクラスを作り、イベントをオーバーライドする方法です。この方法を用いた場合は以下のようになります:" - -#: ../../api.rst:107 -msgid "" -"If an event handler raises an exception, :func:`on_error` will be called " -"to handle it, which defaults to print a traceback and ignoring the " -"exception." -msgstr "" -"イベントハンドラが例外を発生させると、それを処理するために :func:`on_error` が呼び出されます。 " -"デフォルトではトレースバックが出力され、例外は無視されます。" - -#: ../../api.rst:112 -msgid "" -"All the events must be a |coroutine_link|_. If they aren't, then you " -"might get unexpected errors. In order to turn a function into a coroutine" -" they must be ``async def`` functions." -msgstr "" -"すべてのイベントは |coroutine_link|_ である必要があります。 |coroutine_link|_ " -"でない場合、予期せぬエラーが発生する可能性があります。関数をコルーチンにするには、関数定義の際に ``async def`` を使用してください。" - -#: ../../api.rst:118 -msgid "" -"Called when the client has successfully connected to Discord. This is not" -" the same as the client being fully prepared, see :func:`on_ready` for " -"that." -msgstr "" -"クライアントがDiscordに正常に接続できたときに呼び出されます。クライアントの準備が完了していることと同義ではありません。 " -":func:`on_ready` を参照してください。" - -#: ../../api.rst:121 -msgid "The warnings on :func:`on_ready` also apply." -msgstr ":func:`on_ready` での警告も適用されます。" - -#: ../../api.rst:125 -#, fuzzy -msgid "" -"Similar to :func:`on_connect` except used by :class:`AutoShardedClient` " -"to denote when a particular shard ID has connected to Discord." -msgstr "" -"特定の Shard IDが準備完了になったかを確認するために :class:`AutoShardedClient` で使用される以外は " -":func:`on_ready` とほとんど同じです。" - -#: ../../api.rst:130 -#, fuzzy -msgid "The shard ID that has connected." -msgstr "準備が完了したShard ID。" - -#: ../../api.rst:135 -msgid "" -"Called when the client has disconnected from Discord. This could happen " -"either through the internet being disconnected, explicit calls to logout," -" or Discord terminating the connection one way or the other." -msgstr "クライアントがDiscordから切断したときに呼び出されます。これはインターネットが切断された、明示的にログアウトした、またはDiscord側から何らかの方法で切断されたというような場合に呼び出される可能性があります。" - -#: ../../api.rst:139 -msgid "This function can be called many times." -msgstr "この関数は何度でも呼び出すことができます。" - -#: ../../api.rst:143 -#, fuzzy -msgid "" -"Similar to :func:`on_disconnect` except used by " -":class:`AutoShardedClient` to denote when a particular shard ID has " -"disconnected from Discord." -msgstr "" -"特定の Shard IDが準備完了になったかを確認するために :class:`AutoShardedClient` で使用される以外は " -":func:`on_ready` とほとんど同じです。" - -#: ../../api.rst:148 -#, fuzzy -msgid "The shard ID that has disconnected." -msgstr "準備が完了したShard ID。" - -#: ../../api.rst:153 -msgid "" -"Called when the client is done preparing the data received from Discord. " -"Usually after login is successful and the :attr:`Client.guilds` and co. " -"are filled up." -msgstr "" -"クライアントがDiscordから受信したデータの準備を完了した際に呼び出されます。通常はログインが成功したあと、 " -":attr:`Client.guilds` とそれに関連するものの準備が完了したときです。" - -#: ../../api.rst:158 -msgid "" -"This function is not guaranteed to be the first event called. Likewise, " -"this function is **not** guaranteed to only be called once. This library " -"implements reconnection logic and thus will end up calling this event " -"whenever a RESUME request fails." -msgstr "" -"このイベントは、最初に呼び出されるイベントとは限りません。同時に、このイベントは **一度だけ呼ばれるという保証もできません** " -"。このライブラリは、再接続ロジックを実装しているためリジューム要求が失敗するたびにこのイベントが呼び出されることになります。" - -#: ../../api.rst:165 -msgid "" -"Similar to :func:`on_ready` except used by :class:`AutoShardedClient` to " -"denote when a particular shard ID has become ready." -msgstr "" -"特定の Shard IDが準備完了になったかを確認するために :class:`AutoShardedClient` で使用される以外は " -":func:`on_ready` とほとんど同じです。" - -#: ../../api.rst:168 -msgid "The shard ID that is ready." -msgstr "準備が完了したShard ID。" - -#: ../../api.rst:173 -msgid "Called when the client has resumed a session." -msgstr "クライアントがセッションを再開したときに呼び出されます。" - -#: ../../api.rst:177 -#, fuzzy -msgid "" -"Similar to :func:`on_resumed` except used by :class:`AutoShardedClient` " -"to denote when a particular shard ID has resumed a session." -msgstr "" -"特定の Shard IDが準備完了になったかを確認するために :class:`AutoShardedClient` で使用される以外は " -":func:`on_ready` とほとんど同じです。" - -#: ../../api.rst:182 -#, fuzzy -msgid "The shard ID that has resumed." -msgstr "準備が完了したShard ID。" - -#: ../../api.rst:187 -msgid "" -"Usually when an event raises an uncaught exception, a traceback is " -"printed to stderr and the exception is ignored. If you want to change " -"this behaviour and handle the exception for whatever reason yourself, " -"this event can be overridden. Which, when done, will suppress the default" -" action of printing the traceback." -msgstr "イベントがキャッチされない例外を発生させた場合、通常はトレースバックがstderrに出力され、その例外は無視されます。何らかの理由でこの動作を変更して、自分自身で例外処理を行いたい場合は、このイベントをオーバーライドすることができます。これを行った場合、トレースバックを出力するというデフォルトの動作は行われません。" - -#: ../../api.rst:193 -msgid "" -"The information of the exception raised and the exception itself can be " -"retrieved with a standard call to :func:`sys.exc_info`." -msgstr "発生した例外の情報と、例外事態は :func:`sys.exc_info` への標準呼び出しで取得できます。" - -#: ../../api.rst:196 -msgid "" -"If you want exception to propagate out of the :class:`Client` class you " -"can define an ``on_error`` handler consisting of a single empty " -":ref:`py:raise`. Exceptions raised by ``on_error`` will not be handled " -"in any way by :class:`Client`." -msgstr "" -"例外を :class:`Client` クラスの外に伝播させたい場合は、単一の空の :ref:`py:raise` 文を持つ " -"``on_error`` を定義することができます。発生した例外は、 :class:`Client` の ``on_error`` " -"では決して処理されることはありません。" - -#: ../../api.rst:203 -msgid "``on_error`` will only be dispatched to :meth:`Client.event`." -msgstr "" - -#: ../../api.rst:205 -msgid "" -"It will not be received by :meth:`Client.wait_for`, or, if used, " -":ref:`ext_commands_api_bot` listeners such as " -":meth:`~ext.commands.Bot.listen` or :meth:`~ext.commands.Cog.listener`." -msgstr "" - -#: ../../api.rst:209 -msgid "The name of the event that raised the exception." -msgstr "例外を発生させたイベントの名前。" - -#: ../../api.rst:212 -msgid "The positional arguments for the event that raised the exception." -msgstr "例外を発生させたイベントの位置引数。" - -#: ../../api.rst:214 -msgid "The keyword arguments for the event that raised the exception." -msgstr "例外を発生させたイベントのキーワード引数。" - -#: ../../api.rst:219 -msgid "" -"Called whenever a message is received from the WebSocket, before it's " -"processed. This event is always dispatched when a message is received and" -" the passed data is not processed in any way." -msgstr "メッセージが処理される前、WebSocketからメッセージが受信されるたびに呼び出されます。このイベントはメッセージを受信した場合、渡されたデータが処理できないときでも常に呼びだされます。" - -#: ../../api.rst:223 ../../api.rst:242 -msgid "" -"This is only really useful for grabbing the WebSocket stream and " -"debugging purposes." -msgstr "これはWebSocketストリームを取得してデバッグする時のみに役に立ちます。" - -#: ../../api.rst:228 -msgid "" -"This is only for the messages received from the client WebSocket. The " -"voice WebSocket will not trigger this event." -msgstr "これは、クライアントWebSocketから受信したメッセージ専用です。音声WebSocketではこのイベントは実行されません。" - -#: ../../api.rst:231 -msgid "" -"The message passed in from the WebSocket library. Could be :class:`bytes`" -" for a binary message or :class:`str` for a regular message." -msgstr "" -"WebSocketライブラリから渡されたメッセージ。バイナリメッセージの場合は :class:`bytes` 、通常のメッセージの場合は " -":class:`str` です。" - -#: ../../api.rst:238 -msgid "" -"Called whenever a send operation is done on the WebSocket before the " -"message is sent. The passed parameter is the message that is being sent " -"to the WebSocket." -msgstr "メッセージが送信される前にWebSocketで送信操作が行われるたびに呼び出されます。渡されるパラメータはWebSocketに送信されているメッセージです。" - -#: ../../api.rst:247 -#, fuzzy -msgid "" -"This is only for the messages sent from the client WebSocket. The voice " -"WebSocket will not trigger this event." -msgstr "これは、クライアントWebSocketから受信したメッセージ専用です。音声WebSocketではこのイベントは実行されません。" - -#: ../../api.rst:250 -msgid "" -"The message that is about to be passed on to the WebSocket library. It " -"can be :class:`bytes` to denote a binary message or :class:`str` to " -"denote a regular text message." -msgstr "" -"WebSocketライブラリから渡されるメッセージ。バイナリメッセージの場合は :class:`bytes` 、通常のメッセージの場合は " -":class:`str` です。" - -#: ../../api.rst:256 -msgid "Called when someone begins typing a message." -msgstr "誰かがメッセージを入力し始めたときに呼び出されます。" - -#: ../../api.rst:258 -msgid "" -"The ``channel`` parameter can be a :class:`abc.Messageable` instance. " -"Which could either be :class:`TextChannel`, :class:`GroupChannel`, or " -":class:`DMChannel`." -msgstr "" -"channelパラメータは :class:`abc.Messageable` インスタンスにすることができます。 " -":class:`TextChannel` 、 :class:`GroupChannel` 、または :class:`DMChannel` " -"のいずれかです。" - -#: ../../api.rst:262 -msgid "" -"If the ``channel`` is a :class:`TextChannel` then the ``user`` parameter " -"is a :class:`Member`, otherwise it is a :class:`User`." -msgstr "" -"``channel`` が :class:`TextChannel` である場合、 ``user`` パラメータは :class:`Member`" -" 、それ以外の場合は :class:`User` です。" - -#: ../../api.rst:265 -msgid "This requires :attr:`Intents.typing` to be enabled." -msgstr "" - -#: ../../api.rst:267 -msgid "The location where the typing originated from." -msgstr "入力が行われたチャンネル。" - -#: ../../api.rst:269 -msgid "The user that started typing." -msgstr "入力を始めたユーザー。" - -#: ../../api.rst:271 -msgid "When the typing started as a naive datetime in UTC." -msgstr "UTCのnaive datetimeでの、タイピングの開始時刻。" - -#: ../../api.rst:276 -msgid "Called when a :class:`Message` is created and sent." -msgstr ":class:`Message` が作成され送信されたときに呼び出されます。" - -#: ../../api.rst:278 ../../api.rst:301 ../../api.rst:318 ../../api.rst:331 -#: ../../api.rst:344 ../../api.rst:370 ../../api.rst:393 ../../api.rst:505 -#: ../../api.rst:514 -msgid "This requires :attr:`Intents.messages` to be enabled." -msgstr "" - -#: ../../api.rst:282 -msgid "" -"Your bot's own messages and private messages are sent through this event." -" This can lead cases of 'recursion' depending on how your bot was " -"programmed. If you want the bot to not reply to itself, consider checking" -" the user IDs. Note that :class:`~ext.commands.Bot` does not have this " -"problem." -msgstr "Botのメッセージとプライベートメッセージはこのイベントを通して送信されます。Botのプログラムによっては「再帰呼び出し」を続けることになります。Botが自分自身に返信しないようにするためにはユーザーIDを確認する方法が考えられます。この問題はBotが抱えるものではありません。" - -#: ../../api.rst:288 -msgid "The current message." -msgstr "現在のメッセージ。" - -#: ../../api.rst:293 -msgid "" -"Called when a message is deleted. If the message is not found in the " -"internal message cache, then this event will not be called. Messages " -"might not be in cache if the message is too old or the client is " -"participating in high traffic guilds." -msgstr "メッセージが削除された際に呼び出されます。メッセージが内部のメッセージキャッシュに見つからない場合、このイベントは呼び出されません。これはメッセージが古すぎるか、クライアントが通信の多いギルドに参加している場合に発生します。" - -#: ../../api.rst:298 -#, fuzzy -msgid "" -"If this occurs increase the :attr:`Client.max_messages` attribute or use " -"the :func:`on_raw_message_delete` event instead." -msgstr "このような場合には :attr:`Client.max_messages` を増やしてください。" - -#: ../../api.rst:303 -msgid "The deleted message." -msgstr "削除されたメッセージ。" - -#: ../../api.rst:308 -msgid "" -"Called when messages are bulk deleted. If none of the messages deleted " -"are found in the internal message cache, then this event will not be " -"called. If individual messages were not found in the internal message " -"cache, this event will still be called, but the messages not found will " -"not be included in the messages list. Messages might not be in cache if " -"the message is too old or the client is participating in high traffic " -"guilds." -msgstr "メッセージが一括削除されたときに呼び出されます。メッセージが内部のメッセージキャッシュに見つからない場合、このイベントは呼び出されません。個々のメッセージが見つからない場合でも、このイベントは呼び出されますが、見つからなかったメッセージはメッセージのリストに含まれません。これはメッセージが古すぎるか、クライアントが通信の多いギルドに参加している場合に発生します。" - -#: ../../api.rst:315 -#, fuzzy -msgid "" -"If this occurs increase the :attr:`Client.max_messages` attribute or use " -"the :func:`on_raw_bulk_message_delete` event instead." -msgstr "このような場合には :attr:`Client.max_messages` を増やしてください。" - -#: ../../api.rst:320 -msgid "The messages that have been deleted." -msgstr "削除されたメッセージのリスト。" - -#: ../../api.rst:325 -msgid "" -"Called when a message is deleted. Unlike :func:`on_message_delete`, this " -"is called regardless of the message being in the internal message cache " -"or not." -msgstr "" -"メッセージが削除されたときに呼び出されます。 :func:`on_message_delete` " -"とは異なり、削除されたメッセージが内部キャッシュに存在するか否かにかかわらず呼び出されます。" - -#: ../../api.rst:328 -msgid "" -"If the message is found in the message cache, it can be accessed via " -":attr:`RawMessageDeleteEvent.cached_message`" -msgstr "" -"メッセージがメッセージキャッシュ内に見つかった場合、 :attr:`RawMessageDeleteEvent.cached_message` " -"を介してアクセスすることができます。" - -#: ../../api.rst:333 ../../api.rst:346 ../../api.rst:395 ../../api.rst:422 -#: ../../api.rst:449 ../../api.rst:472 ../../api.rst:497 -msgid "The raw event payload data." -msgstr "生のイベントペイロードデータ。" - -#: ../../api.rst:338 -msgid "" -"Called when a bulk delete is triggered. Unlike " -":func:`on_bulk_message_delete`, this is called regardless of the messages" -" being in the internal message cache or not." -msgstr "" -"メッセージが一括削除されたときに呼び出されます。 :func:`on_bulk_message_delete` " -"とは異なり、削除されたメッセージが内部キャッシュに存在するか否かにかかわらず呼び出されます。" - -#: ../../api.rst:341 -msgid "" -"If the messages are found in the message cache, they can be accessed via " -":attr:`RawBulkMessageDeleteEvent.cached_messages`" -msgstr "" -"メッセージがメッセージキャッシュ内に見つかった場合、 " -":attr:`RawBulkMessageDeleteEvent.cached_messages` を介してアクセスすることができます。" - -#: ../../api.rst:351 -msgid "" -"Called when a :class:`Message` receives an update event. If the message " -"is not found in the internal message cache, then these events will not be" -" called. Messages might not be in cache if the message is too old or the " -"client is participating in high traffic guilds." -msgstr "" -":class:`Message` " -"が更新イベントを受け取ったときに呼び出されます。メッセージが内部のメッセージキャッシュに見つからない場合、このイベントは呼び出されません。これはメッセージが古すぎるか、クライアントが通信の多いギルドに参加している場合に発生します。" - -#: ../../api.rst:356 -#, fuzzy -msgid "" -"If this occurs increase the :attr:`Client.max_messages` attribute or use " -"the :func:`on_raw_message_edit` event instead." -msgstr "このような場合には :attr:`Client.max_messages` を増やしてください。" - -#: ../../api.rst:359 -msgid "The following non-exhaustive cases trigger this event:" -msgstr "以下の非網羅的ケースがこのイベントを発生させます:" - -#: ../../api.rst:361 -msgid "A message has been pinned or unpinned." -msgstr "メッセージをピン留め、または解除した。" - -#: ../../api.rst:362 -msgid "The message content has been changed." -msgstr "メッセージの内容を変更した。" - -#: ../../api.rst:363 -msgid "The message has received an embed." -msgstr "メッセージが埋め込みを受け取った。" - -#: ../../api.rst:365 -msgid "" -"For performance reasons, the embed server does not do this in a " -"\"consistent\" manner." -msgstr "パフォーマンス上の理由から、埋め込みのサーバーはこれを「一貫した」方法では行いません。" - -#: ../../api.rst:367 -msgid "The message's embeds were suppressed or unsuppressed." -msgstr "" - -#: ../../api.rst:368 -msgid "A call message has received an update to its participants or ending time." -msgstr "通話呼び出しメッセージの参加者や終了時刻が変わった。" - -#: ../../api.rst:372 -msgid "The previous version of the message." -msgstr "更新前のメッセージ。" - -#: ../../api.rst:374 -msgid "The current version of the message." -msgstr "更新後のメッセージ。" - -#: ../../api.rst:379 -msgid "" -"Called when a message is edited. Unlike :func:`on_message_edit`, this is " -"called regardless of the state of the internal message cache." -msgstr "" -"メッセージが編集されたときに呼び出されます。 :func:`on_message_edit` " -"とは異なり、これは内部のメッセージキャッシュの状態に関係なく呼び出されます。" - -#: ../../api.rst:382 -msgid "" -"If the message is found in the message cache, it can be accessed via " -":attr:`RawMessageUpdateEvent.cached_message`" -msgstr "" -"メッセージがメッセージキャッシュ内に見つかった場合、 :attr:`RawMessageUpdateEvent.cached_message` " -"を介してアクセスすることができます。" - -#: ../../api.rst:385 -#, fuzzy -msgid "" -"Due to the inherently raw nature of this event, the data parameter " -"coincides with the raw data given by the `gateway " -"`_." -msgstr "" -"このイベントの性質は、本質的に生表現のため、データのパラメータは `ゲートウェイ " -"`_ " -"によって与えられた生データと一致します。" - -#: ../../api.rst:388 -msgid "" -"Since the data payload can be partial, care must be taken when accessing " -"stuff in the dictionary. One example of a common case of partial data is " -"when the ``'content'`` key is inaccessible. This denotes an \"embed\" " -"only edit, which is an edit in which only the embeds are updated by the " -"Discord embed server." -msgstr "データのペイロードが部分的であるため、データにアクセスするときは気をつけてください。部分的なデータの主な場合のひとつは、``'content'``にアクセスできない場合です。Discordの埋め込みサーバーによって、埋め込みが更新される、\"埋め込み\"しか変わっていない編集がそうです。" - -#: ../../api.rst:400 -#, fuzzy -msgid "" -"Called when a message has a reaction added to it. Similar to " -":func:`on_message_edit`, if the message is not found in the internal " -"message cache, then this event will not be called. Consider using " -":func:`on_raw_reaction_add` instead." -msgstr "" -"メッセージにリアクションが追加されたときに呼び出されます。 :func:`on_message_edit` " -"のように、内部メッセージキャッシュにメッセージが見つからない場合は、このイベントは呼び出されません。" - -#: ../../api.rst:406 -msgid "" -"To get the :class:`Message` being reacted, access it via " -":attr:`Reaction.message`." -msgstr "リアクションの付いた:class:`Message`を取得するには、:attr:`Reaction.message`を使ってください。" - -#: ../../api.rst:408 ../../api.rst:420 ../../api.rst:435 ../../api.rst:447 -#: ../../api.rst:458 ../../api.rst:470 ../../api.rst:481 ../../api.rst:493 -msgid "This requires :attr:`Intents.reactions` to be enabled." -msgstr "" - -#: ../../api.rst:410 ../../api.rst:437 -msgid "The current state of the reaction." -msgstr "リアクションの現在の状態。" - -#: ../../api.rst:412 ../../api.rst:439 -msgid "The user who added the reaction." -msgstr "リアクションを追加したユーザー。" - -#: ../../api.rst:417 -msgid "" -"Called when a message has a reaction added. Unlike " -":func:`on_reaction_add`, this is called regardless of the state of the " -"internal message cache." -msgstr "" -"メッセージにリアクションが追加されたときに呼び出されます。 :func:`on_reaction_add` " -"とは異なり、これは内部のメッセージキャッシュの状態に関係なく呼び出されます。" - -#: ../../api.rst:427 -msgid "" -"Called when a message has a reaction removed from it. Similar to " -"on_message_edit, if the message is not found in the internal message " -"cache, then this event will not be called." -msgstr "メッセージのリアクションが取り除かれたときに呼び出されます。on_message_editのように、内部のメッセージキャッシュにメッセージがないときには、このイベントは呼び出されません。" - -#: ../../api.rst:433 -msgid "To get the message being reacted, access it via :attr:`Reaction.message`." -msgstr "リアクションの付いたメッセージを取得するには、:attr:`Reaction.message`を使ってください。" - -#: ../../api.rst:444 -msgid "" -"Called when a message has a reaction removed. Unlike " -":func:`on_reaction_remove`, this is called regardless of the state of the" -" internal message cache." -msgstr "" -"メッセージからリアクションが削除されたときに呼び出されます。 :func:`on_reaction_remove` " -"とは異なり、これは内部メッセージキャッシュの状態に関係なく呼び出されます。" - -#: ../../api.rst:454 -#, fuzzy -msgid "" -"Called when a message has all its reactions removed from it. Similar to " -":func:`on_message_edit`, if the message is not found in the internal " -"message cache, then this event will not be called. Consider using " -":func:`on_raw_reaction_clear` instead." -msgstr "" -"メッセージのリアクションがすべて削除されたときに呼び出されます。 :func:`on_message_edit` " -"のように、内部メッセージキャッシュにメッセージが見つからない場合は、このイベントは呼び出されません。" - -#: ../../api.rst:460 -msgid "The message that had its reactions cleared." -msgstr "リアクションが削除されたメッセージ。" - -#: ../../api.rst:462 -msgid "The reactions that were removed." -msgstr "除去されたリアクション。" - -#: ../../api.rst:467 -msgid "" -"Called when a message has all its reactions removed. Unlike " -":func:`on_reaction_clear`, this is called regardless of the state of the " -"internal message cache." -msgstr "" -"メッセージからリアクションがすべて削除されたときに呼び出されます。 :func:`on_reaction_clear` " -"とは異なり、これは内部メッセージキャッシュの状態に関係なく呼び出されます。" - -#: ../../api.rst:477 -#, fuzzy -msgid "" -"Called when a message has a specific reaction removed from it. Similar to" -" :func:`on_message_edit`, if the message is not found in the internal " -"message cache, then this event will not be called. Consider using " -":func:`on_raw_reaction_clear_emoji` instead." -msgstr "" -"メッセージのリアクションがすべて削除されたときに呼び出されます。 :func:`on_message_edit` " -"のように、内部メッセージキャッシュにメッセージが見つからない場合は、このイベントは呼び出されません。" - -#: ../../api.rst:485 -#, fuzzy -msgid "The reaction that got cleared." -msgstr "除去されたリアクション。" - -#: ../../api.rst:490 -#, fuzzy -msgid "" -"Called when a message has a specific reaction removed from it. Unlike " -":func:`on_reaction_clear_emoji` this is called regardless of the state of" -" the internal message cache." -msgstr "" -"メッセージからリアクションがすべて削除されたときに呼び出されます。 :func:`on_reaction_clear` " -"とは異なり、これは内部メッセージキャッシュの状態に関係なく呼び出されます。" - -#: ../../api.rst:503 -msgid "Called whenever a private channel is deleted or created." -msgstr "プライベートチャンネルが削除されたり作成されたときに呼び出されます。" - -#: ../../api.rst:507 -msgid "The private channel that got created or deleted." -msgstr "作成、または削除されたプライベートチャンネル。" - -#: ../../api.rst:512 -msgid "Called whenever a private group DM is updated. e.g. changed name or topic." -msgstr "プライベートグループDMが更新されたとき呼び出されます。 例: 名前やトピックの変更。" - -#: ../../api.rst:516 -msgid "The updated group channel's old info." -msgstr "更新されたグループチャンネルの更新前情報。" - -#: ../../api.rst:518 -msgid "The updated group channel's new info." -msgstr "更新されたグループチャンネルの更新後情報。" - -#: ../../api.rst:523 -msgid "Called whenever a message is pinned or unpinned from a private channel." -msgstr "プライベートチャンネルのメッセージがピン留めされたりはずされたりしたときに呼ばれます。" - -#: ../../api.rst:525 -msgid "The private channel that had its pins updated." -msgstr "ピン留めが更新されたプライベートチャンネル。" - -#: ../../api.rst:527 ../../api.rst:561 -msgid "" -"The latest message that was pinned as a naive datetime in UTC. Could be " -"``None``." -msgstr "最後にピン留めされたメッセージがピン留めされたUTC naive datetime。 ``None``の場合もあります。" - -#: ../../api.rst:533 -msgid "Called whenever a guild channel is deleted or created." -msgstr "ギルドのチャンネルが削除・作成されたとき呼び出されます。" - -#: ../../api.rst:535 -msgid "Note that you can get the guild from :attr:`~abc.GuildChannel.guild`." -msgstr "ギルドは :attr:`~abc.GuildChannel.guild` で取得できます。" - -#: ../../api.rst:537 ../../api.rst:546 ../../api.rst:557 ../../api.rst:634 -#: ../../api.rst:653 ../../api.rst:667 ../../api.rst:681 ../../api.rst:690 -#: ../../api.rst:716 -msgid "This requires :attr:`Intents.guilds` to be enabled." -msgstr "" - -#: ../../api.rst:539 -msgid "The guild channel that got created or deleted." -msgstr "作成、または削除されたギルドチャンネル。" - -#: ../../api.rst:544 -msgid "" -"Called whenever a guild channel is updated. e.g. changed name, topic, " -"permissions." -msgstr "ギルドチャンネルが更新されるたびに呼び出されます。例えば名前、トピック、権限の変更などです。" - -#: ../../api.rst:548 -msgid "The updated guild channel's old info." -msgstr "更新されたギルドの更新前情報。" - -#: ../../api.rst:550 -msgid "The updated guild channel's new info." -msgstr "更新されたギルドの更新後情報。" - -#: ../../api.rst:555 -msgid "Called whenever a message is pinned or unpinned from a guild channel." -msgstr "ギルドチャンネルのメッセージがピン留めされたり、解除されたりしたときに呼び出されます。" - -#: ../../api.rst:559 -msgid "The guild channel that had its pins updated." -msgstr "ピン留めが更新されたギルドチャンネル。" - -#: ../../api.rst:568 -msgid "" -"Called whenever an integration is created, modified, or removed from a " -"guild." -msgstr "ギルドの連携サービスが作成、更新、削除されるたびに呼び出されます。" - -#: ../../api.rst:570 -msgid "This requires :attr:`Intents.integrations` to be enabled." -msgstr "" - -#: ../../api.rst:572 -msgid "The guild that had its integrations updated." -msgstr "連携サービスが更新されたギルド。" - -#: ../../api.rst:577 -msgid "" -"Called whenever a webhook is created, modified, or removed from a guild " -"channel." -msgstr "ギルドチャンネルのWebhookが作成、更新、削除されたときに呼び出されます。" - -#: ../../api.rst:579 -msgid "This requires :attr:`Intents.webhooks` to be enabled." -msgstr "" - -#: ../../api.rst:581 -msgid "The channel that had its webhooks updated." -msgstr "Webhookが更新されたチャンネル。" - -#: ../../api.rst:587 -msgid "Called when a :class:`Member` leaves or joins a :class:`Guild`." -msgstr ":class:`Member` が :class:`Guild` に参加したり退出したりしたときに呼び出されます。" - -#: ../../api.rst:589 ../../api.rst:605 ../../api.rst:622 -msgid "This requires :attr:`Intents.members` to be enabled." -msgstr "" - -#: ../../api.rst:591 -msgid "The member who joined or left." -msgstr "参加、または脱退したメンバー。" - -#: ../../api.rst:596 -msgid "Called when a :class:`Member` updates their profile." -msgstr ":class:`Member` がプロフィールを編集したとき呼び出されます。" - -#: ../../api.rst:598 ../../api.rst:616 -msgid "This is called when one or more of the following things change:" -msgstr "これらのうちひとつ以上が変更されたとき呼び出されます:" - -#: ../../api.rst:600 -msgid "status" -msgstr "ステータス" - -#: ../../api.rst:601 -msgid "activity" -msgstr "" - -#: ../../api.rst:602 -msgid "nickname" -msgstr "ニックネーム" - -#: ../../api.rst:603 discord.Member.edit:16 of -msgid "roles" -msgstr "roles" - -#: ../../api.rst:607 -msgid "The updated member's old info." -msgstr "更新されたメンバーの更新前情報。" - -#: ../../api.rst:609 -msgid "The updated member's updated info." -msgstr "更新されたメンバーの更新後情報。" - -#: ../../api.rst:614 -msgid "Called when a :class:`User` updates their profile." -msgstr ":class:`User` がプロフィールを編集したとき呼び出されます。" - -#: ../../api.rst:618 -msgid "avatar" -msgstr "アバター" - -#: ../../api.rst:619 -msgid "username" -msgstr "ユーザー名" - -#: ../../api.rst:620 -msgid "discriminator" -msgstr "識別子" - -#: ../../api.rst:624 -msgid "The updated user's old info." -msgstr "更新されたユーザーの更新前情報。" - -#: ../../api.rst:626 -msgid "The updated user's updated info." -msgstr "更新されたユーザーの更新後情報。" - -#: ../../api.rst:631 -msgid "" -"Called when a :class:`Guild` is either created by the :class:`Client` or " -"when the :class:`Client` joins a guild." -msgstr "" -":class:`Client` によって :class:`Guild` が作成された。または :class:`Client` " -"がギルドに参加したときに呼び出されます。" - -#: ../../api.rst:636 -msgid "The guild that was joined." -msgstr "参加したギルド。" - -#: ../../api.rst:641 -msgid "Called when a :class:`Guild` is removed from the :class:`Client`." -msgstr ":class:`Client` が :class:`Guild` から削除されたときに呼び出されます。" - -#: ../../api.rst:643 -msgid "This happens through, but not limited to, these circumstances:" -msgstr "これは以下の状況時に呼び出されますが、これに限ったものではありません:" - -#: ../../api.rst:645 -msgid "The client got banned." -msgstr "クライアントがBANされた。" - -#: ../../api.rst:646 -msgid "The client got kicked." -msgstr "クライアントがキックされた。" - -#: ../../api.rst:647 -msgid "The client left the guild." -msgstr "クライアントがギルドから退出した。" - -#: ../../api.rst:648 -msgid "The client or the guild owner deleted the guild." -msgstr "クライアント、またはギルドオーナーがギルドを削除した。" - -#: ../../api.rst:650 -msgid "" -"In order for this event to be invoked then the :class:`Client` must have " -"been part of the guild to begin with. (i.e. it is part of " -":attr:`Client.guilds`)" -msgstr "" -"このイベントが呼び出されるためには、 :class:`Client` がギルドに参加している必要があります。(つまり、 " -":attr:`Client.guilds` にギルドが存在しなければならない)" - -#: ../../api.rst:655 -msgid "The guild that got removed." -msgstr "削除されたギルド。" - -#: ../../api.rst:660 -msgid "Called when a :class:`Guild` updates, for example:" -msgstr ":class:`Guild` が更新されたときに呼び出されます。例えば:" - -#: ../../api.rst:662 -msgid "Changed name" -msgstr "名前が変更された" - -#: ../../api.rst:663 -msgid "Changed AFK channel" -msgstr "AFKチャンネルが変更された" - -#: ../../api.rst:664 -msgid "Changed AFK timeout" -msgstr "AFKのタイムアウト時間が変更された" - -#: ../../api.rst:665 -msgid "etc" -msgstr "その他" - -#: ../../api.rst:669 -msgid "The guild prior to being updated." -msgstr "更新される前のギルド。" - -#: ../../api.rst:671 -msgid "The guild after being updated." -msgstr "更新された後のギルド。" - -#: ../../api.rst:677 -msgid "Called when a :class:`Guild` creates or deletes a new :class:`Role`." -msgstr ":class:`Guild` で :class:`Role` が新しく作成されたか、削除されたときに呼び出されます。" - -#: ../../api.rst:679 -msgid "To get the guild it belongs to, use :attr:`Role.guild`." -msgstr "ギルドを取得するには :attr:`Role.guild` を使用してください。" - -#: ../../api.rst:683 -msgid "The role that was created or deleted." -msgstr "作成、または削除された役職。" - -#: ../../api.rst:688 -msgid "Called when a :class:`Role` is changed guild-wide." -msgstr ":class:`Role` がギルド全体で変更されたときに呼び出されます。" - -#: ../../api.rst:692 -msgid "The updated role's old info." -msgstr "更新された役職の更新前情報。" - -#: ../../api.rst:694 -msgid "The updated role's updated info." -msgstr "更新された役職の更新後情報。" - -#: ../../api.rst:699 -msgid "Called when a :class:`Guild` adds or removes :class:`Emoji`." -msgstr ":class:`Guild` に :class:`Emoji` が追加、または削除されたときに呼び出されます。" - -#: ../../api.rst:701 -msgid "This requires :attr:`Intents.emojis` to be enabled." -msgstr "" - -#: ../../api.rst:703 -msgid "The guild who got their emojis updated." -msgstr "絵文字が更新されたギルド。" - -#: ../../api.rst:705 -msgid "A list of emojis before the update." -msgstr "更新前の絵文字のリスト。" - -#: ../../api.rst:707 -msgid "A list of emojis after the update." -msgstr "更新後の絵文字のリスト。" - -#: ../../api.rst:713 -msgid "" -"Called when a guild becomes available or unavailable. The guild must have" -" existed in the :attr:`Client.guilds` cache." -msgstr "ギルドが利用可能・不可能になったときに呼び出されます。ギルドは :attr:`Client.guilds` キャッシュに存在していないといけません。" - -#: ../../api.rst:718 -msgid "The :class:`Guild` that has changed availability." -msgstr "利用状況が変わった:class:`Guild`。" - -#: ../../api.rst:722 -msgid "Called when a :class:`Member` changes their :class:`VoiceState`." -msgstr ":class:`Member` が :class:`VoiceState` を変更したとき呼び出されます。" - -#: ../../api.rst:724 -msgid "" -"The following, but not limited to, examples illustrate when this event is" -" called:" -msgstr "これらの場合に限りませんが、例を挙げると、以下の場合に呼び出されます:" - -#: ../../api.rst:726 -msgid "A member joins a voice channel." -msgstr "メンバーがボイスチャンネルに参加したとき。" - -#: ../../api.rst:727 -msgid "A member leaves a voice channel." -msgstr "メンバーがボイスチャンネルから退出したとき。" - -#: ../../api.rst:728 -msgid "A member is muted or deafened by their own accord." -msgstr "メンバーが自身でマイクやスピーカーをミュートしたとき。" - -#: ../../api.rst:729 -msgid "A member is muted or deafened by a guild administrator." -msgstr "メンバーがギルドの管理者によってマイクやスピーカーをミュートされたとき。" - -#: ../../api.rst:731 -msgid "This requires :attr:`Intents.voice_states` to be enabled." -msgstr "" - -#: ../../api.rst:733 -msgid "The member whose voice states changed." -msgstr "ボイスの状態が変わった `Member` 。" - -#: ../../api.rst:735 -msgid "The voice state prior to the changes." -msgstr "更新前のボイス状態。" - -#: ../../api.rst:737 -msgid "The voice state after to the changes." -msgstr "更新後のボイス状態。" - -#: ../../api.rst:742 -msgid "Called when user gets banned from a :class:`Guild`." -msgstr "ユーザーが :class:`Guild` からBANされたとき呼び出されます。" - -#: ../../api.rst:744 ../../api.rst:757 -msgid "This requires :attr:`Intents.bans` to be enabled." -msgstr "" - -#: ../../api.rst:746 -msgid "The guild the user got banned from." -msgstr "ユーザーがBANされたギルド。" - -#: ../../api.rst:748 -msgid "" -"The user that got banned. Can be either :class:`User` or :class:`Member` " -"depending if the user was in the guild or not at the time of removal." -msgstr "BANされたユーザー。BAN時にユーザーがギルドにいたかによって、 :class:`User` か :class:`Member` になります。" - -#: ../../api.rst:755 -msgid "Called when a :class:`User` gets unbanned from a :class:`Guild`." -msgstr ":class:`User` が :class:`Guild` のBANを解除されたとき呼び出されます。" - -#: ../../api.rst:759 -msgid "The guild the user got unbanned from." -msgstr "ユーザーのBANが解除されたギルド。" - -#: ../../api.rst:761 -msgid "The user that got unbanned." -msgstr "Banが解除されたユーザー。" - -#: ../../api.rst:766 -#, fuzzy -msgid "" -"Called when an :class:`Invite` is created. You must have the " -":attr:`~Permissions.manage_channels` permission to receive this." -msgstr "これを行うには、関連付けられたGuildにて、 :attr:`~.Permissions.manage_channels` 権限が必要です。" - -#: ../../api.rst:773 ../../api.rst:790 -msgid "" -"There is a rare possibility that the :attr:`Invite.guild` and " -":attr:`Invite.channel` attributes will be of :class:`Object` rather than " -"the respective models." -msgstr "" - -#: ../../api.rst:776 ../../api.rst:796 -msgid "This requires :attr:`Intents.invites` to be enabled." -msgstr "" - -#: ../../api.rst:778 discord.CategoryChannel.create_invite:26 -#: discord.TextChannel.create_invite:26 discord.VoiceChannel.create_invite:26 -#: discord.abc.GuildChannel.create_invite:26 of -msgid "The invite that was created." -msgstr "" - -#: ../../api.rst:783 -#, fuzzy -msgid "" -"Called when an :class:`Invite` is deleted. You must have the " -":attr:`~Permissions.manage_channels` permission to receive this." -msgstr "これを行うには、関連付けられたGuildにて、 :attr:`~.Permissions.manage_channels` 権限が必要です。" - -#: ../../api.rst:793 -msgid "" -"Outside of those two attributes, the only other attribute guaranteed to " -"be filled by the Discord gateway for this event is :attr:`Invite.code`." -msgstr "" - -#: ../../api.rst:798 -#, fuzzy -msgid "The invite that was deleted." -msgstr "招待の更新。" - -#: ../../api.rst:804 -msgid "Called when someone joins or leaves a :class:`GroupChannel`." -msgstr "誰かが :class:`GroupChannel` に参加、または脱退したときに呼び出されます。" - -#: ../../api.rst:806 -msgid "The group that the user joined or left." -msgstr "ユーザーが参加または脱退したグループ。" - -#: ../../api.rst:808 -msgid "The user that joined or left." -msgstr "参加または脱退したユーザー。" - -#: ../../api.rst:814 -msgid "" -"Called when a :class:`Relationship` is added or removed from the " -":class:`ClientUser`." -msgstr ":class:`ClientUser` の :class:`Relationship` が追加・削除されたとき呼び出されます。" - -#: ../../api.rst:817 -msgid "The relationship that was added or removed." -msgstr "追加・削除されたRelationship。" - -#: ../../api.rst:822 -msgid "" -"Called when a :class:`Relationship` is updated, e.g. when you block a " -"friend or a friendship is accepted." -msgstr ":class:`Relationship` が更新されたとき、たとえばフレンドをブロックしたり、フレンドが承認されたときに呼び出されます。" - -#: ../../api.rst:825 -msgid "The previous relationship status." -msgstr "以前のフレンドの状態。" - -#: ../../api.rst:827 -msgid "The updated relationship status." -msgstr "更新されたのフレンドの状態。" - -#: ../../api.rst:833 -msgid "Utility Functions" -msgstr "ユーティリティ関数" - -#: discord.utils.find:1 of -msgid "" -"A helper to return the first element found in the sequence that meets the" -" predicate. For example: ::" -msgstr "与えられた関数を満たす最初の要素を返すヘルパー。例: ::" - -#: discord.utils.find:6 of -msgid "" -"would find the first :class:`~discord.Member` whose name is 'Mighty' and " -"return it. If an entry is not found, then ``None`` is returned." -msgstr "" -"は、名前が'Mighty'である最初に見つかった :class:`~discord.Member` を返します。見つからない場合は " -"``None`` を返します。" - -#: discord.utils.find:9 of -msgid "" -"This is different from :func:`py:filter` due to the fact it stops the " -"moment it finds a valid entry." -msgstr "これは、適切な値を見つけると止まる点で、 :func:`py:filter` と異なります。" - -#: discord.utils.find:12 of -msgid "A function that returns a boolean-like result." -msgstr "真偽値を返す関数。" - -#: discord.utils.find:13 of -msgid "The iterable to search through." -msgstr "検索するイテラブル。" - -#: discord.utils.get:1 of -msgid "" -"A helper that returns the first element in the iterable that meets all " -"the traits passed in ``attrs``. This is an alternative for " -":func:`~discord.utils.find`." -msgstr "``attrs`` に渡されたすべての条件を満たす最初の要素を返すヘルパー。 :func:`~discord.utils.find` の代替案です。" - -#: discord.utils.get:5 of -msgid "" -"When multiple attributes are specified, they are checked using logical " -"AND, not logical OR. Meaning they have to meet every attribute passed in " -"and not one of them." -msgstr "複数の条件が指定されている場合、またはではなくかつでチェックされます。つまり、どれかではなく、すべての条件を満たさないといけません。" - -#: discord.utils.get:9 of -msgid "" -"To have a nested attribute search (i.e. search by ``x.y``) then pass in " -"``x__y`` as the keyword argument." -msgstr "ネストされている属性で検索するとき (例: ``x.y`` で検索) は、キーワード引数に ``x__y`` を渡してください。" - -#: discord.utils.get:12 of -msgid "" -"If nothing is found that matches the attributes passed, then ``None`` is " -"returned." -msgstr "与えられた属性にマッチする項目がない場合、 ``None`` を返します。" - -#: discord.utils.get:17 of -msgid "Basic usage:" -msgstr "基本的な使用法:" - -#: discord.utils.get:23 of -msgid "Multiple attribute matching:" -msgstr "複数の属性のマッチ:" - -#: discord.utils.get:29 of -msgid "Nested attribute matching:" -msgstr "ネストされた属性のマッチ:" - -#: discord.utils.get:35 of -msgid "An iterable to search through." -msgstr "検索するイテラブル。" - -#: discord.utils.get:36 of -msgid "Keyword arguments that denote attributes to search with." -msgstr "検索用の属性を表すキーワード引数。" - -#: discord.utils.snowflake_time:1 of -msgid "The snowflake ID." -msgstr "" - -#: discord.utils.snowflake_time:4 of -#, fuzzy -msgid "The creation date in UTC of a Discord snowflake ID." -msgstr "Discordのsnowflake IDの作成日時をUTCで返します。" - -#: ../../api.rst:878 discord.AuditLogEntry.created_at:3 -#: discord.CategoryChannel.created_at:3 discord.ClientUser.created_at:5 -#: discord.DMChannel.created_at:3 discord.Embed:51 discord.Emoji.created_at:3 -#: discord.GroupChannel.created_at:3 discord.Guild.created_at:3 -#: discord.Integration:81 discord.Invite:74 discord.Message.created_at:3 -#: discord.Object.created_at:3 discord.PartialInviteChannel.created_at:3 -#: discord.PartialInviteGuild.created_at:3 discord.Role.created_at:3 -#: discord.Spotify.end:3 discord.Spotify.start:3 discord.Template:39 -#: discord.Template:45 discord.TextChannel.created_at:3 -#: discord.User.created_at:5 discord.VoiceChannel.created_at:3 -#: discord.Webhook.created_at:3 discord.Widget.created_at:3 -#: discord.WidgetChannel.created_at:3 discord.WidgetMember.created_at:5 -#: discord.abc.GuildChannel.created_at:3 discord.abc.Snowflake.created_at:3 -#: discord.utils.snowflake_time:5 of -msgid ":class:`datetime.datetime`" -msgstr "" - -#: discord.utils.oauth_url:1 of -msgid "" -"A helper function that returns the OAuth2 URL for inviting the bot into " -"guilds." -msgstr "ボットをギルドに招待するOAuth2 URLを返すヘルパー関数。" - -#: discord.utils.oauth_url:4 of -msgid "The client ID for your bot." -msgstr "ボットのクライアントID。" - -#: discord.utils.oauth_url:6 of -msgid "" -"The permissions you're requesting. If not given then you won't be " -"requesting any permissions." -msgstr "要求する権限。もし与えられていない場合、権限を要求しません。" - -#: discord.utils.oauth_url:9 of -msgid "The guild to pre-select in the authorization screen, if available." -msgstr "利用できる場合は、認証画面であらかじめ選択されるギルド。" - -#: discord.utils.oauth_url:11 of -msgid "An optional valid redirect URI." -msgstr "任意の有効なリダイレクトURI。" - -#: discord.utils.oauth_url:14 of -#, fuzzy -msgid "The OAuth2 URL for inviting the bot into guilds." -msgstr "ボットをギルドに招待するOAuth2 URLを返すヘルパー関数。" - -#: discord.utils.escape_markdown:1 of -msgid "A helper function that escapes Discord's markdown." -msgstr "Discordのマークダウンをエスケープするヘルパー関数。" - -#: discord.utils.escape_markdown:3 of -msgid "The text to escape markdown from." -msgstr "マークダウンをエスケープするテキスト。" - -#: discord.utils.escape_markdown:5 of -msgid "" -"Whether to escape the markdown characters as needed. This means that it " -"does not escape extraneous characters if it's not necessary, e.g. " -"``**hello**`` is escaped into ``\\*\\*hello**`` instead of " -"``\\*\\*hello\\*\\*``. Note however that this can open you up to some " -"clever syntax abuse. Defaults to ``False``." -msgstr "" -"必要に応じてマークダウンをエスケープするかどうか。必要でなければ無関係な文字をエスケープしません。 ``**hello**`` は " -"``\\*\\*hello\\*\\*`` ではなく ``\\*\\*hello**`` " -"にエスケープされます。ただし、これによって巧妙な構文の乱用が発生する可能性があります。デフォルトは ``False`` です。" - -#: discord.utils.escape_markdown:11 of -msgid "" -"Whether to leave links alone when escaping markdown. For example, if a " -"URL in the text contains characters such as ``_`` then it will be left " -"alone. This option is not supported with ``as_needed``. Defaults to " -"``True``." -msgstr "" -"マークダウンをエスケープするときにリンクを残すかどうか。たとえば、テキスト中のURLが ``_`` " -"のような文字を含む場合、これは残されます。これは ``as_needed`` と併用できません。デフォルトは ``True`` です。" - -#: discord.utils.escape_markdown:17 of -msgid "The text with the markdown special characters escaped with a slash." -msgstr "マークダウンの特殊文字をスラッシュでエスケープしたテキスト。" - -#: discord.utils.escape_mentions:1 of -msgid "A helper function that escapes everyone, here, role, and user mentions." -msgstr "everyone、here、役職とユーザーのメンションをエスケープするヘルパー関数。" - -#: discord.utils.escape_mentions:5 of -msgid "This does not include channel mentions." -msgstr "チャンネルのメンションはエスケープしません。" - -#: discord.utils.escape_mentions:9 of -msgid "" -"For more granular control over what mentions should be escaped within " -"messages, refer to the :class:`~discord.AllowedMentions` class." -msgstr "" - -#: discord.utils.escape_mentions:13 of -msgid "The text to escape mentions from." -msgstr "メンションをエスケープするテキスト。" - -#: discord.utils.escape_mentions:16 of -msgid "The text with the mentions removed." -msgstr "メンションが削除されたテキスト。" - -#: discord.utils.resolve_invite:1 of -#, fuzzy -msgid "Resolves an invite from a :class:`~discord.Invite`, URL or code." -msgstr ":class:`~discord.Invite` やURL、IDから招待を解決します" - -#: discord.utils.resolve_invite:3 of -msgid "The invite." -msgstr "招待。" - -#: discord.utils.resolve_invite:6 of -msgid "The invite code." -msgstr "招待コード。" - -#: discord.utils.resolve_template:1 of -#, fuzzy -msgid "Resolves a template code from a :class:`~discord.Template`, URL or code." -msgstr ":class:`~discord.Invite` やURL、IDから招待を解決します" - -#: discord.utils.resolve_template:5 of -#, fuzzy -msgid "The code." -msgstr "招待コード。" - -#: discord.Template:7 discord.utils.resolve_template:8 of -#, fuzzy -msgid "The template code." -msgstr "招待コード。" - -#: discord.utils.sleep_until:3 of -#, fuzzy -msgid "Sleep until a specified time." -msgstr "特定のインデックスのフィールドを削除します。" - -#: discord.utils.sleep_until:5 of -msgid "If the time supplied is in the past this function will yield instantly." -msgstr "" - -#: discord.utils.sleep_until:9 of -msgid "" -"The timestamp in which to sleep until. If the datetime is naive then it " -"is assumed to be in UTC." -msgstr "" - -#: discord.utils.sleep_until:12 of -msgid "If provided is returned to the caller when the coroutine completes." -msgstr "" - -#: ../../api.rst:854 -msgid "Profile" -msgstr "プロフィール" - -#: ../../api.rst:858 -msgid "A namedtuple representing a user's Discord public profile." -msgstr "Discordの公開プロフィールを表すnamedtuple。" - -#: ../../api.rst:862 -msgid "The :class:`User` the profile belongs to." -msgstr "このプロフィールを持つ :class:`User` 。" - -#: ../../api.rst:867 -msgid "A boolean indicating if the user has premium (i.e. Discord Nitro)." -msgstr "このユーザーがプレミアム(つまり: Discord Nitro)を持っているかを示す真偽値。" - -#: ../../api.rst:872 -msgid "An alias for :attr:`premium`." -msgstr ":attr:`premium` のエイリアス。" - -#: ../../api.rst:875 -msgid "" -"A naive UTC datetime indicating how long the user has been premium since." -" This could be ``None`` if not applicable." -msgstr "プレミアムを有効にした日時を表すtimezone naiveなUTC datetime。利用できない場合は ``None`` になります。" - -#: ../../api.rst:881 -msgid "A boolean indicating if the user is Discord Staff." -msgstr "ユーザーがDiscordのスタッフかを示す真偽値。" - -#: ../../api.rst:886 -msgid "A boolean indicating if the user is a Discord Partner." -msgstr "ユーザーがDiscordパートナーかを示す真偽値。" - -#: ../../api.rst:891 -msgid "A boolean indicating if the user is a Bug Hunter." -msgstr "ユーザーがバグハンターかを示す真偽値。" - -#: ../../api.rst:896 -msgid "A boolean indicating if the user has had premium before 10 October, 2018." -msgstr "ユーザーが2018年10月10日以前にNitroを持っていたかを示す真偽値。" - -#: ../../api.rst:901 -msgid "A boolean indicating if the user is in Discord HypeSquad." -msgstr "ユーザーがDiscord HypeSquadに属しているかを示す真偽値。" - -#: ../../api.rst:906 -msgid "A list of :class:`HypeSquadHouse` that the user is in." -msgstr "ユーザーが所属する :class:`HypeSquadHouse` のリスト。" - -#: ../../api.rst:908 -msgid "List[:class:`HypeSquadHouse`]" -msgstr "" - -#: ../../api.rst:911 -#, fuzzy -msgid "A boolean indicating if the user is in part of a team." -msgstr "ユーザーがDiscordのスタッフかを示す真偽値。" - -#: ../../api.rst:919 -#, fuzzy -msgid "" -"A boolean indicating if the user is officially part of the Discord urgent" -" message system." -msgstr "ユーザーがDiscordパートナーかを示す真偽値。" - -#: ../../api.rst:927 -msgid "" -"A list of :class:`Guild` that the :class:`ClientUser` shares with this " -"user." -msgstr ":class:`ClientUser` がこのユーザーと共有する :class:`Guild` の一覧。" - -#: ../../api.rst:930 -#, fuzzy -msgid "List[:class:`Guild`]" -msgstr ":class:`.Guild`" - -#: ../../api.rst:934 -msgid "A list of dict objects indicating the accounts the user has connected." -msgstr "ユーザーが関連付けたアカウントを示す辞書型のリスト。" - -#: ../../api.rst:936 -msgid "An example entry can be seen below: ::" -msgstr "以下がその例です: ::" - -#: ../../api.rst:940 -msgid "List[Dict[:class:`str`, :class:`str`]]" -msgstr "" - -#: ../../api.rst:945 -msgid "Enumerations" -msgstr "列挙型" - -#: ../../api.rst:947 -msgid "" -"The API provides some enumerations for certain types of strings to avoid " -"the API from being stringly typed in case the strings change in the " -"future." -msgstr "APIは、文字列が将来変わることに備え、文字列を直書きするのを防ぐために、いくらかの文字列の列挙型を提供します。" - -#: ../../api.rst:950 -msgid "" -"All enumerations are subclasses of an internal class which mimics the " -"behaviour of :class:`enum.Enum`." -msgstr "列挙型はすべて :class:`enum.Enum` の動作を模倣した内部クラスのサブクラスです。" - -#: ../../api.rst:955 -msgid "Specifies the type of channel." -msgstr "特定チャンネルのチャンネルタイプ。" - -#: ../../api.rst:959 -msgid "A text channel." -msgstr "テキストチャンネル。" - -#: ../../api.rst:962 -msgid "A voice channel." -msgstr "ボイスチャンネル。" - -#: ../../api.rst:965 -msgid "A private text channel. Also called a direct message." -msgstr "プライベートのテキストチャンネル。ダイレクトメッセージとも呼ばれています。" - -#: ../../api.rst:968 -msgid "A private group text channel." -msgstr "プライベートのグループDM。" - -#: ../../api.rst:971 -#, fuzzy -msgid "A category channel." -msgstr "テキストチャンネル。" - -#: ../../api.rst:974 -msgid "A guild news channel." -msgstr "ギルドのニュースチャンネル。" - -#: ../../api.rst:978 -msgid "A guild store channel." -msgstr "ギルドのストアチャンネル。" - -#: ../../api.rst:982 -msgid "" -"Specifies the type of :class:`Message`. This is used to denote if a " -"message is to be interpreted as a system message or a regular message." -msgstr ":class:`Message` のタイプを指定します。これは、メッセージが通常のものかシステムメッセージかを判断するのに使用できます。" - -#: ../../api.rst:989 -#, fuzzy -msgid "Checks if two messages are equal." -msgstr "二つのユーザーが等しいかを比較します。" - -#: ../../api.rst:992 -#, fuzzy -msgid "Checks if two messages are not equal." -msgstr "二つのユーザーが等しいものではないか比較します。" - -#: ../../api.rst:996 -msgid "The default message type. This is the same as regular messages." -msgstr "デフォルトのメッセージ。これは通常のメッセージと同じです。" - -#: ../../api.rst:999 -msgid "" -"The system message when a recipient is added to a group private message, " -"i.e. a private channel of type :attr:`ChannelType.group`." -msgstr "" -"グループのプライベートメッセージ、つまり、 :attr:`ChannelType.group` " -"のプライベートチャンネルの参加者が増えたときのシステムメッセージ。" - -#: ../../api.rst:1003 -msgid "" -"The system message when a recipient is removed from a group private " -"message, i.e. a private channel of type :attr:`ChannelType.group`." -msgstr "" -"グループのプライベートメッセージ、つまり、 :attr:`ChannelType.group` " -"のプライベートチャンネルの参加者が減ったときのシステムメッセージ。" - -#: ../../api.rst:1007 -msgid "" -"The system message denoting call state, e.g. missed call, started call, " -"etc." -msgstr "通話の状態を示すシステムメッセージ。例: 不在着信、通話の開始、その他。" - -#: ../../api.rst:1011 -msgid "The system message denoting that a channel's name has been changed." -msgstr "チャンネル名の変更を示すシステムメッセージ。" - -#: ../../api.rst:1014 -msgid "The system message denoting that a channel's icon has been changed." -msgstr "チャンネルのアイコンの変更を示すシステムメッセージ。" - -#: ../../api.rst:1017 -msgid "" -"The system message denoting that a pinned message has been added to a " -"channel." -msgstr "ピン留めの追加を示すシステムメッセージ。" - -#: ../../api.rst:1020 -msgid "The system message denoting that a new member has joined a Guild." -msgstr "ギルドの新規メンバーの参加を示すシステムメッセージ。" - -#: ../../api.rst:1024 -msgid "The system message denoting that a member has \"nitro boosted\" a guild." -msgstr "メンバーがギルドを「ニトロブースト」したことを表すシステムメッセージ。" - -#: ../../api.rst:1027 -msgid "" -"The system message denoting that a member has \"nitro boosted\" a guild " -"and it achieved level 1." -msgstr "メンバーがギルドを「ニトロブースト」し、それによってギルドがレベル1に到達したことを表すシステムメッセージ。" - -#: ../../api.rst:1031 -msgid "" -"The system message denoting that a member has \"nitro boosted\" a guild " -"and it achieved level 2." -msgstr "メンバーがギルドを「ニトロブースト」し、それによってギルドがレベル2に到達したことを表すシステムメッセージ。" - -#: ../../api.rst:1035 -msgid "" -"The system message denoting that a member has \"nitro boosted\" a guild " -"and it achieved level 3." -msgstr "メンバーがギルドを「ニトロブースト」し、それによってギルドがレベル3に到達したことを表すシステムメッセージ。" - -#: ../../api.rst:1039 -#, fuzzy -msgid "" -"The system message denoting that an announcement channel has been " -"followed." -msgstr "チャンネル名の変更を示すシステムメッセージ。" - -#: ../../api.rst:1045 -msgid "" -"Specifies the type of :class:`Activity`. This is used to check how to " -"interpret the activity itself." -msgstr ":class:`Activity` のタイプを指定します。これはアクティビティをどう解釈するか確認するために使われます。" - -#: ../../api.rst:1050 -msgid "An unknown activity type. This should generally not happen." -msgstr "不明なアクティビティタイプ。これは通常起こらないはずです。" - -#: ../../api.rst:1053 -msgid "A \"Playing\" activity type." -msgstr "プレイ中のアクティビティタイプ。" - -#: ../../api.rst:1056 -msgid "A \"Streaming\" activity type." -msgstr "放送中のアクティビティタイプ。" - -#: ../../api.rst:1059 -msgid "A \"Listening\" activity type." -msgstr "再生中のアクティビティタイプ。" - -#: ../../api.rst:1062 -msgid "A \"Watching\" activity type." -msgstr "視聴中のアクティビティタイプ。" - -#: ../../api.rst:1065 -#, fuzzy -msgid "A custom activity type." -msgstr "放送中のアクティビティタイプ。" - -#: ../../api.rst:1068 -#, fuzzy -msgid "A competing activity type." -msgstr "視聴中のアクティビティタイプ。" - -#: ../../api.rst:1074 -msgid "Specifies the HypeSquad house a user belongs to." -msgstr "ユーザーが属するHypeSquadハウスを指定します。" - -#: ../../api.rst:1078 -msgid "The \"Bravery\" house." -msgstr "Braveryのハウス。" - -#: ../../api.rst:1081 -msgid "The \"Brilliance\" house." -msgstr "Brillianceのハウス。" - -#: ../../api.rst:1084 -msgid "The \"Balance\" house." -msgstr "Balanceのハウス。" - -#: ../../api.rst:1088 -msgid "Specifies the region a voice server belongs to." -msgstr "ボイスサーバーのリージョンを指定します。" - -#: ../../api.rst:1092 -msgid "The Amsterdam region." -msgstr "アムステルダムリージョン。" - -#: ../../api.rst:1095 -msgid "The Brazil region." -msgstr "ブラジルリージョン。" - -#: ../../api.rst:1098 -#, fuzzy -msgid "The Dubai region." -msgstr "インドリージョン。" - -#: ../../api.rst:1104 -msgid "The EU Central region." -msgstr "中央ヨーロッパのリージョン。" - -#: ../../api.rst:1107 -msgid "The EU West region." -msgstr "東ヨーロッパのリージョン。" - -#: ../../api.rst:1110 -#, fuzzy -msgid "The Europe region." -msgstr "日本リージョン。" - -#: ../../api.rst:1116 -msgid "The Frankfurt region." -msgstr "フランクフルトリージョン。" - -#: ../../api.rst:1119 -msgid "The Hong Kong region." -msgstr "香港リージョン。" - -#: ../../api.rst:1122 -msgid "The India region." -msgstr "インドリージョン。" - -#: ../../api.rst:1128 -msgid "The Japan region." -msgstr "日本リージョン。" - -#: ../../api.rst:1131 -msgid "The London region." -msgstr "ロンドンリージョン。" - -#: ../../api.rst:1134 -msgid "The Russia region." -msgstr "ロシアリージョン。" - -#: ../../api.rst:1137 -msgid "The Singapore region." -msgstr "シンガポールリージョン。" - -#: ../../api.rst:1140 -msgid "The South Africa region." -msgstr "南アフリカリージョン。" - -#: ../../api.rst:1143 -#, fuzzy -msgid "The South Korea region." -msgstr "南アフリカリージョン。" - -#: ../../api.rst:1146 -msgid "The Sydney region." -msgstr "シドニーリージョン。" - -#: ../../api.rst:1149 -msgid "The US Central region." -msgstr "中央アメリカのリージョン。" - -#: ../../api.rst:1152 -msgid "The US East region." -msgstr "アメリカ西部のリージョン。" - -#: ../../api.rst:1155 -msgid "The US South region." -msgstr "アメリカ南部のリージョン。" - -#: ../../api.rst:1158 -msgid "The US West region." -msgstr "アメリカ東部のリージョン。" - -#: ../../api.rst:1161 -msgid "The Amsterdam region for VIP guilds." -msgstr "VIPギルド用のアムステルダムリージョン。" - -#: ../../api.rst:1164 -msgid "The US East region for VIP guilds." -msgstr "VIPギルド用のアメリカ東部リージョン。" - -#: ../../api.rst:1167 -msgid "The US West region for VIP guilds." -msgstr "VIPギルド用のアメリカ西部リージョン。" - -#: ../../api.rst:1171 -msgid "" -"Specifies a :class:`Guild`\\'s verification level, which is the criteria " -"in which a member must meet before being able to send messages to the " -"guild." -msgstr ":class:`Guild` の認証レベルを指定します。これは、メンバーがギルドにメッセージを送信できるようになるまでの条件です。" - -#: ../../api.rst:1178 -msgid "Checks if two verification levels are equal." -msgstr "認証レベルが等しいか確認します。" - -#: ../../api.rst:1181 -msgid "Checks if two verification levels are not equal." -msgstr "認証レベルが等しくないか確認します。" - -#: ../../api.rst:1184 -msgid "Checks if a verification level is higher than another." -msgstr "認証レベルがあるレベルより厳しいか確認します。" - -#: ../../api.rst:1187 -msgid "Checks if a verification level is lower than another." -msgstr "認証レベルがあるレベルより緩いか確認します。" - -#: ../../api.rst:1190 -msgid "Checks if a verification level is higher or equal to another." -msgstr "認証レベルがあるレベルと同じ、又は厳しいか確認します。" - -#: ../../api.rst:1193 -msgid "Checks if a verification level is lower or equal to another." -msgstr "認証レベルがあるレベルと同じ、又は緩いか確認します。" - -#: ../../api.rst:1197 -msgid "No criteria set." -msgstr "無制限。" - -#: ../../api.rst:1200 -msgid "Member must have a verified email on their Discord account." -msgstr "メンバーはDiscordアカウントのメール認証を済ませないといけません。" - -#: ../../api.rst:1203 -msgid "" -"Member must have a verified email and be registered on Discord for more " -"than five minutes." -msgstr "メンバーはメール認証をし、かつアカウント登録から5分経過しないといけません。" - -#: ../../api.rst:1207 -msgid "" -"Member must have a verified email, be registered on Discord for more than" -" five minutes, and be a member of the guild itself for more than ten " -"minutes." -msgstr "メンバーはメール認証をし、Discordのアカウント登録から5分経過し、かつ10分以上ギルドに所属していないといけません。" - -#: ../../api.rst:1212 -msgid "An alias for :attr:`high`." -msgstr ":attr:`high` のエイリアス。" - -#: ../../api.rst:1215 -msgid "Member must have a verified phone on their Discord account." -msgstr "メンバーはDiscordアカウントの電話番号認証を済ませないといけません。" - -#: ../../api.rst:1219 ../../api.rst:1223 -msgid "An alias for :attr:`extreme`." -msgstr ":attr:`extreme` のエイリアス。" - -#: ../../api.rst:1229 -msgid "" -"Specifies whether a :class:`Guild` has notifications on for all messages " -"or mentions only by default." -msgstr ":class:`Guild` の通知対象のデフォルト設定をすべてのメッセージ、またはメンションのみに指定します。" - -#: ../../api.rst:1233 -msgid "" -"Members receive notifications for every message regardless of them being " -"mentioned." -msgstr "メンバーは、メンションされているかどうかに関わらず、すべてのメッセージの通知を受け取ります。" - -#: ../../api.rst:1236 -msgid "Members receive notifications for messages they are mentioned in." -msgstr "メンバーは自分がメンションされているメッセージの通知のみ受け取ります。" - -#: ../../api.rst:1240 -msgid "" -"Specifies a :class:`Guild`\\'s explicit content filter, which is the " -"machine learning algorithms that Discord uses to detect if an image " -"contains pornography or otherwise explicit content." -msgstr "" -":class:`Guild` " -"の不適切な表現のフィルターを指定します。これはDiscordがポルノ画像や不適切な表現を検出するために使用している機械学習アルゴリズムです。" - -#: ../../api.rst:1248 -msgid "Checks if two content filter levels are equal." -msgstr "表現のフィルターのレベルが等しいか確認します。" - -#: ../../api.rst:1251 -msgid "Checks if two content filter levels are not equal." -msgstr "表現のフィルターのレベルが等しくないか確認します。" - -#: ../../api.rst:1254 -msgid "Checks if a content filter level is higher than another." -msgstr "表現のフィルターのレベルが他のレベルより大きいか確認します。" - -#: ../../api.rst:1257 -msgid "Checks if a content filter level is lower than another." -msgstr "表現のフィルターのレベルが他のレベルより小さいか確認します。" - -#: ../../api.rst:1260 -msgid "Checks if a content filter level is higher or equal to another." -msgstr "表現のフィルターのレベルが他のレベルより大きい、または等しいか確認します。" - -#: ../../api.rst:1263 -msgid "Checks if a content filter level is lower or equal to another." -msgstr "表現のフィルターのレベルが他のレベルより小さい、または等しいか確認します。" - -#: ../../api.rst:1267 -msgid "The guild does not have the content filter enabled." -msgstr "ギルドで表現のフィルターが有効ではない。" - -#: ../../api.rst:1270 -msgid "The guild has the content filter enabled for members without a role." -msgstr "ギルドで役職を持たないメンバーに対して表現のフィルターが有効化されている。" - -#: ../../api.rst:1273 -msgid "The guild has the content filter enabled for every member." -msgstr "ギルドで、すべてのメンバーに対して表現のフィルターが有効化されている。" - -#: ../../api.rst:1277 -msgid "Specifies a :class:`Member` 's status." -msgstr ":class:`Member` のステータスを指定します。" - -#: ../../api.rst:1281 -msgid "The member is online." -msgstr "メンバーがオンライン。" - -#: ../../api.rst:1284 -msgid "The member is offline." -msgstr "メンバーがオフライン。" - -#: ../../api.rst:1287 -msgid "The member is idle." -msgstr "メンバーが退席中。" - -#: ../../api.rst:1290 -msgid "The member is \"Do Not Disturb\"." -msgstr "メンバーが取り込み中。" - -#: ../../api.rst:1293 -msgid "An alias for :attr:`dnd`." -msgstr ":attr:`dnd` のエイリアス。" - -#: ../../api.rst:1296 -msgid "" -"The member is \"invisible\". In reality, this is only used in sending a " -"presence a la :meth:`Client.change_presence`. When you receive a user's " -"presence this will be :attr:`offline` instead." -msgstr "" -"メンバーがオンライン状態を隠す。実際には、これは :meth:`Client.change_presence` " -"でプレゼンスを送信する時のみ使用します。ユーザーのプレゼンスを受け取った場合、これは :attr:`offline` に置き換えられます。" - -#: ../../api.rst:1303 -msgid "" -"Represents the type of action being done for a :class:`AuditLogEntry`\\, " -"which is retrievable via :meth:`Guild.audit_logs`." -msgstr "" -":class:`AuditLogEntry` で行われた動作の種類を取得します。AuditLogEntryは " -":meth:`Guild.audit_logs` で取得可能です。" - -#: ../../api.rst:1308 -msgid "The guild has updated. Things that trigger this include:" -msgstr "ギルドが更新された。このトリガーとなるものは以下のとおりです。" - -#: ../../api.rst:1310 -msgid "Changing the guild vanity URL" -msgstr "ギルドのvanity URLの変更" - -#: ../../api.rst:1311 -msgid "Changing the guild invite splash" -msgstr "ギルドの招待時のスプラッシュ画像の変更" - -#: ../../api.rst:1312 -msgid "Changing the guild AFK channel or timeout" -msgstr "ギルドのAFKチャンネル、またはタイムアウトの変更" - -#: ../../api.rst:1313 -msgid "Changing the guild voice server region" -msgstr "ギルドの音声通話のサーバーリージョンの変更" - -#: ../../api.rst:1314 -msgid "Changing the guild icon" -msgstr "ギルドのアイコンの変更" - -#: ../../api.rst:1315 -msgid "Changing the guild moderation settings" -msgstr "ギルドの管理設定の変更" - -#: ../../api.rst:1316 -msgid "Changing things related to the guild widget" -msgstr "ギルドのウィジェットに関連するものの変更" - -#: ../../api.rst:1318 -msgid "" -"When this is the action, the type of :attr:`~AuditLogEntry.target` is the" -" :class:`Guild`." -msgstr "これが上記のactionならば、:attr:`~AuditLogEntry.target` のtypeは :class:`Guild`になります。" - -#: ../../api.rst:1321 ../../api.rst:1344 ../../api.rst:1363 ../../api.rst:1382 -#: ../../api.rst:1401 ../../api.rst:1417 ../../api.rst:1432 ../../api.rst:1491 -#: ../../api.rst:1505 ../../api.rst:1550 ../../api.rst:1570 ../../api.rst:1585 -#: ../../api.rst:1600 ../../api.rst:1624 ../../api.rst:1641 ../../api.rst:1657 -#: ../../api.rst:1669 ../../api.rst:1682 ../../api.rst:1693 ../../api.rst:1704 -msgid "Possible attributes for :class:`AuditLogDiff`:" -msgstr ":class:`AuditLogDiff` から、以下の属性を参照できます:" - -#: ../../api.rst:1323 -msgid ":attr:`~AuditLogDiff.afk_channel`" -msgstr ":attr:`~AuditLogDiff.afk_channel`" - -#: ../../api.rst:1324 -msgid ":attr:`~AuditLogDiff.system_channel`" -msgstr ":attr:`~AuditLogDiff.system_channel`" - -#: ../../api.rst:1325 -msgid ":attr:`~AuditLogDiff.afk_timeout`" -msgstr ":attr:`~AuditLogDiff.afk_timeout`" - -#: ../../api.rst:1326 -msgid ":attr:`~AuditLogDiff.default_message_notifications`" -msgstr ":attr:`~AuditLogDiff.default_message_notifications`" - -#: ../../api.rst:1327 -msgid ":attr:`~AuditLogDiff.explicit_content_filter`" -msgstr ":attr:`~AuditLogDiff.explicit_content_filter`" - -#: ../../api.rst:1328 -msgid ":attr:`~AuditLogDiff.mfa_level`" -msgstr ":attr:`~AuditLogDiff.mfa_level`" - -#: ../../api.rst:1329 ../../api.rst:1346 ../../api.rst:1365 ../../api.rst:1384 -#: ../../api.rst:1555 ../../api.rst:1575 ../../api.rst:1590 ../../api.rst:1644 -#: ../../api.rst:1660 ../../api.rst:1672 ../../api.rst:1684 ../../api.rst:1695 -#: ../../api.rst:1706 -msgid ":attr:`~AuditLogDiff.name`" -msgstr ":attr:`~AuditLogDiff.name`" - -#: ../../api.rst:1330 -msgid ":attr:`~AuditLogDiff.owner`" -msgstr ":attr:`~AuditLogDiff.owner`" - -#: ../../api.rst:1331 -msgid ":attr:`~AuditLogDiff.splash`" -msgstr ":attr:`~AuditLogDiff.splash`" - -#: ../../api.rst:1332 -msgid ":attr:`~AuditLogDiff.vanity_url_code`" -msgstr ":attr:`~AuditLogDiff.vanity_url_code`" - -#: ../../api.rst:1336 -msgid "A new channel was created." -msgstr "チャンネルが作成されました。" - -#: ../../api.rst:1338 -msgid "" -"When this is the action, the type of :attr:`~AuditLogEntry.target` is " -"either a :class:`abc.GuildChannel` or :class:`Object` with an ID." -msgstr "" -"これが上記のactionならば、 :attr:`~AuditLogEntry.target` のtypeは、IDが設定されている " -":class:`abc.GuildChannel` か、 :class:`Object` のいずれかになります。" - -#: ../../api.rst:1341 -msgid "" -"A more filled out object in the :class:`Object` case can be found by " -"using :attr:`~AuditLogEntry.after`." -msgstr "" -":class:`Object` の場合、 :attr:`~AuditLogEntry.after` " -"を使用して、より詳細な情報を持つオブジェクトを見つけることができます。" - -#: ../../api.rst:1347 ../../api.rst:1366 ../../api.rst:1385 ../../api.rst:1406 -#: ../../api.rst:1422 ../../api.rst:1437 -msgid ":attr:`~AuditLogDiff.type`" -msgstr ":attr:`~AuditLogDiff.type`" - -#: ../../api.rst:1348 ../../api.rst:1368 ../../api.rst:1386 -msgid ":attr:`~AuditLogDiff.overwrites`" -msgstr ":attr:`~AuditLogDiff.overwrites`" - -#: ../../api.rst:1352 -msgid "A channel was updated. Things that trigger this include:" -msgstr "チャンネルが更新されました。これのトリガーとなるものは以下の通りです。" - -#: ../../api.rst:1354 -msgid "The channel name or topic was changed" -msgstr "チャンネルのチャンネルトピックの変更、または名前の変更。" - -#: ../../api.rst:1355 -msgid "The channel bitrate was changed" -msgstr "チャンネルのビットレートの変更。" - -#: ../../api.rst:1357 ../../api.rst:1392 -msgid "" -"When this is the action, the type of :attr:`~AuditLogEntry.target` is the" -" :class:`abc.GuildChannel` or :class:`Object` with an ID." -msgstr "" -"これが上記のactionならば、 :attr:`~AuditLogEntry.target` のtypeは、IDが設定されている " -":class:`abc.GuildChannel` か、 :class:`Object` のいずれかになります。" - -#: ../../api.rst:1360 -msgid "" -"A more filled out object in the :class:`Object` case can be found by " -"using :attr:`~AuditLogEntry.after` or :attr:`~AuditLogEntry.before`." -msgstr "" -":class:`Object` の場合、 :attr:`~AuditLogEntry.after` または " -":attr:`~AuditLogEntry.before` を使用して、より詳細な情報を持つオブジェクトを見つけることができます。" - -#: ../../api.rst:1367 -msgid ":attr:`~AuditLogDiff.position`" -msgstr ":attr:`~AuditLogDiff.position`" - -#: ../../api.rst:1369 -msgid ":attr:`~AuditLogDiff.topic`" -msgstr ":attr:`~AuditLogDiff.topic`" - -#: ../../api.rst:1370 -msgid ":attr:`~AuditLogDiff.bitrate`" -msgstr ":attr:`~AuditLogDiff.bitrate`" - -#: ../../api.rst:1374 -msgid "A channel was deleted." -msgstr "チャンネルの削除。" - -#: ../../api.rst:1376 -msgid "" -"When this is the action, the type of :attr:`~AuditLogEntry.target` is an " -":class:`Object` with an ID." -msgstr "" -"これが上記のactionならば、 :attr:`~AuditLogEntry.target` のtypeは、IDが設定されている " -":class:`Object` になります。" - -#: ../../api.rst:1379 -msgid "" -"A more filled out object can be found by using the " -":attr:`~AuditLogEntry.before` object." -msgstr "" - -#: ../../api.rst:1390 -msgid "A channel permission overwrite was created." -msgstr "チャンネルにおける権限の上書き設定の作成。" - -#: ../../api.rst:1395 -msgid "" -"When this is the action, the type of :attr:`~AuditLogEntry.extra` is " -"either a :class:`Role` or :class:`Member`. If the object is not found " -"then it is a :class:`Object` with an ID being filled, a name, and a " -"``type`` attribute set to either ``'role'`` or ``'member'`` to help " -"dictate what type of ID it is." -msgstr "" -"この場合には、 :attr:`~AuditLogEntry.extra` は :class:`Role` か :class:`Member` " -"です。もしオブジェクトが見つからない場合はid、name、 ``'role'`` か ``'member'`` である``type`` 属性がある" -" :class:`Object` です。" - -#: ../../api.rst:1403 ../../api.rst:1419 ../../api.rst:1434 -msgid ":attr:`~AuditLogDiff.deny`" -msgstr ":attr:`~AuditLogDiff.deny`" - -#: ../../api.rst:1404 ../../api.rst:1420 ../../api.rst:1435 -msgid ":attr:`~AuditLogDiff.allow`" -msgstr ":attr:`~AuditLogDiff.allow`" - -#: ../../api.rst:1405 ../../api.rst:1421 ../../api.rst:1436 -msgid ":attr:`~AuditLogDiff.id`" -msgstr ":attr:`~AuditLogDiff.id`" - -#: ../../api.rst:1410 -msgid "" -"A channel permission overwrite was changed, this is typically when the " -"permission values change." -msgstr "チャンネルの権限の上書きが変更されました。典型的な例は、権限が変更された場合です。" - -#: ../../api.rst:1413 ../../api.rst:1428 -msgid "" -"See :attr:`overwrite_create` for more information on how the " -":attr:`~AuditLogEntry.target` and :attr:`~AuditLogEntry.extra` fields are" -" set." -msgstr "" -":attr:`overwrite_create` に、 :attr:`~AuditLogEntry.target` と " -":attr:`~AuditLogEntry.extra` についての説明があります。" - -#: ../../api.rst:1426 -msgid "A channel permission overwrite was deleted." -msgstr "チャンネルにおける権限の上書き設定の削除。" - -#: ../../api.rst:1441 -msgid "A member was kicked." -msgstr "メンバーのキック。" - -#: ../../api.rst:1443 -msgid "" -"When this is the action, the type of :attr:`~AuditLogEntry.target` is the" -" :class:`User` who got kicked." -msgstr "" -"これが上記のactionならば、:attr:`~AuditLogEntry.target` のtypeはキックされたユーザーに該当する " -":class:`User` になります。" - -#: ../../api.rst:1446 ../../api.rst:1461 ../../api.rst:1470 ../../api.rst:1479 -msgid "When this is the action, :attr:`~AuditLogEntry.changes` is empty." -msgstr "これが上記のactionなら、:attr:`~AuditLogEntry.changes` は空になります。" - -#: ../../api.rst:1450 -msgid "A member prune was triggered." -msgstr "非アクティブメンバーの一括キック。" - -#: ../../api.rst:1452 -msgid "" -"When this is the action, the type of :attr:`~AuditLogEntry.target` is set" -" to ``None``." -msgstr "これが上記のactionならば、:attr:`~AuditLogEntry.target` のtypeは ``None`` に設定されます。" - -#: ../../api.rst:1455 ../../api.rst:1514 ../../api.rst:1716 ../../api.rst:1743 -#: ../../api.rst:1758 -msgid "" -"When this is the action, the type of :attr:`~AuditLogEntry.extra` is set " -"to an unspecified proxy object with two attributes:" -msgstr "" - -#: ../../api.rst:1458 -msgid "``delete_members_days``: An integer specifying how far the prune was." -msgstr "" - -#: ../../api.rst:1459 -msgid "``members_removed``: An integer specifying how many members were removed." -msgstr "" - -#: ../../api.rst:1465 -msgid "A member was banned." -msgstr "メンバーのBAN。" - -#: ../../api.rst:1467 -msgid "" -"When this is the action, the type of :attr:`~AuditLogEntry.target` is the" -" :class:`User` who got banned." -msgstr "" -"これが上記のactionならば、:attr:`~AuditLogEntry.target` のtypeはBANされたユーザーに該当する " -":class:`User` になります。" - -#: ../../api.rst:1474 -msgid "A member was unbanned." -msgstr "メンバーのBANの解除。" - -#: ../../api.rst:1476 -msgid "" -"When this is the action, the type of :attr:`~AuditLogEntry.target` is the" -" :class:`User` who got unbanned." -msgstr "" -"これが上記のactionならば、:attr:`~AuditLogEntry.target` のtypeはBANが解除されたユーザーに該当する " -":class:`User` になります。" - -#: ../../api.rst:1483 -msgid "A member has updated. This triggers in the following situations:" -msgstr "メンバーの何らかの更新。これのトリガーとなるのは以下の場合です:" - -#: ../../api.rst:1485 -msgid "A nickname was changed" -msgstr "メンバーのニックネームの変更。" - -#: ../../api.rst:1486 -msgid "They were server muted or deafened (or it was undo'd)" -msgstr "" - -#: ../../api.rst:1488 -msgid "" -"When this is the action, the type of :attr:`~AuditLogEntry.target` is the" -" :class:`Member` or :class:`User` who got updated." -msgstr "" -"これが上記のactionならば、 :attr:`~AuditLogEntry.target` のtypeは、更新の行われた " -":class:`Member` あるいは :class:`User` になります。" - -#: ../../api.rst:1493 -msgid ":attr:`~AuditLogDiff.nick`" -msgstr ":attr:`~AuditLogDiff.nick`" - -#: ../../api.rst:1494 -msgid ":attr:`~AuditLogDiff.mute`" -msgstr ":attr:`~AuditLogDiff.mute`" - -#: ../../api.rst:1495 -msgid ":attr:`~AuditLogDiff.deaf`" -msgstr ":attr:`~AuditLogDiff.deaf`" - -#: ../../api.rst:1499 -msgid "" -"A member's role has been updated. This triggers when a member either " -"gains a role or losses a role." -msgstr "" - -#: ../../api.rst:1502 -msgid "" -"When this is the action, the type of :attr:`~AuditLogEntry.target` is the" -" :class:`Member` or :class:`User` who got the role." -msgstr "" -"これが上記のactionならば、 :attr:`~AuditLogEntry.target` のtypeは、役職の更新が行われた " -":class:`Member` あるいは :class:`User` になります。" - -#: ../../api.rst:1507 -msgid ":attr:`~AuditLogDiff.roles`" -msgstr ":attr:`~AuditLogDiff.roles`" - -#: ../../api.rst:1511 -msgid "" -"A member's voice channel has been updated. This triggers when a member is" -" moved to a different voice channel." -msgstr "" - -#: ../../api.rst:1517 -msgid "" -"``channel``: A :class:`TextChannel` or :class:`Object` with the channel " -"ID where the members were moved." -msgstr "" - -#: ../../api.rst:1518 -msgid "``count``: An integer specifying how many members were moved." -msgstr "" - -#: ../../api.rst:1524 -msgid "" -"A member's voice state has changed. This triggers when a member is force " -"disconnected from voice." -msgstr "" - -#: ../../api.rst:1527 ../../api.rst:1729 -#, fuzzy -msgid "" -"When this is the action, the type of :attr:`~AuditLogEntry.extra` is set " -"to an unspecified proxy object with one attribute:" -msgstr "" -"これが上記のactionならば、 :attr:`~AuditLogEntry.target` のtypeは、IDが設定されている " -":class:`Object` になります。" - -#: ../../api.rst:1530 -msgid "``count``: An integer specifying how many members were disconnected." -msgstr "" - -#: ../../api.rst:1536 -msgid "A bot was added to the guild." -msgstr "" - -#: ../../api.rst:1538 -#, fuzzy -msgid "" -"When this is the action, the type of :attr:`~AuditLogEntry.target` is the" -" :class:`Member` or :class:`User` which was added to the guild." -msgstr "" -"これが上記のactionならば、 :attr:`~AuditLogEntry.target` のtypeは、役職の更新が行われた " -":class:`Member` あるいは :class:`User` になります。" - -#: ../../api.rst:1545 -msgid "A new role was created." -msgstr "新しい役職の作成。" - -#: ../../api.rst:1547 ../../api.rst:1567 ../../api.rst:1582 -msgid "" -"When this is the action, the type of :attr:`~AuditLogEntry.target` is the" -" :class:`Role` or a :class:`Object` with the ID." -msgstr "" -"これが上記のactionならば、 :attr:`~AuditLogEntry.target` のtypeは、IDが設定されている " -":class:`Role` か、 :class:`Object` のいずれかになります。" - -#: ../../api.rst:1552 ../../api.rst:1572 ../../api.rst:1587 -msgid ":attr:`~AuditLogDiff.colour`" -msgstr ":attr:`~AuditLogDiff.colour`" - -#: ../../api.rst:1553 ../../api.rst:1573 ../../api.rst:1588 -msgid ":attr:`~AuditLogDiff.mentionable`" -msgstr ":attr:`~AuditLogDiff.mentionable`" - -#: ../../api.rst:1554 ../../api.rst:1574 ../../api.rst:1589 -msgid ":attr:`~AuditLogDiff.hoist`" -msgstr ":attr:`~AuditLogDiff.hoist`" - -#: ../../api.rst:1556 ../../api.rst:1576 ../../api.rst:1591 -msgid ":attr:`~AuditLogDiff.permissions`" -msgstr ":attr:`~AuditLogDiff.permissions`" - -#: ../../api.rst:1560 -msgid "A role was updated. This triggers in the following situations:" -msgstr "役職の何らかの更新。これのトリガーとなるのは以下の場合です:" - -#: ../../api.rst:1562 -msgid "The name has changed" -msgstr "名前の更新。" - -#: ../../api.rst:1563 -msgid "The permissions have changed" -msgstr "" - -#: ../../api.rst:1564 -msgid "The colour has changed" -msgstr "" - -#: ../../api.rst:1565 -msgid "Its hoist/mentionable state has changed" -msgstr "" - -#: ../../api.rst:1580 -msgid "A role was deleted." -msgstr "役職の削除。" - -#: ../../api.rst:1595 -msgid "An invite was created." -msgstr "招待の作成。" - -#: ../../api.rst:1597 -msgid "" -"When this is the action, the type of :attr:`~AuditLogEntry.target` is the" -" :class:`Invite` that was created." -msgstr "" -"これが上記のactionならば、:attr:`~AuditLogEntry.target` のtypeは作成された招待に該当する " -":class:`Invite` になります。" - -#: ../../api.rst:1602 ../../api.rst:1626 -msgid ":attr:`~AuditLogDiff.max_age`" -msgstr ":attr:`~AuditLogDiff.max_age`" - -#: ../../api.rst:1603 ../../api.rst:1627 -msgid ":attr:`~AuditLogDiff.code`" -msgstr ":attr:`~AuditLogDiff.code`" - -#: ../../api.rst:1604 ../../api.rst:1628 -msgid ":attr:`~AuditLogDiff.temporary`" -msgstr ":attr:`~AuditLogDiff.temporary`" - -#: ../../api.rst:1605 ../../api.rst:1629 -msgid ":attr:`~AuditLogDiff.inviter`" -msgstr ":attr:`~AuditLogDiff.inviter`" - -#: ../../api.rst:1606 ../../api.rst:1630 ../../api.rst:1643 ../../api.rst:1659 -#: ../../api.rst:1671 -msgid ":attr:`~AuditLogDiff.channel`" -msgstr ":attr:`~AuditLogDiff.channel`" - -#: ../../api.rst:1607 ../../api.rst:1631 -msgid ":attr:`~AuditLogDiff.uses`" -msgstr ":attr:`~AuditLogDiff.uses`" - -#: ../../api.rst:1608 ../../api.rst:1632 -msgid ":attr:`~AuditLogDiff.max_uses`" -msgstr ":attr:`~AuditLogDiff.max_uses`" - -#: ../../api.rst:1612 -msgid "An invite was updated." -msgstr "招待の更新。" - -#: ../../api.rst:1614 -msgid "" -"When this is the action, the type of :attr:`~AuditLogEntry.target` is the" -" :class:`Invite` that was updated." -msgstr "" - -#: ../../api.rst:1619 -msgid "An invite was deleted." -msgstr "" - -#: ../../api.rst:1621 -msgid "" -"When this is the action, the type of :attr:`~AuditLogEntry.target` is the" -" :class:`Invite` that was deleted." -msgstr "" - -#: ../../api.rst:1636 -msgid "A webhook was created." -msgstr "" - -#: ../../api.rst:1638 ../../api.rst:1654 ../../api.rst:1666 -msgid "" -"When this is the action, the type of :attr:`~AuditLogEntry.target` is the" -" :class:`Object` with the webhook ID." -msgstr "" - -#: ../../api.rst:1645 ../../api.rst:1673 -msgid ":attr:`~AuditLogDiff.type` (always set to ``1`` if so)" -msgstr "" - -#: ../../api.rst:1649 -msgid "A webhook was updated. This trigger in the following situations:" -msgstr "" - -#: ../../api.rst:1651 -msgid "The webhook name changed" -msgstr "" - -#: ../../api.rst:1652 -msgid "The webhook channel changed" -msgstr "" - -#: ../../api.rst:1664 -msgid "A webhook was deleted." -msgstr "" - -#: ../../api.rst:1677 -msgid "An emoji was created." -msgstr "" - -#: ../../api.rst:1679 ../../api.rst:1690 -msgid "" -"When this is the action, the type of :attr:`~AuditLogEntry.target` is the" -" :class:`Emoji` or :class:`Object` with the emoji ID." -msgstr "" - -#: ../../api.rst:1688 -msgid "An emoji was updated. This triggers when the name has changed." -msgstr "" - -#: ../../api.rst:1699 -msgid "An emoji was deleted." -msgstr "" - -#: ../../api.rst:1701 -msgid "" -"When this is the action, the type of :attr:`~AuditLogEntry.target` is the" -" :class:`Object` with the emoji ID." -msgstr "" - -#: ../../api.rst:1710 -msgid "" -"A message was deleted by a moderator. Note that this only triggers if the" -" message was deleted by someone other than the author." -msgstr "" - -#: ../../api.rst:1713 -msgid "" -"When this is the action, the type of :attr:`~AuditLogEntry.target` is the" -" :class:`Member` or :class:`User` who had their message deleted." -msgstr "" - -#: ../../api.rst:1719 ../../api.rst:1732 -msgid "``count``: An integer specifying how many messages were deleted." -msgstr "" - -#: ../../api.rst:1720 -msgid "" -"``channel``: A :class:`TextChannel` or :class:`Object` with the channel " -"ID where the message got deleted." -msgstr "" - -#: ../../api.rst:1724 -msgid "Messages were bulk deleted by a moderator." -msgstr "" - -#: ../../api.rst:1726 -#, fuzzy -msgid "" -"When this is the action, the type of :attr:`~AuditLogEntry.target` is the" -" :class:`TextChannel` or :class:`Object` with the ID of the channel that " -"was purged." -msgstr "" -"これが上記のactionならば、 :attr:`~AuditLogEntry.target` のtypeは、IDが設定されている " -":class:`abc.GuildChannel` か、 :class:`Object` のいずれかになります。" - -#: ../../api.rst:1738 -#, fuzzy -msgid "A message was pinned in a channel." -msgstr "メッセージをピン留め、または解除した。" - -#: ../../api.rst:1740 -#, fuzzy -msgid "" -"When this is the action, the type of :attr:`~AuditLogEntry.target` is the" -" :class:`Member` or :class:`User` who had their message pinned." -msgstr "" -"これが上記のactionならば、 :attr:`~AuditLogEntry.target` のtypeは、役職の更新が行われた " -":class:`Member` あるいは :class:`User` になります。" - -#: ../../api.rst:1746 -msgid "" -"``channel``: A :class:`TextChannel` or :class:`Object` with the channel " -"ID where the message was pinned." -msgstr "" - -#: ../../api.rst:1747 -msgid "``message_id``: the ID of the message which was pinned." -msgstr "" - -#: ../../api.rst:1753 -#, fuzzy -msgid "A message was unpinned in a channel." -msgstr "ギルドチャンネルのメッセージがピン留めされたり、解除されたりしたときに呼び出されます。" - -#: ../../api.rst:1755 -#, fuzzy -msgid "" -"When this is the action, the type of :attr:`~AuditLogEntry.target` is the" -" :class:`Member` or :class:`User` who had their message unpinned." -msgstr "" -"これが上記のactionならば、 :attr:`~AuditLogEntry.target` のtypeは、更新の行われた " -":class:`Member` あるいは :class:`User` になります。" - -#: ../../api.rst:1761 -msgid "" -"``channel``: A :class:`TextChannel` or :class:`Object` with the channel " -"ID where the message was unpinned." -msgstr "" - -#: ../../api.rst:1762 -msgid "``message_id``: the ID of the message which was unpinned." -msgstr "" - -#: ../../api.rst:1768 -#, fuzzy -msgid "A guild integration was created." -msgstr "招待の作成。" - -#: ../../api.rst:1770 -#, fuzzy -msgid "" -"When this is the action, the type of :attr:`~AuditLogEntry.target` is the" -" :class:`Object` with the integration ID of the integration which was " -"created." -msgstr "" -"これが上記のactionならば、:attr:`~AuditLogEntry.target` のtypeは作成された招待に該当する " -":class:`Invite` になります。" - -#: ../../api.rst:1777 -#, fuzzy -msgid "A guild integration was updated." -msgstr "連携サービスが更新されたギルド。" - -#: ../../api.rst:1779 -#, fuzzy -msgid "" -"When this is the action, the type of :attr:`~AuditLogEntry.target` is the" -" :class:`Object` with the integration ID of the integration which was " -"updated." -msgstr "" -"これが上記のactionならば、:attr:`~AuditLogEntry.target` のtypeは作成された招待に該当する " -":class:`Invite` になります。" - -#: ../../api.rst:1786 -#, fuzzy -msgid "A guild integration was deleted." -msgstr "連携サービスが更新されたギルド。" - -#: ../../api.rst:1788 -#, fuzzy -msgid "" -"When this is the action, the type of :attr:`~AuditLogEntry.target` is the" -" :class:`Object` with the integration ID of the integration which was " -"deleted." -msgstr "" -"これが上記のactionならば、:attr:`~AuditLogEntry.target` のtypeは作成された招待に該当する " -":class:`Invite` になります。" - -#: ../../api.rst:1795 -msgid "Represents the category that the :class:`AuditLogAction` belongs to." -msgstr "" - -#: ../../api.rst:1797 -msgid "This can be retrieved via :attr:`AuditLogEntry.category`." -msgstr "" - -#: ../../api.rst:1801 -msgid "The action is the creation of something." -msgstr "" - -#: ../../api.rst:1805 -msgid "The action is the deletion of something." -msgstr "" - -#: ../../api.rst:1809 -msgid "The action is the update of something." -msgstr "" - -#: ../../api.rst:1813 -msgid "Specifies the type of :class:`Relationship`." -msgstr "" - -#: ../../api.rst:1817 ../../api.rst:1843 ../../api.rst:1865 ../../api.rst:1894 -#: ../../api.rst:1911 -msgid "This only applies to users, *not* bots." -msgstr "" - -#: ../../api.rst:1821 -msgid "You are friends with this user." -msgstr "" - -#: ../../api.rst:1825 -msgid "You have blocked this user." -msgstr "このユーザーはブロックされています。" - -#: ../../api.rst:1829 -msgid "The user has sent you a friend request." -msgstr "フレンド申請が届いています。" - -#: ../../api.rst:1833 -msgid "You have sent a friend request to this user." -msgstr "" - -#: ../../api.rst:1838 -msgid "" -"Represents the options found in ``Settings > Privacy & Safety > Safe " -"Direct Messaging`` in the Discord client." -msgstr "" - -#: ../../api.rst:1847 -msgid "Scan all direct messages from everyone." -msgstr "" - -#: ../../api.rst:1851 -msgid "Scan all direct messages that aren't from friends." -msgstr "" - -#: ../../api.rst:1855 -msgid "Don't scan any direct messages." -msgstr "" - -#: ../../api.rst:1860 -msgid "" -"Represents the options found in ``Settings > Privacy & Safety > Who Can " -"Add You As A Friend`` in the Discord client." -msgstr "" - -#: ../../api.rst:1869 -msgid "This allows no-one to add you as a friend." -msgstr "" - -#: ../../api.rst:1873 -msgid "This allows guild members to add you as a friend." -msgstr "" - -#: ../../api.rst:1877 -msgid "This allows friends of friends to add you as a friend." -msgstr "" - -#: ../../api.rst:1881 -msgid "This is a superset of :attr:`mutual_guilds` and :attr:`mutual_friends`." -msgstr "" - -#: ../../api.rst:1885 -msgid "This allows everyone to add you as a friend." -msgstr "" - -#: ../../api.rst:1890 -msgid "Represents the user's Discord Nitro subscription type." -msgstr "" - -#: ../../api.rst:1898 -msgid "Represents the Discord Nitro with Nitro-exclusive games." -msgstr "" - -#: ../../api.rst:1902 -msgid "Represents the Discord Nitro with no Nitro-exclusive games." -msgstr "" - -#: ../../api.rst:1907 -msgid "Represents the theme synced across all Discord clients." -msgstr "" - -#: ../../api.rst:1915 -msgid "Represents the Light theme on Discord." -msgstr "Discordのライトテーマを表します。" - -#: ../../api.rst:1919 -msgid "Represents the Dark theme on Discord." -msgstr "Discordのダークテーマを表します。" - -#: ../../api.rst:1924 -msgid "" -"Represents the membership state of a team member retrieved through " -":func:`Bot.application_info`." -msgstr "" - -#: ../../api.rst:1930 -#, fuzzy -msgid "Represents an invited member." -msgstr "Discordの埋め込みを表します。" - -#: ../../api.rst:1934 -msgid "Represents a member currently in the team." -msgstr "" - -#: ../../api.rst:1938 -msgid "Represents the type of webhook that can be received." -msgstr "" - -#: ../../api.rst:1944 -msgid "Represents a webhook that can post messages to channels with a token." -msgstr "" - -#: ../../api.rst:1948 -msgid "" -"Represents a webhook that is internally managed by Discord, used for " -"following channels." -msgstr "" - -#: ../../api.rst:1952 -msgid "" -"Represents the behaviour the :class:`Integration` should perform when a " -"user's subscription has finished." -msgstr "" - -#: ../../api.rst:1955 -msgid "There is an alias for this called ``ExpireBehavior``." -msgstr "" - -#: ../../api.rst:1961 -msgid "" -"This will remove the :attr:`Integration.role` from the user when their " -"subscription is finished." -msgstr "" - -#: ../../api.rst:1966 -msgid "This will kick the user when their subscription is finished." -msgstr "" - -#: ../../api.rst:1970 -msgid "Represents the default avatar of a Discord :class:`User`" -msgstr "" - -#: ../../api.rst:1974 -msgid "" -"Represents the default avatar with the color blurple. See also " -":attr:`Colour.blurple`" -msgstr "" - -#: ../../api.rst:1978 -msgid "" -"Represents the default avatar with the color grey. See also " -":attr:`Colour.greyple`" -msgstr "" - -#: ../../api.rst:1982 -#, fuzzy -msgid "An alias for :attr:`grey`." -msgstr ":attr:`high` のエイリアス。" - -#: ../../api.rst:1985 -msgid "" -"Represents the default avatar with the color green. See also " -":attr:`Colour.green`" -msgstr "" - -#: ../../api.rst:1989 -msgid "" -"Represents the default avatar with the color orange. See also " -":attr:`Colour.orange`" -msgstr "" - -#: ../../api.rst:1993 -msgid "" -"Represents the default avatar with the color red. See also " -":attr:`Colour.red`" -msgstr "" - -#: ../../api.rst:1998 -msgid "Async Iterator" -msgstr "非同期イテレータ" - -#: ../../api.rst:2000 -msgid "" -"Some API functions return an \"async iterator\". An async iterator is " -"something that is capable of being used in an :ref:`async for statement " -"`." -msgstr "" -"一部のAPI関数では「非同期イテレータ」を返します。非同期イテレータは :ref:`async for 構文 ` " -"で使用できるものです。" - -#: ../../api.rst:2003 -msgid "These async iterators can be used as follows: ::" -msgstr "これら非同期イテレータは以下のようにして使用可能です: ::" - -#: ../../api.rst:2008 -msgid "" -"Certain utilities make working with async iterators easier, detailed " -"below." -msgstr "" - -#: ../../api.rst:2012 -msgid "" -"Represents the \"AsyncIterator\" concept. Note that no such class exists," -" it is purely abstract." -msgstr "" - -#: ../../api.rst:2019 -msgid "Iterates over the contents of the async iterator." -msgstr "" - -#: ../../api.rst:2027 -msgid "" -"Advances the iterator by one, if possible. If no more items are found " -"then this raises :exc:`NoMoreItems`." -msgstr "" - -#: ../../api.rst:2035 -msgid "Similar to :func:`utils.get` except run over the async iterator." -msgstr "" - -#: ../../api.rst:2037 -msgid "Getting the last message by a user named 'Dave' or ``None``: ::" -msgstr "" - -#: ../../api.rst:2046 -msgid "Similar to :func:`utils.find` except run over the async iterator." -msgstr "" - -#: ../../api.rst:2048 -msgid "" -"Unlike :func:`utils.find`\\, the predicate provided can be a " -"|coroutine_link|_." -msgstr "" - -#: ../../api.rst:2051 -msgid "Getting the last audit log with a reason or ``None``: ::" -msgstr "" - -#: ../../api.rst:2058 -msgid "The predicate to use. Could be a |coroutine_link|_." -msgstr "" - -#: ../../api.rst:2059 -msgid "The first element that returns ``True`` for the predicate or ``None``." -msgstr "" - -#: ../../api.rst:2066 -msgid "Flattens the async iterator into a :class:`list` with all the elements." -msgstr "" - -#: ../../api.rst:2068 -msgid "A list of every element in the async iterator." -msgstr "" - -#: ../../api.rst:2073 -msgid "" -"This is similar to the built-in :func:`map ` function. Another " -":class:`AsyncIterator` is returned that executes the function on every " -"element it is iterating over. This function can either be a regular " -"function or a |coroutine_link|_." -msgstr "" - -#: ../../api.rst:2078 -msgid "Creating a content iterator: ::" -msgstr "" - -#: ../../api.rst:2086 -msgid "The function to call on every element. Could be a |coroutine_link|_." -msgstr "" - -#: ../../api.rst:2087 ../../api.rst:2104 -#, fuzzy -msgid ":class:`AsyncIterator`" -msgstr ":class:`str`" - -#: ../../api.rst:2091 -msgid "" -"This is similar to the built-in :func:`filter ` function. " -"Another :class:`AsyncIterator` is returned that filters over the original" -" async iterator. This predicate can be a regular function or a " -"|coroutine_link|_." -msgstr "" - -#: ../../api.rst:2095 -msgid "Getting messages by non-bot accounts: ::" -msgstr "" - -#: ../../api.rst:2103 -msgid "The predicate to call on every element. Could be a |coroutine_link|_." -msgstr "" - -#: ../../api.rst:2109 -msgid "Audit Log Data" -msgstr "監査ログデータ" - -#: ../../api.rst:2111 -msgid "" -"Working with :meth:`Guild.audit_logs` is a complicated process with a lot" -" of machinery involved. The library attempts to make it easy to use and " -"friendly. In order to accomplish this goal, it must make use of a couple " -"of data classes that aid in this goal." -msgstr "" - -#: discord.AuditLogEntry:1 of -msgid "Represents an Audit Log entry." -msgstr "" - -#: discord.AuditLogEntry:3 of -msgid "You retrieve these via :meth:`Guild.audit_logs`." -msgstr "" - -#: discord.AuditLogEntry:7 of -#, fuzzy -msgid "The action that was done." -msgstr "参加したギルド。" - -#: discord.AuditLogEntry:9 of -#, fuzzy -msgid ":class:`AuditLogAction`" -msgstr ":class:`.Guild`" - -#: discord.AuditLogEntry:13 of -msgid "" -"The user who initiated this action. Usually a :class:`Member`\\, unless " -"gone then it's a :class:`User`." -msgstr "" - -#: discord.AuditLogEntry:16 discord.Message:25 of -#, fuzzy -msgid ":class:`abc.User`" -msgstr ":class:`str`" - -#: discord.AuditLogEntry:20 of -msgid "The entry ID." -msgstr "" - -#: discord.AuditLogEntry:26 of -msgid "" -"The target that got changed. The exact type of this depends on the action" -" being done." -msgstr "" - -#: discord.AuditLogEntry:29 discord.AuditLogEntry:44 of -msgid "Any" -msgstr "" - -#: discord.AuditLogEntry:33 of -msgid "The reason this action was done." -msgstr "" - -#: discord.AuditLogEntry:39 of -msgid "" -"Extra information that this entry has that might be useful. For most " -"actions, this is ``None``. However in some cases it contains extra " -"information. See :class:`AuditLogAction` for which actions have this " -"field filled out." -msgstr "" - -#: discord.AuditLogEntry.created_at:1 of -#, fuzzy -msgid "Returns the entry's creation time in UTC." -msgstr "カテゴリの名前を返します。" - -#: discord.AuditLogEntry.category:1 of -#, fuzzy -msgid "The category of the action, if applicable." -msgstr "該当すれば :class:`Relationship` が返ります。" - -#: discord.AuditLogEntry.category:3 of -msgid "Optional[:class:`AuditLogActionCategory`]" -msgstr "" - -#: discord.AuditLogEntry.changes:1 of -msgid "The list of changes this entry has." -msgstr "" - -#: discord.AuditLogEntry.changes:3 of -#, fuzzy -msgid ":class:`AuditLogChanges`" -msgstr ":class:`bytes`" - -#: discord.AuditLogEntry.before:1 of -msgid "The target's prior state." -msgstr "" - -#: discord.AuditLogEntry.after:3 discord.AuditLogEntry.before:3 of -#, fuzzy -msgid ":class:`AuditLogDiff`" -msgstr ":class:`.Guild`" - -#: discord.AuditLogEntry.after:1 of -msgid "The target's subsequent state." -msgstr "" - -#: ../../api.rst:2120 -msgid "An audit log change set." -msgstr "" - -#: ../../api.rst:2124 -msgid "The old value. The attribute has the type of :class:`AuditLogDiff`." -msgstr "" - -#: ../../api.rst:2126 ../../api.rst:2146 -msgid "" -"Depending on the :class:`AuditLogActionCategory` retrieved by " -":attr:`~AuditLogEntry.category`\\, the data retrieved by this attribute " -"differs:" -msgstr "" - -#: ../../api.rst:2131 ../../api.rst:2151 -msgid "Category" -msgstr "" - -#: ../../api.rst:2131 ../../api.rst:2151 -msgid "Description" -msgstr "" - -#: ../../api.rst:2133 ../../api.rst:2153 -msgid ":attr:`~AuditLogActionCategory.create`" -msgstr ":attr:`~AuditLogActionCategory.create`" - -#: ../../api.rst:2133 -msgid "All attributes are set to ``None``." -msgstr "" - -#: ../../api.rst:2135 ../../api.rst:2155 -msgid ":attr:`~AuditLogActionCategory.delete`" -msgstr ":attr:`~AuditLogActionCategory.delete`" - -#: ../../api.rst:2135 -msgid "All attributes are set the value before deletion." -msgstr "" - -#: ../../api.rst:2137 ../../api.rst:2157 -msgid ":attr:`~AuditLogActionCategory.update`" -msgstr ":attr:`~AuditLogActionCategory.update`" - -#: ../../api.rst:2137 -msgid "All attributes are set the value before updating." -msgstr "" - -#: ../../api.rst:2139 ../../api.rst:2159 -msgid "``None``" -msgstr "``None``" - -#: ../../api.rst:2139 ../../api.rst:2159 -msgid "No attributes are set." -msgstr "" - -#: ../../api.rst:2144 -msgid "The new value. The attribute has the type of :class:`AuditLogDiff`." -msgstr "" - -#: ../../api.rst:2153 -msgid "All attributes are set to the created value" -msgstr "" - -#: ../../api.rst:2155 -msgid "All attributes are set to ``None``" -msgstr "" - -#: ../../api.rst:2157 -msgid "All attributes are set the value after updating." -msgstr "" - -#: ../../api.rst:2164 -msgid "" -"Represents an audit log \"change\" object. A change object has dynamic " -"attributes that depend on the type of action being done. Certain actions " -"map to certain attributes being set." -msgstr "" - -#: ../../api.rst:2168 -msgid "" -"Note that accessing an attribute that does not match the specified action" -" will lead to an attribute error." -msgstr "" - -#: ../../api.rst:2171 -msgid "" -"To get a list of attributes that have been set, you can iterate over " -"them. To see a list of all possible attributes that could be set based on" -" the action being done, check the documentation for " -":class:`AuditLogAction`, otherwise check the documentation below for all " -"attributes that are possible." -msgstr "" - -#: ../../api.rst:2180 -msgid "Returns an iterator over (attribute, value) tuple of this diff." -msgstr "" - -#: ../../api.rst:2184 -#, fuzzy -msgid "A name of something." -msgstr "ギルドの名前。" - -#: ../../api.rst:2190 -msgid "A guild's icon hash. See also :attr:`Guild.icon`." -msgstr "" - -#: ../../api.rst:2196 -msgid "The guild's invite splash hash. See also :attr:`Guild.splash`." -msgstr "" - -#: ../../api.rst:2202 -msgid "The guild's owner. See also :attr:`Guild.owner`" -msgstr "" - -#: ../../api.rst:2204 -msgid "Union[:class:`Member`, :class:`User`]" -msgstr "" - -#: ../../api.rst:2208 -msgid "The guild's voice region. See also :attr:`Guild.region`." -msgstr "" - -#: ../../api.rst:2210 discord.GroupCall:27 discord.Guild:40 of -#, fuzzy -msgid ":class:`VoiceRegion`" -msgstr ":class:`bool`" - -#: ../../api.rst:2214 -#, fuzzy -msgid "The guild's AFK channel." -msgstr "ギルドのニュースチャンネル。" - -#: ../../api.rst:2216 ../../api.rst:2227 -msgid "" -"If this could not be found, then it falls back to a :class:`Object` with " -"the ID being set." -msgstr "" - -#: ../../api.rst:2219 -msgid "See :attr:`Guild.afk_channel`." -msgstr "" - -#: ../../api.rst:2221 -#, fuzzy -msgid "Union[:class:`VoiceChannel`, :class:`Object`]" -msgstr "Union[:class:`.abc.GuildChannel`, :class:`.abc.PrivateChannel`]" - -#: ../../api.rst:2225 -#, fuzzy -msgid "The guild's system channel." -msgstr "ギルドのストアチャンネル。" - -#: ../../api.rst:2230 -msgid "See :attr:`Guild.system_channel`." -msgstr "" - -#: ../../api.rst:2232 ../../api.rst:2259 -#, fuzzy -msgid "Union[:class:`TextChannel`, :class:`Object`]" -msgstr "Union[:class:`.abc.GuildChannel`, :class:`.abc.PrivateChannel`]" - -#: ../../api.rst:2236 -msgid "The guild's AFK timeout. See :attr:`Guild.afk_timeout`." -msgstr "" - -#: ../../api.rst:2242 -msgid "The guild's MFA level. See :attr:`Guild.mfa_level`." -msgstr "" - -#: ../../api.rst:2248 -msgid "The guild's widget has been enabled or disabled." -msgstr "" - -#: ../../api.rst:2254 -#, fuzzy -msgid "The widget's channel." -msgstr "ボイスチャンネル。" - -#: ../../api.rst:2256 -msgid "" -"If this could not be found then it falls back to a :class:`Object` with " -"the ID being set." -msgstr "" - -#: ../../api.rst:2263 discord.Guild:128 of -#, fuzzy -msgid "The guild's verification level." -msgstr "認証レベルが等しいか確認します。" - -#: ../../api.rst:2265 -msgid "See also :attr:`Guild.verification_level`." -msgstr "" - -#: ../../api.rst:2267 discord.Guild:130 discord.PartialInviteGuild:40 of -#, fuzzy -msgid ":class:`VerificationLevel`" -msgstr ":class:`.Profile`" - -#: ../../api.rst:2271 -msgid "The guild's default notification level." -msgstr "" - -#: ../../api.rst:2273 -msgid "See also :attr:`Guild.default_notifications`." -msgstr "" - -#: ../../api.rst:2275 discord.Guild:142 of -#, fuzzy -msgid ":class:`NotificationLevel`" -msgstr ":class:`.Profile`" - -#: ../../api.rst:2279 -#, fuzzy -msgid "The guild's content filter." -msgstr "ギルドで表現のフィルターが有効ではない。" - -#: ../../api.rst:2281 -msgid "See also :attr:`Guild.explicit_content_filter`." -msgstr "" - -#: ../../api.rst:2283 discord.Guild:136 of -#, fuzzy -msgid ":class:`ContentFilter`" -msgstr ":class:`.Profile`" - -#: ../../api.rst:2287 -#, fuzzy -msgid "The guild's default message notification setting." -msgstr ":attr:`~AuditLogDiff.default_message_notifications`" - -#: ../../api.rst:2293 -#, fuzzy -msgid "The guild's vanity URL." -msgstr "ギルドのウィジェット。" - -#: ../../api.rst:2295 -msgid "See also :meth:`Guild.vanity_invite` and :meth:`Guild.edit`." -msgstr "" - -#: ../../api.rst:2301 -msgid "The position of a :class:`Role` or :class:`abc.GuildChannel`." -msgstr "" - -#: ../../api.rst:2307 -#, fuzzy -msgid "The type of channel or channel permission overwrite." -msgstr "権限を確認したいチャンネル。" - -#: ../../api.rst:2309 -msgid "" -"If the type is an :class:`int`, then it is a type of channel which can be" -" either ``0`` to indicate a text channel or ``1`` to indicate a voice " -"channel." -msgstr "" - -#: ../../api.rst:2312 -msgid "" -"If the type is a :class:`str`, then it is a type of permission overwrite " -"which can be either ``'role'`` or ``'member'``." -msgstr "" - -#: ../../api.rst:2315 -#, fuzzy -msgid "Union[:class:`int`, :class:`str`]" -msgstr "Union[:class:`.abc.GuildChannel`, :class:`.abc.PrivateChannel`]" - -#: ../../api.rst:2319 -#, fuzzy -msgid "The topic of a :class:`TextChannel`." -msgstr ":class:`str` – :class:`TextChannel` のトピック。" - -#: ../../api.rst:2321 -msgid "See also :attr:`TextChannel.topic`." -msgstr "" - -#: ../../api.rst:2327 -#, fuzzy -msgid "The bitrate of a :class:`VoiceChannel`." -msgstr ":class:`str` – :class:`TextChannel` のトピック。" - -#: ../../api.rst:2329 -msgid "See also :attr:`VoiceChannel.bitrate`." -msgstr "" - -#: ../../api.rst:2335 -msgid "" -"A list of permission overwrite tuples that represents a target and a " -":class:`PermissionOverwrite` for said target." -msgstr "" - -#: ../../api.rst:2338 -msgid "" -"The first element is the object being targeted, which can either be a " -":class:`Member` or :class:`User` or :class:`Role`. If this object is not " -"found then it is a :class:`Object` with an ID being filled and a ``type``" -" attribute set to either ``'role'`` or ``'member'`` to help decide what " -"type of ID it is." -msgstr "" - -#: ../../api.rst:2344 -msgid "List[Tuple[target, :class:`PermissionOverwrite`]]" -msgstr "" - -#: ../../api.rst:2348 -msgid "A list of roles being added or removed from a member." -msgstr "" - -#: ../../api.rst:2350 -msgid "" -"If a role is not found then it is a :class:`Object` with the ID and name " -"being filled in." -msgstr "" - -#: ../../api.rst:2353 -msgid "List[Union[:class:`Role`, :class:`Object`]]" -msgstr "" - -#: ../../api.rst:2357 -msgid "The nickname of a member." -msgstr "" - -#: ../../api.rst:2359 -msgid "See also :attr:`Member.nick`" -msgstr "" - -#: ../../api.rst:2365 -msgid "Whether the member is being server deafened." -msgstr "" - -#: ../../api.rst:2367 -msgid "See also :attr:`VoiceState.deaf`." -msgstr "" - -#: ../../api.rst:2373 -msgid "Whether the member is being server muted." -msgstr "" - -#: ../../api.rst:2375 -msgid "See also :attr:`VoiceState.mute`." -msgstr "" - -#: ../../api.rst:2381 -#, fuzzy -msgid "The permissions of a role." -msgstr ":class:`Permissions` – 役職の権限。" - -#: ../../api.rst:2383 -msgid "See also :attr:`Role.permissions`." -msgstr "" - -#: ../../api.rst:2385 ../../api.rst:2474 discord.DMChannel.permissions_for:17 -#: discord.GroupChannel.permissions_for:18 discord.Member.guild_permissions:12 -#: discord.Member.permissions_in:13 discord.Role.permissions:3 of -msgid ":class:`Permissions`" -msgstr "" - -#: ../../api.rst:2390 -#, fuzzy -msgid "The colour of a role." -msgstr ":class:`Colour` – 役職の色。" - -#: ../../api.rst:2392 -msgid "See also :attr:`Role.colour`" -msgstr "" - -#: ../../api.rst:2394 discord.ClientUser.color:6 discord.ClientUser.colour:6 -#: discord.Member.color:7 discord.Member.colour:7 discord.Role.color:3 -#: discord.Role.colour:3 discord.Spotify.color:5 discord.Spotify.colour:5 -#: discord.User.color:6 discord.User.colour:6 discord.WidgetMember.color:6 -#: discord.WidgetMember.colour:6 of -#, fuzzy -msgid ":class:`Colour`" -msgstr ":class:`bool`" - -#: ../../api.rst:2398 -msgid "Whether the role is being hoisted or not." -msgstr "" - -#: ../../api.rst:2400 -msgid "See also :attr:`Role.hoist`" -msgstr "" - -#: ../../api.rst:2406 -msgid "Whether the role is mentionable or not." -msgstr "" - -#: ../../api.rst:2408 -msgid "See also :attr:`Role.mentionable`" -msgstr "" - -#: ../../api.rst:2414 -#, fuzzy -msgid "The invite's code." -msgstr "招待コード。" - -#: ../../api.rst:2416 -msgid "See also :attr:`Invite.code`" -msgstr "" - -#: ../../api.rst:2422 -#, fuzzy -msgid "A guild channel." -msgstr "ギルドのニュースチャンネル。" - -#: ../../api.rst:2424 -msgid "" -"If the channel is not found then it is a :class:`Object` with the ID " -"being set. In some cases the channel name is also set." -msgstr "" - -#: ../../api.rst:2427 -#, fuzzy -msgid "Union[:class:`abc.GuildChannel`, :class:`Object`]" -msgstr "Union[:class:`.abc.GuildChannel`, :class:`.abc.PrivateChannel`]" - -#: ../../api.rst:2431 discord.Invite:97 of -#, fuzzy -msgid "The user who created the invite." -msgstr ":class:`User` – 招待を作成したユーザー。" - -#: ../../api.rst:2433 -msgid "See also :attr:`Invite.inviter`." -msgstr "" - -#: ../../api.rst:2439 -#, fuzzy -msgid "The invite's max uses." -msgstr ":class:`int` – 招待の最大使用可能回数。" - -#: ../../api.rst:2441 -msgid "See also :attr:`Invite.max_uses`." -msgstr "" - -#: ../../api.rst:2447 -#, fuzzy -msgid "The invite's current uses." -msgstr ":class:`int` – 招待の現在までの使用回数。" - -#: ../../api.rst:2449 -msgid "See also :attr:`Invite.uses`." -msgstr "" - -#: ../../api.rst:2455 -#, fuzzy -msgid "The invite's max age in seconds." -msgstr ":class:`int` – 招待の最大使用可能回数。" - -#: ../../api.rst:2457 -msgid "See also :attr:`Invite.max_age`." -msgstr "" - -#: ../../api.rst:2463 -msgid "If the invite is a temporary invite." -msgstr "" - -#: ../../api.rst:2465 -msgid "See also :attr:`Invite.temporary`." -msgstr "" - -#: ../../api.rst:2472 -msgid "The permissions being allowed or denied." -msgstr "" - -#: ../../api.rst:2478 -#, fuzzy -msgid "The ID of the object being changed." -msgstr "更新される前のギルド。" - -#: ../../api.rst:2484 -msgid "The avatar hash of a member." -msgstr "" - -#: ../../api.rst:2486 -msgid "See also :attr:`User.avatar`." -msgstr "" - -#: ../../api.rst:2492 -msgid "" -"The number of seconds members have to wait before sending another message" -" in the channel." -msgstr "" - -#: ../../api.rst:2495 -msgid "See also :attr:`TextChannel.slowmode_delay`." -msgstr "" - -#: ../../api.rst:2503 -msgid "Webhook Support" -msgstr "Webhookサポート" - -#: ../../api.rst:2505 -msgid "" -"discord.py offers support for creating, editing, and executing webhooks " -"through the :class:`Webhook` class." -msgstr "" - -#: discord.Webhook:1 of -msgid "Represents a Discord webhook." -msgstr "" - -#: discord.Webhook:3 of -msgid "" -"Webhooks are a form to send messages to channels in Discord without a bot" -" user or authentication." -msgstr "" - -#: discord.Webhook:6 of -msgid "" -"There are two main ways to use Webhooks. The first is through the ones " -"received by the library such as :meth:`.Guild.webhooks` and " -":meth:`.TextChannel.webhooks`. The ones received by the library will " -"automatically have an adapter bound using the library's HTTP session. " -"Those webhooks will have :meth:`~.Webhook.send`, :meth:`~.Webhook.delete`" -" and :meth:`~.Webhook.edit` as coroutines." -msgstr "" - -#: discord.Webhook:13 of -msgid "" -"The second form involves creating a webhook object manually without " -"having it bound to a websocket connection using the " -":meth:`~.Webhook.from_url` or :meth:`~.Webhook.partial` classmethods. " -"This form allows finer grained control over how requests are done, " -"allowing you to mix async and sync code using either :doc:`aiohttp " -"` or :doc:`req:index`." -msgstr "" - -#: discord.Webhook:19 of -msgid "" -"For example, creating a webhook from a URL and using :doc:`aiohttp " -"`:" -msgstr "" - -#: discord.Webhook:31 of -msgid "Or creating a webhook from an ID and token and using :doc:`req:index`:" -msgstr "" - -#: discord.Webhook:45 of -#, fuzzy -msgid "Checks if two webhooks are equal." -msgstr "二つのユーザーが等しいかを比較します。" - -#: discord.Webhook:49 of -#, fuzzy -msgid "Checks if two webhooks are not equal." -msgstr "二つのユーザーが等しいものではないか比較します。" - -#: discord.Webhook:53 of -#, fuzzy -msgid "Returns the webhooks's hash." -msgstr "カテゴリのハッシュを返します。" - -#: discord.Webhook:55 of -msgid "Webhooks are now comparable and hashable." -msgstr "" - -#: discord.Webhook:60 of -msgid "The webhook's ID" -msgstr "" - -#: discord.Webhook:66 of -#, fuzzy -msgid "The type of the webhook." -msgstr "ユーザーのプロフィール。" - -#: discord.Webhook:70 of -#, fuzzy -msgid ":class:`WebhookType`" -msgstr ":class:`.Webhook`" - -#: discord.Webhook:74 of -msgid "" -"The authentication token of the webhook. If this is ``None`` then the " -"webhook cannot be used to make requests." -msgstr "" - -#: discord.Webhook:81 of -msgid "The guild ID this webhook is for." -msgstr "" - -#: discord.Webhook:87 of -#, fuzzy -msgid "The channel ID this webhook is for." -msgstr "Webhookが更新されたチャンネル。" - -#: discord.Webhook:93 of -msgid "" -"The user this webhook was created by. If the webhook was received without" -" authentication then this will be ``None``." -msgstr "" - -#: discord.Webhook:96 of -msgid "Optional[:class:`abc.User`]" -msgstr "" - -#: discord.Webhook:100 of -#, fuzzy -msgid "The default name of the webhook." -msgstr "フィールドの名前。" - -#: discord.Webhook:106 of -msgid "The default avatar of the webhook." -msgstr "" - -#: discord.Webhook.url:1 of -msgid "Returns the webhook's url." -msgstr "" - -#: discord.Webhook.partial:1 of -msgid "Creates a partial :class:`Webhook`." -msgstr "" - -#: discord.Webhook.partial:3 of -msgid "The ID of the webhook." -msgstr "" - -#: discord.Webhook.partial:5 of -msgid "The authentication token of the webhook." -msgstr "" - -#: discord.Webhook.from_url:5 discord.Webhook.partial:7 of -msgid "" -"The webhook adapter to use when sending requests. This is typically " -":class:`AsyncWebhookAdapter` for :doc:`aiohttp ` or " -":class:`RequestsWebhookAdapter` for :doc:`req:index`." -msgstr "" - -#: discord.Webhook.from_url:12 discord.Webhook.partial:12 of -msgid "" -"A partial :class:`Webhook`. A partial webhook is just a webhook object " -"with an ID and a token." -msgstr "" - -#: discord.TextChannel.create_webhook:22 discord.TextChannel.follow:23 -#: discord.Webhook.from_url:14 discord.Webhook.partial:14 -#: discord.WebhookAdapter:7 of -msgid ":class:`Webhook`" -msgstr "" - -#: discord.Webhook.from_url:1 of -msgid "Creates a partial :class:`Webhook` from a webhook URL." -msgstr "" - -#: discord.Webhook.from_url:3 of -msgid "The URL of the webhook." -msgstr "" - -#: discord.Webhook.from_url:10 of -#, fuzzy -msgid "The URL is invalid." -msgstr "メンバーがオンライン。" - -#: discord.Webhook.guild:1 of -msgid "The guild this webhook belongs to." -msgstr "" - -#: discord.Webhook.channel:3 discord.Webhook.guild:3 of -msgid "If this is a partial webhook, then this will always return ``None``." -msgstr "" - -#: discord.Webhook.channel:1 of -#, fuzzy -msgid "The text channel this webhook belongs to." -msgstr "Webhookが更新されたチャンネル。" - -#: discord.Guild.public_updates_channel:9 discord.Guild.rules_channel:8 -#: discord.Guild.system_channel:5 discord.Webhook.channel:5 of -msgid "Optional[:class:`TextChannel`]" -msgstr "" - -#: discord.Webhook.created_at:1 of -msgid "Returns the webhook's creation time in UTC." -msgstr "" - -#: discord.Webhook.avatar_url:1 discord.Webhook.avatar_url_as:1 of -msgid "Returns an :class:`Asset` for the avatar the webhook has." -msgstr "" - -#: discord.Webhook.avatar_url:3 discord.Webhook.avatar_url_as:3 of -msgid "" -"If the webhook does not have a traditional avatar, an asset for the " -"default avatar is returned instead." -msgstr "" - -#: discord.Webhook.avatar_url:6 of -msgid "" -"This is equivalent to calling :meth:`avatar_url_as` with the default " -"parameters." -msgstr "" - -#: discord.ClientUser.avatar_url:9 discord.ClientUser.avatar_url_as:24 -#: discord.ClientUser.default_avatar_url:3 discord.Emoji.url:3 -#: discord.GroupChannel.icon_url:3 discord.Guild.banner_url:3 -#: discord.Guild.banner_url_as:14 discord.Guild.discovery_splash_url:5 -#: discord.Guild.discovery_splash_url_as:16 discord.Guild.icon_url:3 -#: discord.Guild.icon_url_as:20 discord.Guild.splash_url:3 -#: discord.Guild.splash_url_as:14 discord.Member.avatar_url_as:24 -#: discord.PartialEmoji.url:3 discord.PartialInviteGuild.banner_url:3 -#: discord.PartialInviteGuild.banner_url_as:4 -#: discord.PartialInviteGuild.icon_url:3 -#: discord.PartialInviteGuild.icon_url_as:4 -#: discord.PartialInviteGuild.splash_url:3 -#: discord.PartialInviteGuild.splash_url_as:4 discord.User.avatar_url:9 -#: discord.User.avatar_url_as:24 discord.User.default_avatar_url:3 -#: discord.Webhook.avatar_url:9 discord.Webhook.avatar_url_as:18 -#: discord.WidgetMember.avatar_url:9 discord.WidgetMember.avatar_url_as:24 -#: discord.WidgetMember.default_avatar_url:3 of -msgid ":class:`Asset`" -msgstr "" - -#: discord.Webhook.avatar_url_as:6 of -msgid "" -"The format must be one of 'jpeg', 'jpg', or 'png'. The size must be a " -"power of 2 between 16 and 1024." -msgstr "" - -#: discord.Webhook.avatar_url_as:9 of -msgid "" -"The format to attempt to convert the avatar to. If the format is " -"``None``, then it is equivalent to png." -msgstr "" - -#: discord.ClientUser.avatar_url_as:18 discord.Guild.banner_url_as:8 -#: discord.Guild.discovery_splash_url_as:10 discord.Guild.icon_url_as:14 -#: discord.Guild.splash_url_as:8 discord.Member.avatar_url_as:18 -#: discord.User.avatar_url_as:18 discord.Webhook.avatar_url_as:12 -#: discord.WidgetMember.avatar_url_as:18 of -msgid "The size of the image to display." -msgstr "" - -#: discord.Guild.banner_url_as:11 discord.Guild.discovery_splash_url_as:13 -#: discord.Guild.icon_url_as:17 discord.Guild.splash_url_as:11 -#: discord.Webhook.avatar_url_as:15 of -msgid "Bad image format passed to ``format`` or invalid ``size``." -msgstr "" - -#: discord.ClientUser.avatar_url_as:23 discord.Guild.banner_url_as:13 -#: discord.Guild.discovery_splash_url_as:15 discord.Guild.icon_url_as:19 -#: discord.Guild.splash_url_as:13 discord.Member.avatar_url_as:23 -#: discord.PartialInviteGuild.banner_url_as:3 -#: discord.PartialInviteGuild.icon_url_as:3 -#: discord.PartialInviteGuild.splash_url_as:3 discord.User.avatar_url_as:23 -#: discord.Webhook.avatar_url_as:17 discord.WidgetMember.avatar_url_as:23 of -msgid "The resulting CDN asset." -msgstr "" - -#: discord.Webhook.delete:1 discord.Webhook.edit:1 discord.Webhook.send:1 of -msgid "|maybecoro|" -msgstr "" - -#: discord.Webhook.delete:3 of -msgid "Deletes this Webhook." -msgstr "" - -#: discord.Webhook.delete:5 discord.Webhook.edit:5 discord.Webhook.send:5 of -msgid "" -"If the webhook is constructed with a :class:`RequestsWebhookAdapter` then" -" this is not a coroutine." -msgstr "" - -#: discord.Webhook.delete:8 of -msgid "" -"The reason for deleting this webhook. Shows up on the audit log. .. " -"versionadded:: 1.4" -msgstr "" - -#: discord.Webhook.delete:8 of -msgid "The reason for deleting this webhook. Shows up on the audit log." -msgstr "" - -#: discord.Webhook.delete:13 of -#, fuzzy -msgid "Deleting the webhook failed." -msgstr ":exc:`.HTTPException` -- Webhookの取得に失敗した。" - -#: discord.Webhook.delete:14 discord.Webhook.edit:18 of -msgid "This webhook does not exist." -msgstr "" - -#: discord.Webhook.delete:15 of -#, fuzzy -msgid "You do not have permissions to delete this webhook." -msgstr ":exc:`.Forbidden` -- このWebhookを取得する権限がない。" - -#: discord.Webhook.delete:16 discord.Webhook.edit:19 of -msgid "This webhook does not have a token associated with it." -msgstr "" - -#: discord.Webhook.edit:3 of -msgid "Edits this Webhook." -msgstr "" - -#: discord.Webhook.edit:8 of -msgid "The webhook's new default name." -msgstr "" - -#: discord.Webhook.edit:10 of -msgid "" -"A :term:`py:bytes-like object` representing the webhook's new default " -"avatar." -msgstr "" - -#: discord.Webhook.edit:12 of -msgid "" -"The reason for editing this webhook. Shows up on the audit log. .. " -"versionadded:: 1.4" -msgstr "" - -#: discord.Webhook.edit:12 of -msgid "The reason for editing this webhook. Shows up on the audit log." -msgstr "" - -#: discord.Webhook.edit:17 of -#, fuzzy -msgid "Editing the webhook failed." -msgstr ":exc:`.HTTPException` -- Webhookの取得に失敗した。" - -#: discord.Webhook.send:3 of -msgid "Sends a message using the webhook." -msgstr "" - -#: discord.Webhook.send:8 of -msgid "" -"The content must be a type that can convert to a string through " -"``str(content)``." -msgstr "" - -#: discord.Webhook.send:10 of -msgid "" -"To upload a single file, the ``file`` parameter should be used with a " -"single :class:`File` object." -msgstr "" - -#: discord.Webhook.send:13 of -msgid "" -"If the ``embed`` parameter is provided, it must be of type :class:`Embed`" -" and it must be a rich embed type. You cannot mix the ``embed`` parameter" -" with the ``embeds`` parameter, which must be a :class:`list` of " -":class:`Embed` objects to send." -msgstr "" - -#: discord.DMChannel.send:17 discord.GroupChannel.send:17 -#: discord.Member.send:17 discord.TextChannel.send:17 discord.User.send:17 -#: discord.Webhook.send:17 discord.abc.Messageable.send:17 of -msgid "The content of the message to send." -msgstr "" - -#: discord.Webhook.send:19 of -msgid "" -"Whether the server should wait before sending a response. This " -"essentially means that the return type of this function changes from " -"``None`` to a :class:`Message` if set to ``True``." -msgstr "" - -#: discord.Webhook.send:23 of -msgid "" -"The username to send with this message. If no username is provided then " -"the default username for the webhook is used." -msgstr "" - -#: discord.Webhook.send:26 of -msgid "" -"The avatar URL to send with this message. If no avatar URL is provided " -"then the default avatar for the webhook is used." -msgstr "" - -#: discord.DMChannel.send:19 discord.GroupChannel.send:19 -#: discord.Member.send:19 discord.TextChannel.send:19 discord.User.send:19 -#: discord.Webhook.send:29 discord.abc.Messageable.send:19 of -msgid "Indicates if the message should be sent using text-to-speech." -msgstr "" - -#: discord.Webhook.send:31 of -msgid "The file to upload. This cannot be mixed with ``files`` parameter." -msgstr "" - -#: discord.Webhook.send:33 of -msgid "" -"A list of files to send with the content. This cannot be mixed with the " -"``file`` parameter." -msgstr "" - -#: discord.Webhook.send:36 of -msgid "" -"The rich embed for the content to send. This cannot be mixed with " -"``embeds`` parameter." -msgstr "" - -#: discord.Webhook.send:39 of -msgid "" -"A list of embeds to send with the content. Maximum of 10. This cannot be " -"mixed with the ``embed`` parameter." -msgstr "" - -#: discord.Message.edit:25 discord.Webhook.send:42 of -msgid "" -"Controls the mentions being processed in this message. .. versionadded::" -" 1.4" -msgstr "" - -#: discord.Message.edit:25 discord.Webhook.send:42 of -msgid "Controls the mentions being processed in this message." -msgstr "" - -#: discord.DMChannel.send:44 discord.GroupChannel.send:44 -#: discord.Member.send:44 discord.TextChannel.send:44 discord.User.send:44 -#: discord.Webhook.send:47 discord.abc.Messageable.send:44 of -msgid "Sending the message failed." -msgstr "" - -#: discord.Webhook.send:48 of -msgid "This webhook was not found." -msgstr "" - -#: discord.Webhook.send:49 of -msgid "The authorization token for the webhook is incorrect." -msgstr "" - -#: discord.Webhook.send:50 of -msgid "" -"You specified both ``embed`` and ``embeds`` or the length of " -"``embeds`` was invalid or there was no token associated with this " -"webhook." -msgstr "" - -#: discord.DMChannel.send:48 discord.GroupChannel.send:48 -#: discord.Member.send:48 discord.TextChannel.send:48 discord.User.send:48 -#: discord.Webhook.send:52 discord.abc.Messageable.send:48 of -msgid "The message that was sent." -msgstr "" - -#: discord.MessageReference.cached_message:3 discord.RawMessageDeleteEvent:25 -#: discord.RawMessageUpdateEvent:27 discord.TextChannel.last_message:14 -#: discord.Webhook.send:53 of -msgid "Optional[:class:`Message`]" -msgstr "" - -#: discord.Webhook.execute:1 of -msgid "An alias for :meth:`~.Webhook.send`." -msgstr "" - -#: ../../api.rst:2511 -msgid "Adapters" -msgstr "" - -#: ../../api.rst:2513 -msgid "" -"Adapters allow you to change how the request should be handled. They all " -"build on a single interface, :meth:`WebhookAdapter.request`." -msgstr "" - -#: discord.WebhookAdapter:1 of -msgid "Base class for all webhook adapters." -msgstr "" - -#: discord.WebhookAdapter:5 of -msgid "The webhook that owns this adapter." -msgstr "" - -#: discord.AsyncWebhookAdapter.request:1 -#: discord.RequestsWebhookAdapter.request:1 discord.WebhookAdapter.request:1 of -msgid "Actually does the request." -msgstr "" - -#: discord.AsyncWebhookAdapter.request:5 -#: discord.RequestsWebhookAdapter.request:5 discord.WebhookAdapter.request:5 of -msgid "The HTTP verb to use for the request." -msgstr "" - -#: discord.AsyncWebhookAdapter.request:7 -#: discord.RequestsWebhookAdapter.request:7 discord.WebhookAdapter.request:7 of -msgid "" -"The URL to send the request to. This will have the query parameters " -"already added to it, if any." -msgstr "" - -#: discord.AsyncWebhookAdapter.request:10 -#: discord.RequestsWebhookAdapter.request:10 discord.WebhookAdapter.request:10 -#: of -msgid "" -"A dict containing multipart form data to send with the request. If a " -"filename is being uploaded, then it will be under a ``file`` key which " -"will have a 3-element :class:`tuple` denoting ``(filename, file, " -"content_type)``." -msgstr "" - -#: discord.AsyncWebhookAdapter.request:15 -#: discord.RequestsWebhookAdapter.request:15 discord.WebhookAdapter.request:15 -#: of -msgid "The JSON to send with the request, if any." -msgstr "" - -#: discord.AsyncWebhookAdapter.handle_execution_response:1 -#: discord.RequestsWebhookAdapter.handle_execution_response:1 -#: discord.WebhookAdapter.handle_execution_response:1 of -msgid "Transforms the webhook execution response into something more meaningful." -msgstr "" - -#: discord.AsyncWebhookAdapter.handle_execution_response:4 -#: discord.RequestsWebhookAdapter.handle_execution_response:4 -#: discord.WebhookAdapter.handle_execution_response:4 of -msgid "" -"This is mainly used to convert the data into a :class:`Message` if " -"necessary." -msgstr "" - -#: discord.AsyncWebhookAdapter.handle_execution_response:9 -#: discord.RequestsWebhookAdapter.handle_execution_response:9 -#: discord.WebhookAdapter.handle_execution_response:9 of -msgid "The data that was returned from the request." -msgstr "" - -#: discord.AsyncWebhookAdapter.handle_execution_response:10 -#: discord.RequestsWebhookAdapter.handle_execution_response:10 -#: discord.WebhookAdapter.handle_execution_response:10 of -msgid "Whether the webhook execution was asked to wait or not." -msgstr "" - -#: discord.AsyncWebhookAdapter:1 of -msgid "A webhook adapter suited for use with aiohttp." -msgstr "" - -#: discord.AsyncWebhookAdapter:5 of -msgid "You are responsible for cleaning up the client session." -msgstr "" - -#: discord.AsyncWebhookAdapter:7 of -msgid "The session to use to send requests." -msgstr "" - -#: discord.RequestsWebhookAdapter:1 of -msgid "A webhook adapter suited for use with ``requests``." -msgstr "" - -#: discord.RequestsWebhookAdapter:3 of -msgid "Only versions of :doc:`req:index` higher than 2.13.0 are supported." -msgstr "" - -#: discord.RequestsWebhookAdapter:5 of -msgid "" -"The requests session to use for sending requests. If not given then each " -"request will create a new session. Note if a session is given, the " -"webhook adapter **will not** clean it up for you. You must close the " -"session yourself." -msgstr "" - -#: discord.RequestsWebhookAdapter:10 of -msgid "" -"Whether to sleep the thread when encountering a 429 or pre-emptive rate " -"limit or a 5xx status code. Defaults to ``True``. If set to ``False`` " -"then this will raise an :exc:`HTTPException` instead." -msgstr "" - -#: ../../api.rst:2528 -msgid "Abstract Base Classes" -msgstr "抽象基底クラス" - -#: ../../api.rst:2530 -msgid "" -"An :term:`py:abstract base class` (also known as an ``abc``) is a class " -"that models can inherit to get their behaviour. The Python implementation" -" of an :doc:`abc ` is slightly different in that you can " -"register them at run-time. **Abstract base classes cannot be " -"instantiated**. They are mainly there for usage with " -":func:`py:isinstance` and :func:`py:issubclass`\\." -msgstr "" - -#: ../../api.rst:2535 -msgid "" -"This library has a module related to abstract base classes, some of which" -" are actually from the :doc:`abc ` standard module, " -"others which are not." -msgstr "" - -#: discord.abc.Snowflake:1 of -msgid "An ABC that details the common operations on a Discord model." -msgstr "" - -#: discord.abc.Snowflake:3 of -msgid "" -"Almost all :ref:`Discord models ` meet this abstract " -"base class." -msgstr "" - -#: discord.abc.Snowflake:6 of -msgid "" -"If you want to create a snowflake on your own, consider using " -":class:`.Object`." -msgstr "" - -#: discord.abc.Snowflake:11 of -msgid "The model's unique ID." -msgstr "" - -#: discord.abc.Snowflake.created_at:1 of -#, fuzzy -msgid "Returns the model's creation time as a naive datetime in UTC." -msgstr "UTCのnaive datetimeでの、タイピングの開始時刻。" - -#: discord.abc.User:1 of -msgid "An ABC that details the common operations on a Discord user." -msgstr "" - -#: discord.abc.Connectable:4 discord.abc.GuildChannel:3 -#: discord.abc.Messageable:3 discord.abc.PrivateChannel:3 discord.abc.User:3 of -msgid "The following implement this ABC:" -msgstr "" - -#: discord.abc.PrivateChannel:14 discord.abc.User:6 of -msgid ":class:`~discord.ClientUser`" -msgstr ":class:`~discord.ClientUser`" - -#: discord.abc.Messageable:9 discord.abc.User:7 of -msgid ":class:`~discord.Member`" -msgstr "" - -#: discord.abc.GuildChannel:9 discord.abc.PrivateChannel:8 discord.abc.User:9 -#: of -msgid "This ABC must also implement :class:`~discord.abc.Snowflake`." -msgstr "" - -#: discord.ClientUser:23 discord.User:23 discord.abc.User:13 of -#, fuzzy -msgid "The user's username." -msgstr ":class:`str` -- ユーザーのユーザー名。" - -#: discord.abc.User:19 of -#, fuzzy -msgid "The user's discriminator." -msgstr "ユーザー名とディスクリミネータを返します。" - -#: discord.abc.User:25 of -#, fuzzy -msgid "The avatar hash the user has." -msgstr "ユーザーのハッシュ値を返します。" - -#: discord.abc.User:31 of -#, fuzzy -msgid "If the user is a bot account." -msgstr ":class:`bool` -- ユーザーがBotアカウントであるかを表します。" - -#: discord.ClientUser.display_name:1 discord.Member.display_name:1 -#: discord.User.display_name:1 discord.abc.User.display_name:1 of -#, fuzzy -msgid "Returns the user's display name." -msgstr "役職の名前を返します。" - -#: discord.ClientUser.mention:1 discord.User.mention:1 -#: discord.WidgetMember.mention:1 discord.abc.User.mention:1 of -msgid "Returns a string that allows you to mention the given user." -msgstr "" - -#: discord.abc.PrivateChannel:1 of -msgid "An ABC that details the common operations on a private Discord channel." -msgstr "" - -#: discord.abc.Messageable:6 discord.abc.PrivateChannel:5 of -msgid ":class:`~discord.DMChannel`" -msgstr "" - -#: discord.abc.Messageable:7 discord.abc.PrivateChannel:6 of -msgid ":class:`~discord.GroupChannel`" -msgstr "" - -#: discord.DMChannel:29 discord.GroupChannel:29 discord.abc.PrivateChannel:12 -#: of -#, fuzzy -msgid "The user presenting yourself." -msgstr ":class:`~discord.ClientUser` -- ユーザー自分自身。" - -#: discord.abc.GuildChannel:1 of -msgid "An ABC that details the common operations on a Discord guild channel." -msgstr "" - -#: discord.abc.GuildChannel:5 discord.abc.Messageable:5 of -msgid ":class:`~discord.TextChannel`" -msgstr "" - -#: discord.abc.Connectable:6 discord.abc.GuildChannel:6 of -msgid ":class:`~discord.VoiceChannel`" -msgstr "" - -#: discord.abc.GuildChannel:7 of -msgid ":class:`~discord.CategoryChannel`" -msgstr "" - -#: discord.TextChannel:23 discord.VoiceChannel:23 discord.abc.GuildChannel:13 -#: of -#, fuzzy -msgid "The channel name." -msgstr "テキストチャンネル。" - -#: discord.TextChannel:29 discord.VoiceChannel:29 discord.abc.GuildChannel:19 -#: of -#, fuzzy -msgid "The guild the channel belongs to." -msgstr "ギルドのストアチャンネル。" - -#: discord.abc.GuildChannel:21 of -#, fuzzy -msgid ":class:`~discord.Guild`" -msgstr ":class:`~discord.User`" - -#: discord.Guild.create_text_channel:47 discord.TextChannel:53 -#: discord.VoiceChannel:47 discord.abc.GuildChannel:25 of -msgid "" -"The position in the channel list. This is a number that starts at 0. e.g." -" the top channel is position 0." -msgstr "" - -#: discord.CategoryChannel.changed_roles:1 discord.TextChannel.changed_roles:1 -#: discord.VoiceChannel.changed_roles:1 -#: discord.abc.GuildChannel.changed_roles:1 of -msgid "" -"Returns a list of roles that have been overridden from their default " -"values in the :attr:`~discord.Guild.roles` attribute." -msgstr "" - -#: discord.CategoryChannel.changed_roles:4 discord.TextChannel.changed_roles:4 -#: discord.VoiceChannel.changed_roles:4 -#: discord.abc.GuildChannel.changed_roles:4 of -#, fuzzy -msgid "List[:class:`~discord.Role`]" -msgstr ":class:`~discord.User`" - -#: discord.CategoryChannel.mention:1 discord.PartialInviteChannel.mention:1 -#: discord.TextChannel.mention:1 discord.VoiceChannel.mention:1 -#: discord.WidgetChannel.mention:1 discord.abc.GuildChannel.mention:1 of -msgid "The string that allows you to mention the channel." -msgstr "" - -#: discord.CategoryChannel.created_at:1 discord.GroupChannel.created_at:1 -#: discord.PartialInviteChannel.created_at:1 discord.TextChannel.created_at:1 -#: discord.VoiceChannel.created_at:1 discord.WidgetChannel.created_at:1 -#: discord.abc.GuildChannel.created_at:1 of -msgid "Returns the channel's creation time in UTC." -msgstr "" - -#: discord.CategoryChannel.overwrites_for:1 -#: discord.TextChannel.overwrites_for:1 discord.VoiceChannel.overwrites_for:1 -#: discord.abc.GuildChannel.overwrites_for:1 of -msgid "Returns the channel-specific overwrites for a member or a role." -msgstr "" - -#: discord.CategoryChannel.overwrites_for:3 -#: discord.TextChannel.overwrites_for:3 discord.VoiceChannel.overwrites_for:3 -#: discord.abc.GuildChannel.overwrites_for:3 of -msgid "The role or user denoting whose overwrite to get." -msgstr "" - -#: discord.CategoryChannel.overwrites_for:7 -#: discord.TextChannel.overwrites_for:7 discord.VoiceChannel.overwrites_for:7 -#: discord.abc.GuildChannel.overwrites_for:7 of -msgid "The permission overwrites for this object." -msgstr "" - -#: discord.CategoryChannel.overwrites_for:8 -#: discord.TextChannel.overwrites_for:8 discord.VoiceChannel.overwrites_for:8 -#: discord.abc.GuildChannel.overwrites_for:8 of -msgid ":class:`~discord.PermissionOverwrite`" -msgstr "" - -#: discord.CategoryChannel.overwrites:1 discord.TextChannel.overwrites:1 -#: discord.VoiceChannel.overwrites:1 discord.abc.GuildChannel.overwrites:1 of -msgid "Returns all of the channel's overwrites." -msgstr "" - -#: discord.CategoryChannel.overwrites:3 discord.TextChannel.overwrites:3 -#: discord.VoiceChannel.overwrites:3 discord.abc.GuildChannel.overwrites:3 of -msgid "" -"This is returned as a dictionary where the key contains the target which " -"can be either a :class:`~discord.Role` or a :class:`~discord.Member` and " -"the value is the overwrite as a :class:`~discord.PermissionOverwrite`." -msgstr "" - -#: discord.CategoryChannel.overwrites:7 discord.TextChannel.overwrites:7 -#: discord.VoiceChannel.overwrites:7 discord.abc.GuildChannel.overwrites:7 of -msgid "The channel's permission overwrites." -msgstr "" - -#: discord.CategoryChannel.overwrites:8 discord.TextChannel.overwrites:8 -#: discord.VoiceChannel.overwrites:8 discord.abc.GuildChannel.overwrites:8 of -msgid "" -"Mapping[Union[:class:`~discord.Role`, :class:`~discord.Member`], " -":class:`~discord.PermissionOverwrite`]" -msgstr "" - -#: discord.CategoryChannel.category:1 discord.TextChannel.category:1 -#: discord.VoiceChannel.category:1 discord.abc.GuildChannel.category:1 of -msgid "The category this channel belongs to." -msgstr "" - -#: discord.CategoryChannel.category:3 discord.TextChannel.category:3 -#: discord.VoiceChannel.category:3 discord.abc.GuildChannel.category:3 of -msgid "If there is no category then this is ``None``." -msgstr "" - -#: discord.CategoryChannel.category:5 discord.TextChannel.category:5 -#: discord.VoiceChannel.category:5 discord.abc.GuildChannel.category:5 of -#, fuzzy -msgid "Optional[:class:`~discord.CategoryChannel`]" -msgstr ":class:`~discord.User`" - -#: discord.CategoryChannel.permissions_synced:1 -#: discord.TextChannel.permissions_synced:1 -#: discord.VoiceChannel.permissions_synced:1 -#: discord.abc.GuildChannel.permissions_synced:1 of -msgid "" -"Whether or not the permissions for this channel are synced with the " -"category it belongs to." -msgstr "" - -#: discord.CategoryChannel.permissions_synced:4 -#: discord.TextChannel.permissions_synced:4 -#: discord.VoiceChannel.permissions_synced:4 -#: discord.abc.GuildChannel.permissions_synced:4 of -msgid "If there is no category then this is ``False``." -msgstr "" - -#: discord.CategoryChannel.permissions_for:1 -#: discord.TextChannel.permissions_for:1 discord.VoiceChannel.permissions_for:1 -#: discord.abc.GuildChannel.permissions_for:1 of -msgid "Handles permission resolution for the current :class:`~discord.Member`." -msgstr "" - -#: discord.CategoryChannel.permissions_for:3 -#: discord.TextChannel.permissions_for:3 discord.VoiceChannel.permissions_for:3 -#: discord.abc.GuildChannel.permissions_for:3 of -msgid "This function takes into consideration the following cases:" -msgstr "" - -#: discord.CategoryChannel.permissions_for:5 -#: discord.TextChannel.permissions_for:5 discord.VoiceChannel.permissions_for:5 -#: discord.abc.GuildChannel.permissions_for:5 of -msgid "Guild owner" -msgstr "" - -#: discord.CategoryChannel.permissions_for:6 -#: discord.TextChannel.permissions_for:6 discord.VoiceChannel.permissions_for:6 -#: discord.abc.GuildChannel.permissions_for:6 of -msgid "Guild roles" -msgstr "" - -#: discord.CategoryChannel.permissions_for:7 -#: discord.TextChannel.permissions_for:7 discord.VoiceChannel.permissions_for:7 -#: discord.abc.GuildChannel.permissions_for:7 of -msgid "Channel overrides" -msgstr "" - -#: discord.CategoryChannel.permissions_for:8 -#: discord.TextChannel.permissions_for:8 discord.VoiceChannel.permissions_for:8 -#: discord.abc.GuildChannel.permissions_for:8 of -msgid "Member overrides" -msgstr "" - -#: discord.CategoryChannel.permissions_for:10 -#: discord.TextChannel.permissions_for:10 -#: discord.VoiceChannel.permissions_for:10 -#: discord.abc.GuildChannel.permissions_for:10 of -msgid "The member to resolve permissions for." -msgstr "" - -#: discord.CategoryChannel.permissions_for:13 discord.Member.permissions_in:12 -#: discord.TextChannel.permissions_for:13 -#: discord.VoiceChannel.permissions_for:13 -#: discord.abc.GuildChannel.permissions_for:13 of -msgid "The resolved permissions for the member." -msgstr "" - -#: discord.CategoryChannel.permissions_for:14 -#: discord.TextChannel.permissions_for:14 -#: discord.VoiceChannel.permissions_for:14 -#: discord.abc.GuildChannel.permissions_for:14 of -msgid ":class:`~discord.Permissions`" -msgstr "" - -#: discord.CategoryChannel.delete:3 discord.TextChannel.delete:3 -#: discord.VoiceChannel.delete:3 discord.abc.GuildChannel.delete:3 of -msgid "Deletes the channel." -msgstr "" - -#: discord.CategoryChannel.delete:5 discord.TextChannel.delete:5 -#: discord.VoiceChannel.delete:5 discord.abc.GuildChannel.delete:5 of -#, fuzzy -msgid "You must have :attr:`~Permissions.manage_channels` permission to use this." -msgstr "これを行うためには、そのチャンネルの :attr:`~.Permissions.read_message_history` 権限が必要です。" - -#: discord.CategoryChannel.delete:7 discord.TextChannel.delete:7 -#: discord.VoiceChannel.delete:7 discord.abc.GuildChannel.delete:7 of -msgid "The reason for deleting this channel. Shows up on the audit log." -msgstr "" - -#: discord.CategoryChannel.delete:11 discord.TextChannel.delete:11 -#: discord.VoiceChannel.delete:11 discord.abc.GuildChannel.delete:11 of -#, fuzzy -msgid "You do not have proper permissions to delete the channel." -msgstr ":exc:`.Forbidden` -- 指定のチャンネルを取得する権限がない。" - -#: discord.CategoryChannel.delete:12 discord.TextChannel.delete:12 -#: discord.VoiceChannel.delete:12 discord.abc.GuildChannel.delete:12 of -#, fuzzy -msgid "The channel was not found or was already deleted." -msgstr "作成、または削除されたギルドチャンネル。" - -#: discord.CategoryChannel.delete:13 discord.TextChannel.delete:13 -#: discord.VoiceChannel.delete:13 discord.abc.GuildChannel.delete:13 of -#, fuzzy -msgid "Deleting the channel failed." -msgstr ":exc:`.HTTPException` -- チャンネルの取得に失敗した。" - -#: discord.CategoryChannel.set_permissions:3 -#: discord.TextChannel.set_permissions:3 discord.VoiceChannel.set_permissions:3 -#: discord.abc.GuildChannel.set_permissions:3 of -msgid "" -"Sets the channel specific permission overwrites for a target in the " -"channel." -msgstr "" - -#: discord.CategoryChannel.set_permissions:6 -#: discord.TextChannel.set_permissions:6 discord.VoiceChannel.set_permissions:6 -#: discord.abc.GuildChannel.set_permissions:6 of -msgid "" -"The ``target`` parameter should either be a :class:`~discord.Member` or a" -" :class:`~discord.Role` that belongs to guild." -msgstr "" - -#: discord.CategoryChannel.set_permissions:9 -#: discord.TextChannel.set_permissions:9 discord.VoiceChannel.set_permissions:9 -#: discord.abc.GuildChannel.set_permissions:9 of -msgid "" -"The ``overwrite`` parameter, if given, must either be ``None`` or " -":class:`~discord.PermissionOverwrite`. For convenience, you can pass in " -"keyword arguments denoting :class:`~discord.Permissions` attributes. If " -"this is done, then you cannot mix the keyword arguments with the " -"``overwrite`` parameter." -msgstr "" - -#: discord.CategoryChannel.set_permissions:15 -#: discord.TextChannel.set_permissions:15 -#: discord.VoiceChannel.set_permissions:15 -#: discord.abc.GuildChannel.set_permissions:15 of -msgid "" -"If the ``overwrite`` parameter is ``None``, then the permission " -"overwrites are deleted." -msgstr "" - -#: discord.CategoryChannel.set_permissions:18 discord.Member.add_roles:5 -#: discord.Member.remove_roles:5 discord.Role.delete:5 discord.Role.edit:5 -#: discord.TextChannel.set_permissions:18 -#: discord.VoiceChannel.set_permissions:18 -#: discord.abc.GuildChannel.set_permissions:18 of -msgid "" -"You must have the :attr:`~Permissions.manage_roles` permission to use " -"this." -msgstr "" - -#: discord.CategoryChannel.set_permissions:22 -#: discord.TextChannel.set_permissions:22 -#: discord.VoiceChannel.set_permissions:22 -#: discord.abc.GuildChannel.set_permissions:22 of -msgid "Setting allow and deny: ::" -msgstr "" - -#: discord.CategoryChannel.set_permissions:27 -#: discord.TextChannel.set_permissions:27 -#: discord.VoiceChannel.set_permissions:27 -#: discord.abc.GuildChannel.set_permissions:27 of -msgid "Deleting overwrites ::" -msgstr "" - -#: discord.CategoryChannel.set_permissions:31 -#: discord.TextChannel.set_permissions:31 -#: discord.VoiceChannel.set_permissions:31 -#: discord.abc.GuildChannel.set_permissions:31 of -msgid "Using :class:`~discord.PermissionOverwrite` ::" -msgstr "" - -#: discord.CategoryChannel.set_permissions:38 -#: discord.TextChannel.set_permissions:38 -#: discord.VoiceChannel.set_permissions:38 -#: discord.abc.GuildChannel.set_permissions:38 of -msgid "The member or role to overwrite permissions for." -msgstr "" - -#: discord.CategoryChannel.set_permissions:40 -#: discord.TextChannel.set_permissions:40 -#: discord.VoiceChannel.set_permissions:40 -#: discord.abc.GuildChannel.set_permissions:40 of -msgid "" -"The permissions to allow and deny to the target, or ``None`` to delete " -"the overwrite." -msgstr "" - -#: discord.CategoryChannel.set_permissions:43 -#: discord.TextChannel.set_permissions:43 -#: discord.VoiceChannel.set_permissions:43 -#: discord.abc.GuildChannel.set_permissions:43 of -msgid "" -"A keyword argument list of permissions to set for ease of use. Cannot be " -"mixed with ``overwrite``." -msgstr "" - -#: discord.CategoryChannel.set_permissions:45 discord.Guild.prune_members:21 -#: discord.Guild.unban:12 discord.Member.move_to:16 -#: discord.TextChannel.set_permissions:45 -#: discord.VoiceChannel.set_permissions:45 -#: discord.abc.GuildChannel.set_permissions:45 of -msgid "The reason for doing this action. Shows up on the audit log." -msgstr "" - -#: discord.CategoryChannel.set_permissions:48 -#: discord.TextChannel.set_permissions:48 -#: discord.VoiceChannel.set_permissions:48 -#: discord.abc.GuildChannel.set_permissions:48 of -msgid "You do not have permissions to edit channel specific permissions." -msgstr "" - -#: discord.CategoryChannel.set_permissions:49 -#: discord.TextChannel.set_permissions:49 -#: discord.VoiceChannel.set_permissions:49 -#: discord.abc.GuildChannel.set_permissions:49 of -#, fuzzy -msgid "Editing channel specific permissions failed." -msgstr "権限を確認したいチャンネル。" - -#: discord.CategoryChannel.set_permissions:50 -#: discord.TextChannel.set_permissions:50 -#: discord.VoiceChannel.set_permissions:50 -#: discord.abc.GuildChannel.set_permissions:50 of -msgid "The role or member being edited is not part of the guild." -msgstr "" - -#: discord.CategoryChannel.set_permissions:51 -#: discord.TextChannel.set_permissions:51 -#: discord.VoiceChannel.set_permissions:51 -#: discord.abc.GuildChannel.set_permissions:51 of -msgid "" -"The overwrite parameter invalid or the target type was not " -":class:`~discord.Role` or :class:`~discord.Member`." -msgstr "" - -#: discord.CategoryChannel.clone:3 discord.TextChannel.clone:3 -#: discord.VoiceChannel.clone:3 discord.abc.GuildChannel.clone:3 of -msgid "" -"Clones this channel. This creates a channel with the same properties as " -"this channel." -msgstr "" - -#: discord.CategoryChannel.clone:6 discord.TextChannel.clone:6 -#: discord.VoiceChannel.clone:6 discord.abc.GuildChannel.clone:6 of -#, fuzzy -msgid "" -"You must have the :attr:`~discord.Permissions.manage_channels` permission" -" to do this." -msgstr "これを行うには、関連付けられたGuildにて、 :attr:`~.Permissions.manage_channels` 権限が必要です。" - -#: discord.CategoryChannel.clone:11 discord.TextChannel.clone:11 -#: discord.VoiceChannel.clone:11 discord.abc.GuildChannel.clone:11 of -msgid "" -"The name of the new channel. If not provided, defaults to this channel " -"name." -msgstr "" - -#: discord.CategoryChannel.clone:14 discord.TextChannel.clone:14 -#: discord.VoiceChannel.clone:14 discord.abc.GuildChannel.clone:14 of -msgid "The reason for cloning this channel. Shows up on the audit log." -msgstr "" - -#: discord.CategoryChannel.clone:17 discord.Guild.create_category:10 -#: discord.Guild.create_category_channel:10 -#: discord.Guild.create_text_channel:60 discord.Guild.create_voice_channel:11 -#: discord.TextChannel.clone:17 discord.VoiceChannel.clone:17 -#: discord.abc.GuildChannel.clone:17 of -#, fuzzy -msgid "You do not have the proper permissions to create this channel." -msgstr ":exc:`.Forbidden` -- 指定のチャンネルを取得する権限がない。" - -#: discord.CategoryChannel.clone:18 discord.Guild.create_category:11 -#: discord.Guild.create_category_channel:11 -#: discord.Guild.create_text_channel:61 discord.Guild.create_voice_channel:12 -#: discord.TextChannel.clone:18 discord.VoiceChannel.clone:18 -#: discord.abc.GuildChannel.clone:18 of -#, fuzzy -msgid "Creating the channel failed." -msgstr ":exc:`.HTTPException` -- チャンネルの取得に失敗した。" - -#: discord.CategoryChannel.clone:20 discord.Member.create_dm:6 -#: discord.TextChannel.clone:20 discord.User.create_dm:6 -#: discord.VoiceChannel.clone:20 discord.abc.GuildChannel.clone:20 of -#, fuzzy -msgid "The channel that was created." -msgstr "チャンネルが作成されました。" - -#: discord.CategoryChannel.clone:21 discord.TextChannel.clone:21 -#: discord.VoiceChannel.clone:21 discord.abc.GuildChannel.clone:21 of -#, fuzzy -msgid ":class:`.abc.GuildChannel`" -msgstr ":class:`.Guild`" - -#: discord.CategoryChannel.create_invite:3 discord.TextChannel.create_invite:3 -#: discord.VoiceChannel.create_invite:3 -#: discord.abc.GuildChannel.create_invite:3 of -msgid "Creates an instant invite." -msgstr "" - -#: discord.CategoryChannel.create_invite:5 discord.TextChannel.create_invite:5 -#: discord.VoiceChannel.create_invite:5 -#: discord.abc.GuildChannel.create_invite:5 of -#, fuzzy -msgid "" -"You must have the :attr:`~Permissions.create_instant_invite` permission " -"to do this." -msgstr "これを行うためには、そのチャンネルの :attr:`~.Permissions.read_message_history` 権限が必要です。" - -#: discord.CategoryChannel.create_invite:8 discord.TextChannel.create_invite:8 -#: discord.VoiceChannel.create_invite:8 -#: discord.abc.GuildChannel.create_invite:8 of -msgid "" -"How long the invite should last in seconds. If it's 0 then the invite " -"doesn't expire. Defaults to ``0``." -msgstr "" - -#: discord.CategoryChannel.create_invite:11 -#: discord.TextChannel.create_invite:11 discord.VoiceChannel.create_invite:11 -#: discord.abc.GuildChannel.create_invite:11 of -msgid "" -"How many uses the invite could be used for. If it's 0 then there are " -"unlimited uses. Defaults to ``0``." -msgstr "" - -#: discord.CategoryChannel.create_invite:14 -#: discord.TextChannel.create_invite:14 discord.VoiceChannel.create_invite:14 -#: discord.abc.GuildChannel.create_invite:14 of -msgid "" -"Denotes that the invite grants temporary membership (i.e. they get kicked" -" after they disconnect). Defaults to ``False``." -msgstr "" - -#: discord.CategoryChannel.create_invite:17 -#: discord.TextChannel.create_invite:17 discord.VoiceChannel.create_invite:17 -#: discord.abc.GuildChannel.create_invite:17 of -msgid "" -"Indicates if a unique invite URL should be created. Defaults to True. If " -"this is set to ``False`` then it will return a previously created invite." -msgstr "" - -#: discord.CategoryChannel.create_invite:21 -#: discord.TextChannel.create_invite:21 discord.VoiceChannel.create_invite:21 -#: discord.abc.GuildChannel.create_invite:21 of -msgid "The reason for creating this invite. Shows up on the audit log." -msgstr "" - -#: discord.CategoryChannel.create_invite:24 -#: discord.TextChannel.create_invite:24 discord.VoiceChannel.create_invite:24 -#: discord.abc.GuildChannel.create_invite:24 of -#, fuzzy -msgid "Invite creation failed." -msgstr "招待の作成。" - -#: discord.CategoryChannel.create_invite:27 -#: discord.TextChannel.create_invite:27 discord.VoiceChannel.create_invite:27 -#: discord.abc.GuildChannel.create_invite:27 of -msgid ":class:`~discord.Invite`" -msgstr "" - -#: discord.CategoryChannel.invites:3 discord.TextChannel.invites:3 -#: discord.VoiceChannel.invites:3 discord.abc.GuildChannel.invites:3 of -msgid "Returns a list of all active instant invites from this channel." -msgstr "" - -#: discord.CategoryChannel.invites:5 discord.TextChannel.invites:5 -#: discord.VoiceChannel.invites:5 discord.abc.GuildChannel.invites:5 of -#, fuzzy -msgid "You must have :attr:`~Permissions.manage_guild` to get this information." -msgstr "これを行うためには、そのチャンネルの :attr:`~.Permissions.read_message_history` 権限が必要です。" - -#: discord.CategoryChannel.invites:7 discord.Guild.bans:13 -#: discord.Guild.fetch_ban:13 discord.Guild.invites:8 -#: discord.TextChannel.invites:7 discord.VoiceChannel.invites:7 -#: discord.abc.GuildChannel.invites:7 of -#, fuzzy -msgid "You do not have proper permissions to get the information." -msgstr "この情報を取得するためには、ギルドのウィジェットを有効化しておく必要があります。" - -#: discord.CategoryChannel.invites:8 discord.Guild.bans:14 -#: discord.Guild.fetch_ban:15 discord.Guild.invites:9 -#: discord.TextChannel.invites:8 discord.VoiceChannel.invites:8 -#: discord.abc.GuildChannel.invites:8 of -msgid "An error occurred while fetching the information." -msgstr "" - -#: discord.CategoryChannel.invites:10 discord.Guild.invites:11 -#: discord.TextChannel.invites:10 discord.VoiceChannel.invites:10 -#: discord.abc.GuildChannel.invites:10 of -msgid "The list of invites that are currently active." -msgstr "" - -#: discord.CategoryChannel.invites:11 discord.TextChannel.invites:11 -#: discord.VoiceChannel.invites:11 discord.abc.GuildChannel.invites:11 of -msgid "List[:class:`~discord.Invite`]" -msgstr "" - -#: discord.abc.Messageable:1 of -msgid "" -"An ABC that details the common operations on a model that can send " -"messages." -msgstr "" - -#: discord.abc.Messageable:10 of -msgid ":class:`~discord.ext.commands.Context`" -msgstr "" - -#: discord.DMChannel.history:1 discord.GroupChannel.history:1 -#: discord.Member.history:1 discord.TextChannel.history:1 -#: discord.User.history:1 discord.abc.Messageable.history:1 of -msgid "" -"Returns an :class:`~discord.AsyncIterator` that enables receiving the " -"destination's message history." -msgstr "" - -#: discord.DMChannel.history:3 discord.GroupChannel.history:3 -#: discord.Member.history:3 discord.TextChannel.history:3 -#: discord.User.history:3 discord.abc.Messageable.history:3 of -#, fuzzy -msgid "" -"You must have :attr:`~Permissions.read_message_history` permissions to " -"use this." -msgstr "これを行うためには、そのチャンネルの :attr:`~.Permissions.read_message_history` 権限が必要です。" - -#: discord.DMChannel.history:14 discord.GroupChannel.history:14 -#: discord.Member.history:14 discord.Reaction.users:14 -#: discord.TextChannel.history:14 discord.User.history:14 -#: discord.abc.Messageable.history:14 of -msgid "Flattening into a list: ::" -msgstr "" - -#: discord.DMChannel.history:21 discord.GroupChannel.history:21 -#: discord.Member.history:21 discord.TextChannel.history:21 -#: discord.User.history:21 discord.abc.Messageable.history:21 of -msgid "" -"The number of messages to retrieve. If ``None``, retrieves every message " -"in the channel. Note, however, that this would make it a slow operation." -msgstr "" - -#: discord.DMChannel.history:25 discord.GroupChannel.history:25 -#: discord.Member.history:25 discord.TextChannel.history:25 -#: discord.User.history:25 discord.abc.Messageable.history:25 of -msgid "" -"Retrieve messages before this date or message. If a date is provided it " -"must be a timezone-naive datetime representing UTC time." -msgstr "" - -#: discord.DMChannel.history:28 discord.GroupChannel.history:28 -#: discord.Member.history:28 discord.TextChannel.history:28 -#: discord.User.history:28 discord.abc.Messageable.history:28 of -msgid "" -"Retrieve messages after this date or message. If a date is provided it " -"must be a timezone-naive datetime representing UTC time." -msgstr "" - -#: discord.DMChannel.history:31 discord.GroupChannel.history:31 -#: discord.Member.history:31 discord.TextChannel.history:31 -#: discord.User.history:31 discord.abc.Messageable.history:31 of -msgid "" -"Retrieve messages around this date or message. If a date is provided it " -"must be a timezone-naive datetime representing UTC time. When using this " -"argument, the maximum limit is 101. Note that if the limit is an even " -"number then this will return at most limit + 1 messages." -msgstr "" - -#: discord.DMChannel.history:36 discord.GroupChannel.history:36 -#: discord.Member.history:36 discord.TextChannel.history:36 -#: discord.User.history:36 discord.abc.Messageable.history:36 of -msgid "" -"If set to ``True``, return messages in oldest->newest order. Defaults to " -"``True`` if ``after`` is specified, otherwise ``False``." -msgstr "" - -#: discord.DMChannel.history:40 discord.GroupChannel.history:40 -#: discord.Member.history:40 discord.TextChannel.history:40 -#: discord.User.history:40 discord.abc.Messageable.history:40 of -#, fuzzy -msgid "You do not have permissions to get channel message history." -msgstr ":exc:`.Forbidden` -- 指定のチャンネルを取得する権限がない。" - -#: discord.DMChannel.history:41 discord.GroupChannel.history:41 -#: discord.Member.history:41 discord.TextChannel.history:41 -#: discord.User.history:41 discord.abc.Messageable.history:41 of -msgid "The request to get message history failed." -msgstr "" - -#: discord.DMChannel.history:43 discord.GroupChannel.history:43 -#: discord.Member.history:43 discord.TextChannel.history:43 -#: discord.User.history:43 discord.abc.Messageable.history:43 of -msgid ":class:`~discord.Message` -- The message with the message data parsed." -msgstr "" - -#: discord.DMChannel.typing:1 discord.GroupChannel.typing:1 -#: discord.Member.typing:1 discord.TextChannel.typing:1 discord.User.typing:1 -#: discord.abc.Messageable.typing:1 of -msgid "" -"Returns a context manager that allows you to type for an indefinite " -"period of time." -msgstr "" - -#: discord.DMChannel.typing:3 discord.GroupChannel.typing:3 -#: discord.Member.typing:3 discord.TextChannel.typing:3 discord.User.typing:3 -#: discord.abc.Messageable.typing:3 of -msgid "This is useful for denoting long computations in your bot." -msgstr "" - -#: discord.DMChannel.typing:7 discord.GroupChannel.typing:7 -#: discord.Member.typing:7 discord.TextChannel.typing:7 discord.User.typing:7 -#: discord.abc.Messageable.typing:7 of -msgid "" -"This is both a regular context manager and an async context manager. This" -" means that both ``with`` and ``async with`` work with this." -msgstr "" - -#: discord.DMChannel.typing:10 discord.GroupChannel.typing:10 -#: discord.Member.typing:10 discord.TextChannel.typing:10 -#: discord.User.typing:10 discord.abc.Messageable.typing:10 of -msgid "Example Usage: ::" -msgstr "" - -#: discord.DMChannel.send:3 discord.GroupChannel.send:3 discord.Member.send:3 -#: discord.TextChannel.send:3 discord.User.send:3 -#: discord.abc.Messageable.send:3 of -msgid "Sends a message to the destination with the content given." -msgstr "" - -#: discord.DMChannel.send:5 discord.GroupChannel.send:5 discord.Member.send:5 -#: discord.TextChannel.send:5 discord.User.send:5 -#: discord.abc.Messageable.send:5 of -msgid "" -"The content must be a type that can convert to a string through " -"``str(content)``. If the content is set to ``None`` (the default), then " -"the ``embed`` parameter must be provided." -msgstr "" - -#: discord.DMChannel.send:9 discord.GroupChannel.send:9 discord.Member.send:9 -#: discord.TextChannel.send:9 discord.User.send:9 -#: discord.abc.Messageable.send:9 of -msgid "" -"To upload a single file, the ``file`` parameter should be used with a " -"single :class:`~discord.File` object. To upload multiple files, the " -"``files`` parameter should be used with a :class:`list` of " -":class:`~discord.File` objects. **Specifying both parameters will lead to" -" an exception**." -msgstr "" - -#: discord.DMChannel.send:14 discord.GroupChannel.send:14 -#: discord.Member.send:14 discord.TextChannel.send:14 discord.User.send:14 -#: discord.abc.Messageable.send:14 of -msgid "" -"If the ``embed`` parameter is provided, it must be of type " -":class:`~discord.Embed` and it must be a rich embed type." -msgstr "" - -#: discord.DMChannel.send:21 discord.GroupChannel.send:21 -#: discord.Member.send:21 discord.TextChannel.send:21 discord.User.send:21 -#: discord.abc.Messageable.send:21 of -msgid "The rich embed for the content." -msgstr "" - -#: discord.DMChannel.send:23 discord.GroupChannel.send:23 -#: discord.Member.send:23 discord.TextChannel.send:23 discord.User.send:23 -#: discord.abc.Messageable.send:23 of -msgid "The file to upload." -msgstr "" - -#: discord.DMChannel.send:25 discord.GroupChannel.send:25 -#: discord.Member.send:25 discord.TextChannel.send:25 discord.User.send:25 -#: discord.abc.Messageable.send:25 of -msgid "A list of files to upload. Must be a maximum of 10." -msgstr "" - -#: discord.DMChannel.send:27 discord.GroupChannel.send:27 -#: discord.Member.send:27 discord.TextChannel.send:27 discord.User.send:27 -#: discord.abc.Messageable.send:27 of -msgid "" -"The nonce to use for sending this message. If the message was " -"successfully sent, then the message will have a nonce with this value." -msgstr "" - -#: discord.DMChannel.send:30 discord.GroupChannel.send:30 -#: discord.Member.send:30 discord.TextChannel.send:30 discord.User.send:30 -#: discord.abc.Messageable.send:30 of -msgid "" -"If provided, the number of seconds to wait in the background before " -"deleting the message we just sent. If the deletion fails, then it is " -"silently ignored." -msgstr "" - -#: discord.DMChannel.send:34 discord.GroupChannel.send:34 -#: discord.Member.send:34 discord.TextChannel.send:34 discord.User.send:34 -#: discord.abc.Messageable.send:34 of -msgid "" -"Controls the mentions being processed in this message. If this is passed," -" then the object is merged with :attr:`~discord.Client.allowed_mentions`." -" The merging behaviour only overrides attributes that have been " -"explicitly passed to the object, otherwise it uses the attributes set in " -":attr:`~discord.Client.allowed_mentions`. If no object is passed at all " -"then the defaults given by :attr:`~discord.Client.allowed_mentions` are " -"used instead. .. versionadded:: 1.4" -msgstr "" - -#: discord.DMChannel.send:34 discord.GroupChannel.send:34 -#: discord.Member.send:34 discord.TextChannel.send:34 discord.User.send:34 -#: discord.abc.Messageable.send:34 of -msgid "" -"Controls the mentions being processed in this message. If this is passed," -" then the object is merged with :attr:`~discord.Client.allowed_mentions`." -" The merging behaviour only overrides attributes that have been " -"explicitly passed to the object, otherwise it uses the attributes set in " -":attr:`~discord.Client.allowed_mentions`. If no object is passed at all " -"then the defaults given by :attr:`~discord.Client.allowed_mentions` are " -"used instead." -msgstr "" - -#: discord.DMChannel.send:45 discord.GroupChannel.send:45 -#: discord.Member.send:45 discord.TextChannel.send:45 discord.User.send:45 -#: discord.abc.Messageable.send:45 of -msgid "You do not have the proper permissions to send the message." -msgstr "" - -#: discord.DMChannel.send:46 discord.GroupChannel.send:46 -#: discord.Member.send:46 discord.TextChannel.send:46 discord.User.send:46 -#: discord.abc.Messageable.send:46 of -msgid "" -"The ``files`` list is not of the appropriate size or you specified " -"both ``file`` and ``files``." -msgstr "" - -#: discord.DMChannel.fetch_message:15 discord.DMChannel.send:49 -#: discord.GroupChannel.fetch_message:15 discord.GroupChannel.send:49 -#: discord.Member.fetch_message:15 discord.Member.send:49 -#: discord.TextChannel.fetch_message:15 discord.TextChannel.send:49 -#: discord.User.fetch_message:15 discord.User.send:49 -#: discord.abc.Messageable.fetch_message:15 discord.abc.Messageable.send:49 of -msgid ":class:`~discord.Message`" -msgstr "" - -#: discord.DMChannel.trigger_typing:3 discord.GroupChannel.trigger_typing:3 -#: discord.Member.trigger_typing:3 discord.TextChannel.trigger_typing:3 -#: discord.User.trigger_typing:3 discord.abc.Messageable.trigger_typing:3 of -msgid "Triggers a *typing* indicator to the destination." -msgstr "" - -#: discord.DMChannel.trigger_typing:5 discord.GroupChannel.trigger_typing:5 -#: discord.Member.trigger_typing:5 discord.TextChannel.trigger_typing:5 -#: discord.User.trigger_typing:5 discord.abc.Messageable.trigger_typing:5 of -msgid "" -"*Typing* indicator will go away after 10 seconds, or after a message is " -"sent." -msgstr "" - -#: discord.DMChannel.fetch_message:3 discord.GroupChannel.fetch_message:3 -#: discord.Member.fetch_message:3 discord.TextChannel.fetch_message:3 -#: discord.User.fetch_message:3 discord.abc.Messageable.fetch_message:3 of -msgid "Retrieves a single :class:`~discord.Message` from the destination." -msgstr "" - -#: discord.DMChannel.fetch_message:5 discord.GroupChannel.fetch_message:5 -#: discord.Member.fetch_message:5 discord.TextChannel.fetch_message:5 -#: discord.User.fetch_message:5 discord.abc.Messageable.fetch_message:5 of -msgid "This can only be used by bot accounts." -msgstr "" - -#: discord.DMChannel.fetch_message:7 discord.GroupChannel.fetch_message:7 -#: discord.Member.fetch_message:7 discord.TextChannel.fetch_message:7 -#: discord.User.fetch_message:7 discord.abc.Messageable.fetch_message:7 of -msgid "The message ID to look for." -msgstr "" - -#: discord.DMChannel.fetch_message:10 discord.GroupChannel.fetch_message:10 -#: discord.Member.fetch_message:10 discord.TextChannel.fetch_message:10 -#: discord.User.fetch_message:10 discord.abc.Messageable.fetch_message:10 of -msgid "The specified message was not found." -msgstr "" - -#: discord.DMChannel.fetch_message:11 discord.GroupChannel.fetch_message:11 -#: discord.Member.fetch_message:11 discord.TextChannel.fetch_message:11 -#: discord.User.fetch_message:11 discord.abc.Messageable.fetch_message:11 of -msgid "You do not have the permissions required to get a message." -msgstr "" - -#: discord.DMChannel.fetch_message:12 discord.GroupChannel.fetch_message:12 -#: discord.Member.fetch_message:12 discord.TextChannel.fetch_message:12 -#: discord.User.fetch_message:12 discord.abc.Messageable.fetch_message:12 of -msgid "Retrieving the message failed." -msgstr "" - -#: discord.DMChannel.fetch_message:14 discord.GroupChannel.fetch_message:14 -#: discord.Member.fetch_message:14 discord.TextChannel.fetch_message:14 -#: discord.User.fetch_message:14 discord.abc.Messageable.fetch_message:14 of -msgid "The message asked for." -msgstr "" - -#: discord.DMChannel.pins:3 discord.GroupChannel.pins:3 discord.Member.pins:3 -#: discord.TextChannel.pins:3 discord.User.pins:3 -#: discord.abc.Messageable.pins:3 of -msgid "Retrieves all messages that are currently pinned in the channel." -msgstr "" - -#: discord.DMChannel.pins:7 discord.GroupChannel.pins:7 discord.Member.pins:7 -#: discord.TextChannel.pins:7 discord.User.pins:7 -#: discord.abc.Messageable.pins:7 of -msgid "" -"Due to a limitation with the Discord API, the :class:`.Message` objects " -"returned by this method do not contain complete " -":attr:`.Message.reactions` data." -msgstr "" - -#: discord.DMChannel.pins:11 discord.GroupChannel.pins:11 -#: discord.Member.pins:11 discord.TextChannel.pins:11 discord.User.pins:11 -#: discord.abc.Messageable.pins:11 of -msgid "Retrieving the pinned messages failed." -msgstr "" - -#: discord.DMChannel.pins:13 discord.GroupChannel.pins:13 -#: discord.Member.pins:13 discord.TextChannel.pins:13 discord.User.pins:13 -#: discord.abc.Messageable.pins:13 of -msgid "The messages that are currently pinned." -msgstr "" - -#: discord.DMChannel.pins:14 discord.GroupChannel.pins:14 -#: discord.Member.pins:14 discord.TextChannel.pins:14 discord.User.pins:14 -#: discord.abc.Messageable.pins:14 of -msgid "List[:class:`~discord.Message`]" -msgstr "" - -#: discord.abc.Connectable:1 of -msgid "" -"An ABC that details the common operations on a channel that can connect " -"to a voice server." -msgstr "" - -#: ../../api.rst:2565 -msgid "Discord Models" -msgstr "Discordモデル" - -#: ../../api.rst:2567 -msgid "" -"Models are classes that are received from Discord and are not meant to be" -" created by the user of the library." -msgstr "モデルはDiscordから受け取るクラスであり、ユーザーによって作成されることを想定していません。" - -#: ../../api.rst:2572 -msgid "" -"The classes listed below are **not intended to be created by users** and " -"are also **read-only**." -msgstr "下記のクラスは、 **ユーザーによって作成されることを想定しておらず** 、中には **読み取り専用** のものもあります。" - -#: ../../api.rst:2575 -msgid "" -"For example, this means that you should not make your own :class:`User` " -"instances nor should you modify the :class:`User` instance yourself." -msgstr "" -"つまり、独自の :class:`User` を作成は行うべきではなく、また、 :class:`User` " -"インスタンスの値の変更もするべきではありません。" - -#: ../../api.rst:2578 -msgid "" -"If you want to get one of these model classes instances they'd have to be" -" through the cache, and a common way of doing so is through the " -":func:`utils.find` function or attributes of model classes that you " -"receive from the events specified in the :ref:`discord-api-events`." -msgstr "" -"このようなモデルクラスのインスタンスを取得したい場合は、 キャッシュを経由して取得する必要があります。一般的な方法としては " -":func:`utils.find` 関数を用いるか、 :ref:`discord-api-events` " -"の特定のイベントから受け取る方法が挙げられます。" - -#: ../../api.rst:2585 ../../api.rst:2870 -msgid "" -"Nearly all classes here have :ref:`py:slots` defined which means that it " -"is impossible to have dynamic attributes to the data classes." -msgstr "ほぼすべてのクラスに :ref:`py:slots` が定義されています。つまり、データクラスに動的に変数を追加することは不可能です。" - -#: ../../api.rst:2590 -msgid "ClientUser" -msgstr "ClientUser" - -#: discord.ClientUser:1 of -msgid "Represents your Discord user." -msgstr "あなたのDiscordユーザーを表します。" - -#: discord.ClientUser:7 discord.User:7 of -msgid "Checks if two users are equal." -msgstr "二つのユーザーが等しいかを比較します。" - -#: discord.ClientUser:11 discord.User:11 of -msgid "Checks if two users are not equal." -msgstr "二つのユーザーが等しいものではないか比較します。" - -#: discord.ClientUser:15 discord.User:15 of -msgid "Return the user's hash." -msgstr "ユーザーのハッシュ値を返します。" - -#: discord.ClientUser:19 discord.User:19 of -msgid "Returns the user's name with discriminator." -msgstr "ユーザー名とディスクリミネータを返します。" - -#: discord.ClientUser:29 discord.User:29 of -#, fuzzy -msgid "The user's unique ID." -msgstr ":class:`int` -- ユーザーの一意のID。" - -#: discord.ClientUser:35 discord.User:35 of -#, fuzzy -msgid "The user's discriminator. This is given when the username has conflicts." -msgstr ":class:`str` -- ユーザーの識別子。これはユーザー名が重複しているときに与えられます。" - -#: discord.ClientUser:41 of -#, fuzzy -msgid "The avatar hash the user has. Could be ``None``." -msgstr "Optional[:class:`str`] -- ユーザーのアバターハッシュ。 Noneが返る場合もあります。" - -#: discord.ClientUser:53 discord.User:53 of -#, fuzzy -msgid "" -"Specifies if the user is a system user (i.e. represents Discord " -"officially)." -msgstr ":class:`bool` -- ユーザーがプレミアムユーザー (例えば Discord Nitro) であるかを表します。" - -#: discord.ClientUser:61 of -#, fuzzy -msgid "Specifies if the user is a verified account." -msgstr ":class:`bool` -- ユーザーが認証済みアカウントであるかを表します。" - -#: discord.ClientUser:67 of -#, fuzzy -msgid "The email the user used when registering." -msgstr "Optional[:class:`str`] -- ユーザーが登録時に使用したEメールアドレス。" - -#: discord.ClientUser:73 of -#, fuzzy -msgid "The IETF language tag used to identify the language the user is using." -msgstr "Optional[:class:`str`] -- ユーザーが使用している言語を識別するためのIETF言語タグ。" - -#: discord.ClientUser:79 of -#, fuzzy -msgid "Specifies if the user has MFA turned on and working." -msgstr ":class:`bool` -- ユーザーが二段階認証を行っているかを表します。" - -#: discord.ClientUser:85 of -#, fuzzy -msgid "Specifies if the user is a premium user (e.g. has Discord Nitro)." -msgstr ":class:`bool` -- ユーザーがプレミアムユーザー (例えば Discord Nitro) であるかを表します。" - -#: discord.ClientUser:91 of -#, fuzzy -msgid "" -"Specifies the type of premium a user has (e.g. Nitro or Nitro Classic). " -"Could be None if the user is not premium." -msgstr "" -":class:`PremiumType` -- ユーザーのプレミアムの種類 (例えばNitroやNitro Classic) " -"を表します。ユーザーがプレミアムでない場合、Noneが返ります。" - -#: discord.ClientUser:93 of -msgid "Optional[:class:`PremiumType`]" -msgstr "" - -#: discord.ClientUser.get_relationship:1 of -msgid "Retrieves the :class:`Relationship` if applicable." -msgstr "該当すれば :class:`Relationship` が返ります。" - -#: discord.ClientUser.get_relationship:7 of -msgid "The user ID to check if we have a relationship with them." -msgstr "リレーションシップがあるか確認したいユーザーのID。" - -#: discord.ClientUser.get_relationship:10 of -msgid "The relationship if available or ``None``." -msgstr "該当すればリレーションシップが返り、それ以外は ``None`` が返ります。" - -#: discord.ClientUser.get_relationship:11 discord.User.relationship:7 of -msgid "Optional[:class:`Relationship`]" -msgstr "" - -#: discord.ClientUser.relationships:1 of -#, fuzzy -msgid "Returns all the relationships that the user has." -msgstr "List[:class:`User`] -- ユーザーが持つすべてのリレーションシップを返します。" - -#: discord.CallMessage:16 discord.ClientUser.blocked:7 -#: discord.ClientUser.friends:7 discord.ClientUser.relationships:7 -#: discord.GroupCall:21 discord.GroupCall.connected:3 discord.GroupChannel:25 -#: discord.Member.mutual_friends:13 discord.User.mutual_friends:13 of -msgid "List[:class:`User`]" -msgstr "" - -#: discord.ClientUser.friends:1 of -#, fuzzy -msgid "Returns all the users that the user is friends with." -msgstr "List[:class:`User`] -- ユーザーのフレンドであるすべてのユーザーを返します。" - -#: discord.ClientUser.blocked:1 of -#, fuzzy -msgid "Returns all the users that the user has blocked." -msgstr "List[:class:`User`] -- ユーザーがブロックしているすべてのユーザーを返します。" - -#: discord.ClientUser.edit:3 of -msgid "Edits the current profile of the client." -msgstr "現在のクライアントのプロフィールを編集します。" - -#: discord.ClientUser.edit:5 of -msgid "" -"If a bot account is used then a password field is optional, otherwise it " -"is required." -msgstr "Botアカウントである場合はpasswordフィールドはオプションとなります。それ以外の場合は必須です。" - -#: discord.ClientUser.edit:10 of -msgid "" -"To upload an avatar, a :term:`py:bytes-like object` must be passed in " -"that represents the image being uploaded. If this is done through a file " -"then the file must be opened via ``open('some_filename', 'rb')`` and the " -":term:`py:bytes-like object` is given through the use of ``fp.read()``." -msgstr "" -"アバターをアップロードする際には、アップロードする画像を表す :term:`py:bytes-like object` " -"を渡す必要があります。これをファイルを介して行う場合、ファイルを ``open('some_filename', 'rb')`` で開き、 " -":term:`py:bytes-like object` は ``fp.read()`` で取得できます。" - -#: discord.ClientUser.edit:15 of -msgid "The only image formats supported for uploading is JPEG and PNG." -msgstr "" - -#: discord.ClientUser.edit:17 of -msgid "" -"The current password for the client's account. Only applicable to user " -"accounts." -msgstr "クライアントの現在のパスワード。ユーザーアカウントでのみ適用可能です。" - -#: discord.ClientUser.edit:20 of -msgid "The new password you wish to change to. Only applicable to user accounts." -msgstr "変更する際の新しいパスワード。ユーザーアカウントでのみ適用可能です。" - -#: discord.ClientUser.edit:23 of -msgid "The new email you wish to change to. Only applicable to user accounts." -msgstr "変更する際の新しいEメールアドレス。ユーザーアカウントでのみ適用可能です。" - -#: discord.ClientUser.edit:26 of -msgid "" -"The hypesquad house you wish to change to. Could be ``None`` to leave the" -" current house. Only applicable to user accounts." -msgstr "" -"変更する際の新しいHypesquad house。現在のhouseから脱退したい場合は ``None`` " -"を指定してください。ユーザアカウントでのみ適用可能です。" - -#: discord.ClientUser.edit:30 of -msgid "The new username you wish to change to." -msgstr "変更する際の新しいユーザー名。" - -#: discord.ClientUser.edit:32 of -msgid "" -"A :term:`py:bytes-like object` representing the image to upload. Could be" -" ``None`` to denote no avatar." -msgstr "" -"アップロードする画像を表す :term:`py:bytes-like object` 。アバターをなしにしたい場合は ``None`` " -"を設定することが出来ます。" - -#: discord.ClientUser.edit:36 of -#, fuzzy -msgid "Editing your profile failed." -msgstr ":exc:`HTTPException` -- プロフィールの編集に失敗した。" - -#: discord.ClientUser.edit:37 of -#, fuzzy -msgid "Wrong image format passed for ``avatar``." -msgstr ":exc:`InvalidArgument` -- ``avatar`` に誤った形式の画像が渡された。" - -#: discord.ClientUser.edit:38 of -#, fuzzy -msgid "" -"Password is required for non-bot accounts. House field was not a " -"HypeSquadHouse." -msgstr "" -":exc:`ClientException` -- Botではないアカウントでpasswordが指定されていない。 " -"HouseフィールドがHypeSquadHouseでない。" - -#: discord.ClientUser.create_group:3 of -msgid "" -"Creates a group direct message with the recipients provided. These " -"recipients must be have a relationship of type " -":attr:`RelationshipType.friend`." -msgstr "" -"与えられたrecipientsを含むグループダイレクトメッセージを作成します。これを実行するにはrecipientsとの間に " -":attr:`RelationshipType.friend` のリレーションシップを持っていなければなりません。" - -#: discord.ClientUser.create_group:11 of -msgid "An argument :class:`list` of :class:`User` to have in your group." -msgstr "グループに参加させたい :class:`User` の :class:`list` 。" - -#: discord.ClientUser.create_group:15 of -#, fuzzy -msgid "Failed to create the group direct message." -msgstr ":exc:`HTTPException` -- グループダイレクトメッセージの作成に失敗した。" - -#: discord.ClientUser.create_group:16 of -msgid "" -"Attempted to create a group with only one recipient. This does not " -"include yourself." -msgstr "" - -#: discord.ClientUser.create_group:18 of -msgid "The new group channel." -msgstr "新しいグループチャンネル。" - -#: discord.ClientUser.create_group:19 of -msgid ":class:`GroupChannel`" -msgstr "" - -#: discord.ClientUser.edit_settings:3 of -msgid "Edits the client user's settings." -msgstr "クライアントユーザーの設定を変更します。" - -#: discord.ClientUser.edit_settings:9 of -msgid "" -"How long (in seconds) the user needs to be AFK until Discord sends push " -"notifications to your mobile device." -msgstr "" - -#: discord.ClientUser.edit_settings:12 of -msgid "Whether or not to animate emojis in the chat." -msgstr "" - -#: discord.ClientUser.edit_settings:14 of -msgid "" -"Whether or not to automatically convert emoticons into emojis. e.g. :-) " -"-> 😃" -msgstr "" - -#: discord.ClientUser.edit_settings:17 of -msgid "" -"Whether or not to automatically disable DMs between you and members of " -"new guilds you join." -msgstr "" - -#: discord.ClientUser.edit_settings:20 of -msgid "" -"Whether or not to automatically detect accounts from services like Steam " -"and Blizzard when you open the Discord client." -msgstr "" - -#: discord.ClientUser.edit_settings:23 of -msgid "Whether or not to enable developer mode." -msgstr "" - -#: discord.ClientUser.edit_settings:25 of -msgid "Whether or not to disable the showing of the Games tab." -msgstr "" - -#: discord.ClientUser.edit_settings:27 of -msgid "Whether or not to allow tts messages to be played/sent." -msgstr "" - -#: discord.ClientUser.edit_settings:29 of -msgid "The filter for explicit content in all messages." -msgstr "" - -#: discord.ClientUser.edit_settings:31 of -msgid "Who can add you as a friend." -msgstr "" - -#: discord.ClientUser.edit_settings:33 of -msgid "Whether or not to automatically play gifs that are in the chat." -msgstr "" - -#: discord.ClientUser.edit_settings:35 of -msgid "" -"A list of guilds in order of the guild/guild icons that are on the left " -"hand side of the UI." -msgstr "" - -#: discord.ClientUser.edit_settings:38 of -msgid "Whether or not to display attachments when they are uploaded in chat." -msgstr "" - -#: discord.ClientUser.edit_settings:40 of -msgid "Whether or not to display videos and images from links posted in chat." -msgstr "" - -#: discord.ClientUser.edit_settings:42 of -msgid "" -"The :rfc:`3066` language identifier of the locale to use for the language" -" of the Discord client." -msgstr "" - -#: discord.ClientUser.edit_settings:45 of -msgid "Whether or not to use the compact Discord display mode." -msgstr "" - -#: discord.ClientUser.edit_settings:47 of -msgid "Whether or not to render embeds that are sent in the chat." -msgstr "" - -#: discord.ClientUser.edit_settings:49 of -msgid "Whether or not to render reactions that are added to messages." -msgstr "" - -#: discord.ClientUser.edit_settings:51 of -msgid "A list of guilds that you will not receive DMs from." -msgstr "" - -#: discord.ClientUser.edit_settings:53 of -msgid "Whether or not to display the game that you are currently playing." -msgstr "" - -#: discord.ClientUser.edit_settings:55 of -msgid "The clients status that is shown to others." -msgstr "" - -#: discord.ClientUser.edit_settings:57 of -msgid "The theme of the Discord UI." -msgstr "" - -#: discord.ClientUser.edit_settings:59 of -msgid "The timezone offset to use." -msgstr "" - -#: discord.ClientUser.edit_settings:62 of -#, fuzzy -msgid "Editing the settings failed." -msgstr ":exc:`HTTPException` -- 設定の編集に失敗した。" - -#: discord.ClientUser.edit_settings:63 of -#, fuzzy -msgid "The client is a bot user and not a user account." -msgstr ":exc:`Forbidden` -- クライアントがBotユーザーであり、ユーザーアカウントでない。" - -#: discord.ClientUser.edit_settings:65 of -msgid "The client user's updated settings." -msgstr "クライアントユーザーの更新された設定。" - -#: discord.Activity:57 discord.Activity:69 discord.Activity:78 -#: discord.ClientUser.edit_settings:66 discord.RawMessageUpdateEvent:21 -#: discord.Streaming:61 of -msgid ":class:`dict`" -msgstr "" - -#: discord.ClientUser.avatar_url:1 discord.ClientUser.avatar_url_as:1 -#: discord.Member.avatar_url_as:1 discord.User.avatar_url:1 -#: discord.User.avatar_url_as:1 discord.WidgetMember.avatar_url:1 -#: discord.WidgetMember.avatar_url_as:1 of -msgid "Returns an :class:`Asset` for the avatar the user has." -msgstr "" - -#: discord.ClientUser.avatar_url:3 discord.ClientUser.avatar_url_as:3 -#: discord.Member.avatar_url_as:3 discord.User.avatar_url:3 -#: discord.User.avatar_url_as:3 discord.WidgetMember.avatar_url:3 -#: discord.WidgetMember.avatar_url_as:3 of -msgid "" -"If the user does not have a traditional avatar, an asset for the default " -"avatar is returned instead." -msgstr "" - -#: discord.ClientUser.avatar_url:6 discord.User.avatar_url:6 -#: discord.WidgetMember.avatar_url:6 of -msgid "" -"This is equivalent to calling :meth:`avatar_url_as` with the default " -"parameters (i.e. webp/gif detection and a size of 1024)." -msgstr "" -"これはデフォルトパラメータ(webp/gif フォーマット及びサイズが1024)で :meth:`avatar_url_as` " -"を呼び出すのと同等の処理です。" - -#: discord.ClientUser.avatar_url_as:6 discord.Guild.icon_url_as:3 -#: discord.Member.avatar_url_as:6 discord.User.avatar_url_as:6 -#: discord.WidgetMember.avatar_url_as:6 of -msgid "" -"The format must be one of 'webp', 'jpeg', 'jpg', 'png' or 'gif', and " -"'gif' is only valid for animated avatars. The size must be a power of 2 " -"between 16 and 4096." -msgstr "" - -#: discord.ClientUser.avatar_url_as:10 discord.Member.avatar_url_as:10 -#: discord.User.avatar_url_as:10 discord.WidgetMember.avatar_url_as:10 of -msgid "" -"The format to attempt to convert the avatar to. If the format is " -"``None``, then it is automatically detected into either 'gif' or " -"static_format depending on the avatar being animated or not." -msgstr "" -"アバターのフォーマット。 ``None`` の場合はアニメーションアバターなら 「gif」、それ以外は static_format " -"のフォーマットに自動的に変換されます。" - -#: discord.ClientUser.avatar_url_as:15 discord.Member.avatar_url_as:15 -#: discord.User.avatar_url_as:15 discord.WidgetMember.avatar_url_as:15 of -msgid "" -"Format to attempt to convert only non-animated avatars to. Defaults to " -"'webp'" -msgstr "アバターがアニメーションでない場合に変換されるフォーマット。デフォルトでは「webp」です。" - -#: discord.ClientUser.avatar_url_as:21 discord.Member.avatar_url_as:21 -#: discord.User.avatar_url_as:21 discord.WidgetMember.avatar_url_as:21 of -msgid "" -"Bad image format passed to ``format`` or ``static_format``, or " -"invalid ``size``." -msgstr "" - -#: discord.ClientUser.color:1 discord.User.color:1 discord.WidgetMember.color:1 -#: of -msgid "" -"A property that returns a color denoting the rendered color for the user." -" This always returns :meth:`Colour.default`." -msgstr "" - -#: discord.ClientUser.color:4 discord.Member.color:5 discord.User.color:4 -#: discord.WidgetMember.color:4 of -msgid "There is an alias for this named :attr:`colour`." -msgstr "" - -#: discord.ClientUser.colour:1 discord.User.colour:1 -#: discord.WidgetMember.colour:1 of -msgid "" -"A property that returns a colour denoting the rendered colour for the " -"user. This always returns :meth:`Colour.default`." -msgstr "" - -#: discord.ClientUser.colour:4 discord.Member.colour:5 discord.User.colour:4 -#: discord.WidgetMember.colour:4 of -msgid "There is an alias for this named :attr:`color`." -msgstr "" - -#: discord.ClientUser.created_at:1 discord.User.created_at:1 -#: discord.WidgetMember.created_at:1 of -#, fuzzy -msgid "Returns the user's creation time in UTC." -msgstr "ユーザー名とディスクリミネータを返します。" - -#: discord.ClientUser.created_at:3 discord.User.created_at:3 -#: discord.WidgetMember.created_at:3 of -#, fuzzy -msgid "This is when the user's Discord account was created." -msgstr "これはユーザーのDiscordアカウントが作成された時間です。" - -#: discord.ClientUser.default_avatar:1 discord.User.default_avatar:1 -#: discord.WidgetMember.default_avatar:1 of -msgid "" -"Returns the default avatar for a given user. This is calculated by the " -"user's discriminator." -msgstr "" - -#: discord.ClientUser.default_avatar:3 discord.User.default_avatar:3 -#: discord.WidgetMember.default_avatar:3 of -#, fuzzy -msgid ":class:`DefaultAvatar`" -msgstr ":class:`str`" - -#: discord.ClientUser.default_avatar_url:1 discord.User.default_avatar_url:1 -#: discord.WidgetMember.default_avatar_url:1 of -msgid "Returns a URL for a user's default avatar." -msgstr "" - -#: discord.ClientUser.display_name:3 discord.Member.display_name:3 -#: discord.User.display_name:3 of -msgid "" -"For regular users this is just their username, but if they have a guild " -"specific nickname then that is returned instead." -msgstr "通常であれば、これはユーザー名がそのまま返りますが、ギルドにてニックネームを設定している場合は、代替としてニックネームが返ります。" - -#: discord.ClientUser.is_avatar_animated:1 discord.Member.is_avatar_animated:1 -#: discord.User.is_avatar_animated:1 discord.WidgetMember.is_avatar_animated:1 -#: of -#, fuzzy -msgid ":class:`bool`: Indicates if the user has an animated avatar." -msgstr ":class:`bool` -- ユーザーが認証済みアカウントであるかを表します。" - -#: discord.ClientUser.mentioned_in:1 discord.User.mentioned_in:1 -#: discord.WidgetMember.mentioned_in:1 of -msgid "Checks if the user is mentioned in the specified message." -msgstr "指定のメッセージにユーザーに対するメンションが含まれているかを確認します。" - -#: discord.ClientUser.mentioned_in:3 discord.Member.mentioned_in:3 -#: discord.User.mentioned_in:3 discord.WidgetMember.mentioned_in:3 of -msgid "The message to check if you're mentioned in." -msgstr "メンションが含まれているかを確認するメッセージ。" - -#: discord.ClientUser.mentioned_in:6 discord.User.mentioned_in:6 -#: discord.WidgetMember.mentioned_in:6 of -#, fuzzy -msgid "Indicates if the user is mentioned in the message." -msgstr "指定のメッセージにユーザーに対するメンションが含まれているかを確認します。" - -#: discord.ClientUser.permissions_in:1 discord.Member.permissions_in:1 -#: discord.User.permissions_in:1 discord.WidgetMember.permissions_in:1 of -msgid "An alias for :meth:`abc.GuildChannel.permissions_for`." -msgstr ":meth:`abc.GuildChannel.permissions_for` のエイリアス。" - -#: discord.ClientUser.permissions_in:3 discord.Member.permissions_in:3 -#: discord.User.permissions_in:3 discord.WidgetMember.permissions_in:3 of -msgid "Basically equivalent to:" -msgstr "基本的には以下と同等です:" - -#: discord.ClientUser.permissions_in:9 discord.Member.permissions_in:9 -#: discord.User.permissions_in:9 discord.WidgetMember.permissions_in:9 of -msgid "The channel to check your permissions for." -msgstr "権限を確認したいチャンネル。" - -#: discord.ClientUser.public_flags:1 discord.User.public_flags:1 -#: discord.WidgetMember.public_flags:1 of -msgid "The publicly available flags the user has." -msgstr "" - -#: discord.ClientUser.public_flags:3 discord.User.public_flags:3 -#: discord.WidgetMember.public_flags:3 of -#, fuzzy -msgid ":class:`PublicUserFlags`" -msgstr ":class:`bytes`" - -#: ../../api.rst:2597 -msgid "Relationship" -msgstr "" - -#: discord.Relationship:1 of -msgid "Represents a relationship in Discord." -msgstr "Discordのリレーションシップを表します。" - -#: discord.Relationship:3 of -msgid "" -"A relationship is like a friendship, a person who is blocked, etc. Only " -"non-bot accounts can have relationships." -msgstr "フレンドや、ブロックした人などのようなリレーションシップです。Botでないアカウントのみがリレーションシップを持つことが出来ます。" - -#: discord.Relationship:8 of -#, fuzzy -msgid "The user you have the relationship with." -msgstr "リレーションシップがあるか確認したいユーザーのID。" - -#: discord.Relationship:14 of -#, fuzzy -msgid "The type of relationship you have." -msgstr "以前のフレンドの状態。" - -#: discord.Relationship:16 of -#, fuzzy -msgid ":class:`RelationshipType`" -msgstr ":class:`.Invite`" - -#: discord.Relationship.delete:3 of -msgid "Deletes the relationship." -msgstr "" - -#: discord.Relationship.delete:5 of -msgid "Deleting the relationship failed." -msgstr "" - -#: discord.Relationship.accept:3 of -msgid "Accepts the relationship request. e.g. accepting a friend request." -msgstr "" - -#: discord.Relationship.accept:6 of -#, fuzzy -msgid "Accepting the relationship failed." -msgstr ":exc:`HTTPException` -- 設定の編集に失敗した。" - -#: ../../api.rst:2603 -msgid "User" -msgstr "" - -#: discord.User:1 of -msgid "Represents a Discord user." -msgstr "" - -#: discord.User:41 of -#, fuzzy -msgid "The avatar hash the user has. Could be None." -msgstr "Optional[:class:`str`] -- ユーザーのアバターハッシュ。 Noneが返る場合もあります。" - -#: discord.User.dm_channel:1 of -msgid "Returns the channel associated with this user if it exists." -msgstr "" - -#: discord.User.dm_channel:3 of -msgid "" -"If this returns ``None``, you can create a DM channel by calling the " -":meth:`create_dm` coroutine function." -msgstr "これが ``None``を返すなら、あなたは :meth:`create_dm` コルーチン関数を使って、DMチャンネルを作ることができます。" - -#: discord.User.dm_channel:6 of -msgid "Optional[:class:`DMChannel`]" -msgstr "" - -#: discord.Member.create_dm:1 discord.User.create_dm:1 of -msgid "Creates a :class:`DMChannel` with this user." -msgstr "このユーザーと :class:`DMChannel` を作ります。" - -#: discord.Member.create_dm:3 discord.User.create_dm:3 of -msgid "" -"This should be rarely called, as this is done transparently for most " -"people." -msgstr "" - -#: discord.Member.create_dm:7 discord.User.create_dm:7 of -#, fuzzy -msgid ":class:`.DMChannel`" -msgstr ":class:`.Widget`" - -#: discord.User.relationship:1 of -msgid "" -"Returns the :class:`Relationship` with this user if applicable, ``None`` " -"otherwise." -msgstr "" - -#: discord.Member.mutual_friends:3 discord.User.mutual_friends:3 of -msgid "Gets all mutual friends of this user." -msgstr "" - -#: discord.Member.mutual_friends:9 discord.User.mutual_friends:9 of -msgid "Not allowed to get mutual friends of this user." -msgstr "" - -#: discord.Member.mutual_friends:10 discord.User.mutual_friends:10 of -msgid "Getting mutual friends failed." -msgstr "" - -#: discord.Member.mutual_friends:12 discord.User.mutual_friends:12 of -msgid "The users that are mutual friends." -msgstr "" - -#: discord.Member.is_friend:1 discord.User.is_friend:1 of -#, fuzzy -msgid ":class:`bool`: Checks if the user is your friend." -msgstr ":class:`bool` -- ユーザーが認証済みアカウントであるかを表します。" - -#: discord.Member.is_blocked:1 discord.User.is_blocked:1 of -#, fuzzy -msgid ":class:`bool`: Checks if the user is blocked." -msgstr ":class:`bool` -- ユーザーがBotアカウントであるかを表します。" - -#: discord.Member.block:3 discord.User.block:3 of -msgid "Blocks the user." -msgstr "ユーザーをブロックします。" - -#: discord.Member.block:9 discord.User.block:9 of -#, fuzzy -msgid "Not allowed to block this user." -msgstr "このユーザーはブロックされています。" - -#: discord.Member.block:10 discord.User.block:10 of -#, fuzzy -msgid "Blocking the user failed." -msgstr "ユーザーをブロックします。" - -#: discord.Member.unblock:3 discord.User.unblock:3 of -msgid "Unblocks the user." -msgstr "" - -#: discord.Member.unblock:9 discord.User.unblock:9 of -#, fuzzy -msgid "Not allowed to unblock this user." -msgstr "このユーザーはブロックされています。" - -#: discord.Member.unblock:10 discord.User.unblock:10 of -#, fuzzy -msgid "Unblocking the user failed." -msgstr "ユーザーをブロックします。" - -#: discord.Member.remove_friend:3 discord.User.remove_friend:3 of -msgid "Removes the user as a friend." -msgstr "" - -#: discord.Member.remove_friend:9 discord.User.remove_friend:9 of -msgid "Not allowed to remove this user as a friend." -msgstr "" - -#: discord.Member.remove_friend:10 discord.User.remove_friend:10 of -msgid "Removing the user as a friend failed." -msgstr "" - -#: discord.Member.send_friend_request:3 discord.User.send_friend_request:3 of -msgid "Sends the user a friend request." -msgstr "" - -#: discord.Member.send_friend_request:9 discord.User.send_friend_request:9 of -msgid "Not allowed to send a friend request to the user." -msgstr "" - -#: discord.Member.send_friend_request:10 discord.User.send_friend_request:10 of -msgid "Sending the friend request failed." -msgstr "" - -#: discord.Member.profile:3 discord.User.profile:3 of -msgid "Gets the user's profile." -msgstr "" - -#: discord.Member.profile:13 discord.User.profile:13 of -msgid ":class:`Profile`" -msgstr "" - -#: ../../api.rst:2617 -msgid "Attachment" -msgstr "" - -#: discord.Attachment:1 of -msgid "Represents an attachment from Discord." -msgstr "" - -#: discord.Attachment:5 of -msgid "The attachment ID." -msgstr "" - -#: discord.Attachment:11 of -msgid "The attachment size in bytes." -msgstr "" - -#: discord.Attachment:17 of -msgid "The attachment's height, in pixels. Only applicable to images and videos." -msgstr "" - -#: discord.Attachment:23 of -msgid "The attachment's width, in pixels. Only applicable to images and videos." -msgstr "" - -#: discord.Attachment:29 of -msgid "The attachment's filename." -msgstr "" - -#: discord.Attachment:35 of -msgid "" -"The attachment URL. If the message this attachment was attached to is " -"deleted, then this will 404." -msgstr "" - -#: discord.Attachment:42 of -msgid "" -"The proxy URL. This is a cached version of the :attr:`~Attachment.url` in" -" the case of images. When the message is deleted, this URL might be valid" -" for a few minutes or not valid at all." -msgstr "" - -#: discord.Attachment.is_spoiler:1 of -msgid ":class:`bool`: Whether this attachment contains a spoiler." -msgstr "" - -#: discord.Attachment.save:3 of -msgid "Saves this attachment into a file-like object." -msgstr "" - -#: discord.Attachment.save:5 of -msgid "" -"The file-like object to save this attachment to or the filename to use. " -"If a filename is passed then a file is created with that filename and " -"used instead." -msgstr "" - -#: discord.Attachment.save:9 of -msgid "" -"Whether to seek to the beginning of the file after saving is successfully" -" done." -msgstr "" - -#: discord.Attachment.read:7 discord.Attachment.save:12 -#: discord.Attachment.to_file:8 of -msgid "" -"Whether to use :attr:`proxy_url` rather than :attr:`url` when downloading" -" the attachment. This will allow attachments to be saved after deletion " -"more often, compared to the regular URL which is generally deleted right " -"after the message is deleted. Note that this can still fail to download " -"deleted attachments if too much time has passed and it does not work on " -"some types of attachments." -msgstr "" - -#: discord.Attachment.save:20 of -msgid "Saving the attachment failed." -msgstr "" - -#: discord.Attachment.read:17 discord.Attachment.save:21 -#: discord.Attachment.to_file:24 of -#, fuzzy -msgid "The attachment was deleted." -msgstr "チャンネルの削除。" - -#: discord.Asset.save:14 discord.Attachment.save:23 of -msgid "The number of bytes written." -msgstr "" - -#: discord.Attachment.read:3 of -msgid "Retrieves the content of this attachment as a :class:`bytes` object." -msgstr "" - -#: discord.Attachment.read:15 discord.Attachment.to_file:22 of -msgid "Downloading the attachment failed." -msgstr "" - -#: discord.Attachment.read:16 discord.Attachment.to_file:23 of -#, fuzzy -msgid "You do not have permissions to access this attachment" -msgstr ":exc:`.Forbidden` -- 指定のチャンネルを取得する権限がない。" - -#: discord.Attachment.read:19 of -msgid "The contents of the attachment." -msgstr "" - -#: discord.Attachment.to_file:3 of -msgid "" -"Converts the attachment into a :class:`File` suitable for sending via " -":meth:`abc.Messageable.send`." -msgstr "" - -#: discord.Attachment.to_file:8 of -msgid "" -"Whether to use :attr:`proxy_url` rather than :attr:`url` when downloading" -" the attachment. This will allow attachments to be saved after deletion " -"more often, compared to the regular URL which is generally deleted right " -"after the message is deleted. Note that this can still fail to download " -"deleted attachments if too much time has passed and it does not work on " -"some types of attachments. .. versionadded:: 1.4" -msgstr "" - -#: discord.Attachment.to_file:17 of -msgid "Whether the file is a spoiler. .. versionadded:: 1.4" -msgstr "" - -#: discord.Attachment.to_file:17 of -msgid "Whether the file is a spoiler." -msgstr "" - -#: discord.Attachment.to_file:26 of -msgid "The attachment as a file suitable for sending." -msgstr "" - -#: discord.Attachment.to_file:27 of -#, fuzzy -msgid ":class:`File`" -msgstr ":class:`.Profile`" - -#: ../../api.rst:2623 -msgid "Asset" -msgstr "" - -#: discord.Asset:1 of -msgid "Represents a CDN asset on Discord." -msgstr "" - -#: discord.Asset:7 of -msgid "Returns the URL of the CDN asset." -msgstr "" - -#: discord.Asset:11 of -msgid "Returns the length of the CDN asset's URL." -msgstr "" - -#: discord.Asset:15 of -msgid "Checks if the Asset has a URL." -msgstr "" - -#: discord.Asset:19 of -msgid "Checks if the asset is equal to another asset." -msgstr "" - -#: discord.Asset:23 of -msgid "Checks if the asset is not equal to another asset." -msgstr "" - -#: discord.Asset:27 of -msgid "Returns the hash of the asset." -msgstr "" - -#: discord.Asset.read:3 of -msgid "Retrieves the content of this asset as a :class:`bytes` object." -msgstr "" - -#: discord.Asset.read:7 of -msgid "" -":class:`PartialEmoji` won't have a connection state if user created, and " -"a URL won't be present if a custom image isn't associated with the asset," -" e.g. a guild with no custom icon." -msgstr "" - -#: discord.Asset.read:13 discord.Asset.save:10 of -msgid "There was no valid URL or internal connection state." -msgstr "" - -#: discord.Asset.read:14 discord.Asset.save:11 of -msgid "Downloading the asset failed." -msgstr "" - -#: discord.Asset.read:15 discord.Asset.save:12 of -#, fuzzy -msgid "The asset was deleted." -msgstr "役職の削除。" - -#: discord.Asset.read:17 of -msgid "The content of the asset." -msgstr "" - -#: discord.Asset.save:3 of -msgid "Saves this asset into a file-like object." -msgstr "" - -#: discord.Asset.save:5 discord.Asset.save:7 of -msgid "Same as in :meth:`Attachment.save`." -msgstr "" - -#: ../../api.rst:2629 -msgid "Message" -msgstr "" - -#: discord.Message:1 of -msgid "Represents a message from Discord." -msgstr "" - -#: discord.Message:3 of -msgid "There should be no need to create one of these manually." -msgstr "" - -#: discord.Message:7 of -msgid "" -"Specifies if the message was done with text-to-speech. This can only be " -"accurately received in :func:`on_message` due to a discord limitation." -msgstr "" - -#: discord.Message:15 of -msgid "" -"The type of message. In most cases this should not be checked, but it is " -"helpful in cases where it might be a system message for " -":attr:`system_content`." -msgstr "" - -#: discord.Message:18 of -#, fuzzy -msgid ":class:`MessageType`" -msgstr ":class:`str`" - -#: discord.Message:22 of -msgid "" -"A :class:`Member` that sent the message. If :attr:`channel` is a private " -"channel or the user has the left the guild, then it is a :class:`User` " -"instead." -msgstr "" - -#: discord.Message:29 of -#, fuzzy -msgid "The actual contents of the message." -msgstr "更新後のメッセージ。" - -#: discord.Message:35 of -msgid "" -"The value used by the discord guild and the client to verify that the " -"message is successfully sent. This is typically non-important." -msgstr "" - -#: discord.Message:40 of -#, fuzzy -msgid "A list of embeds the message has." -msgstr "更新前の絵文字のリスト。" - -#: discord.Message:42 of -#, fuzzy -msgid "List[:class:`Embed`]" -msgstr ":class:`bytes`" - -#: discord.Message:46 of -msgid "" -"The :class:`TextChannel` that the message was sent from. Could be a " -":class:`DMChannel` or :class:`GroupChannel` if it's a private message." -msgstr "" - -#: discord.Message:49 of -msgid "Union[:class:`abc.Messageable`]" -msgstr "" - -#: discord.Message:53 of -msgid "" -"The call that the message refers to. This is only applicable to messages " -"of type :attr:`MessageType.call`." -msgstr "" - -#: discord.Message:56 of -msgid "Optional[:class:`CallMessage`]" -msgstr "" - -#: discord.Message:60 of -msgid "" -"The message that this message references. This is only applicable to " -"messages of type :attr:`MessageType.pins_add` or crossposted messages " -"created by a followed channel integration." -msgstr "" - -#: discord.Message:66 of -msgid "Optional[:class:`MessageReference`]" -msgstr "" - -#: discord.Message:70 of -msgid "Specifies if the message mentions everyone." -msgstr "" - -#: discord.Message:74 of -msgid "" -"This does not check if the ``@everyone`` or the ``@here`` text is in the " -"message itself. Rather this boolean indicates if either the ``@everyone``" -" or the ``@here`` text is in the message **and** it did end up " -"mentioning." -msgstr "" - -#: discord.Message:82 of -msgid "" -"A list of :class:`Member` that were mentioned. If the message is in a " -"private message then the list will be of :class:`User` instead. For " -"messages that are not of type :attr:`MessageType.default`\\, this array " -"can be used to aid in system messages. For more information, see " -":attr:`system_content`." -msgstr "" - -#: discord.Message:89 of -msgid "" -"The order of the mentions list is not in any particular order so you " -"should not rely on it. This is a discord limitation, not one with the " -"library." -msgstr "" - -#: discord.Message:92 of -#, fuzzy -msgid "List[:class:`abc.User`]" -msgstr ":class:`str`" - -#: discord.Message:96 of -msgid "" -"A list of :class:`abc.GuildChannel` that were mentioned. If the message " -"is in a private message then the list is always empty." -msgstr "" - -#: discord.CategoryChannel.channels:5 discord.Guild.channels:3 -#: discord.Guild.fetch_channels:15 discord.Message:99 of -msgid "List[:class:`abc.GuildChannel`]" -msgstr "" - -#: discord.Message:103 of -msgid "" -"A list of :class:`Role` that were mentioned. If the message is in a " -"private message then the list is always empty." -msgstr "" - -#: discord.Emoji.roles:5 discord.Guild.edit_role_positions:32 -#: discord.Guild.fetch_roles:14 discord.Guild.roles:6 discord.Member.roles:7 -#: discord.Message:106 of -#, fuzzy -msgid "List[:class:`Role`]" -msgstr ":class:`.Profile`" - -#: discord.Message:110 of -#, fuzzy -msgid "The message ID." -msgstr "削除されたメッセージ。" - -#: discord.Message:116 of -msgid "" -"If this message was sent by a webhook, then this is the webhook ID's that" -" sent this message." -msgstr "" - -#: discord.Message:123 of -msgid "A list of attachments given to a message." -msgstr "" - -#: discord.Message:125 of -msgid "List[:class:`Attachment`]" -msgstr "" - -#: discord.Message:129 of -msgid "Specifies if the message is currently pinned." -msgstr "" - -#: discord.Message:135 of -#, fuzzy -msgid "Extra features of the message." -msgstr "更新後のメッセージ。" - -#: discord.Message:139 of -#, fuzzy -msgid ":class:`MessageFlags`" -msgstr ":class:`bytes`" - -#: discord.Message:143 of -msgid "" -"Reactions to a message. Reactions can be either custom emoji or standard " -"unicode emoji." -msgstr "" - -#: discord.Message:145 of -msgid "List[:class:`Reaction`]" -msgstr "" - -#: discord.Message:149 of -msgid "" -"The activity associated with this message. Sent with Rich-Presence " -"related messages that for example, request joining, spectating, or " -"listening to or with another member." -msgstr "" - -#: discord.Message:152 of -msgid "It is a dictionary with the following optional keys:" -msgstr "" - -#: discord.Message:154 of -msgid "" -"``type``: An integer denoting the type of message activity being " -"requested." -msgstr "" - -#: discord.Message:155 of -msgid "``party_id``: The party ID associated with the party." -msgstr "" - -#: discord.Message:157 discord.Message:171 of -msgid "Optional[:class:`dict`]" -msgstr "" - -#: discord.Message:161 of -msgid "The rich presence enabled application associated with this message." -msgstr "" - -#: discord.Message:163 of -msgid "It is a dictionary with the following keys:" -msgstr "" - -#: discord.Message:165 of -msgid "``id``: A string representing the application's ID." -msgstr "" - -#: discord.Message:166 of -msgid "``name``: A string representing the application's name." -msgstr "" - -#: discord.Message:167 of -msgid "``description``: A string representing the application's description." -msgstr "" - -#: discord.Message:168 of -msgid "``icon``: A string representing the icon ID of the application." -msgstr "" - -#: discord.Message:169 of -msgid "``cover_image``: A string representing the embed's image asset ID." -msgstr "" - -#: discord.Message.guild:1 of -msgid "The guild that the message belongs to, if applicable." -msgstr "" - -#: discord.Message.raw_mentions:1 of -msgid "" -"A property that returns an array of user IDs matched with the syntax of " -"``<@user_id>`` in the message content." -msgstr "" - -#: discord.Message.raw_mentions:4 of -msgid "" -"This allows you to receive the user IDs of mentioned users even in a " -"private message context." -msgstr "" - -#: discord.Message.raw_channel_mentions:4 discord.Message.raw_mentions:7 -#: discord.Message.raw_role_mentions:4 of -#, fuzzy -msgid "List[:class:`int`]" -msgstr ":class:`str`" - -#: discord.Message.raw_channel_mentions:1 of -msgid "" -"A property that returns an array of channel IDs matched with the syntax " -"of ``<#channel_id>`` in the message content." -msgstr "" - -#: discord.Message.raw_role_mentions:1 of -msgid "" -"A property that returns an array of role IDs matched with the syntax of " -"``<@&role_id>`` in the message content." -msgstr "" - -#: discord.Message.clean_content:1 of -msgid "" -"A property that returns the content in a \"cleaned up\" manner. This " -"basically means that mentions are transformed into the way the client " -"shows it. e.g. ``<#id>`` will transform into ``#name``." -msgstr "" - -#: discord.Message.clean_content:6 of -msgid "This will also transform @everyone and @here mentions into non-mentions." -msgstr "" - -#: discord.Message.clean_content:11 of -msgid "" -"This *does not* escape markdown. If you want to escape markdown then use " -":func:`utils.escape_markdown` along with this function." -msgstr "" - -#: discord.Message.created_at:1 of -msgid "The message's creation time in UTC." -msgstr "" - -#: discord.Message.edited_at:1 of -msgid "A naive UTC datetime object containing the edited time of the message." -msgstr "" - -#: discord.Activity.end:3 discord.Activity.start:3 -#: discord.BaseActivity.created_at:5 discord.CallMessage:10 discord.Game.end:3 -#: discord.Game.start:3 discord.Member:30 discord.Member:55 -#: discord.Message.edited_at:3 discord.Spotify.created_at:5 of -msgid "Optional[:class:`datetime.datetime`]" -msgstr "" - -#: discord.Message.jump_url:1 of -msgid "Returns a URL that allows the client to jump to this message." -msgstr "" - -#: discord.Message.is_system:1 of -msgid ":class:`bool`: Whether the message is a system message." -msgstr "" - -#: discord.Message.system_content:1 of -msgid "" -"A property that returns the content that is rendered regardless of the " -":attr:`Message.type`." -msgstr "" - -#: discord.Message.system_content:4 of -msgid "" -"In the case of :attr:`MessageType.default`\\, this just returns the " -"regular :attr:`Message.content`. Otherwise this returns an English " -"message denoting the contents of the system message." -msgstr "" - -#: discord.Message.delete:3 of -msgid "Deletes the message." -msgstr "" - -#: discord.Message.delete:5 of -msgid "" -"Your own messages could be deleted without any proper permissions. " -"However to delete other people's messages, you need the " -":attr:`~Permissions.manage_messages` permission." -msgstr "" - -#: discord.Message.delete:9 of -msgid "Added the new ``delay`` keyword-only parameter." -msgstr "" - -#: discord.Message.delete:12 of -msgid "" -"If provided, the number of seconds to wait in the background before " -"deleting the message. If the deletion fails then it is silently ignored." -msgstr "" - -#: discord.Message.delete:16 of -msgid "You do not have proper permissions to delete the message." -msgstr "" - -#: discord.Message.delete:17 of -#, fuzzy -msgid "The message was deleted already" -msgstr "メッセージが埋め込みを受け取った。" - -#: discord.Message.delete:18 of -#, fuzzy -msgid "Deleting the message failed." -msgstr "削除されたメッセージ。" - -#: discord.Message.edit:3 of -msgid "Edits the message." -msgstr "" - -#: discord.Message.edit:5 of -msgid "" -"The content must be able to be transformed into a string via " -"``str(content)``." -msgstr "" - -#: discord.Message.edit:7 of -msgid "The ``suppress`` keyword-only parameter was added." -msgstr "" - -#: discord.Message.edit:10 of -msgid "" -"The new content to replace the message with. Could be ``None`` to remove " -"the content." -msgstr "" - -#: discord.Message.edit:13 of -msgid "" -"The new embed to replace the original with. Could be ``None`` to remove " -"the embed." -msgstr "" - -#: discord.Message.edit:16 of -msgid "" -"Whether to suppress embeds for the message. This removes all the embeds " -"if set to ``True``. If set to ``False`` this brings the embeds back if " -"they were suppressed. Using this parameter requires " -":attr:`~.Permissions.manage_messages`." -msgstr "" - -#: discord.Message.edit:21 of -msgid "" -"If provided, the number of seconds to wait in the background before " -"deleting the message we just edited. If the deletion fails, then it is " -"silently ignored." -msgstr "" - -#: discord.Message.edit:30 of -msgid "Editing the message failed." -msgstr "" - -#: discord.Message.edit:31 of -msgid "" -"Tried to suppress a message without permissions or edited a message's" -" content or embed that isn't yours." -msgstr "" - -#: discord.Message.publish:3 of -msgid "Publishes this message to your announcement channel." -msgstr "" - -#: discord.Message.publish:5 of -#, fuzzy -msgid "" -"If the message is not your own then the " -":attr:`~Permissions.manage_messages` permission is needed." -msgstr "これを行うには、関連付けられたGuildにて、 :attr:`~.Permissions.manage_channels` 権限が必要です。" - -#: discord.Message.publish:8 of -msgid "You do not have the proper permissions to publish this message." -msgstr "" - -#: discord.Message.publish:9 of -msgid "Publishing the message failed." -msgstr "" - -#: discord.Message.pin:3 of -msgid "Pins the message." -msgstr "" - -#: discord.Message.pin:5 discord.Message.unpin:5 of -msgid "" -"You must have the :attr:`~Permissions.manage_messages` permission to do " -"this in a non-private channel context." -msgstr "" - -#: discord.Message.pin:8 of -msgid "" -"The reason for pinning the message. Shows up on the audit log. .. " -"versionadded:: 1.4" -msgstr "" - -#: discord.Message.pin:8 of -msgid "The reason for pinning the message. Shows up on the audit log." -msgstr "" - -#: discord.Message.pin:13 of -#, fuzzy -msgid "You do not have permissions to pin the message." -msgstr ":exc:`.Forbidden` -- 指定のチャンネルを取得する権限がない。" - -#: discord.Message.pin:14 discord.Message.unpin:14 of -#, fuzzy -msgid "The message or channel was not found or deleted." -msgstr "作成、または削除されたギルドチャンネル。" - -#: discord.Message.pin:15 of -msgid "" -"Pinning the message failed, probably due to the channel having more " -"than 50 pinned messages." -msgstr "" - -#: discord.Message.unpin:3 of -msgid "Unpins the message." -msgstr "" - -#: discord.Message.unpin:8 of -msgid "" -"The reason for unpinning the message. Shows up on the audit log. .. " -"versionadded:: 1.4" -msgstr "" - -#: discord.Message.unpin:8 of -msgid "The reason for unpinning the message. Shows up on the audit log." -msgstr "" - -#: discord.Message.unpin:13 of -#, fuzzy -msgid "You do not have permissions to unpin the message." -msgstr ":exc:`.Forbidden` -- 指定のチャンネルを取得する権限がない。" - -#: discord.Message.unpin:15 of -msgid "Unpinning the message failed." -msgstr "" - -#: discord.Message.add_reaction:3 of -msgid "Add a reaction to the message." -msgstr "" - -#: discord.Message.add_reaction:5 discord.Message.clear_reaction:5 -#: discord.Message.remove_reaction:5 of -msgid "The emoji may be a unicode emoji or a custom guild :class:`Emoji`." -msgstr "" - -#: discord.Message.add_reaction:7 of -msgid "" -"You must have the :attr:`~Permissions.read_message_history` permission to" -" use this. If nobody else has reacted to the message using this emoji, " -"the :attr:`~Permissions.add_reactions` permission is required." -msgstr "" - -#: discord.Message.add_reaction:11 of -msgid "The emoji to react with." -msgstr "" - -#: discord.Message.add_reaction:14 of -msgid "Adding the reaction failed." -msgstr "" - -#: discord.Message.add_reaction:15 of -msgid "You do not have the proper permissions to react to the message." -msgstr "" - -#: discord.Message.add_reaction:16 discord.Message.clear_reaction:16 -#: discord.Reaction.clear:11 of -msgid "The emoji you specified was not found." -msgstr "" - -#: discord.Message.add_reaction:17 discord.Message.clear_reaction:17 -#: discord.Message.remove_reaction:21 discord.Reaction.clear:12 of -msgid "The emoji parameter is invalid." -msgstr "" - -#: discord.Message.remove_reaction:3 of -msgid "Remove a reaction by the member from the message." -msgstr "" - -#: discord.Message.remove_reaction:7 of -msgid "" -"If the reaction is not your own (i.e. ``member`` parameter is not you) " -"then the :attr:`~Permissions.manage_messages` permission is needed." -msgstr "" - -#: discord.Message.remove_reaction:10 of -msgid "" -"The ``member`` parameter must represent a member and meet the " -":class:`abc.Snowflake` abc." -msgstr "" - -#: discord.Message.remove_reaction:13 of -msgid "The emoji to remove." -msgstr "" - -#: discord.Message.remove_reaction:15 of -msgid "The member for which to remove the reaction." -msgstr "" - -#: discord.Message.remove_reaction:18 discord.Reaction.remove:14 of -msgid "Removing the reaction failed." -msgstr "" - -#: discord.Message.remove_reaction:19 discord.Reaction.remove:15 of -msgid "You do not have the proper permissions to remove the reaction." -msgstr "" - -#: discord.Message.remove_reaction:20 of -msgid "The member or emoji you specified was not found." -msgstr "" - -#: discord.Message.clear_reaction:3 of -#, fuzzy -msgid "Clears a specific reaction from the message." -msgstr "メッセージ送信者がサムズアップリアクションを付けるのを待つ場合: ::" - -#: discord.Message.clear_reaction:7 discord.Message.clear_reactions:5 -#: discord.Reaction.clear:5 of -msgid "You need the :attr:`~Permissions.manage_messages` permission to use this." -msgstr "" - -#: discord.Message.clear_reaction:11 of -msgid "The emoji to clear." -msgstr "" - -#: discord.Message.clear_reaction:14 discord.Reaction.clear:9 of -msgid "Clearing the reaction failed." -msgstr "" - -#: discord.Message.clear_reaction:15 discord.Reaction.clear:10 of -msgid "You do not have the proper permissions to clear the reaction." -msgstr "" - -#: discord.Message.clear_reactions:3 of -msgid "Removes all the reactions from the message." -msgstr "" - -#: discord.Message.clear_reactions:7 of -msgid "Removing the reactions failed." -msgstr "" - -#: discord.Message.clear_reactions:8 of -msgid "You do not have the proper permissions to remove all the reactions." -msgstr "" - -#: discord.Message.ack:3 of -msgid "Marks this message as read." -msgstr "" - -#: discord.Guild.ack:5 discord.Message.ack:5 of -msgid "The user must not be a bot user." -msgstr "" - -#: discord.Guild.ack:7 discord.Message.ack:7 of -msgid "Acking failed." -msgstr "" - -#: discord.Guild.ack:8 discord.Message.ack:8 of -msgid "You must not be a bot user." -msgstr "" - -#: ../../api.rst:2635 -msgid "Reaction" -msgstr "" - -#: discord.Reaction:1 of -msgid "Represents a reaction to a message." -msgstr "" - -#: discord.Emoji:3 discord.Invite:3 discord.Reaction:3 of -msgid "" -"Depending on the way this object was created, some of the attributes can " -"have a value of ``None``." -msgstr "" - -#: discord.Reaction:10 of -msgid "" -"Checks if two reactions are equal. This works by checking if the emoji is" -" the same. So two messages with the same reaction will be considered " -"\"equal\"." -msgstr "" - -#: discord.Reaction:16 of -msgid "Checks if two reactions are not equal." -msgstr "" - -#: discord.Reaction:20 of -msgid "Returns the reaction's hash." -msgstr "" - -#: discord.Reaction:24 of -msgid "Returns the string form of the reaction's emoji." -msgstr "" - -#: discord.Reaction:28 of -msgid "The reaction emoji. May be a custom emoji, or a unicode emoji." -msgstr "" - -#: discord.Reaction:30 of -msgid "Union[:class:`Emoji`, :class:`PartialEmoji`, :class:`str`]" -msgstr "" - -#: discord.Reaction:34 of -msgid "Number of times this reaction was made" -msgstr "" - -#: discord.Reaction:40 of -#, fuzzy -msgid "If the user sent this reaction." -msgstr "リアクションを追加したユーザー。" - -#: discord.Reaction:46 of -#, fuzzy -msgid "Message this reaction is for." -msgstr "リアクションが削除されたメッセージ。" - -#: discord.CallMessage:22 discord.Intents.dm_messages:16 -#: discord.Intents.guild_messages:15 discord.Intents.messages:16 -#: discord.Reaction:48 of -#, fuzzy -msgid ":class:`Message`" -msgstr ":class:`bytes`" - -#: discord.Reaction.users:1 of -msgid "" -"Returns an :class:`AsyncIterator` representing the users that have " -"reacted to the message." -msgstr "" - -#: discord.Reaction.users:3 of -msgid "" -"The ``after`` parameter must represent a member and meet the " -":class:`abc.Snowflake` abc." -msgstr "" - -#: discord.Reaction.users:21 of -msgid "" -"The maximum number of results to return. If not provided, returns all the" -" users who reacted to the message." -msgstr "" - -#: discord.Reaction.users:25 of -msgid "For pagination, reactions are sorted by member." -msgstr "" - -#: discord.Reaction.users:28 of -#, fuzzy -msgid "Getting the users for the reaction failed." -msgstr "リアクションを追加したユーザー。" - -#: discord.Reaction.users:30 of -msgid "" -"Union[:class:`User`, :class:`Member`] -- The member (if retrievable) or " -"the user that has reacted to this message. The case where it can be a " -":class:`Member` is in a guild message context. Sometimes it can be a " -":class:`User` if the member has left the guild." -msgstr "" - -#: discord.Reaction.custom_emoji:1 of -msgid "If this is a custom emoji." -msgstr "" - -#: discord.Reaction.remove:3 of -msgid "Remove the reaction by the provided :class:`User` from the message." -msgstr "" - -#: discord.Reaction.remove:5 of -msgid "" -"If the reaction is not your own (i.e. ``user`` parameter is not you) then" -" the :attr:`~Permissions.manage_messages` permission is needed." -msgstr "" - -#: discord.Reaction.remove:8 of -msgid "" -"The ``user`` parameter must represent a user or member and meet the " -":class:`abc.Snowflake` abc." -msgstr "" - -#: discord.Reaction.remove:11 of -msgid "The user or member from which to remove the reaction." -msgstr "" - -#: discord.Reaction.remove:16 of -msgid "The user you specified, or the reaction's message was not found." -msgstr "" - -#: discord.Reaction.clear:3 of -#, fuzzy -msgid "Clears this reaction from the message." -msgstr "メッセージ送信者がサムズアップリアクションを付けるのを待つ場合: ::" - -#: ../../api.rst:2645 -msgid "CallMessage" -msgstr "" - -#: discord.CallMessage:1 of -msgid "Represents a group call message from Discord." -msgstr "" - -#: discord.CallMessage:3 of -msgid "" -"This is only received in cases where the message type is equivalent to " -":attr:`MessageType.call`." -msgstr "" - -#: discord.CallMessage:8 of -msgid "" -"A naive UTC datetime object that represents the time that the call has " -"ended." -msgstr "" - -#: discord.CallMessage:14 of -msgid "The list of users that are participating in this call." -msgstr "" - -#: discord.CallMessage:20 of -msgid "The message associated with this call message." -msgstr "" - -#: discord.CallMessage.call_ended:1 of -#, fuzzy -msgid "Indicates if the call has ended." -msgstr "opusライブラリがロードされているかを表します。" - -#: discord.CallMessage.channel:1 of -#, fuzzy -msgid "The private channel associated with this message." -msgstr "プライベートのテキストチャンネル。ダイレクトメッセージとも呼ばれています。" - -#: discord.CallMessage.channel:3 discord.GroupCall.channel:3 of -#, fuzzy -msgid ":class:`GroupChannel`" -msgstr ":class:`bool`" - -#: discord.CallMessage.duration:1 of -msgid "Queries the duration of the call." -msgstr "" - -#: discord.CallMessage.duration:3 of -msgid "If the call has not ended then the current duration will be returned." -msgstr "" - -#: discord.CallMessage.duration:6 of -msgid "The timedelta object representing the duration." -msgstr "" - -#: discord.CallMessage.duration:7 discord.Spotify.duration:3 of -msgid ":class:`datetime.timedelta`" -msgstr "" - -#: ../../api.rst:2651 -msgid "GroupCall" -msgstr "" - -#: discord.GroupCall:1 of -msgid "Represents the actual group call from Discord." -msgstr "" - -#: discord.GroupCall:3 of -msgid "This is accompanied with a :class:`CallMessage` denoting the information." -msgstr "" - -#: discord.GroupCall:7 of -msgid "The call message associated with this group call." -msgstr "" - -#: discord.GroupCall:9 of -#, fuzzy -msgid ":class:`CallMessage`" -msgstr ":class:`bytes`" - -#: discord.GroupCall:13 of -msgid "Denotes if this group call is unavailable." -msgstr "" - -#: discord.GroupCall:19 of -msgid "A list of users that are currently being rung to join the call." -msgstr "" - -#: discord.GroupCall:25 of -#, fuzzy -msgid "The guild region the group call is being hosted on." -msgstr "更新される前のギルド。" - -#: discord.GroupCall.connected:1 of -msgid "A property that returns all users that are currently in this call." -msgstr "" - -#: discord.GroupCall.channel:1 of -#, fuzzy -msgid "Returns the channel the group call is in." -msgstr "カテゴリの名前を返します。" - -#: discord.GroupCall.voice_state_for:1 of -msgid "Retrieves the :class:`VoiceState` for a specified :class:`User`." -msgstr "" - -#: discord.GroupCall.voice_state_for:3 of -msgid "" -"If the :class:`User` has no voice state then this function returns " -"``None``." -msgstr "" - -#: discord.GroupCall.voice_state_for:6 of -msgid "The user to retrieve the voice state for." -msgstr "" - -#: discord.GroupCall.voice_state_for:9 of -msgid "The voice state associated with this user." -msgstr "" - -#: discord.GroupCall.voice_state_for:10 discord.Member.voice:3 of -msgid "Optional[:class:`VoiceState`]" -msgstr "" - -#: ../../api.rst:2657 -msgid "Guild" -msgstr "" - -#: discord.Guild:1 of -msgid "Represents a Discord guild." -msgstr "" - -#: discord.Guild:3 of -msgid "This is referred to as a \"server\" in the official Discord UI." -msgstr "" - -#: discord.Guild:9 of -msgid "Checks if two guilds are equal." -msgstr "" - -#: discord.Guild:13 of -msgid "Checks if two guilds are not equal." -msgstr "" - -#: discord.Guild:17 of -msgid "Returns the guild's hash." -msgstr "" - -#: discord.Guild:21 of -msgid "Returns the guild's name." -msgstr "" - -#: discord.Guild:25 of -#, fuzzy -msgid "The guild name." -msgstr "IDから取得したギルド。" - -#: discord.Guild:31 of -msgid "All emojis that the guild owns." -msgstr "" - -#: discord.Guild:33 of -msgid "Tuple[:class:`Emoji`, ...]" -msgstr "" - -#: discord.Guild:37 of -msgid "" -"The region the guild belongs on. There is a chance that the region will " -"be a :class:`str` if the value is not recognised by the enumerator." -msgstr "" - -#: discord.Guild:44 of -msgid "The timeout to get sent to the AFK channel." -msgstr "" - -#: discord.Guild:50 of -msgid "The channel that denotes the AFK channel. ``None`` if it doesn't exist." -msgstr "" - -#: discord.Guild:52 discord.VoiceState:52 discord.WidgetMember:91 of -msgid "Optional[:class:`VoiceChannel`]" -msgstr "" - -#: discord.Guild:56 of -#, fuzzy -msgid "The guild's icon." -msgstr "ギルドのウィジェット。" - -#: discord.Guild:62 discord.Widget:19 of -#, fuzzy -msgid "The guild's ID." -msgstr "ギルドのウィジェット。" - -#: discord.Guild:68 of -msgid "The guild owner's ID. Use :attr:`Guild.owner` instead." -msgstr "" - -#: discord.Guild:74 of -msgid "" -"Indicates if the guild is unavailable. If this is ``True`` then the " -"reliability of other attributes outside of :meth:`Guild.id` is slim and " -"they might all be ``None``. It is best to not do anything with the guild " -"if it is unavailable." -msgstr "" - -#: discord.Guild:78 of -msgid "" -"Check the :func:`on_guild_unavailable` and :func:`on_guild_available` " -"events." -msgstr "" - -#: discord.Guild:84 of -msgid "The maximum amount of presences for the guild." -msgstr "" - -#: discord.Guild:90 of -msgid "The maximum amount of members for the guild." -msgstr "" - -#: discord.Guild:94 of -msgid "This attribute is only available via :meth:`.Client.fetch_guild`." -msgstr "" - -#: discord.Guild:100 of -msgid "The maximum amount of users in a video channel." -msgstr "" - -#: discord.Guild:108 of -#, fuzzy -msgid "The guild's banner." -msgstr "ギルドのウィジェット。" - -#: discord.Guild:114 of -#, fuzzy -msgid "The guild's description." -msgstr "ギルドのウィジェット。" - -#: discord.Guild:120 of -msgid "" -"Indicates the guild's two factor authorisation level. If this value is 0 " -"then the guild does not require 2FA for their administrative members. If " -"the value is 1 then they do." -msgstr "" - -#: discord.Guild:134 of -#, fuzzy -msgid "The guild's explicit content filter." -msgstr "ギルドで表現のフィルターが有効ではない。" - -#: discord.Guild:140 of -#, fuzzy -msgid "The guild's notification settings." -msgstr "ギルドの管理設定の変更" - -#: discord.Guild:146 of -msgid "A list of features that the guild has. They are currently as follows:" -msgstr "" - -#: discord.Guild:148 of -msgid "``VIP_REGIONS``: Guild has VIP voice regions" -msgstr "" - -#: discord.Guild:149 of -msgid "" -"``VANITY_URL``: Guild can have a vanity invite URL (e.g. discord.gg" -"/discord-api)" -msgstr "" - -#: discord.Guild:150 of -msgid "``INVITE_SPLASH``: Guild's invite page can have a special splash." -msgstr "" - -#: discord.Guild:151 of -msgid "``VERIFIED``: Guild is a verified server." -msgstr "" - -#: discord.Guild:152 of -msgid "``PARTNERED``: Guild is a partnered server." -msgstr "" - -#: discord.Guild:153 of -msgid "``MORE_EMOJI``: Guild is allowed to have more than 50 custom emoji." -msgstr "" - -#: discord.Guild:154 of -msgid "``DISCOVERABLE``: Guild shows up in Server Discovery." -msgstr "" - -#: discord.Guild:155 of -msgid "``FEATURABLE``: Guild is able to be featured in Server Discovery." -msgstr "" - -#: discord.Guild:156 of -msgid "``COMMUNITY``: Guild is a community server." -msgstr "" - -#: discord.Guild:157 of -msgid "``COMMERCE``: Guild can sell things using store channels." -msgstr "" - -#: discord.Guild:158 of -msgid "``PUBLIC``: Guild is a public guild." -msgstr "" - -#: discord.Guild:159 of -msgid "``NEWS``: Guild can create news channels." -msgstr "" - -#: discord.Guild:160 of -msgid "``BANNER``: Guild can upload and use a banner (i.e. :meth:`banner_url`)." -msgstr "" - -#: discord.Guild:161 of -msgid "``ANIMATED_ICON``: Guild can upload an animated icon." -msgstr "" - -#: discord.Guild:162 of -msgid "``PUBLIC_DISABLED``: Guild cannot be public." -msgstr "" - -#: discord.Guild:163 of -msgid "``WELCOME_SCREEN_ENABLED``: Guild has enabled the welcome screen" -msgstr "" - -#: discord.Guild:165 discord.PartialInviteGuild:46 discord.Spotify.artists:3 of -#, fuzzy -msgid "List[:class:`str`]" -msgstr ":class:`str`" - -#: discord.Guild:169 of -#, fuzzy -msgid "The guild's invite splash." -msgstr "ギルドの招待時のスプラッシュ画像の変更" - -#: discord.Guild:175 of -msgid "" -"The premium tier for this guild. Corresponds to \"Nitro Server\" in the " -"official UI. The number goes from 0 to 3 inclusive." -msgstr "" - -#: discord.Guild:182 of -msgid "The number of \"boosts\" this guild currently has." -msgstr "" - -#: discord.Guild:188 of -msgid "" -"The preferred locale for the guild. Used when filtering Server Discovery " -"results to a specific language." -msgstr "" - -#: discord.Guild:195 of -#, fuzzy -msgid "The guild's discovery splash." -msgstr "ギルドの招待時のスプラッシュ画像の変更" - -#: discord.Guild.audit_logs:1 of -msgid "" -"Returns an :class:`AsyncIterator` that enables receiving the guild's " -"audit logs." -msgstr "" - -#: discord.Guild.audit_logs:3 of -msgid "" -"You must have the :attr:`~Permissions.view_audit_log` permission to use " -"this." -msgstr "" - -#: discord.Guild.audit_logs:7 of -msgid "Getting the first 100 entries: ::" -msgstr "" - -#: discord.Guild.audit_logs:12 of -msgid "Getting entries for a specific action: ::" -msgstr "" - -#: discord.Guild.audit_logs:17 of -msgid "Getting entries made by a specific user: ::" -msgstr "" - -#: discord.Guild.audit_logs:22 of -msgid "The number of entries to retrieve. If ``None`` retrieve all entries." -msgstr "" - -#: discord.Guild.audit_logs:24 of -msgid "" -"Retrieve entries before this date or entry. If a date is provided it must" -" be a timezone-naive datetime representing UTC time." -msgstr "" - -#: discord.Guild.audit_logs:27 of -msgid "" -"Retrieve entries after this date or entry. If a date is provided it must " -"be a timezone-naive datetime representing UTC time." -msgstr "" - -#: discord.Guild.audit_logs:30 of -msgid "" -"If set to ``True``, return entries in oldest->newest order. Defaults to " -"``True`` if ``after`` is specified, otherwise ``False``." -msgstr "" - -#: discord.Guild.audit_logs:33 of -msgid "The moderator to filter entries from." -msgstr "" - -#: discord.Guild.audit_logs:35 of -msgid "The action to filter with." -msgstr "" - -#: discord.Guild.audit_logs:38 of -msgid "You are not allowed to fetch audit logs" -msgstr "" - -#: discord.Guild.audit_logs:39 of -msgid "An error occurred while fetching the audit logs." -msgstr "" - -#: discord.Guild.audit_logs:41 of -msgid ":class:`AuditLogEntry` -- The audit log entry." -msgstr "" - -#: discord.Guild.channels:1 of -msgid "A list of channels that belongs to this guild." -msgstr "" - -#: discord.Guild.large:1 of -msgid "Indicates if the guild is a 'large' guild." -msgstr "" - -#: discord.Guild.large:3 of -msgid "" -"A large guild is defined as having more than ``large_threshold`` count " -"members, which for this library is set to the maximum of 250." -msgstr "" - -#: discord.Guild.voice_channels:1 of -msgid "A list of voice channels that belongs to this guild." -msgstr "" - -#: discord.Guild.categories:3 discord.Guild.text_channels:3 -#: discord.Guild.voice_channels:3 of -msgid "This is sorted by the position and are in UI order from top to bottom." -msgstr "" - -#: discord.CategoryChannel.voice_channels:3 discord.Guild.voice_channels:5 of -msgid "List[:class:`VoiceChannel`]" -msgstr "" - -#: discord.Guild.me:1 of -msgid "" -"Similar to :attr:`Client.user` except an instance of :class:`Member`. " -"This is essentially used to get the member version of yourself." -msgstr "" - -#: discord.Guild.fetch_member:16 discord.Guild.me:4 of -msgid ":class:`Member`" -msgstr "" - -#: discord.Guild.voice_client:1 of -msgid "Returns the :class:`VoiceProtocol` associated with this guild, if any." -msgstr "" - -#: discord.Guild.voice_client:3 of -msgid "Optional[:class:`VoiceProtocol`]" -msgstr "" - -#: discord.Guild.text_channels:1 of -msgid "A list of text channels that belongs to this guild." -msgstr "" - -#: discord.CategoryChannel.text_channels:3 discord.Guild.text_channels:5 of -msgid "List[:class:`TextChannel`]" -msgstr "" - -#: discord.Guild.categories:1 of -msgid "A list of categories that belongs to this guild." -msgstr "" - -#: discord.Guild.categories:5 of -msgid "List[:class:`CategoryChannel`]" -msgstr "" - -#: discord.Guild.by_category:1 of -msgid "Returns every :class:`CategoryChannel` and their associated channels." -msgstr "" - -#: discord.Guild.by_category:3 of -msgid "These channels and categories are sorted in the official Discord UI order." -msgstr "" - -#: discord.Guild.by_category:5 of -msgid "" -"If the channels do not have a category, then the first element of the " -"tuple is ``None``." -msgstr "" - -#: discord.Guild.by_category:8 of -msgid "The categories and their associated channels." -msgstr "" - -#: discord.Guild.by_category:9 of -msgid "" -"List[Tuple[Optional[:class:`CategoryChannel`], " -"List[:class:`abc.GuildChannel`]]]" -msgstr "" - -#: discord.Guild.get_channel:7 of -#, fuzzy -msgid "Optional[:class:`.abc.GuildChannel`]" -msgstr "Union[:class:`.abc.GuildChannel`, :class:`.abc.PrivateChannel`]" - -#: discord.Guild.system_channel:1 of -msgid "Returns the guild's channel used for system messages." -msgstr "" - -#: discord.Guild.public_updates_channel:5 discord.Guild.rules_channel:4 -#: discord.Guild.system_channel:3 of -msgid "If no channel is set, then this returns ``None``." -msgstr "" - -#: discord.Guild.system_channel_flags:1 of -msgid "Returns the guild's system channel settings." -msgstr "" - -#: discord.Guild.system_channel_flags:3 of -#, fuzzy -msgid ":class:`SystemChannelFlags`" -msgstr ":class:`bytes`" - -#: discord.Guild.rules_channel:1 of -msgid "" -"Return's the guild's channel used for the rules. Must be a discoverable " -"guild." -msgstr "" - -#: discord.Guild.public_updates_channel:1 of -msgid "" -"Return's the guild's channel where admins and moderators of the guilds " -"receive notices from Discord. This is only available to guilds that " -"contain ``PUBLIC`` in :attr:`Guild.features`." -msgstr "" - -#: discord.Guild.emoji_limit:1 of -msgid "The maximum number of emoji slots this guild has." -msgstr "" - -#: discord.Guild.bitrate_limit:1 of -msgid "The maximum bitrate for voice channels this guild can have." -msgstr "" - -#: discord.Guild.filesize_limit:1 of -msgid "The maximum number of bytes files can have when uploaded to this guild." -msgstr "" - -#: discord.Guild.members:1 of -msgid "A list of members that belong to this guild." -msgstr "" - -#: discord.Guild.members:3 discord.Guild.premium_subscribers:3 -#: discord.Guild.query_members:27 discord.Role.members:3 -#: discord.TextChannel.members:3 discord.VoiceChannel.members:3 of -#, fuzzy -msgid "List[:class:`Member`]" -msgstr ":class:`bytes`" - -#: discord.Guild.get_member:1 of -msgid "Returns a member with the given ID." -msgstr "" - -#: discord.Guild.get_member:6 of -msgid "The member or ``None`` if not found." -msgstr "" - -#: discord.Guild.get_member:7 discord.Guild.get_member_named:20 -#: discord.Guild.owner:3 discord.RawReactionActionEvent:40 of -msgid "Optional[:class:`Member`]" -msgstr "" - -#: discord.Guild.premium_subscribers:1 of -msgid "A list of members who have \"boosted\" this guild." -msgstr "" - -#: discord.Guild.roles:1 of -msgid "Returns a :class:`list` of the guild's roles in hierarchy order." -msgstr "" - -#: discord.Guild.roles:3 of -msgid "The first element of this list will be the lowest role in the hierarchy." -msgstr "" - -#: discord.Guild.get_role:1 of -msgid "Returns a role with the given ID." -msgstr "" - -#: discord.Guild.get_role:6 of -msgid "The role or ``None`` if not found." -msgstr "" - -#: discord.Guild.get_role:7 of -#, fuzzy -msgid "Optional[:class:`Role`]" -msgstr ":class:`.Profile`" - -#: discord.Guild.default_role:1 of -msgid "Gets the @everyone role that all members have by default." -msgstr "" - -#: discord.Guild.create_role:31 discord.Guild.default_role:3 -#: discord.Integration:45 discord.Member.top_role:6 of -msgid ":class:`Role`" -msgstr "" - -#: discord.Guild.owner:1 of -#, fuzzy -msgid "The member that owns the guild." -msgstr "ギルドの名前。" - -#: discord.Guild.icon_url:1 discord.PartialInviteGuild.icon_url:1 of -#, fuzzy -msgid "Returns the guild's icon asset." -msgstr "役職の名前を返します。" - -#: discord.Guild.is_icon_animated:1 of -msgid ":class:`bool`: Returns True if the guild has an animated icon." -msgstr "" - -#: discord.Guild.icon_url_as:1 of -msgid "Returns an :class:`Asset` for the guild's icon." -msgstr "" - -#: discord.Guild.icon_url_as:7 of -msgid "" -"The format to attempt to convert the icon to. If the format is ``None``, " -"then it is automatically detected into either 'gif' or static_format " -"depending on the icon being animated or not." -msgstr "" - -#: discord.Guild.icon_url_as:12 of -msgid "Format to attempt to convert only non-animated icons to." -msgstr "" - -#: discord.Guild.banner_url:1 discord.PartialInviteGuild.banner_url:1 of -#, fuzzy -msgid "Returns the guild's banner asset." -msgstr "役職の名前を返します。" - -#: discord.Guild.banner_url_as:1 of -msgid "Returns an :class:`Asset` for the guild's banner." -msgstr "" - -#: discord.Guild.banner_url_as:3 of -msgid "" -"The format must be one of 'webp', 'jpeg', or 'png'. The size must be a " -"power of 2 between 16 and 4096." -msgstr "" - -#: discord.Guild.banner_url_as:6 of -msgid "The format to attempt to convert the banner to." -msgstr "" - -#: discord.Guild.splash_url:1 discord.PartialInviteGuild.splash_url:1 of -#, fuzzy -msgid "Returns the guild's invite splash asset." -msgstr "ギルドの招待時のスプラッシュ画像の変更" - -#: discord.Guild.splash_url_as:1 of -msgid "Returns an :class:`Asset` for the guild's invite splash." -msgstr "" - -#: discord.Guild.discovery_splash_url_as:3 discord.Guild.splash_url_as:3 of -msgid "" -"The format must be one of 'webp', 'jpeg', 'jpg', or 'png'. The size must " -"be a power of 2 between 16 and 4096." -msgstr "" - -#: discord.Guild.discovery_splash_url_as:8 discord.Guild.splash_url_as:6 of -msgid "The format to attempt to convert the splash to." -msgstr "" - -#: discord.Guild.discovery_splash_url:1 of -msgid "Returns the guild's discovery splash asset." -msgstr "" - -#: discord.Guild.discovery_splash_url_as:1 of -msgid "Returns an :class:`Asset` for the guild's discovery splash." -msgstr "" - -#: discord.Guild.member_count:1 of -msgid "Returns the true member count regardless of it being loaded fully or not." -msgstr "" - -#: discord.Guild.member_count:5 of -msgid "" -"Due to a Discord limitation, in order for this attribute to remain up-to-" -"date and accurate, it requires :attr:`Intents.members` to be specified." -msgstr "" - -#: discord.Guild.chunked:1 of -msgid "Returns a boolean indicating if the guild is \"chunked\"." -msgstr "" - -#: discord.Guild.chunked:3 of -msgid "" -"A chunked guild means that :attr:`member_count` is equal to the number of" -" members stored in the internal :attr:`members` cache." -msgstr "" - -#: discord.Guild.chunked:6 of -msgid "" -"If this value returns ``False``, then you should request for offline " -"members." -msgstr "" - -#: discord.Guild.shard_id:1 of -#, fuzzy -msgid "Returns the shard ID for this guild if applicable." -msgstr ":exc:`.Forbidden` -- ギルドのウィジェットが有効化されていない。" - -#: discord.Guild.created_at:1 discord.PartialInviteGuild.created_at:1 of -msgid "Returns the guild's creation time in UTC." -msgstr "" - -#: discord.Guild.get_member_named:1 of -msgid "Returns the first member found that matches the name provided." -msgstr "" - -#: discord.Guild.get_member_named:3 of -msgid "" -"The name can have an optional discriminator argument, e.g. \"Jake#0001\" " -"or \"Jake\" will both do the lookup. However the former will give a more " -"precise result. Note that the discriminator must have all 4 digits for " -"this to work." -msgstr "" - -#: discord.Guild.get_member_named:8 of -msgid "" -"If a nickname is passed, then it is looked up via the nickname. Note " -"however, that a nickname + discriminator combo will not lookup the " -"nickname but rather the username + discriminator combo due to nickname + " -"discriminator not being unique." -msgstr "" - -#: discord.Guild.get_member_named:13 of -msgid "If no member is found, ``None`` is returned." -msgstr "" - -#: discord.Guild.get_member_named:15 of -msgid "The name of the member to lookup with an optional discriminator." -msgstr "" - -#: discord.Guild.get_member_named:18 of -msgid "" -"The member in this guild with the associated name. If not found then " -"``None`` is returned." -msgstr "" - -#: discord.Guild.create_text_channel:3 of -msgid "Creates a :class:`TextChannel` for the guild." -msgstr "" - -#: discord.Guild.create_text_channel:5 of -msgid "" -"Note that you need the :attr:`~Permissions.manage_channels` permission to" -" create the channel." -msgstr "" - -#: discord.Guild.create_text_channel:8 of -msgid "" -"The ``overwrites`` parameter can be used to create a 'secret' channel " -"upon creation. This parameter expects a :class:`dict` of overwrites with " -"the target (either a :class:`Member` or a :class:`Role`) as the key and a" -" :class:`PermissionOverwrite` as the value." -msgstr "" - -#: discord.Guild.create_text_channel:15 of -msgid "" -"Creating a channel of a specified position will not update the position " -"of other channels to follow suit. A follow-up call to " -":meth:`~TextChannel.edit` will be required to update the position of the " -"channel in the channel list." -msgstr "" - -#: discord.Guild.create_text_channel:21 of -msgid "Creating a basic channel:" -msgstr "" - -#: discord.Guild.create_text_channel:27 of -msgid "Creating a \"secret\" channel:" -msgstr "" - -#: discord.Guild.create_text_channel:38 discord.WidgetChannel:29 of -msgid "The channel's name." -msgstr "" - -#: discord.Guild.create_text_channel:40 of -msgid "" -"A :class:`dict` of target (either a role or a member) to " -":class:`PermissionOverwrite` to apply upon creation of a channel. Useful " -"for creating secret channels." -msgstr "" - -#: discord.Guild.create_text_channel:43 of -msgid "" -"The category to place the newly created channel under. The permissions " -"will be automatically synced to category if no overwrites are provided." -msgstr "" - -#: discord.Guild.create_text_channel:50 discord.TextChannel.edit:16 of -msgid "The new channel's topic." -msgstr "" - -#: discord.Guild.create_text_channel:52 of -msgid "" -"Specifies the slowmode rate limit for user in this channel, in seconds. " -"The maximum value possible is `21600`." -msgstr "" - -#: discord.Guild.create_text_channel:55 discord.TextChannel.edit:20 of -msgid "To mark the channel as NSFW or not." -msgstr "" - -#: discord.Guild.create_text_channel:57 of -msgid "The reason for creating this channel. Shows up on the audit log." -msgstr "" - -#: discord.Guild.create_category:12 discord.Guild.create_category_channel:12 -#: discord.Guild.create_text_channel:62 discord.Guild.create_voice_channel:13 -#: of -msgid "The permission overwrite information is not in proper form." -msgstr "" - -#: discord.CategoryChannel.create_text_channel:5 -#: discord.CategoryChannel.create_voice_channel:5 -#: discord.Guild.create_category:14 discord.Guild.create_category_channel:14 -#: discord.Guild.create_text_channel:64 discord.Guild.create_voice_channel:15 -#: of -msgid "The channel that was just created." -msgstr "" - -#: discord.CategoryChannel.create_text_channel:6 -#: discord.Guild.create_text_channel:65 of -msgid ":class:`TextChannel`" -msgstr "" - -#: discord.Guild.create_voice_channel:3 of -msgid "" -"This is similar to :meth:`create_text_channel` except makes a " -":class:`VoiceChannel` instead, in addition to having the following new " -"parameters." -msgstr "" - -#: discord.Guild.create_voice_channel:6 discord.VoiceChannel:54 of -msgid "The channel's preferred audio bitrate in bits per second." -msgstr "" - -#: discord.Guild.create_voice_channel:8 discord.VoiceChannel:60 of -msgid "The channel's limit for number of members that can be in a voice channel." -msgstr "" - -#: discord.CategoryChannel.create_voice_channel:6 -#: discord.Guild.create_voice_channel:16 of -#, fuzzy -msgid ":class:`VoiceChannel`" -msgstr "ボイスチャンネル。" - -#: discord.Guild.create_category:3 discord.Guild.create_category_channel:3 of -msgid "" -"Same as :meth:`create_text_channel` except makes a " -":class:`CategoryChannel` instead." -msgstr "" - -#: discord.Guild.create_category:7 discord.Guild.create_category_channel:7 of -msgid "" -"The ``category`` parameter is not supported in this function since " -"categories cannot have categories." -msgstr "" - -#: discord.Guild.create_category:15 discord.Guild.create_category_channel:15 of -#, fuzzy -msgid ":class:`CategoryChannel`" -msgstr ":class:`str`" - -#: discord.Guild.leave:3 of -msgid "Leaves the guild." -msgstr "" - -#: discord.Guild.leave:7 of -msgid "" -"You cannot leave the guild that you own, you must delete it instead via " -":meth:`delete`." -msgstr "" - -#: discord.Guild.leave:10 of -#, fuzzy -msgid "Leaving the guild failed." -msgstr "ギルドのアイコンの変更" - -#: discord.Guild.delete:3 of -msgid "Deletes the guild. You must be the guild owner to delete the guild." -msgstr "" - -#: discord.Guild.delete:6 of -#, fuzzy -msgid "Deleting the guild failed." -msgstr ":exc:`.HTTPException` -- ギルドの取得に失敗した。" - -#: discord.Guild.delete:7 of -#, fuzzy -msgid "You do not have permissions to delete the guild." -msgstr ":exc:`.Forbidden` -- 指定のチャンネルを取得する権限がない。" - -#: discord.Guild.edit:3 of -msgid "Edits the guild." -msgstr "" - -#: discord.Guild.edit:5 of -msgid "" -"You must have the :attr:`~Permissions.manage_guild` permission to edit " -"the guild." -msgstr "" - -#: discord.Guild.edit:8 of -msgid "" -"The `rules_channel` and `public_updates_channel` keyword-only parameters " -"were added." -msgstr "" - -#: discord.Guild.edit:11 of -msgid "The new name of the guild." -msgstr "" - -#: discord.Guild.edit:13 of -msgid "" -"The new description of the guild. This is only available to guilds that " -"contain ``PUBLIC`` in :attr:`Guild.features`." -msgstr "" - -#: discord.Guild.edit:16 of -msgid "" -"A :term:`py:bytes-like object` representing the icon. Only PNG/JPEG " -"supported and GIF This is only available to guilds that contain " -"``ANIMATED_ICON`` in :attr:`Guild.features`. Could be ``None`` to denote " -"removal of the icon." -msgstr "" - -#: discord.Guild.edit:20 of -msgid "" -"A :term:`py:bytes-like object` representing the banner. Could be ``None``" -" to denote removal of the banner." -msgstr "" - -#: discord.Guild.edit:23 of -msgid "" -"A :term:`py:bytes-like object` representing the invite splash. Only " -"PNG/JPEG supported. Could be ``None`` to denote removing the splash. This" -" is only available to guilds that contain ``INVITE_SPLASH`` in " -":attr:`Guild.features`." -msgstr "" - -#: discord.Guild.edit:28 of -msgid "The new region for the guild's voice communication." -msgstr "" - -#: discord.Guild.edit:30 of -msgid "" -"The new channel that is the AFK channel. Could be ``None`` for no AFK " -"channel." -msgstr "" - -#: discord.Guild.edit:32 of -msgid "The number of seconds until someone is moved to the AFK channel." -msgstr "" - -#: discord.Guild.edit:34 of -msgid "" -"The new owner of the guild to transfer ownership to. Note that you must " -"be owner of the guild to do this." -msgstr "" - -#: discord.Guild.edit:37 of -msgid "The new verification level for the guild." -msgstr "" - -#: discord.Guild.edit:39 of -msgid "The new default notification level for the guild." -msgstr "" - -#: discord.Guild.edit:41 of -msgid "The new explicit content filter for the guild." -msgstr "" - -#: discord.Guild.edit:43 of -msgid "The new vanity code for the guild." -msgstr "" - -#: discord.Guild.edit:45 of -msgid "" -"The new channel that is used for the system channel. Could be ``None`` " -"for no system channel." -msgstr "" - -#: discord.Guild.edit:47 of -msgid "The new system channel settings to use with the new system channel." -msgstr "" - -#: discord.Guild.edit:49 of -msgid "" -"The new channel that is used for rules. This is only available to guilds " -"that contain ``PUBLIC`` in :attr:`Guild.features`. Could be ``None`` for " -"no rules channel." -msgstr "" - -#: discord.Guild.edit:53 of -msgid "" -"The new channel that is used for public updates from Discord. This is " -"only available to guilds that contain ``PUBLIC`` in " -":attr:`Guild.features`. Could be ``None`` for no public updates channel." -msgstr "" - -#: discord.Guild.edit:57 of -msgid "The reason for editing this guild. Shows up on the audit log." -msgstr "" - -#: discord.Guild.edit:60 of -#, fuzzy -msgid "You do not have permissions to edit the guild." -msgstr ":exc:`.Forbidden` -- 指定のチャンネルを取得する権限がない。" - -#: discord.Guild.edit:61 discord.Integration.edit:16 of -#, fuzzy -msgid "Editing the guild failed." -msgstr ":exc:`.HTTPException` -- ギルドの取得に失敗した。" - -#: discord.Guild.edit:62 of -msgid "" -"The image format passed in to ``icon`` is invalid. It must be PNG or " -"JPG. This is also raised if you are not the owner of the guild and " -"request an ownership transfer." -msgstr "" - -#: discord.Guild.fetch_channels:3 of -msgid "Retrieves all :class:`abc.GuildChannel` that the guild has." -msgstr "" - -#: discord.Guild.fetch_channels:7 of -msgid "" -"This method is an API call. For general usage, consider :attr:`channels` " -"instead." -msgstr "" - -#: discord.Guild.fetch_channels:12 of -#, fuzzy -msgid "Retrieving the channels failed." -msgstr ":exc:`.HTTPException` -- チャンネルの取得に失敗した。" - -#: discord.Guild.fetch_channels:14 of -msgid "All channels in the guild." -msgstr "" - -#: discord.Guild.fetch_members:3 of -#, fuzzy -msgid "" -"Retrieves an :class:`.AsyncIterator` that enables receiving the guild's " -"members." -msgstr "Botが所属するGuildを取得できる、 :class:`AsyncIterator` を取得します。" - -#: discord.Guild.fetch_members:7 of -#, fuzzy -msgid "" -"This method is an API call. For general usage, consider :attr:`members` " -"instead." -msgstr "これはAPIを呼び出します。通常は :attr:`guilds` を代わりに使用してください。" - -#: discord.Guild.fetch_members:13 of -msgid "" -"The number of members to retrieve. Defaults to 1000. Pass ``None`` to " -"fetch all members. Note that this is potentially slow." -msgstr "" - -#: discord.Guild.fetch_members:16 of -#, fuzzy -msgid "" -"Retrieve members after this date or object. If a date is provided it must" -" be a timezone-naive datetime representing UTC time." -msgstr "" -"この日付またはオブジェクトの後のGuildを取得します。もし日付が与えられた場合は、それはUTC時刻を表し、timezone " -"naiveであるdatetimeでないといけません。" - -#: discord.Guild.fetch_members:20 of -#, fuzzy -msgid "Getting the members failed." -msgstr "メンバーが退席中。" - -#: discord.Guild.fetch_members:22 of -#, fuzzy -msgid ":class:`.Member` -- The member with the member data parsed." -msgstr ":class:`.Guild` -- データを解析したGuild。" - -#: discord.Guild.fetch_member:3 of -msgid "Retrieves a :class:`Member` from a guild ID, and a member ID." -msgstr "" - -#: discord.Guild.fetch_member:7 of -msgid "" -"This method is an API call. For general usage, consider " -":meth:`get_member` instead." -msgstr "" - -#: discord.Guild.fetch_member:9 of -msgid "The member's ID to fetch from." -msgstr "" - -#: discord.Guild.fetch_member:13 of -#, fuzzy -msgid "Fetching the member failed." -msgstr "メンバーが退席中。" - -#: discord.Guild.fetch_member:15 of -msgid "The member from the member ID." -msgstr "" - -#: discord.Guild.fetch_ban:3 of -msgid "" -"Retrieves the :class:`BanEntry` for a user, which is a namedtuple with a " -"``user`` and ``reason`` field. See :meth:`bans` for more information." -msgstr "" - -#: discord.Guild.bans:10 discord.Guild.fetch_ban:7 of -msgid "" -"You must have the :attr:`~Permissions.ban_members` permission to get this" -" information." -msgstr "" - -#: discord.Guild.fetch_ban:10 of -msgid "The user to get ban information from." -msgstr "" - -#: discord.Guild.fetch_ban:14 of -#, fuzzy -msgid "This user is not banned." -msgstr "Banが解除されたユーザー。" - -#: discord.Guild.fetch_ban:17 of -msgid "The BanEntry object for the specified user." -msgstr "" - -#: discord.Guild.bans:3 of -msgid "Retrieves all the users that are banned from the guild." -msgstr "" - -#: discord.Guild.bans:5 of -msgid "" -"This coroutine returns a :class:`list` of BanEntry objects, which is a " -"namedtuple with a ``user`` field to denote the :class:`User` that got " -"banned along with a ``reason`` field specifying why the user was banned " -"that could be set to ``None``." -msgstr "" - -#: discord.Guild.bans:16 of -msgid "A list of BanEntry objects." -msgstr "" - -#: discord.Guild.prune_members:3 of -msgid "Prunes the guild from its inactive members." -msgstr "" - -#: discord.Guild.prune_members:5 of -msgid "" -"The inactive members are denoted if they have not logged on in ``days`` " -"number of days and they have no roles." -msgstr "" - -#: discord.Guild.prune_members:8 of -msgid "" -"You must have the :attr:`~Permissions.kick_members` permission to use " -"this." -msgstr "" - -#: discord.Guild.prune_members:11 of -msgid "" -"To check how many members you would prune without actually pruning, see " -"the :meth:`estimate_pruned_members` function." -msgstr "" - -#: discord.Guild.prune_members:14 of -msgid "To prune members that have specific roles see the ``roles`` parameter." -msgstr "" - -#: discord.Guild.prune_members:16 of -msgid "The ``roles`` keyword-only parameter was added." -msgstr "" - -#: discord.Guild.estimate_pruned_members:7 discord.Guild.prune_members:19 of -msgid "The number of days before counting as inactive." -msgstr "" - -#: discord.Guild.prune_members:23 of -msgid "" -"Whether to compute the prune count. This defaults to ``True`` which makes" -" it prone to timeouts in very large guilds. In order to prevent timeouts," -" you must set this to ``False``. If this is set to ``False``\\, then this" -" function will always return ``None``." -msgstr "" - -#: discord.Guild.prune_members:28 of -msgid "" -"A list of :class:`abc.Snowflake` that represent roles to include in the " -"pruning process. If a member has a role that is not specified, they'll be" -" excluded." -msgstr "" - -#: discord.Guild.estimate_pruned_members:10 discord.Guild.prune_members:32 of -#, fuzzy -msgid "You do not have permissions to prune members." -msgstr ":exc:`.Forbidden` -- 招待を取り消す権限が無い。" - -#: discord.Guild.prune_members:33 of -msgid "An error occurred while pruning members." -msgstr "" - -#: discord.Guild.estimate_pruned_members:12 discord.Guild.prune_members:34 of -msgid "An integer was not passed for ``days``." -msgstr "" - -#: discord.Guild.prune_members:36 of -msgid "" -"The number of members pruned. If ``compute_prune_count`` is ``False`` " -"then this returns ``None``." -msgstr "" - -#: discord.Guild.webhooks:3 of -msgid "Gets the list of webhooks from this guild." -msgstr "" - -#: discord.Guild.webhooks:5 discord.TextChannel.create_webhook:5 -#: discord.TextChannel.webhooks:5 of -msgid "Requires :attr:`~.Permissions.manage_webhooks` permissions." -msgstr "" - -#: discord.Guild.webhooks:7 discord.TextChannel.webhooks:7 of -#, fuzzy -msgid "You don't have permissions to get the webhooks." -msgstr ":exc:`.Forbidden` -- このWebhookを取得する権限がない。" - -#: discord.Guild.webhooks:9 of -msgid "The webhooks for this guild." -msgstr "" - -#: discord.Guild.webhooks:10 discord.TextChannel.webhooks:10 of -msgid "List[:class:`Webhook`]" -msgstr "" - -#: discord.Guild.estimate_pruned_members:3 of -msgid "" -"Similar to :meth:`prune_members` except instead of actually pruning " -"members, it returns how many members it would prune from the guild had it" -" been called." -msgstr "" - -#: discord.Guild.estimate_pruned_members:11 of -msgid "An error occurred while fetching the prune members estimate." -msgstr "" - -#: discord.Guild.estimate_pruned_members:14 of -msgid "The number of members estimated to be pruned." -msgstr "" - -#: discord.Guild.invites:3 of -msgid "Returns a list of all active instant invites from the guild." -msgstr "" - -#: discord.Guild.invites:5 of -msgid "" -"You must have the :attr:`~Permissions.manage_guild` permission to get " -"this information." -msgstr "" - -#: discord.Guild.invites:12 of -msgid "List[:class:`Invite`]" -msgstr "" - -#: discord.Guild.create_integration:3 of -#, fuzzy -msgid "Attaches an integration to the guild." -msgstr "ギルドの名前。" - -#: discord.Guild.create_integration:5 discord.Guild.integrations:5 -#: discord.Integration.delete:5 discord.Integration.edit:5 -#: discord.Integration.sync:5 of -#, fuzzy -msgid "You must have the :attr:`~Permissions.manage_guild` permission to do this." -msgstr "これを行うためには、そのチャンネルの :attr:`~.Permissions.read_message_history` 権限が必要です。" - -#: discord.Guild.create_integration:10 of -msgid "The integration type (e.g. Twitch)." -msgstr "" - -#: discord.Guild.create_integration:12 discord.Integration:7 of -msgid "The integration ID." -msgstr "" - -#: discord.Guild.create_integration:15 discord.Guild.integrations:10 of -#, fuzzy -msgid "You do not have permission to create the integration." -msgstr ":exc:`.Forbidden` -- 招待を取り消す権限が無い。" - -#: discord.Guild.create_integration:16 of -msgid "The account could not be found." -msgstr "" - -#: discord.Guild.integrations:3 of -msgid "Returns a list of all integrations attached to the guild." -msgstr "" - -#: discord.Guild.integrations:11 of -msgid "Fetching the integrations failed." -msgstr "" - -#: discord.Guild.integrations:13 of -msgid "The list of integrations that are attached to the guild." -msgstr "" - -#: discord.Guild.integrations:14 of -msgid "List[:class:`Integration`]" -msgstr "" - -#: discord.Guild.fetch_emojis:3 of -msgid "Retrieves all custom :class:`Emoji`\\s from the guild." -msgstr "" - -#: discord.Guild.fetch_emojis:7 of -msgid "" -"This method is an API call. For general usage, consider :attr:`emojis` " -"instead." -msgstr "" - -#: discord.Guild.fetch_emojis:9 of -msgid "An error occurred fetching the emojis." -msgstr "" - -#: discord.Guild.fetch_emojis:11 of -msgid "The retrieved emojis." -msgstr "" - -#: discord.Guild.fetch_emojis:12 of -msgid "List[:class:`Emoji`]" -msgstr "" - -#: discord.Guild.fetch_emoji:3 of -msgid "Retrieves a custom :class:`Emoji` from the guild." -msgstr "" - -#: discord.Guild.fetch_emoji:7 of -msgid "" -"This method is an API call. For general usage, consider iterating over " -":attr:`emojis` instead." -msgstr "" - -#: discord.Emoji:37 discord.Guild.fetch_emoji:10 of -msgid "The emoji's ID." -msgstr "" - -#: discord.Guild.fetch_emoji:13 of -msgid "The emoji requested could not be found." -msgstr "" - -#: discord.Guild.fetch_emoji:14 of -msgid "An error occurred fetching the emoji." -msgstr "" - -#: discord.Guild.fetch_emoji:16 of -msgid "The retrieved emoji." -msgstr "" - -#: discord.Guild.create_custom_emoji:25 discord.Guild.fetch_emoji:17 -#: discord.Intents.emojis:9 of -msgid ":class:`Emoji`" -msgstr "" - -#: discord.Guild.create_custom_emoji:3 of -msgid "Creates a custom :class:`Emoji` for the guild." -msgstr "" - -#: discord.Guild.create_custom_emoji:5 of -msgid "" -"There is currently a limit of 50 static and animated emojis respectively " -"per guild, unless the guild has the ``MORE_EMOJI`` feature which extends " -"the limit to 200." -msgstr "" - -#: discord.Guild.create_custom_emoji:8 of -msgid "" -"You must have the :attr:`~Permissions.manage_emojis` permission to do " -"this." -msgstr "" - -#: discord.Guild.create_custom_emoji:11 of -msgid "The emoji name. Must be at least 2 characters." -msgstr "" - -#: discord.Guild.create_custom_emoji:13 of -msgid "" -"The :term:`py:bytes-like object` representing the image data to use. Only" -" JPG, PNG and GIF images are supported." -msgstr "" - -#: discord.Emoji.edit:10 discord.Guild.create_custom_emoji:16 of -msgid "" -"A :class:`list` of :class:`Role`\\s that can use this emoji. Leave empty " -"to make it available to everyone." -msgstr "" - -#: discord.Guild.create_custom_emoji:18 of -msgid "The reason for creating this emoji. Shows up on the audit log." -msgstr "" - -#: discord.Guild.create_custom_emoji:21 of -#, fuzzy -msgid "You are not allowed to create emojis." -msgstr "10以上のギルドに参加しているBotアカウントはギルドの作成ができません。" - -#: discord.Guild.create_custom_emoji:22 of -msgid "An error occurred creating an emoji." -msgstr "" - -#: discord.Guild.create_custom_emoji:24 of -msgid "The created emoji." -msgstr "" - -#: discord.Guild.fetch_roles:3 of -#, fuzzy -msgid "Retrieves all :class:`Role` that the guild has." -msgstr "特定のIDの :class:`.Webhook` を取得します。" - -#: discord.Guild.fetch_roles:7 of -#, fuzzy -msgid "" -"This method is an API call. For general usage, consider :attr:`roles` " -"instead." -msgstr "これはAPIを呼び出します。通常は :attr:`guilds` を代わりに使用してください。" - -#: discord.Guild.fetch_roles:11 of -#, fuzzy -msgid "Retrieving the roles failed." -msgstr "役職の名前を返します。" - -#: discord.Guild.fetch_roles:13 of -#, fuzzy -msgid "All roles in the guild." -msgstr "ギルドの名前。" - -#: discord.Guild.create_role:3 of -msgid "Creates a :class:`Role` for the guild." -msgstr "" - -#: discord.Guild.create_role:5 discord.Role.edit:8 of -msgid "All fields are optional." -msgstr "" - -#: discord.Guild.create_role:7 discord.Guild.edit_role_positions:5 of -msgid "You must have the :attr:`~Permissions.manage_roles` permission to do this." -msgstr "" - -#: discord.Guild.create_role:10 of -msgid "The role name. Defaults to 'new role'." -msgstr "" - -#: discord.Guild.create_role:12 of -msgid "The permissions to have. Defaults to no permissions." -msgstr "" - -#: discord.Guild.create_role:14 of -msgid "" -"The colour for the role. Defaults to :meth:`Colour.default`. This is " -"aliased to ``color`` as well." -msgstr "" - -#: discord.Guild.create_role:17 of -msgid "" -"Indicates if the role should be shown separately in the member list. " -"Defaults to ``False``." -msgstr "" - -#: discord.Guild.create_role:20 of -msgid "" -"Indicates if the role should be mentionable by others. Defaults to " -"``False``." -msgstr "" - -#: discord.Guild.create_role:23 of -msgid "The reason for creating this role. Shows up on the audit log." -msgstr "" - -#: discord.Guild.create_role:26 of -#, fuzzy -msgid "You do not have permissions to create the role." -msgstr ":exc:`.Forbidden` -- 招待を取り消す権限が無い。" - -#: discord.Guild.create_role:27 of -#, fuzzy -msgid "Creating the role failed." -msgstr "役職の名前を返します。" - -#: discord.Guild.create_role:28 discord.Guild.edit_role_positions:29 of -msgid "An invalid keyword argument was given." -msgstr "" - -#: discord.Guild.create_role:30 of -msgid "The newly created role." -msgstr "" - -#: discord.Guild.edit_role_positions:3 of -#, fuzzy -msgid "Bulk edits a list of :class:`Role` in the guild." -msgstr ":class:`Role` がギルド全体で変更されたときに呼び出されます。" - -#: discord.Guild.edit_role_positions:10 of -#, fuzzy -msgid "Example:" -msgstr "例" - -#: discord.Guild.edit_role_positions:22 of -msgid "" -"A :class:`dict` of :class:`Role` to :class:`int` to change the positions " -"of each given role." -msgstr "" - -#: discord.Guild.edit_role_positions:24 of -msgid "The reason for editing the role positions. Shows up on the audit log." -msgstr "" - -#: discord.Guild.edit_role_positions:27 of -#, fuzzy -msgid "You do not have permissions to move the roles." -msgstr ":exc:`.Forbidden` -- 招待を取り消す権限が無い。" - -#: discord.Guild.edit_role_positions:28 of -#, fuzzy -msgid "Moving the roles failed." -msgstr "役職の名前を返します。" - -#: discord.Guild.edit_role_positions:31 of -msgid "A list of all the roles in the guild." -msgstr "" - -#: discord.Guild.kick:3 of -msgid "Kicks a user from the guild." -msgstr "" - -#: discord.Guild.ban:5 discord.Guild.kick:5 discord.Guild.unban:5 of -msgid "The user must meet the :class:`abc.Snowflake` abc." -msgstr "" - -#: discord.Guild.kick:7 of -msgid "You must have the :attr:`~Permissions.kick_members` permission to do this." -msgstr "" - -#: discord.Guild.kick:10 of -msgid "The user to kick from their guild." -msgstr "" - -#: discord.Guild.kick:12 of -msgid "The reason the user got kicked." -msgstr "" - -#: discord.Guild.kick:15 of -msgid "You do not have the proper permissions to kick." -msgstr "" - -#: discord.Guild.kick:16 of -msgid "Kicking failed." -msgstr "" - -#: discord.Guild.ban:3 of -msgid "Bans a user from the guild." -msgstr "" - -#: discord.Guild.ban:7 discord.Guild.unban:7 of -msgid "You must have the :attr:`~Permissions.ban_members` permission to do this." -msgstr "" - -#: discord.Guild.ban:10 of -msgid "The user to ban from their guild." -msgstr "" - -#: discord.Guild.ban:12 of -msgid "" -"The number of days worth of messages to delete from the user in the " -"guild. The minimum is 0 and the maximum is 7." -msgstr "" - -#: discord.Guild.ban:15 of -msgid "The reason the user got banned." -msgstr "" - -#: discord.Guild.ban:18 of -msgid "You do not have the proper permissions to ban." -msgstr "" - -#: discord.Guild.ban:19 of -msgid "Banning failed." -msgstr "" - -#: discord.Guild.unban:3 of -msgid "Unbans a user from the guild." -msgstr "" - -#: discord.Guild.unban:10 of -msgid "The user to unban." -msgstr "" - -#: discord.Guild.unban:15 of -msgid "You do not have the proper permissions to unban." -msgstr "" - -#: discord.Guild.unban:16 of -msgid "Unbanning failed." -msgstr "" - -#: discord.Guild.vanity_invite:3 of -msgid "Returns the guild's special vanity invite." -msgstr "" - -#: discord.Guild.vanity_invite:5 of -msgid "The guild must have ``VANITY_URL`` in :attr:`~Guild.features`." -msgstr "" - -#: discord.Guild.vanity_invite:7 of -msgid "" -"You must have the :attr:`~Permissions.manage_guild` permission to use " -"this as well." -msgstr "" - -#: discord.Guild.vanity_invite:10 of -#, fuzzy -msgid "You do not have the proper permissions to get this." -msgstr ":exc:`.Forbidden` -- このWebhookを取得する権限がない。" - -#: discord.Guild.vanity_invite:11 of -#, fuzzy -msgid "Retrieving the vanity invite failed." -msgstr ":exc:`.HTTPException` -- 招待の取り消しに失敗した。" - -#: discord.Guild.vanity_invite:13 of -msgid "The special vanity invite." -msgstr "" - -#: discord.Guild.vanity_invite:14 discord.Widget.fetch_invite:13 of -msgid ":class:`Invite`" -msgstr "" - -#: discord.Guild.ack:3 of -msgid "Marks every message in this guild as read." -msgstr "" - -#: discord.Guild.widget:3 of -msgid "Returns the widget of the guild." -msgstr "" - -#: discord.Guild.widget:13 of -msgid ":class:`Widget`" -msgstr "" - -#: discord.Guild.chunk:3 of -msgid "" -"Requests all members that belong to this guild. In order to use this, " -":meth:`Intents.members` must be enabled." -msgstr "" - -#: discord.Guild.chunk:6 discord.Guild.query_members:6 of -msgid "This is a websocket operation and can be slow." -msgstr "" - -#: discord.Guild.chunk:10 of -msgid "Whether to cache the members as well." -msgstr "" - -#: discord.Guild.chunk:13 of -#, fuzzy -msgid "The members intent is not enabled." -msgstr "メンバーがオンライン。" - -#: discord.Guild.query_members:3 of -msgid "" -"Request members that belong to this guild whose username starts with the " -"query given." -msgstr "" - -#: discord.Guild.query_members:10 of -msgid "The string that the username's start with." -msgstr "" - -#: discord.Guild.query_members:12 of -msgid "" -"The maximum number of members to send back. This must be a number between" -" 5 and 100." -msgstr "" - -#: discord.Guild.query_members:15 of -msgid "" -"Whether to cache the members internally. This makes operations such as " -":meth:`get_member` work for those that matched." -msgstr "" - -#: discord.Guild.query_members:18 of -msgid "" -"List of user IDs to search for. If the user ID is not in the guild then " -"it won't be returned. .. versionadded:: 1.4" -msgstr "" - -#: discord.Guild.query_members:18 of -msgid "" -"List of user IDs to search for. If the user ID is not in the guild then " -"it won't be returned." -msgstr "" - -#: discord.Guild.query_members:23 of -msgid "The query timed out waiting for the members." -msgstr "" - -#: discord.Guild.query_members:24 of -msgid "Invalid parameters were passed to the function" -msgstr "" - -#: discord.Guild.query_members:26 of -msgid "The list of members that have matched the query." -msgstr "" - -#: discord.Guild.change_voice_state:3 of -#, fuzzy -msgid "Changes client's voice state in the guild." -msgstr "クライアントがギルドから退出した。" - -#: discord.Guild.change_voice_state:7 of -msgid "Channel the client wants to join. Use ``None`` to disconnect." -msgstr "" - -#: discord.Guild.change_voice_state:9 of -#, fuzzy -msgid "Indicates if the client should be self-muted." -msgstr "ボイスチャンネルに接続しているかどうかを表します。" - -#: discord.Guild.change_voice_state:11 of -msgid "Indicates if the client should be self-deafened." -msgstr "" - -#: ../../api.rst:2667 -#, fuzzy -msgid "Integration" -msgstr "列挙型" - -#: discord.Integration:1 of -#, fuzzy -msgid "Represents a guild integration." -msgstr "Discordの音声接続を表します。" - -#: discord.Integration:13 of -msgid "The integration name." -msgstr "" - -#: discord.Integration:19 of -#, fuzzy -msgid "The guild of the integration." -msgstr "連携サービスが更新されたギルド。" - -#: discord.CategoryChannel:33 discord.Emoji.guild:3 discord.Integration:21 -#: discord.Member:42 discord.Role:53 discord.Template:51 discord.TextChannel:31 -#: discord.VoiceChannel:31 of -#, fuzzy -msgid ":class:`Guild`" -msgstr ":class:`.Guild`" - -#: discord.Integration:25 of -msgid "The integration type (i.e. Twitch)." -msgstr "" - -#: discord.Integration:31 of -msgid "Whether the integration is currently enabled." -msgstr "" - -#: discord.Integration:37 of -msgid "Where the integration is currently syncing." -msgstr "" - -#: discord.Integration:43 of -msgid "The role which the integration uses for subscribers." -msgstr "" - -#: discord.Integration:49 of -msgid "" -"Whether emoticons should be synced for this integration (currently twitch" -" only)." -msgstr "" - -#: discord.Integration:51 discord.WidgetMember:73 discord.WidgetMember:79 -#: discord.WidgetMember:85 of -#, fuzzy -msgid "Optional[:class:`bool`]" -msgstr ":class:`bool`" - -#: discord.Integration:55 of -msgid "" -"The behaviour of expiring subscribers. Aliased to ``expire_behavior`` as " -"well." -msgstr "" - -#: discord.Integration:57 of -#, fuzzy -msgid ":class:`ExpireBehaviour`" -msgstr ":class:`.Webhook`" - -#: discord.Integration:61 of -msgid "The grace period (in days) for expiring subscribers." -msgstr "" - -#: discord.Integration:67 of -#, fuzzy -msgid "The user for the integration." -msgstr "リアクションを追加したユーザー。" - -#: discord.Integration:73 of -#, fuzzy -msgid "The integration account information." -msgstr "Botのアプリケーション情報。" - -#: discord.Integration:75 of -msgid ":class:`IntegrationAccount`" -msgstr "" - -#: discord.Integration:79 of -msgid "When the integration was last synced." -msgstr "" - -#: discord.Integration.edit:3 of -#, fuzzy -msgid "Edits the integration." -msgstr "クライアントユーザーの設定を変更します。" - -#: discord.Integration.edit:8 of -msgid "" -"The behaviour when an integration subscription lapses. Aliased to " -"``expire_behavior`` as well." -msgstr "" - -#: discord.Integration.edit:10 of -msgid "" -"The period (in days) where the integration will ignore lapsed " -"subscriptions." -msgstr "" - -#: discord.Integration.edit:12 of -msgid "" -"Where emoticons should be synced for this integration (currently twitch " -"only)." -msgstr "" - -#: discord.Integration.edit:15 of -#, fuzzy -msgid "You do not have permission to edit the integration." -msgstr ":exc:`.Forbidden` -- このWebhookを取得する権限がない。" - -#: discord.Integration.edit:17 of -msgid "``expire_behaviour`` did not receive a :class:`ExpireBehaviour`." -msgstr "" - -#: discord.Integration.sync:3 of -#, fuzzy -msgid "Syncs the integration." -msgstr "非同期イテレータ。" - -#: discord.Integration.sync:8 of -#, fuzzy -msgid "You do not have permission to sync the integration." -msgstr ":exc:`.Forbidden` -- このWebhookを取得する権限がない。" - -#: discord.Integration.sync:9 of -msgid "Syncing the integration failed." -msgstr "" - -#: discord.Integration.delete:3 of -msgid "Deletes the integration." -msgstr "" - -#: discord.Integration.delete:8 of -#, fuzzy -msgid "You do not have permission to delete the integration." -msgstr ":exc:`.Forbidden` -- このWebhookを取得する権限がない。" - -#: discord.Integration.delete:9 of -msgid "Deleting the integration failed." -msgstr "" - -#: discord.IntegrationAccount:1 of -#, fuzzy -msgid "Represents an integration account." -msgstr "オーディオストリームを表します。" - -#: discord.IntegrationAccount:7 of -msgid "The account ID." -msgstr "" - -#: discord.IntegrationAccount:13 of -msgid "The account name." -msgstr "" - -#: ../../api.rst:2676 -msgid "Member" -msgstr "" - -#: discord.Member:1 of -msgid "Represents a Discord member to a :class:`Guild`." -msgstr "" - -#: discord.Member:3 of -msgid "This implements a lot of the functionality of :class:`User`." -msgstr "" - -#: discord.Member:9 of -msgid "" -"Checks if two members are equal. Note that this works with :class:`User` " -"instances too." -msgstr "" - -#: discord.Member:14 of -msgid "" -"Checks if two members are not equal. Note that this works with " -":class:`User` instances too." -msgstr "" - -#: discord.Member:19 of -msgid "Returns the member's hash." -msgstr "" - -#: discord.Member:23 of -msgid "Returns the member's name with the discriminator." -msgstr "" - -#: discord.Member:27 of -msgid "" -"A datetime object that specifies the date and time in UTC that the member" -" joined the guild. If the member left and rejoined the guild, this will " -"be the latest date. In certain cases, this can be ``None``." -msgstr "" - -#: discord.Member:34 of -msgid "The activities that the user is currently doing." -msgstr "" - -#: discord.Member:36 of -msgid "Tuple[Union[:class:`BaseActivity`, :class:`Spotify`]]" -msgstr "" - -#: discord.Member:40 of -#, fuzzy -msgid "The guild that the member belongs to." -msgstr "更新された後のギルド。" - -#: discord.Member:46 of -#, fuzzy -msgid "The guild specific nickname of the user." -msgstr "ユーザーのプロフィール。" - -#: discord.Member:52 of -msgid "" -"A datetime object that specifies the date and time in UTC when the member" -" used their Nitro boost on the guild, if available. This could be " -"``None``." -msgstr "" - -#: discord.Member.raw_status:1 of -msgid "The member's overall status as a string value." -msgstr "" - -#: discord.Member.status:1 of -msgid "" -"The member's overall status. If the value is unknown, then it will be a " -":class:`str` instead." -msgstr "" - -#: discord.Member.desktop_status:3 discord.Member.mobile_status:3 -#: discord.Member.status:3 discord.Member.web_status:3 discord.WidgetMember:49 -#: of -#, fuzzy -msgid ":class:`Status`" -msgstr ":class:`str`" - -#: discord.Member.mobile_status:1 of -msgid "The member's status on a mobile device, if applicable." -msgstr "" - -#: discord.Member.desktop_status:1 of -msgid "The member's status on the desktop client, if applicable." -msgstr "" - -#: discord.Member.web_status:1 of -msgid "The member's status on the web client, if applicable." -msgstr "" - -#: discord.Member.is_on_mobile:1 of -msgid "" -":class:`bool`: A helper function that determines if a member is active on" -" a mobile device." -msgstr "" - -#: discord.Member.colour:1 of -msgid "" -"A property that returns a colour denoting the rendered colour for the " -"member. If the default colour is the one rendered then an instance of " -":meth:`Colour.default` is returned." -msgstr "" - -#: discord.Member.color:1 of -msgid "" -"A property that returns a color denoting the rendered color for the " -"member. If the default color is the one rendered then an instance of " -":meth:`Colour.default` is returned." -msgstr "" - -#: discord.Member.roles:1 of -msgid "" -"A :class:`list` of :class:`Role` that the member belongs to. Note that " -"the first element of this list is always the default '@everyone' role." -msgstr "" - -#: discord.Member.roles:5 of -msgid "These roles are sorted by their position in the role hierarchy." -msgstr "" - -#: discord.Member.mention:1 of -msgid "Returns a string that allows you to mention the member." -msgstr "" - -#: discord.Member.activity:1 of -msgid "" -"Returns the primary activity the user is currently doing. Could be " -"``None`` if no activity is being done." -msgstr "" - -#: discord.Member.activity:6 of -msgid "" -"A user may have multiple activities, these can be accessed under " -":attr:`activities`." -msgstr "" - -#: discord.Member.activity:8 of -msgid "Union[:class:`BaseActivity`, :class:`Spotify`]" -msgstr "" - -#: discord.Member.mentioned_in:1 of -msgid "Checks if the member is mentioned in the specified message." -msgstr "" - -#: discord.Member.mentioned_in:6 of -#, fuzzy -msgid "Indicates if the member is mentioned in the message." -msgstr "指定のメッセージにユーザーに対するメンションが含まれているかを確認します。" - -#: discord.Member.top_role:1 of -#, fuzzy -msgid "Returns the member's highest role." -msgstr "オブジェクトのハッシュを返します。" - -#: discord.Member.top_role:3 of -msgid "" -"This is useful for figuring where a member stands in the role hierarchy " -"chain." -msgstr "" - -#: discord.Member.guild_permissions:1 of -msgid "Returns the member's guild permissions." -msgstr "" - -#: discord.Member.guild_permissions:3 of -msgid "" -"This only takes into consideration the guild permissions and not most of " -"the implied permissions or any of the channel permission overwrites. For " -"100% accurate permission calculation, please use either " -":meth:`permissions_in` or :meth:`abc.GuildChannel.permissions_for`." -msgstr "" - -#: discord.Member.guild_permissions:9 of -msgid "" -"This does take into consideration guild ownership and the administrator " -"implication." -msgstr "" - -#: discord.Member.voice:1 of -#, fuzzy -msgid "Returns the member's current voice state." -msgstr "ボイスの状態が変わった `Member` 。" - -#: discord.Member.ban:3 of -msgid "Bans this member. Equivalent to :meth:`Guild.ban`." -msgstr "" - -#: discord.Member.unban:3 of -msgid "Unbans this member. Equivalent to :meth:`Guild.unban`." -msgstr "" - -#: discord.Member.kick:3 of -msgid "Kicks this member. Equivalent to :meth:`Guild.kick`." -msgstr "" - -#: discord.Member.edit:3 of -msgid "Edits the member's data." -msgstr "" - -#: discord.Member.edit:5 of -msgid "" -"Depending on the parameter passed, this requires different permissions " -"listed below:" -msgstr "" - -#: discord.Member.edit:8 of -msgid "Parameter" -msgstr "" - -#: discord.Member.edit:8 of -msgid "Permission" -msgstr "" - -#: discord.Member.edit:10 of -msgid "nick" -msgstr "" - -#: discord.Member.edit:10 of -msgid ":attr:`Permissions.manage_nicknames`" -msgstr ":attr:`Permissions.manage_nicknames`" - -#: discord.Member.edit:12 of -msgid "mute" -msgstr "" - -#: discord.Member.edit:12 of -msgid ":attr:`Permissions.mute_members`" -msgstr ":attr:`Permissions.mute_members`" - -#: discord.Member.edit:14 of -msgid "deafen" -msgstr "" - -#: discord.Member.edit:14 of -msgid ":attr:`Permissions.deafen_members`" -msgstr ":attr:`Permissions.deafen_members`" - -#: discord.Member.edit:16 of -msgid ":attr:`Permissions.manage_roles`" -msgstr ":attr:`Permissions.manage_roles`" - -#: discord.Member.edit:18 of -msgid "voice_channel" -msgstr "" - -#: discord.Member.edit:18 of -msgid ":attr:`Permissions.move_members`" -msgstr ":attr:`Permissions.move_members`" - -#: discord.Member.edit:23 of -msgid "Can now pass ``None`` to ``voice_channel`` to kick a member from voice." -msgstr "" - -#: discord.Member.edit:26 of -msgid "The member's new nickname. Use ``None`` to remove the nickname." -msgstr "" - -#: discord.Member.edit:28 of -msgid "Indicates if the member should be guild muted or un-muted." -msgstr "" - -#: discord.Member.edit:30 of -msgid "Indicates if the member should be guild deafened or un-deafened." -msgstr "" - -#: discord.Member.edit:32 of -msgid "The member's new list of roles. This *replaces* the roles." -msgstr "" - -#: discord.Member.edit:34 of -msgid "" -"The voice channel to move the member to. Pass ``None`` to kick them from " -"voice." -msgstr "" - -#: discord.Member.edit:37 of -msgid "The reason for editing this member. Shows up on the audit log." -msgstr "" - -#: discord.Member.edit:40 of -msgid "You do not have the proper permissions to the action requested." -msgstr "" - -#: discord.Member.edit:41 of -msgid "The operation failed." -msgstr "" - -#: discord.Member.move_to:3 of -msgid "Moves a member to a new voice channel (they must be connected first)." -msgstr "" - -#: discord.Member.move_to:5 of -msgid "" -"You must have the :attr:`~Permissions.move_members` permission to use " -"this." -msgstr "" - -#: discord.Member.move_to:8 of -msgid "This raises the same exceptions as :meth:`edit`." -msgstr "" - -#: discord.Member.move_to:10 of -msgid "Can now pass ``None`` to kick a member from voice." -msgstr "" - -#: discord.Member.move_to:13 of -msgid "" -"The new voice channel to move the member to. Pass ``None`` to kick them " -"from voice." -msgstr "" - -#: discord.Member.add_roles:3 of -msgid "Gives the member a number of :class:`Role`\\s." -msgstr "" - -#: discord.Member.add_roles:8 of -msgid "" -"An argument list of :class:`abc.Snowflake` representing a :class:`Role` " -"to give to the member." -msgstr "" - -#: discord.Member.add_roles:11 of -msgid "The reason for adding these roles. Shows up on the audit log." -msgstr "" - -#: discord.Member.add_roles:13 of -msgid "" -"Whether to atomically add roles. This will ensure that multiple " -"operations will always be applied regardless of the current state of the " -"cache." -msgstr "" - -#: discord.Member.add_roles:18 of -#, fuzzy -msgid "You do not have permissions to add these roles." -msgstr ":exc:`.Forbidden` -- 招待を取り消す権限が無い。" - -#: discord.Member.add_roles:19 of -msgid "Adding roles failed." -msgstr "" - -#: discord.Member.avatar:1 of -msgid "Equivalent to :attr:`User.avatar`" -msgstr "" - -#: discord.Member.avatar_url:1 of -msgid "Equivalent to :attr:`User.avatar_url`" -msgstr "" - -#: discord.Member.bot:1 of -msgid "Equivalent to :attr:`User.bot`" -msgstr "" - -#: discord.Member.created_at:1 of -msgid "Equivalent to :attr:`User.created_at`" -msgstr "" - -#: discord.Member.default_avatar:1 of -msgid "Equivalent to :attr:`User.default_avatar`" -msgstr "" - -#: discord.Member.default_avatar_url:1 of -msgid "Equivalent to :attr:`User.default_avatar_url`" -msgstr "" - -#: discord.Member.discriminator:1 of -msgid "Equivalent to :attr:`User.discriminator`" -msgstr "" - -#: discord.Member.dm_channel:1 of -msgid "Equivalent to :attr:`User.dm_channel`" -msgstr "" - -#: discord.Member.id:1 of -msgid "Equivalent to :attr:`User.id`" -msgstr "" - -#: discord.Member.name:1 of -msgid "Equivalent to :attr:`User.name`" -msgstr "" - -#: discord.Member.public_flags:1 of -msgid "Equivalent to :attr:`User.public_flags`" -msgstr "" - -#: discord.Member.relationship:1 of -msgid "Equivalent to :attr:`User.relationship`" -msgstr "" - -#: discord.Member.remove_roles:3 of -msgid "Removes :class:`Role`\\s from this member." -msgstr "" - -#: discord.Member.remove_roles:8 of -msgid "" -"An argument list of :class:`abc.Snowflake` representing a :class:`Role` " -"to remove from the member." -msgstr "" - -#: discord.Member.remove_roles:11 of -msgid "The reason for removing these roles. Shows up on the audit log." -msgstr "" - -#: discord.Member.remove_roles:13 of -msgid "" -"Whether to atomically remove roles. This will ensure that multiple " -"operations will always be applied regardless of the current state of the " -"cache." -msgstr "" - -#: discord.Member.remove_roles:18 of -#, fuzzy -msgid "You do not have permissions to remove these roles." -msgstr ":exc:`.Forbidden` -- 招待を取り消す権限が無い。" - -#: discord.Member.remove_roles:19 of -#, fuzzy -msgid "Removing the roles failed." -msgstr "役職の名前を返します。" - -#: discord.Member.system:1 of -msgid "Equivalent to :attr:`User.system`" -msgstr "" - -#: ../../api.rst:2690 -msgid "Spotify" -msgstr "" - -#: discord.Spotify:1 of -msgid "" -"Represents a Spotify listening activity from Discord. This is a special " -"case of :class:`Activity` that makes it easier to work with the Spotify " -"integration." -msgstr "" - -#: discord.CustomActivity:7 discord.Spotify:8 of -msgid "Checks if two activities are equal." -msgstr "" - -#: discord.CustomActivity:11 discord.Spotify:12 of -msgid "Checks if two activities are not equal." -msgstr "" - -#: discord.CustomActivity:15 discord.Spotify:16 of -msgid "Returns the activity's hash." -msgstr "" - -#: discord.Spotify:20 of -msgid "Returns the string 'Spotify'." -msgstr "" - -#: discord.CustomActivity.type:1 discord.Spotify.type:1 of -msgid "" -"Returns the activity's type. This is for compatibility with " -":class:`Activity`." -msgstr "" - -#: discord.Spotify.type:3 of -msgid "It always returns :attr:`ActivityType.listening`." -msgstr "" - -#: discord.Activity:34 discord.CustomActivity.type:5 discord.Game.type:5 -#: discord.Spotify.type:5 discord.Streaming.type:5 of -#, fuzzy -msgid ":class:`ActivityType`" -msgstr ":class:`.Invite`" - -#: discord.Spotify.created_at:1 of -#, fuzzy -msgid "When the user started listening in UTC." -msgstr "入力を始めたユーザー。" - -#: discord.Spotify.color:1 discord.Spotify.colour:1 of -msgid "Returns the Spotify integration colour, as a :class:`Colour`." -msgstr "" - -#: discord.Spotify.colour:3 of -msgid "There is an alias for this named :attr:`color`" -msgstr "" - -#: discord.Spotify.color:3 of -msgid "There is an alias for this named :attr:`colour`" -msgstr "" - -#: discord.Spotify.name:1 of -msgid "The activity's name. This will always return \"Spotify\"." -msgstr "" - -#: discord.Spotify.title:1 of -#, fuzzy -msgid "The title of the song being played." -msgstr "更新される前のギルド。" - -#: discord.Spotify.artists:1 of -#, fuzzy -msgid "The artists of the song being played." -msgstr "更新される前のギルド。" - -#: discord.Spotify.artist:1 of -#, fuzzy -msgid "The artist of the song being played." -msgstr "更新される前のギルド。" - -#: discord.Spotify.artist:3 of -msgid "" -"This does not attempt to split the artist information into multiple " -"artists. Useful if there's only a single artist." -msgstr "" - -#: discord.Spotify.album:1 of -msgid "The album that the song being played belongs to." -msgstr "" - -#: discord.Spotify.album_cover_url:1 of -msgid "The album cover image URL from Spotify's CDN." -msgstr "" - -#: discord.Spotify.track_id:1 of -msgid "The track ID used by Spotify to identify this song." -msgstr "" - -#: discord.Spotify.start:1 of -msgid "When the user started playing this song in UTC." -msgstr "" - -#: discord.Spotify.end:1 of -msgid "When the user will stop playing this song in UTC." -msgstr "" - -#: discord.Spotify.duration:1 of -#, fuzzy -msgid "The duration of the song being played." -msgstr "更新される前のギルド。" - -#: discord.Spotify.party_id:1 of -#, fuzzy -msgid "The party ID of the listening party." -msgstr "ユーザーのプロフィール。" - -#: ../../api.rst:2696 -msgid "VoiceState" -msgstr "" - -#: discord.VoiceState:1 of -msgid "Represents a Discord user's voice state." -msgstr "" - -#: discord.VoiceState:5 of -msgid "Indicates if the user is currently deafened by the guild." -msgstr "" - -#: discord.VoiceState:11 of -msgid "Indicates if the user is currently muted by the guild." -msgstr "" - -#: discord.VoiceState:17 of -#, fuzzy -msgid "Indicates if the user is currently muted by their own accord." -msgstr "現在オーディオを再生しているかを表します。" - -#: discord.VoiceState:23 of -#, fuzzy -msgid "Indicates if the user is currently deafened by their own accord." -msgstr "メンバーが自身でマイクやスピーカーをミュートしたとき。" - -#: discord.VoiceState:29 of -#, fuzzy -msgid "Indicates if the user is currently streaming via 'Go Live' feature." -msgstr "現在オーディオを再生しているかを表します。" - -#: discord.VoiceState:37 of -#, fuzzy -msgid "Indicates if the user is currently broadcasting video." -msgstr "現在オーディオを再生しているかを表します。" - -#: discord.VoiceState:43 of -msgid "Indicates if the user is currently in the AFK channel in the guild." -msgstr "" - -#: discord.VoiceState:49 of -msgid "" -"The voice channel that the user is currently connected to. ``None`` if " -"the user is not currently in a voice channel." -msgstr "" - -#: ../../api.rst:2702 -msgid "Emoji" -msgstr "" - -#: discord.Emoji:1 of -msgid "Represents a custom emoji." -msgstr "" - -#: discord.Emoji:10 discord.PartialEmoji:12 of -msgid "Checks if two emoji are the same." -msgstr "" - -#: discord.Emoji:14 discord.PartialEmoji:16 of -msgid "Checks if two emoji are not the same." -msgstr "" - -#: discord.Emoji:18 discord.PartialEmoji:20 of -msgid "Return the emoji's hash." -msgstr "" - -#: discord.Emoji:22 of -msgid "" -"Returns an iterator of ``(field, value)`` pairs. This allows this class " -"to be used as an iterable in list/dict/etc constructions." -msgstr "" - -#: discord.Emoji:27 discord.PartialEmoji:24 of -msgid "Returns the emoji rendered for discord." -msgstr "" - -#: discord.Emoji:31 of -#, fuzzy -msgid "The name of the emoji." -msgstr "ギルドの名前。" - -#: discord.Emoji:43 of -msgid "" -"If colons are required to use this emoji in the client (:PJSalt: vs " -"PJSalt)." -msgstr "" - -#: discord.Emoji:49 of -msgid "Whether an emoji is animated or not." -msgstr "" - -#: discord.Emoji:55 of -msgid "If this emoji is managed by a Twitch integration." -msgstr "" - -#: discord.Emoji:61 of -#, fuzzy -msgid "The guild ID the emoji belongs to." -msgstr "絵文字が更新されたギルド。" - -#: discord.Emoji:67 of -msgid "Whether the emoji is available for use." -msgstr "" - -#: discord.Emoji:73 of -msgid "" -"The user that created the emoji. This can only be retrieved using " -":meth:`Guild.fetch_emoji` and having the " -":attr:`~Permissions.manage_emojis` permission." -msgstr "" - -#: discord.Emoji:76 of -#, fuzzy -msgid "Optional[:class:`User`]" -msgstr ":class:`str`" - -#: discord.Emoji.created_at:1 of -msgid "Returns the emoji's creation time in UTC." -msgstr "" - -#: discord.Emoji.url:1 of -msgid "Returns the asset of the emoji." -msgstr "" - -#: discord.Emoji.roles:1 of -msgid "A :class:`list` of roles that is allowed to use this emoji." -msgstr "" - -#: discord.Emoji.roles:3 of -msgid "If roles is empty, the emoji is unrestricted." -msgstr "" - -#: discord.Emoji.guild:1 of -#, fuzzy -msgid "The guild this emoji belongs to." -msgstr "絵文字が更新されたギルド。" - -#: discord.Emoji.is_usable:1 of -msgid ":class:`bool`: Whether the bot can use this emoji." -msgstr "" - -#: discord.Emoji.delete:3 of -msgid "Deletes the custom emoji." -msgstr "" - -#: discord.Emoji.delete:5 discord.Emoji.edit:5 of -msgid "You must have :attr:`~Permissions.manage_emojis` permission to do this." -msgstr "" - -#: discord.Emoji.delete:8 of -msgid "The reason for deleting this emoji. Shows up on the audit log." -msgstr "" - -#: discord.Emoji.delete:11 of -msgid "You are not allowed to delete emojis." -msgstr "" - -#: discord.Emoji.delete:12 of -msgid "An error occurred deleting the emoji." -msgstr "" - -#: discord.Emoji.edit:3 of -msgid "Edits the custom emoji." -msgstr "" - -#: discord.Emoji.edit:8 of -msgid "The new emoji name." -msgstr "" - -#: discord.Emoji.edit:12 of -msgid "The reason for editing this emoji. Shows up on the audit log." -msgstr "" - -#: discord.Emoji.edit:15 of -msgid "You are not allowed to edit emojis." -msgstr "" - -#: discord.Emoji.edit:16 of -msgid "An error occurred editing the emoji." -msgstr "" - -#: ../../api.rst:2708 -msgid "PartialEmoji" -msgstr "" - -#: discord.PartialEmoji:1 of -msgid "Represents a \"partial\" emoji." -msgstr "" - -#: discord.PartialEmoji:3 of -msgid "This model will be given in two scenarios:" -msgstr "" - -#: discord.PartialEmoji:5 of -msgid "\"Raw\" data events such as :func:`on_raw_reaction_add`" -msgstr "" - -#: discord.PartialEmoji:6 of -msgid "Custom emoji that the bot cannot see from e.g. :attr:`Message.reactions`" -msgstr "" - -#: discord.PartialEmoji:28 of -msgid "" -"The custom emoji name, if applicable, or the unicode codepoint of the " -"non-custom emoji. This can be ``None`` if the emoji got deleted (e.g. " -"removing a reaction with a deleted emoji)." -msgstr "" - -#: discord.PartialEmoji:36 of -msgid "Whether the emoji is animated or not." -msgstr "" - -#: discord.PartialEmoji:42 of -msgid "The ID of the custom emoji, if applicable." -msgstr "" - -#: discord.PartialEmoji.is_custom_emoji:1 of -#, fuzzy -msgid ":class:`bool`: Checks if this is a custom non-Unicode emoji." -msgstr ":class:`bool` -- ユーザーがBotアカウントであるかを表します。" - -#: discord.PartialEmoji.is_unicode_emoji:1 of -#, fuzzy -msgid ":class:`bool`: Checks if this is a Unicode emoji." -msgstr ":class:`bool` -- ユーザーがBotアカウントであるかを表します。" - -#: discord.PartialEmoji.url:1 of -msgid "Returns an asset of the emoji, if it is custom." -msgstr "" - -#: ../../api.rst:2714 -msgid "Role" -msgstr "" - -#: discord.Role:1 of -msgid "Represents a Discord role in a :class:`Guild`." -msgstr "" - -#: discord.Role:7 of -msgid "Checks if two roles are equal." -msgstr "" - -#: discord.Role:11 of -msgid "Checks if two roles are not equal." -msgstr "" - -#: discord.Role:15 of -msgid "Checks if a role is higher than another in the hierarchy." -msgstr "" - -#: discord.Role:19 of -msgid "Checks if a role is lower than another in the hierarchy." -msgstr "" - -#: discord.Role:23 of -msgid "Checks if a role is higher or equal to another in the hierarchy." -msgstr "" - -#: discord.Role:27 of -msgid "Checks if a role is lower or equal to another in the hierarchy." -msgstr "" - -#: discord.Role:31 of -msgid "Return the role's hash." -msgstr "役職のハッシュを返します。" - -#: discord.Role:35 of -msgid "Returns the role's name." -msgstr "役職の名前を返します。" - -#: discord.Role:39 of -#, fuzzy -msgid "The ID for the role." -msgstr "IDから取得したギルド。" - -#: discord.Role:45 of -#, fuzzy -msgid "The name of the role." -msgstr "ギルドの名前。" - -#: discord.Role:51 of -#, fuzzy -msgid "The guild the role belongs to." -msgstr "このプロフィールを持つ :class:`User` 。" - -#: discord.Role:57 of -msgid "Indicates if the role will be displayed separately from other members." -msgstr "" - -#: discord.Role:63 of -msgid "" -"The position of the role. This number is usually positive. The bottom " -"role has a position of 0." -msgstr "" - -#: discord.Role:70 of -msgid "" -"Indicates if the role is managed by the guild through some form of " -"integrations such as Twitch." -msgstr "" - -#: discord.Role:77 of -#, fuzzy -msgid "Indicates if the role can be mentioned by users." -msgstr "ボイスチャンネルに接続しているかどうかを表します。" - -#: discord.Role.is_default:1 of -#, fuzzy -msgid ":class:`bool`: Checks if the role is the default role." -msgstr ":class:`bool` -- ユーザーがBotアカウントであるかを表します。" - -#: discord.Role.permissions:1 of -#, fuzzy -msgid "Returns the role's permissions." -msgstr "役職の名前を返します。" - -#: discord.Role.colour:1 of -msgid "Returns the role colour. An alias exists under ``color``." -msgstr "" - -#: discord.Role.color:1 of -msgid "Returns the role color. An alias exists under ``colour``." -msgstr "" - -#: discord.Role.created_at:1 of -#, fuzzy -msgid "Returns the role's creation time in UTC." -msgstr "役職の名前を返します。" - -#: discord.Role.mention:1 of -msgid "Returns a string that allows you to mention a role." -msgstr "" - -#: discord.Role.members:1 of -#, fuzzy -msgid "Returns all the members with this role." -msgstr "ユーザー名とディスクリミネータを返します。" - -#: discord.Role.edit:3 of -msgid "Edits the role." -msgstr "" - -#: discord.Role.edit:10 of -msgid "Can now pass ``int`` to ``colour`` keyword-only parameter." -msgstr "" - -#: discord.Role.edit:13 of -msgid "The new role name to change to." -msgstr "" - -#: discord.Role.edit:15 of -msgid "The new permissions to change to." -msgstr "" - -#: discord.Role.edit:17 of -msgid "The new colour to change to. (aliased to color as well)" -msgstr "" - -#: discord.Role.edit:19 of -msgid "Indicates if the role should be shown separately in the member list." -msgstr "" - -#: discord.Role.edit:21 of -msgid "Indicates if the role should be mentionable by others." -msgstr "" - -#: discord.Role.edit:23 of -msgid "" -"The new role's position. This must be below your top role's position or " -"it will fail." -msgstr "" - -#: discord.Role.edit:26 of -msgid "The reason for editing this role. Shows up on the audit log." -msgstr "" - -#: discord.Role.edit:29 of -#, fuzzy -msgid "You do not have permissions to change the role." -msgstr ":exc:`.Forbidden` -- このWebhookを取得する権限がない。" - -#: discord.Role.edit:30 of -#, fuzzy -msgid "Editing the role failed." -msgstr "役職の名前を返します。" - -#: discord.Role.edit:31 of -msgid "" -"An invalid position was given or the default role was asked to be " -"moved." -msgstr "" - -#: discord.Role.delete:3 of -msgid "Deletes the role." -msgstr "" - -#: discord.Role.delete:8 of -msgid "The reason for deleting this role. Shows up on the audit log." -msgstr "" - -#: discord.Role.delete:11 of -#, fuzzy -msgid "You do not have permissions to delete the role." -msgstr ":exc:`.Forbidden` -- このWebhookを取得する権限がない。" - -#: discord.Role.delete:12 of -#, fuzzy -msgid "Deleting the role failed." -msgstr "役職の名前を返します。" - -#: ../../api.rst:2720 -msgid "TextChannel" -msgstr "" - -#: discord.TextChannel:1 of -msgid "Represents a Discord guild text channel." -msgstr "" - -#: discord.CategoryChannel:9 discord.DMChannel:7 discord.GroupChannel:7 -#: discord.TextChannel:7 discord.VoiceChannel:7 of -msgid "Checks if two channels are equal." -msgstr "" - -#: discord.CategoryChannel:13 discord.DMChannel:11 discord.GroupChannel:11 -#: discord.TextChannel:11 discord.VoiceChannel:11 of -msgid "Checks if two channels are not equal." -msgstr "" - -#: discord.DMChannel:15 discord.GroupChannel:15 discord.TextChannel:15 -#: discord.VoiceChannel:15 of -msgid "Returns the channel's hash." -msgstr "" - -#: discord.TextChannel:19 discord.VoiceChannel:19 of -msgid "Returns the channel's name." -msgstr "" - -#: discord.TextChannel:35 discord.VoiceChannel:35 of -#, fuzzy -msgid "The channel ID." -msgstr "テキストチャンネル。" - -#: discord.TextChannel:41 discord.VoiceChannel:41 of -msgid "The category channel ID this channel belongs to, if applicable." -msgstr "" - -#: discord.TextChannel:47 of -msgid "The channel's topic. ``None`` if it doesn't exist." -msgstr "" - -#: discord.TextChannel:60 of -msgid "" -"The last message ID of the message sent to this channel. It may *not* " -"point to an existing or valid message." -msgstr "" - -#: discord.TextChannel:67 of -msgid "" -"The number of seconds a member must wait between sending messages in this" -" channel. A value of `0` denotes that it is disabled. Bots and users with" -" :attr:`~Permissions.manage_channels` or " -":attr:`~Permissions.manage_messages` bypass slowmode." -msgstr "" - -#: discord.CategoryChannel.type:1 discord.DMChannel.type:1 -#: discord.GroupChannel.type:1 discord.TextChannel.type:1 -#: discord.VoiceChannel.type:1 of -#, fuzzy -msgid "The channel's Discord type." -msgstr "IDから取得したチャンネル。" - -#: discord.CategoryChannel.type:3 discord.DMChannel.type:3 -#: discord.GroupChannel.type:3 discord.PartialInviteChannel:40 -#: discord.TextChannel.type:3 discord.VoiceChannel.type:3 of -#, fuzzy -msgid ":class:`ChannelType`" -msgstr ":class:`.Invite`" - -#: discord.TextChannel.members:1 of -msgid "Returns all members that can see this channel." -msgstr "" - -#: discord.TextChannel.is_nsfw:1 of -#, fuzzy -msgid ":class:`bool`: Checks if the channel is NSFW." -msgstr ":class:`bool` -- ユーザーがBotアカウントであるかを表します。" - -#: discord.TextChannel.is_news:1 of -#, fuzzy -msgid ":class:`bool`: Checks if the channel is a news channel." -msgstr ":class:`bool` -- ユーザーがBotアカウントであるかを表します。" - -#: discord.TextChannel.last_message:1 of -msgid "Fetches the last message from this channel in cache." -msgstr "" - -#: discord.TextChannel.last_message:3 of -msgid "The message might not be valid or point to an existing message." -msgstr "" - -#: discord.TextChannel.last_message:5 of -msgid "Reliable Fetching" -msgstr "" - -#: discord.TextChannel.last_message:8 of -msgid "" -"For a slightly more reliable method of fetching the last message, " -"consider using either :meth:`history` or :meth:`fetch_message` with the " -":attr:`last_message_id` attribute." -msgstr "" - -#: discord.TextChannel.last_message:13 of -msgid "The last message in this channel or ``None`` if not found." -msgstr "" - -#: discord.CategoryChannel.edit:3 discord.TextChannel.edit:3 -#: discord.VoiceChannel.edit:3 of -msgid "Edits the channel." -msgstr "" - -#: discord.CategoryChannel.edit:5 discord.TextChannel.edit:5 -#: discord.VoiceChannel.edit:5 of -msgid "" -"You must have the :attr:`~Permissions.manage_channels` permission to use " -"this." -msgstr "" - -#: discord.CategoryChannel.edit:8 discord.TextChannel.edit:8 -#: discord.VoiceChannel.edit:8 of -msgid "The ``overwrites`` keyword-only parameter was added." -msgstr "" - -#: discord.TextChannel.edit:11 of -msgid "The ``type`` keyword-only parameter was added." -msgstr "" - -#: discord.TextChannel.edit:14 of -msgid "The new channel name." -msgstr "" - -#: discord.TextChannel.edit:18 discord.VoiceChannel.edit:17 of -msgid "The new channel's position." -msgstr "" - -#: discord.TextChannel.edit:22 discord.VoiceChannel.edit:19 of -msgid "" -"Whether to sync permissions with the channel's new or pre-existing " -"category. Defaults to ``False``." -msgstr "" - -#: discord.TextChannel.edit:25 discord.VoiceChannel.edit:22 of -msgid "The new category for this channel. Can be ``None`` to remove the category." -msgstr "" - -#: discord.TextChannel.edit:28 of -msgid "" -"Specifies the slowmode rate limit for user in this channel, in seconds. A" -" value of `0` disables slowmode. The maximum value possible is `21600`." -msgstr "" - -#: discord.TextChannel.edit:31 of -msgid "" -"Change the type of this text channel. Currently, only conversion between " -":attr:`ChannelType.text` and :attr:`ChannelType.news` is supported. This " -"is only available to guilds that contain ``NEWS`` in " -":attr:`Guild.features`." -msgstr "" - -#: discord.TextChannel.edit:35 discord.VoiceChannel.edit:25 of -msgid "The reason for editing this channel. Shows up on the audit log." -msgstr "" - -#: discord.CategoryChannel.edit:19 discord.TextChannel.edit:37 -#: discord.VoiceChannel.edit:27 of -msgid "" -"A :class:`dict` of target (either a role or a member) to " -":class:`PermissionOverwrite` to apply to the channel." -msgstr "" - -#: discord.TextChannel.edit:41 of -msgid "" -"If position is less than 0 or greater than the number of channels, or if" -" the permission overwrite information is not in proper form." -msgstr "" - -#: discord.TextChannel.edit:42 discord.VoiceChannel.edit:32 of -#, fuzzy -msgid "You do not have permissions to edit the channel." -msgstr ":exc:`.Forbidden` -- 指定のチャンネルを取得する権限がない。" - -#: discord.TextChannel.edit:43 discord.VoiceChannel.edit:33 of -#, fuzzy -msgid "Editing the channel failed." -msgstr ":exc:`.HTTPException` -- チャンネルの取得に失敗した。" - -#: discord.TextChannel.delete_messages:3 of -msgid "" -"Deletes a list of messages. This is similar to :meth:`Message.delete` " -"except it bulk deletes multiple messages." -msgstr "" - -#: discord.TextChannel.delete_messages:6 of -msgid "" -"As a special case, if the number of messages is 0, then nothing is done. " -"If the number of messages is 1 then single message delete is done. If " -"it's more than two, then bulk delete is used." -msgstr "" - -#: discord.TextChannel.delete_messages:10 of -msgid "" -"You cannot bulk delete more than 100 messages or messages that are older " -"than 14 days old." -msgstr "" - -#: discord.TextChannel.delete_messages:13 of -msgid "" -"You must have the :attr:`~Permissions.manage_messages` permission to use " -"this." -msgstr "" - -#: discord.TextChannel.delete_messages:16 of -msgid "Usable only by bot accounts." -msgstr "" - -#: discord.TextChannel.delete_messages:18 of -msgid "An iterable of messages denoting which ones to bulk delete." -msgstr "" - -#: discord.TextChannel.delete_messages:21 of -msgid "The number of messages to delete was more than 100." -msgstr "" - -#: discord.TextChannel.delete_messages:22 of -msgid "" -"You do not have proper permissions to delete the messages or you're " -"not using a bot account." -msgstr "" - -#: discord.TextChannel.delete_messages:23 of -msgid "If single delete, then the message was already deleted." -msgstr "" - -#: discord.TextChannel.delete_messages:24 of -#, fuzzy -msgid "Deleting the messages failed." -msgstr "削除されたメッセージ。" - -#: discord.TextChannel.purge:3 of -msgid "" -"Purges a list of messages that meet the criteria given by the predicate " -"``check``. If a ``check`` is not provided then all messages are deleted " -"without discrimination." -msgstr "" - -#: discord.TextChannel.purge:7 of -msgid "" -"You must have the :attr:`~Permissions.manage_messages` permission to " -"delete messages even if they are your own (unless you are a user " -"account). The :attr:`~Permissions.read_message_history` permission is " -"also needed to retrieve message history." -msgstr "" - -#: discord.TextChannel.purge:12 of -msgid "" -"Internally, this employs a different number of strategies depending on " -"the conditions met such as if a bulk delete is possible or if the account" -" is a user bot or not." -msgstr "" - -#: discord.TextChannel.purge:18 of -msgid "Deleting bot's messages ::" -msgstr "" - -#: discord.TextChannel.purge:26 of -msgid "" -"The number of messages to search through. This is not the number of " -"messages that will be deleted, though it can be." -msgstr "" - -#: discord.TextChannel.purge:29 of -msgid "" -"The function used to check if a message should be deleted. It must take a" -" :class:`Message` as its sole parameter." -msgstr "" - -#: discord.TextChannel.purge:32 of -msgid "Same as ``before`` in :meth:`history`." -msgstr "" - -#: discord.TextChannel.purge:34 of -msgid "Same as ``after`` in :meth:`history`." -msgstr "" - -#: discord.TextChannel.purge:36 of -msgid "Same as ``around`` in :meth:`history`." -msgstr "" - -#: discord.TextChannel.purge:38 of -msgid "Same as ``oldest_first`` in :meth:`history`." -msgstr "" - -#: discord.TextChannel.purge:40 of -msgid "" -"If ``True``, use bulk delete. Setting this to ``False`` is useful for " -"mass-deleting a bot's own messages without " -":attr:`Permissions.manage_messages`. When ``True``, will fall back to " -"single delete if current account is a user bot, or if messages are older " -"than two weeks." -msgstr "" - -#: discord.TextChannel.purge:46 of -msgid "You do not have proper permissions to do the actions required." -msgstr "" - -#: discord.TextChannel.purge:47 of -msgid "Purging the messages failed." -msgstr "" - -#: discord.TextChannel.purge:49 of -msgid "The list of messages that were deleted." -msgstr "" - -#: discord.TextChannel.purge:50 of -msgid "List[:class:`.Message`]" -msgstr "" - -#: discord.TextChannel.webhooks:3 of -msgid "Gets the list of webhooks from this channel." -msgstr "" - -#: discord.TextChannel.webhooks:9 of -msgid "The webhooks for this channel." -msgstr "" - -#: discord.TextChannel.create_webhook:3 of -msgid "Creates a webhook for this channel." -msgstr "" - -#: discord.TextChannel.create_webhook:7 of -msgid "Added the ``reason`` keyword-only parameter." -msgstr "" - -#: discord.TextChannel.create_webhook:10 of -msgid "The webhook's name." -msgstr "" - -#: discord.TextChannel.create_webhook:12 of -msgid "" -"A :term:`py:bytes-like object` representing the webhook's default avatar." -" This operates similarly to :meth:`~ClientUser.edit`." -msgstr "" - -#: discord.TextChannel.create_webhook:15 of -msgid "The reason for creating this webhook. Shows up in the audit logs." -msgstr "" - -#: discord.TextChannel.create_webhook:18 of -#, fuzzy -msgid "Creating the webhook failed." -msgstr ":exc:`.HTTPException` -- Webhookの取得に失敗した。" - -#: discord.TextChannel.create_webhook:19 of -#, fuzzy -msgid "You do not have permissions to create a webhook." -msgstr ":exc:`.Forbidden` -- このWebhookを取得する権限がない。" - -#: discord.TextChannel.create_webhook:21 discord.TextChannel.follow:22 of -msgid "The created webhook." -msgstr "" - -#: discord.TextChannel.follow:1 of -msgid "Follows a channel using a webhook." -msgstr "" - -#: discord.TextChannel.follow:3 of -#, fuzzy -msgid "Only news channels can be followed." -msgstr "チャンネルが作成されました。" - -#: discord.TextChannel.follow:7 of -msgid "" -"The webhook returned will not provide a token to do webhook actions, as " -"Discord does not provide it." -msgstr "" - -#: discord.TextChannel.follow:12 of -msgid "The channel you would like to follow from." -msgstr "" - -#: discord.TextChannel.follow:14 of -msgid "" -"The reason for following the channel. Shows up on the destination guild's" -" audit log. .. versionadded:: 1.4" -msgstr "" - -#: discord.TextChannel.follow:14 of -msgid "" -"The reason for following the channel. Shows up on the destination guild's" -" audit log." -msgstr "" - -#: discord.TextChannel.follow:19 of -msgid "Following the channel failed." -msgstr "" - -#: discord.TextChannel.follow:20 of -#, fuzzy -msgid "You do not have the permissions to create a webhook." -msgstr ":exc:`.Forbidden` -- このWebhookを取得する権限がない。" - -#: ../../api.rst:2734 -msgid "VoiceChannel" -msgstr "" - -#: discord.VoiceChannel:1 of -msgid "Represents a Discord guild voice channel." -msgstr "Discordサーバーのボイスチャンネルを表します。" - -#: discord.VoiceChannel.members:1 of -msgid "Returns all members that are currently inside this voice channel." -msgstr "" - -#: discord.VoiceChannel.voice_states:1 of -#, fuzzy -msgid "Returns a mapping of member IDs who have voice states in this channel." -msgstr "ボイスの状態が変わった `Member` 。" - -#: discord.VoiceChannel.voice_states:7 of -msgid "" -"This function is intentionally low level to replace :attr:`members` when " -"the member cache is unavailable." -msgstr "" - -#: discord.VoiceChannel.voice_states:10 of -#, fuzzy -msgid "The mapping of member ID to a voice state." -msgstr "ボイスの状態が変わった `Member` 。" - -#: discord.VoiceChannel.voice_states:11 of -msgid "Mapping[:class:`int`, :class:`VoiceState`]" -msgstr "" - -#: discord.VoiceChannel.edit:11 of -msgid "The new channel's name." -msgstr "" - -#: discord.VoiceChannel.edit:13 of -msgid "The new channel's bitrate." -msgstr "" - -#: discord.VoiceChannel.edit:15 of -msgid "The new channel's user limit." -msgstr "" - -#: discord.VoiceChannel.edit:31 of -msgid "If the permission overwrite information is not in proper form." -msgstr "" - -#: discord.VoiceChannel.connect:3 of -msgid "" -"Connects to voice and creates a :class:`VoiceClient` to establish your " -"connection to the voice server." -msgstr "" - -#: discord.VoiceChannel.connect:6 of -msgid "The timeout in seconds to wait for the voice endpoint." -msgstr "" - -#: discord.VoiceChannel.connect:8 of -msgid "" -"Whether the bot should automatically attempt a reconnect if a part of the" -" handshake fails or the gateway goes down." -msgstr "" - -#: discord.VoiceChannel.connect:12 of -msgid "" -"A type that subclasses :class:`~discord.VoiceProtocol` to connect with. " -"Defaults to :class:`~discord.VoiceClient`." -msgstr "" - -#: discord.VoiceChannel.connect:16 of -#, fuzzy -msgid "Could not connect to the voice channel in time." -msgstr ":class:`abc.Connectable` -- 接続しているボイスチャンネル。" - -#: discord.VoiceChannel.connect:17 of -#, fuzzy -msgid "You are already connected to a voice channel." -msgstr "メンバーがボイスチャンネルに参加したとき。" - -#: discord.VoiceChannel.connect:18 of -#, fuzzy -msgid "The opus library has not been loaded." -msgstr "opusライブラリがロードされているかを表します。" - -#: discord.VoiceChannel.connect:20 of -msgid "A voice client that is fully connected to the voice server." -msgstr "" - -#: discord.VoiceChannel.connect:21 of -#, fuzzy -msgid ":class:`~discord.VoiceProtocol`" -msgstr ":class:`~discord.User`" - -#: ../../api.rst:2741 -msgid "CategoryChannel" -msgstr "" - -#: discord.CategoryChannel:1 of -msgid "Represents a Discord channel category." -msgstr "Discordのチャンネルカテゴリを表します。" - -#: discord.CategoryChannel:3 of -msgid "These are useful to group channels to logical compartments." -msgstr "" - -#: discord.CategoryChannel:17 of -msgid "Returns the category's hash." -msgstr "カテゴリのハッシュを返します。" - -#: discord.CategoryChannel:21 of -msgid "Returns the category's name." -msgstr "カテゴリの名前を返します。" - -#: discord.CategoryChannel:25 of -#, fuzzy -msgid "The category name." -msgstr "カテゴリの名前を返します。" - -#: discord.CategoryChannel:31 of -#, fuzzy -msgid "The guild the category belongs to." -msgstr "更新された後のギルド。" - -#: discord.CategoryChannel:37 of -#, fuzzy -msgid "The category channel ID." -msgstr "新しいグループチャンネル。" - -#: discord.CategoryChannel:43 of -msgid "" -"The position in the category list. This is a number that starts at 0. " -"e.g. the top category is position 0." -msgstr "" - -#: discord.CategoryChannel.is_nsfw:1 of -#, fuzzy -msgid ":class:`bool`: Checks if the category is NSFW." -msgstr "カテゴリがNSFWであるかを返します。" - -#: discord.CategoryChannel.edit:11 of -msgid "The new category's name." -msgstr "" - -#: discord.CategoryChannel.edit:13 of -msgid "The new category's position." -msgstr "" - -#: discord.CategoryChannel.edit:15 of -msgid "To mark the category as NSFW or not." -msgstr "" - -#: discord.CategoryChannel.edit:17 of -msgid "The reason for editing this category. Shows up on the audit log." -msgstr "" - -#: discord.CategoryChannel.edit:23 of -msgid "If position is less than 0 or greater than the number of categories." -msgstr "" - -#: discord.CategoryChannel.edit:24 of -#, fuzzy -msgid "You do not have permissions to edit the category." -msgstr ":exc:`.Forbidden` -- 指定のチャンネルを取得する権限がない。" - -#: discord.CategoryChannel.edit:25 of -#, fuzzy -msgid "Editing the category failed." -msgstr "カテゴリの名前を返します。" - -#: discord.CategoryChannel.channels:1 of -msgid "Returns the channels that are under this category." -msgstr "" - -#: discord.CategoryChannel.channels:3 of -msgid "" -"These are sorted by the official Discord UI, which places voice channels " -"below the text channels." -msgstr "" - -#: discord.CategoryChannel.text_channels:1 of -msgid "Returns the text channels that are under this category." -msgstr "" - -#: discord.CategoryChannel.voice_channels:1 of -msgid "Returns the voice channels that are under this category." -msgstr "" - -#: discord.CategoryChannel.create_text_channel:3 of -msgid "" -"A shortcut method to :meth:`Guild.create_text_channel` to create a " -":class:`TextChannel` in the category." -msgstr "" - -#: discord.CategoryChannel.create_voice_channel:3 of -msgid "" -"A shortcut method to :meth:`Guild.create_voice_channel` to create a " -":class:`VoiceChannel` in the category." -msgstr "" - -#: ../../api.rst:2748 -msgid "DMChannel" -msgstr "" - -#: discord.DMChannel:1 of -msgid "Represents a Discord direct message channel." -msgstr "" - -#: discord.DMChannel:19 discord.GroupChannel:19 of -msgid "Returns a string representation of the channel" -msgstr "" - -#: discord.DMChannel:23 of -msgid "The user you are participating with in the direct message channel." -msgstr "" - -#: discord.DMChannel:35 of -#, fuzzy -msgid "The direct message channel ID." -msgstr "削除されたメッセージ。" - -#: discord.DMChannel.created_at:1 of -msgid "Returns the direct message channel's creation time in UTC." -msgstr "" - -#: discord.DMChannel.permissions_for:1 discord.GroupChannel.permissions_for:1 -#: of -msgid "Handles permission resolution for a :class:`User`." -msgstr "" - -#: discord.DMChannel.permissions_for:3 discord.GroupChannel.permissions_for:3 -#: of -msgid "This function is there for compatibility with other channel types." -msgstr "" - -#: discord.DMChannel.permissions_for:5 discord.GroupChannel.permissions_for:5 -#: of -msgid "Actual direct messages do not really have the concept of permissions." -msgstr "" - -#: discord.DMChannel.permissions_for:7 discord.GroupChannel.permissions_for:7 -#: of -msgid "This returns all the Text related permissions set to ``True`` except:" -msgstr "" - -#: discord.DMChannel.permissions_for:9 of -msgid "" -":attr:`~Permissions.send_tts_messages`: You cannot send TTS messages in a" -" DM." -msgstr "" - -#: discord.DMChannel.permissions_for:10 of -msgid "" -":attr:`~Permissions.manage_messages`: You cannot delete others messages " -"in a DM." -msgstr "" - -#: discord.DMChannel.permissions_for:12 of -msgid "" -"The user to check permissions for. This parameter is ignored but kept for" -" compatibility." -msgstr "" - -#: discord.DMChannel.permissions_for:16 of -msgid "The resolved permissions." -msgstr "" - -#: ../../api.rst:2762 -msgid "GroupChannel" -msgstr "" - -#: discord.GroupChannel:1 of -msgid "Represents a Discord group channel." -msgstr "" - -#: discord.GroupChannel:23 of -msgid "The users you are participating with in the group channel." -msgstr "" - -#: discord.GroupChannel:35 of -#, fuzzy -msgid "The group channel ID." -msgstr "新しいグループチャンネル。" - -#: discord.GroupChannel:41 of -#, fuzzy -msgid "The user that owns the group channel." -msgstr "新しいグループチャンネル。" - -#: discord.GroupChannel:47 of -#, fuzzy -msgid "The group channel's icon hash if provided." -msgstr "更新されたグループチャンネルの更新前情報。" - -#: discord.GroupChannel:53 of -#, fuzzy -msgid "The group channel's name if provided." -msgstr "更新されたグループチャンネルの更新後情報。" - -#: discord.GroupChannel.icon_url:1 of -msgid "Returns the channel's icon asset if available." -msgstr "" - -#: discord.GroupChannel.permissions_for:9 of -msgid "send_tts_messages: You cannot send TTS messages in a DM." -msgstr "" - -#: discord.GroupChannel.permissions_for:10 of -msgid "manage_messages: You cannot delete others messages in a DM." -msgstr "" - -#: discord.GroupChannel.permissions_for:12 of -msgid "This also checks the kick_members permission if the user is the owner." -msgstr "" - -#: discord.GroupChannel.permissions_for:14 of -msgid "The user to check permissions for." -msgstr "" - -#: discord.GroupChannel.permissions_for:17 of -msgid "The resolved permissions for the user." -msgstr "" - -#: discord.GroupChannel.add_recipients:3 of -msgid "Adds recipients to this group." -msgstr "" - -#: discord.GroupChannel.add_recipients:5 of -msgid "" -"A group can only have a maximum of 10 members. Attempting to add more " -"ends up in an exception. To add a recipient to the group, you must have a" -" relationship with the user of type :attr:`RelationshipType.friend`." -msgstr "" - -#: discord.GroupChannel.add_recipients:10 of -msgid "An argument list of users to add to this group." -msgstr "" - -#: discord.GroupChannel.add_recipients:13 of -msgid "Adding a recipient to this group failed." -msgstr "" - -#: discord.GroupChannel.remove_recipients:3 of -msgid "Removes recipients from this group." -msgstr "" - -#: discord.GroupChannel.remove_recipients:5 of -msgid "An argument list of users to remove from this group." -msgstr "" - -#: discord.GroupChannel.remove_recipients:8 of -msgid "Removing a recipient from this group failed." -msgstr "" - -#: discord.GroupChannel.edit:3 of -msgid "Edits the group." -msgstr "" - -#: discord.GroupChannel.edit:5 of -msgid "The new name to change the group to. Could be ``None`` to remove the name." -msgstr "" - -#: discord.GroupChannel.edit:8 of -msgid "" -"A :term:`py:bytes-like object` representing the new icon. Could be " -"``None`` to remove the icon." -msgstr "" - -#: discord.GroupChannel.edit:12 of -msgid "Editing the group failed." -msgstr "" - -#: discord.GroupChannel.leave:3 of -msgid "Leave the group." -msgstr "" - -#: discord.GroupChannel.leave:5 of -msgid "If you are the only one in the group, this deletes it as well." -msgstr "" - -#: discord.GroupChannel.leave:7 of -msgid "Leaving the group failed." -msgstr "" - -#: ../../api.rst:2776 -msgid "PartialInviteGuild" -msgstr "" - -#: discord.PartialInviteGuild:1 of -msgid "Represents a \"partial\" invite guild." -msgstr "" - -#: discord.PartialInviteChannel:3 discord.PartialInviteGuild:3 of -msgid "" -"This model will be given when the user is not part of the guild the " -":class:`Invite` resolves to." -msgstr "" - -#: discord.PartialInviteGuild:10 of -msgid "Checks if two partial guilds are the same." -msgstr "" - -#: discord.PartialInviteGuild:14 of -msgid "Checks if two partial guilds are not the same." -msgstr "" - -#: discord.PartialInviteGuild:18 of -msgid "Return the partial guild's hash." -msgstr "" - -#: discord.PartialInviteGuild:22 of -msgid "Returns the partial guild's name." -msgstr "" - -#: discord.PartialInviteGuild:26 of -msgid "The partial guild's name." -msgstr "" - -#: discord.PartialInviteGuild:32 of -#, fuzzy -msgid "The partial guild's ID." -msgstr "ギルドのウィジェット。" - -#: discord.PartialInviteGuild:38 of -msgid "The partial guild's verification level." -msgstr "" - -#: discord.PartialInviteGuild:44 of -msgid "" -"A list of features the guild has. See :attr:`Guild.features` for more " -"information." -msgstr "" - -#: discord.PartialInviteGuild:50 of -msgid "The partial guild's icon." -msgstr "" - -#: discord.PartialInviteGuild:56 of -msgid "The partial guild's banner." -msgstr "" - -#: discord.PartialInviteGuild:62 of -#, fuzzy -msgid "The partial guild's invite splash." -msgstr "ギルドの招待時のスプラッシュ画像の変更" - -#: discord.PartialInviteGuild:68 of -msgid "The partial guild's description." -msgstr "" - -#: discord.PartialInviteGuild.is_icon_animated:1 of -msgid ":class:`bool`: Returns ``True`` if the guild has an animated icon." -msgstr "" - -#: discord.PartialInviteGuild.icon_url_as:1 of -msgid "The same operation as :meth:`Guild.icon_url_as`." -msgstr "" - -#: discord.PartialInviteGuild.banner_url_as:1 of -msgid "The same operation as :meth:`Guild.banner_url_as`." -msgstr "" - -#: discord.PartialInviteGuild.splash_url_as:1 of -msgid "The same operation as :meth:`Guild.splash_url_as`." -msgstr "" - -#: ../../api.rst:2782 -msgid "PartialInviteChannel" -msgstr "" - -#: discord.PartialInviteChannel:1 of -msgid "Represents a \"partial\" invite channel." -msgstr "" - -#: discord.PartialInviteChannel:10 discord.WidgetChannel:7 of -msgid "Checks if two partial channels are the same." -msgstr "" - -#: discord.PartialInviteChannel:14 discord.WidgetChannel:11 of -msgid "Checks if two partial channels are not the same." -msgstr "" - -#: discord.PartialInviteChannel:18 discord.WidgetChannel:15 of -msgid "Return the partial channel's hash." -msgstr "" - -#: discord.PartialInviteChannel:22 discord.WidgetChannel:19 of -msgid "Returns the partial channel's name." -msgstr "" - -#: discord.PartialInviteChannel:26 of -#, fuzzy -msgid "The partial channel's name." -msgstr "更新されたギルドの更新後情報。" - -#: discord.PartialInviteChannel:32 of -#, fuzzy -msgid "The partial channel's ID." -msgstr "更新されたギルドの更新前情報。" - -#: discord.PartialInviteChannel:38 of -#, fuzzy -msgid "The partial channel's type." -msgstr "更新されたギルドの更新後情報。" - -#: ../../api.rst:2788 -msgid "Invite" -msgstr "" - -#: discord.Invite:1 of -msgid "Represents a Discord :class:`Guild` or :class:`abc.GuildChannel` invite." -msgstr "" - -#: discord.Invite:10 of -msgid "Checks if two invites are equal." -msgstr "" - -#: discord.Invite:14 of -msgid "Checks if two invites are not equal." -msgstr "" - -#: discord.Invite:18 of -msgid "Returns the invite hash." -msgstr "" - -#: discord.Invite:22 of -msgid "Returns the invite URL." -msgstr "" - -#: discord.Invite:24 of -msgid "The following table illustrates what methods will obtain the attributes:" -msgstr "" - -#: discord.Invite:27 of -msgid "Attribute" -msgstr "" - -#: discord.Invite:27 of -msgid "Method" -msgstr "" - -#: discord.Invite:29 of -msgid ":attr:`max_age`" -msgstr ":attr:`max_age`" - -#: discord.Invite:29 discord.Invite:31 discord.Invite:33 discord.Invite:35 -#: discord.Invite:37 of -msgid ":meth:`abc.GuildChannel.invites`\\, :meth:`Guild.invites`" -msgstr "" - -#: discord.Invite:31 of -msgid ":attr:`max_uses`" -msgstr ":attr:`max_uses`" - -#: discord.Invite:33 of -msgid ":attr:`created_at`" -msgstr ":attr:`created_at`" - -#: discord.Invite:35 of -msgid ":attr:`temporary`" -msgstr ":attr:`temporary`" - -#: discord.Invite:37 of -msgid ":attr:`uses`" -msgstr ":attr:`uses`" - -#: discord.Invite:39 of -msgid ":attr:`approximate_member_count`" -msgstr ":attr:`approximate_member_count`" - -#: discord.Invite:39 discord.Invite:41 of -msgid ":meth:`Client.fetch_invite`" -msgstr "" - -#: discord.Invite:41 of -msgid ":attr:`approximate_presence_count`" -msgstr ":attr:`approximate_presence_count`" - -#: discord.Invite:44 of -msgid "If it's not in the table above then it is available by all methods." -msgstr "" - -#: discord.Invite:48 of -msgid "" -"How long the before the invite expires in seconds. A value of 0 indicates" -" that it doesn't expire." -msgstr "" - -#: discord.Invite:54 of -msgid "The URL fragment used for the invite." -msgstr "" - -#: discord.Invite:60 of -msgid "" -"The guild the invite is for. Can be ``None`` if it's from a group direct " -"message." -msgstr "" - -#: discord.Invite:62 of -msgid "" -"Optional[Union[:class:`Guild`, :class:`Object`, " -":class:`PartialInviteGuild`]]" -msgstr "" - -#: discord.Invite:66 of -#, fuzzy -msgid "Indicates if the invite has been revoked." -msgstr "opusライブラリがロードされているかを表します。" - -#: discord.Invite:72 of -msgid "A datetime object denoting the time the invite was created." -msgstr "" - -#: discord.Invite:78 of -msgid "" -"Indicates that the invite grants temporary membership. If ``True``, " -"members who joined via this invite will be kicked upon disconnect." -msgstr "" - -#: discord.Invite:85 of -msgid "How many times the invite has been used." -msgstr "" - -#: discord.Invite:91 of -msgid "How many times the invite can be used." -msgstr "" - -#: discord.Invite:103 of -msgid "The approximate number of members in the guild." -msgstr "" - -#: discord.Invite:109 of -msgid "" -"The approximate number of members currently active in the guild. This " -"includes idle, dnd, online, and invisible members. Offline members are " -"excluded." -msgstr "" - -#: discord.Invite:116 of -#, fuzzy -msgid "The channel the invite is for." -msgstr "権限を確認したいチャンネル。" - -#: discord.Invite:118 of -#, fuzzy -msgid "" -"Union[:class:`abc.GuildChannel`, :class:`Object`, " -":class:`PartialInviteChannel`]" -msgstr "Union[:class:`.abc.GuildChannel`, :class:`.abc.PrivateChannel`]" - -#: discord.Invite.id:1 of -msgid "Returns the proper code portion of the invite." -msgstr "" - -#: discord.Invite.url:1 of -msgid "A property that retrieves the invite URL." -msgstr "" - -#: discord.Invite.delete:3 of -msgid "Revokes the instant invite." -msgstr "" - -#: discord.Invite.delete:5 of -msgid "" -"You must have the :attr:`~Permissions.manage_channels` permission to do " -"this." -msgstr "" - -#: discord.Invite.delete:7 of -msgid "The reason for deleting this invite. Shows up on the audit log." -msgstr "" - -#: ../../api.rst:2794 -msgid "Template" -msgstr "" - -#: discord.Template:1 of -#, fuzzy -msgid "Represents a Discord template." -msgstr "Discordの埋め込みを表します。" - -#: discord.Template:13 of -msgid "How many times the template has been used." -msgstr "" - -#: discord.Template:19 of -#, fuzzy -msgid "The name of the template." -msgstr "フィールドの名前。" - -#: discord.Template:25 of -#, fuzzy -msgid "The description of the template." -msgstr "更新後のメッセージ。" - -#: discord.Template:31 of -#, fuzzy -msgid "The creator of the template." -msgstr "リアクションの現在の状態。" - -#: discord.Template:37 of -#, fuzzy -msgid "When the template was created." -msgstr "新しい役職の作成。" - -#: discord.Template:43 of -msgid "" -"When the template was last updated (referred to as \"last synced\" in the" -" client)." -msgstr "" - -#: discord.Template:49 of -#, fuzzy -msgid "The source guild." -msgstr "ギルドのID。" - -#: discord.Template.create_guild:3 of -#, fuzzy -msgid "Creates a :class:`.Guild` using the template." -msgstr ":class:`.Guild` を作成します。" - -#: ../../api.rst:2800 -msgid "WidgetChannel" -msgstr "" - -#: discord.WidgetChannel:1 of -msgid "Represents a \"partial\" widget channel." -msgstr "" - -#: discord.WidgetChannel:23 of -#, fuzzy -msgid "The channel's ID." -msgstr "テキストチャンネル。" - -#: discord.WidgetChannel:35 of -msgid "The channel's position" -msgstr "" - -#: ../../api.rst:2806 -msgid "WidgetMember" -msgstr "" - -#: discord.WidgetMember:1 of -msgid "Represents a \"partial\" member of the widget's guild." -msgstr "" - -#: discord.WidgetMember:7 of -msgid "Checks if two widget members are the same." -msgstr "" - -#: discord.WidgetMember:11 of -msgid "Checks if two widget members are not the same." -msgstr "" - -#: discord.WidgetMember:15 of -msgid "Return the widget member's hash." -msgstr "" - -#: discord.WidgetMember:19 of -msgid "Returns the widget member's `name#discriminator`." -msgstr "" - -#: discord.WidgetMember:23 of -#, fuzzy -msgid "The member's ID." -msgstr "メンバーが退席中。" - -#: discord.WidgetMember:29 of -#, fuzzy -msgid "The member's username." -msgstr "メンバーがオンライン。" - -#: discord.WidgetMember:35 of -#, fuzzy -msgid "The member's discriminator." -msgstr "ユーザー名とディスクリミネータを返します。" - -#: discord.WidgetMember:41 of -#, fuzzy -msgid "Whether the member is a bot." -msgstr "メンバーがオンライン。" - -#: discord.WidgetMember:47 of -#, fuzzy -msgid "The member's status." -msgstr "メンバーが退席中。" - -#: discord.WidgetMember:53 of -#, fuzzy -msgid "The member's nickname." -msgstr "メンバーがオンライン。" - -#: discord.WidgetMember:59 of -msgid "The member's avatar hash." -msgstr "" - -#: discord.WidgetMember:65 of -#, fuzzy -msgid "The member's activity." -msgstr "メンバーが退席中。" - -#: discord.WidgetMember:67 of -msgid "Optional[Union[:class:`BaseActivity`, :class:`Spotify`]]" -msgstr "" - -#: discord.WidgetMember:71 of -msgid "Whether the member is currently deafened." -msgstr "" - -#: discord.WidgetMember:77 of -msgid "Whether the member is currently muted." -msgstr "" - -#: discord.WidgetMember:83 of -msgid "Whether the member is currently being suppressed." -msgstr "" - -#: discord.WidgetMember:89 of -#, fuzzy -msgid "Which channel the member is connected to." -msgstr "ボイスチャンネルに接続しているかどうかを表します。" - -#: discord.WidgetMember.display_name:1 of -#, fuzzy -msgid "Returns the member's display name." -msgstr "役職の名前を返します。" - -#: ../../api.rst:2813 -msgid "Widget" -msgstr "" - -#: discord.Widget:1 of -msgid "Represents a :class:`Guild` widget." -msgstr "" - -#: discord.Widget:7 of -msgid "Checks if two widgets are the same." -msgstr "" - -#: discord.Widget:11 of -msgid "Checks if two widgets are not the same." -msgstr "" - -#: discord.Widget:15 of -msgid "Returns the widget's JSON URL." -msgstr "" - -#: discord.Widget:25 of -#, fuzzy -msgid "The guild's name." -msgstr "ギルドのウィジェット。" - -#: discord.Widget:31 of -msgid "The accessible voice channels in the guild." -msgstr "" - -#: discord.Widget:33 of -msgid "Optional[List[:class:`WidgetChannel`]]" -msgstr "" - -#: discord.Widget:37 of -msgid "" -"The online members in the server. Offline members do not appear in the " -"widget." -msgstr "" - -#: discord.Widget:42 of -msgid "" -"Due to a Discord limitation, if this data is available the users will be " -"\"anonymized\" with linear IDs and discriminator information being " -"incorrect. Likewise, the number of members retrieved is capped." -msgstr "" - -#: discord.Widget:47 of -msgid "Optional[List[:class:`Member`]]" -msgstr "" - -#: discord.Widget.created_at:1 of -msgid "Returns the member's creation time in UTC." -msgstr "" - -#: discord.Widget.json_url:1 of -#, fuzzy -msgid "The JSON URL of the widget." -msgstr "フィールドの名前。" - -#: discord.Widget.invite_url:1 of -msgid "The invite URL for the guild, if available." -msgstr "" - -#: discord.Widget.fetch_invite:3 of -msgid "" -"Retrieves an :class:`Invite` from a invite URL or ID. This is the same as" -" :meth:`Client.fetch_invite`; the invite code is abstracted away." -msgstr "" - -#: discord.Widget.fetch_invite:7 of -msgid "" -"Whether to include count information in the invite. This fills the " -":attr:`Invite.approximate_member_count` and " -":attr:`Invite.approximate_presence_count` fields." -msgstr "" - -#: ../../api.rst:2819 -msgid "MessageReference" -msgstr "" - -#: discord.MessageReference:1 of -msgid "Represents a reference to a :class:`Message`." -msgstr "" - -#: discord.MessageReference:7 of -msgid "The id of the message referenced." -msgstr "" - -#: discord.MessageReference:13 of -#, fuzzy -msgid "The channel id of the message referenced." -msgstr "更新後のメッセージ。" - -#: discord.MessageReference:19 of -msgid "The guild id of the message referenced." -msgstr "" - -#: discord.MessageReference.cached_message:1 discord.RawMessageDeleteEvent:23 -#: discord.RawMessageUpdateEvent:25 of -msgid "The cached message, if found in the internal message cache." -msgstr "" - -#: ../../api.rst:2824 -msgid "RawMessageDeleteEvent" -msgstr "" - -#: discord.RawMessageDeleteEvent:1 of -msgid "Represents the event payload for a :func:`on_raw_message_delete` event." -msgstr "" - -#: discord.RawMessageDeleteEvent:5 of -msgid "The channel ID where the deletion took place." -msgstr "" - -#: discord.RawMessageDeleteEvent:11 of -msgid "The guild ID where the deletion took place, if applicable." -msgstr "" - -#: discord.RawMessageDeleteEvent:17 of -#, fuzzy -msgid "The message ID that got deleted." -msgstr "削除されたメッセージのリスト。" - -#: ../../api.rst:2830 -msgid "RawBulkMessageDeleteEvent" -msgstr "" - -#: discord.RawBulkMessageDeleteEvent:1 of -msgid "" -"Represents the event payload for a :func:`on_raw_bulk_message_delete` " -"event." -msgstr "" - -#: discord.RawBulkMessageDeleteEvent:5 of -#, fuzzy -msgid "A :class:`set` of the message IDs that were deleted." -msgstr "削除されたメッセージのリスト。" - -#: discord.RawBulkMessageDeleteEvent:7 of -#, fuzzy -msgid "Set[:class:`int`]" -msgstr ":class:`str`" - -#: discord.RawBulkMessageDeleteEvent:11 of -msgid "The channel ID where the message got deleted." -msgstr "" - -#: discord.RawBulkMessageDeleteEvent:17 of -msgid "The guild ID where the message got deleted, if applicable." -msgstr "" - -#: discord.RawBulkMessageDeleteEvent:23 of -msgid "The cached messages, if found in the internal message cache." -msgstr "" - -#: discord.RawBulkMessageDeleteEvent:25 of -#, fuzzy -msgid "List[:class:`Message`]" -msgstr ":class:`bytes`" - -#: ../../api.rst:2836 -msgid "RawMessageUpdateEvent" -msgstr "" - -#: discord.RawMessageUpdateEvent:1 of -msgid "Represents the payload for a :func:`on_raw_message_edit` event." -msgstr "" - -#: discord.RawMessageUpdateEvent:5 of -#, fuzzy -msgid "The message ID that got updated." -msgstr "Banが解除されたユーザー。" - -#: discord.RawMessageUpdateEvent:11 of -msgid "The channel ID where the update took place." -msgstr "" - -#: discord.RawMessageUpdateEvent:19 of -#, fuzzy -msgid "" -"The raw data given by the `gateway " -"`_" -msgstr "" -"このイベントの性質は、本質的に生表現のため、データのパラメータは `ゲートウェイ " -"`_ " -"によって与えられた生データと一致します。" - -#: ../../api.rst:2842 -msgid "RawReactionActionEvent" -msgstr "" - -#: discord.RawReactionActionEvent:1 of -msgid "" -"Represents the payload for a :func:`on_raw_reaction_add` or " -":func:`on_raw_reaction_remove` event." -msgstr "" - -#: discord.RawReactionActionEvent:6 of -#, fuzzy -msgid "The message ID that got or lost a reaction." -msgstr "リアクションが削除されたメッセージ。" - -#: discord.RawReactionActionEvent:12 of -#, fuzzy -msgid "The user ID who added the reaction or whose reaction was removed." -msgstr "リアクションを追加したユーザー。" - -#: discord.RawReactionActionEvent:18 of -#, fuzzy -msgid "The channel ID where the reaction got added or removed." -msgstr "作成、または削除されたギルドチャンネル。" - -#: discord.RawReactionActionEvent:24 of -msgid "The guild ID where the reaction got added or removed, if applicable." -msgstr "" - -#: discord.RawReactionActionEvent:30 of -msgid "The custom or unicode emoji being used." -msgstr "" - -#: discord.RawReactionActionEvent:32 discord.RawReactionClearEmojiEvent:27 of -#, fuzzy -msgid ":class:`PartialEmoji`" -msgstr ":class:`.Profile`" - -#: discord.RawReactionActionEvent:36 of -msgid "" -"The member who added the reaction. Only available if `event_type` is " -"`REACTION_ADD` and the reaction is inside a guild." -msgstr "" - -#: discord.RawReactionActionEvent:44 of -msgid "" -"The event type that triggered this action. Can be ``REACTION_ADD`` for " -"reaction addition or ``REACTION_REMOVE`` for reaction removal." -msgstr "" - -#: ../../api.rst:2848 -msgid "RawReactionClearEvent" -msgstr "" - -#: discord.RawReactionClearEvent:1 of -msgid "Represents the payload for a :func:`on_raw_reaction_clear` event." -msgstr "" - -#: discord.RawReactionClearEmojiEvent:7 discord.RawReactionClearEvent:5 of -#, fuzzy -msgid "The message ID that got its reactions cleared." -msgstr "リアクションが削除されたメッセージ。" - -#: discord.RawReactionClearEmojiEvent:13 discord.RawReactionClearEvent:11 of -#, fuzzy -msgid "The channel ID where the reactions got cleared." -msgstr "リアクションが削除されたメッセージ。" - -#: discord.RawReactionClearEmojiEvent:19 discord.RawReactionClearEvent:17 of -#, fuzzy -msgid "The guild ID where the reactions got cleared." -msgstr "作成、または削除されたギルドチャンネル。" - -#: ../../api.rst:2854 -msgid "RawReactionClearEmojiEvent" -msgstr "" - -#: discord.RawReactionClearEmojiEvent:1 of -msgid "Represents the payload for a :func:`on_raw_reaction_clear_emoji` event." -msgstr "" - -#: discord.RawReactionClearEmojiEvent:25 of -msgid "The custom or unicode emoji being removed." -msgstr "" - -#: ../../api.rst:2863 -msgid "Data Classes" -msgstr "データクラス" - -#: ../../api.rst:2865 -msgid "Some classes are just there to be data containers, this lists them." -msgstr "" - -#: ../../api.rst:2867 -msgid "" -"Unlike :ref:`models ` you are allowed to create most " -"of these yourself, even if they can also be used to hold attributes." -msgstr "" - -#: ../../api.rst:2873 -msgid "" -"The only exception to this rule is :class:`abc.Snowflake`, which is made " -"with dynamic attributes in mind." -msgstr "" - -#: ../../api.rst:2878 -msgid "Object" -msgstr "" - -#: discord.Object:1 of -msgid "Represents a generic Discord object." -msgstr "" - -#: discord.Object:3 of -msgid "" -"The purpose of this class is to allow you to create 'miniature' versions " -"of data classes if you want to pass in just an ID. Most functions that " -"take in a specific data class with an ID can also take in this class as a" -" substitute instead. Note that even though this is the case, not all " -"objects (if any) actually inherit from this class." -msgstr "" - -#: discord.Object:9 of -msgid "" -"There are also some cases where some websocket events are received in " -":issue:`strange order <21>` and when such events happened you would " -"receive this class rather than the actual data class. These cases are " -"extremely rare." -msgstr "" - -#: discord.Object:18 of -msgid "Checks if two objects are equal." -msgstr "二つのオブジェクトが等しいか比較します。" - -#: discord.Object:22 of -msgid "Checks if two objects are not equal." -msgstr "二つのオブジェクトが等しいものでないか比較します。" - -#: discord.Object:26 of -msgid "Returns the object's hash." -msgstr "オブジェクトのハッシュを返します。" - -#: discord.Object:30 of -#, fuzzy -msgid "The ID of the object." -msgstr "ユーザーのプロフィール。" - -#: discord.Object.created_at:1 of -#, fuzzy -msgid "Returns the snowflake's creation time in UTC." -msgstr "役職の名前を返します。" - -#: ../../api.rst:2884 -msgid "Embed" -msgstr "" - -#: discord.Embed:1 of -msgid "Represents a Discord embed." -msgstr "Discordの埋め込みを表します。" - -#: discord.Embed:7 of -msgid "" -"Returns the total size of the embed. Useful for checking if it's within " -"the 6000 character limit." -msgstr "" - -#: discord.Embed:10 of -msgid "" -"Certain properties return an ``EmbedProxy``, a type that acts similar to " -"a regular :class:`dict` except using dotted access, e.g. " -"``embed.author.icon_url``. If the attribute is invalid or empty, then a " -"special sentinel value is returned, :attr:`Embed.Empty`." -msgstr "" - -#: discord.Embed:16 of -msgid "" -"For ease of use, all parameters that expect a :class:`str` are implicitly" -" casted to :class:`str` for you." -msgstr "使いやすさを考慮して、strが渡されることを想定されたすべてのパラメータは、暗黙的にstrにキャストされます。" - -#: discord.Embed:21 of -msgid "The title of the embed. This can be set during initialisation." -msgstr "" - -#: discord.Embed:28 of -msgid "" -"The type of embed. Usually \"rich\". This can be set during " -"initialisation." -msgstr "" - -#: discord.Embed:35 of -msgid "The description of the embed. This can be set during initialisation." -msgstr "" - -#: discord.Embed:42 of -msgid "The URL of the embed. This can be set during initialisation." -msgstr "" - -#: discord.Embed:49 of -msgid "" -"The timestamp of the embed content. This could be a naive or aware " -"datetime." -msgstr "" - -#: discord.Embed:55 of -msgid "" -"The colour code of the embed. Aliased to ``color`` as well. This can be " -"set during initialisation." -msgstr "" - -#: discord.Embed:58 of -#, fuzzy -msgid "Union[:class:`Colour`, :class:`int`]" -msgstr "Union[:class:`.abc.GuildChannel`, :class:`.abc.PrivateChannel`]" - -#: discord.Embed:62 of -msgid "" -"A special sentinel value used by ``EmbedProxy`` and this class to denote " -"that the value or attribute is empty." -msgstr "" - -#: discord.Embed.from_dict:1 of -msgid "" -"Converts a :class:`dict` to a :class:`Embed` provided it is in the format" -" that Discord expects it to be in." -msgstr "" - -#: discord.Embed.from_dict:4 of -msgid "" -"You can find out about this format in the `official Discord " -"documentation`__." -msgstr "" - -#: discord.Embed.from_dict:10 of -msgid "The dictionary to convert into an embed." -msgstr "" - -#: discord.Embed.copy:1 of -msgid "Returns a shallow copy of the embed." -msgstr "" - -#: discord.Embed.footer:1 of -msgid "Returns an ``EmbedProxy`` denoting the footer contents." -msgstr "" - -#: discord.Embed.footer:3 of -msgid "See :meth:`set_footer` for possible values you can access." -msgstr "" - -#: discord.Embed.author:5 discord.Embed.fields:5 discord.Embed.footer:5 -#: discord.Embed.image:10 discord.Embed.provider:5 discord.Embed.thumbnail:10 -#: discord.Embed.video:9 of -msgid "If the attribute has no value then :attr:`Empty` is returned." -msgstr "" - -#: discord.Embed.author:7 discord.Embed.footer:7 discord.Embed.image:12 -#: discord.Embed.provider:7 discord.Embed.thumbnail:12 discord.Embed.video:11 -#: of -msgid "Union[:class:`EmbedProxy`, :attr:`Empty`]" -msgstr "" - -#: discord.Embed.set_footer:1 of -msgid "Sets the footer for the embed content." -msgstr "" - -#: discord.Embed.add_field:3 discord.Embed.insert_field_at:3 -#: discord.Embed.remove_author:3 discord.Embed.set_author:3 -#: discord.Embed.set_field_at:5 discord.Embed.set_footer:3 -#: discord.Embed.set_image:3 discord.Embed.set_thumbnail:3 of -msgid "" -"This function returns the class instance to allow for fluent-style " -"chaining." -msgstr "" - -#: discord.Embed.set_footer:6 of -msgid "The footer text." -msgstr "フッターテキスト。" - -#: discord.Embed.set_footer:8 of -msgid "The URL of the footer icon. Only HTTP(S) is supported." -msgstr "" - -#: discord.Embed.image:1 of -msgid "Returns an ``EmbedProxy`` denoting the image contents." -msgstr "" - -#: discord.Embed.image:3 discord.Embed.thumbnail:3 of -msgid "Possible attributes you can access are:" -msgstr "" - -#: discord.Embed.image:5 discord.Embed.thumbnail:5 of -msgid "``url``" -msgstr "" - -#: discord.Embed.image:6 discord.Embed.thumbnail:6 of -msgid "``proxy_url``" -msgstr "" - -#: discord.Embed.image:7 discord.Embed.thumbnail:7 of -msgid "``width``" -msgstr "" - -#: discord.Embed.image:8 discord.Embed.thumbnail:8 of -msgid "``height``" -msgstr "" - -#: discord.Embed.set_image:1 of -msgid "Sets the image for the embed content." -msgstr "" - -#: discord.Embed.set_image:6 of -msgid "Passing :attr:`Empty` removes the image." -msgstr "" - -#: discord.Embed.set_image:9 of -msgid "The source URL for the image. Only HTTP(S) is supported." -msgstr "" - -#: discord.Embed.thumbnail:1 of -msgid "Returns an ``EmbedProxy`` denoting the thumbnail contents." -msgstr "" - -#: discord.Embed.set_thumbnail:1 of -msgid "Sets the thumbnail for the embed content." -msgstr "" - -#: discord.Embed.set_thumbnail:6 of -msgid "Passing :attr:`Empty` removes the thumbnail." -msgstr "" - -#: discord.Embed.set_thumbnail:9 of -msgid "The source URL for the thumbnail. Only HTTP(S) is supported." -msgstr "" - -#: discord.Embed.video:1 of -msgid "Returns an ``EmbedProxy`` denoting the video contents." -msgstr "" - -#: discord.Embed.video:3 of -msgid "Possible attributes include:" -msgstr "" - -#: discord.Embed.video:5 of -msgid "``url`` for the video URL." -msgstr "" - -#: discord.Embed.video:6 of -msgid "``height`` for the video height." -msgstr "" - -#: discord.Embed.video:7 of -msgid "``width`` for the video width." -msgstr "" - -#: discord.Embed.provider:1 of -msgid "Returns an ``EmbedProxy`` denoting the provider contents." -msgstr "" - -#: discord.Embed.provider:3 of -msgid "The only attributes that might be accessed are ``name`` and ``url``." -msgstr "" - -#: discord.Embed.author:1 of -msgid "Returns an ``EmbedProxy`` denoting the author contents." -msgstr "" - -#: discord.Embed.author:3 of -msgid "See :meth:`set_author` for possible values you can access." -msgstr "" - -#: discord.Embed.set_author:1 of -msgid "Sets the author for the embed content." -msgstr "" - -#: discord.Embed.set_author:6 of -msgid "The name of the author." -msgstr "" - -#: discord.Embed.set_author:8 of -msgid "The URL for the author." -msgstr "" - -#: discord.Embed.set_author:10 of -msgid "The URL of the author icon. Only HTTP(S) is supported." -msgstr "" - -#: discord.Embed.remove_author:1 of -#, fuzzy -msgid "Clears embed's author information." -msgstr "Botのアプリケーション情報。" - -#: discord.Embed.fields:1 of -msgid "Returns a :class:`list` of ``EmbedProxy`` denoting the field contents." -msgstr "" - -#: discord.Embed.fields:3 of -msgid "See :meth:`add_field` for possible values you can access." -msgstr "" - -#: discord.Embed.fields:7 of -msgid "Union[List[:class:`EmbedProxy`], :attr:`Empty`]" -msgstr "" - -#: discord.Embed.add_field:1 of -msgid "Adds a field to the embed object." -msgstr "" - -#: discord.Embed.add_field:6 discord.Embed.insert_field_at:10 -#: discord.Embed.set_field_at:10 of -msgid "The name of the field." -msgstr "フィールドの名前。" - -#: discord.Embed.add_field:8 discord.Embed.insert_field_at:12 -#: discord.Embed.set_field_at:12 of -msgid "The value of the field." -msgstr "フィールドの値。" - -#: discord.Embed.add_field:10 discord.Embed.insert_field_at:14 -#: discord.Embed.set_field_at:14 of -msgid "Whether the field should be displayed inline." -msgstr "フィールドをインライン表示するかどうか。" - -#: discord.Embed.insert_field_at:1 of -msgid "Inserts a field before a specified index to the embed." -msgstr "" - -#: discord.Embed.insert_field_at:8 of -msgid "The index of where to insert the field." -msgstr "" - -#: discord.Embed.clear_fields:1 of -msgid "Removes all fields from this embed." -msgstr "埋め込みからすべてのフィールドを削除します。" - -#: discord.Embed.remove_field:1 of -msgid "Removes a field at a specified index." -msgstr "特定のインデックスのフィールドを削除します。" - -#: discord.Embed.remove_field:3 of -msgid "" -"If the index is invalid or out of bounds then the error is silently " -"swallowed." -msgstr "" - -#: discord.Embed.remove_field:8 of -msgid "" -"When deleting a field by index, the index of the other fields shift to " -"fill the gap just like a regular list." -msgstr "" - -#: discord.Embed.remove_field:11 of -msgid "The index of the field to remove." -msgstr "" - -#: discord.Embed.set_field_at:1 of -msgid "Modifies a field to the embed object." -msgstr "" - -#: discord.Embed.set_field_at:3 of -msgid "The index must point to a valid pre-existing field." -msgstr "" - -#: discord.Embed.set_field_at:8 of -msgid "The index of the field to modify." -msgstr "" - -#: discord.Embed.set_field_at:17 of -#, fuzzy -msgid "An invalid index was provided." -msgstr "招待の更新。" - -#: discord.Embed.to_dict:1 of -msgid "Converts this embed object into a dict." -msgstr "" - -#: ../../api.rst:2890 -msgid "AllowedMentions" -msgstr "" - -#: discord.AllowedMentions:1 of -msgid "A class that represents what mentions are allowed in a message." -msgstr "" - -#: discord.AllowedMentions:3 of -msgid "" -"This class can be set during :class:`Client` initialisation to apply to " -"every message sent. It can also be applied on a per message basis via " -":meth:`abc.Messageable.send` for more fine-grained control." -msgstr "" - -#: discord.AllowedMentions:9 of -msgid "Whether to allow everyone and here mentions. Defaults to ``True``." -msgstr "" - -#: discord.AllowedMentions:15 of -msgid "" -"Controls the users being mentioned. If ``True`` (the default) then users " -"are mentioned based on the message content. If ``False`` then users are " -"not mentioned at all. If a list of :class:`abc.Snowflake` is given then " -"only the users provided will be mentioned, provided those users are in " -"the message content." -msgstr "" - -#: discord.AllowedMentions:21 discord.AllowedMentions:31 of -#, fuzzy -msgid "Union[:class:`bool`, List[:class:`abc.Snowflake`]]" -msgstr "Union[:class:`.abc.GuildChannel`, :class:`.abc.PrivateChannel`]" - -#: discord.AllowedMentions:25 of -msgid "" -"Controls the roles being mentioned. If ``True`` (the default) then roles " -"are mentioned based on the message content. If ``False`` then roles are " -"not mentioned at all. If a list of :class:`abc.Snowflake` is given then " -"only the roles provided will be mentioned, provided those roles are in " -"the message content." -msgstr "" - -#: discord.AllowedMentions.all:1 of -msgid "" -"A factory method that returns a :class:`AllowedMentions` with all fields " -"explicitly set to ``True``" -msgstr "" - -#: discord.AllowedMentions.none:1 of -msgid "" -"A factory method that returns a :class:`AllowedMentions` with all fields " -"set to ``False``" -msgstr "" - -#: ../../api.rst:2896 -#, fuzzy -msgid "Intents" -msgstr "クライアント" - -#: discord.Intents:1 of -msgid "Wraps up a Discord gateway intent flag." -msgstr "" - -#: discord.Intents:3 of -msgid "" -"Similar to :class:`Permissions`\\, the properties provided are two way. " -"You can set and retrieve individual bits using the properties as if they " -"were regular bools." -msgstr "" - -#: discord.Intents:7 discord.MemberCacheFlags:12 discord.SystemChannelFlags:7 -#: of -msgid "" -"To construct an object you can pass keyword arguments denoting the flags " -"to enable or disable." -msgstr "" - -#: discord.Intents:10 of -msgid "" -"This is used to disable certain gateway features that are unnecessary to " -"run your bot. To make use of this, it is passed to the ``intents`` " -"keyword argument of :class:`Client`." -msgstr "" - -#: discord.Intents:20 discord.MemberCacheFlags:23 discord.MessageFlags:9 -#: discord.SystemChannelFlags:14 of -msgid "Checks if two flags are equal." -msgstr "" - -#: discord.Intents:23 discord.MemberCacheFlags:26 discord.MessageFlags:12 -#: discord.SystemChannelFlags:17 of -msgid "Checks if two flags are not equal." -msgstr "" - -#: discord.Intents:26 discord.MemberCacheFlags:29 discord.MessageFlags:15 -#: discord.PublicUserFlags:13 discord.SystemChannelFlags:20 of -msgid "Return the flag's hash." -msgstr "" - -#: discord.Intents:29 discord.MemberCacheFlags:32 discord.MessageFlags:18 -#: discord.SystemChannelFlags:23 of -msgid "" -"Returns an iterator of ``(name, value)`` pairs. This allows it to be, for" -" example, constructed as a dict or a list of pairs." -msgstr "" - -#: discord.Intents:34 discord.MemberCacheFlags:37 of -msgid "" -"The raw value. You should query flags via the properties rather than " -"using this raw value." -msgstr "" - -#: discord.Intents.all:1 of -msgid "A factory method that creates a :class:`Intents` with everything enabled." -msgstr "" - -#: discord.Intents.none:1 of -msgid "A factory method that creates a :class:`Intents` with everything disabled." -msgstr "" - -#: discord.Intents.default:1 of -msgid "" -"A factory method that creates a :class:`Intents` with everything enabled " -"except :attr:`presences` and :attr:`members`." -msgstr "" - -#: discord.Intents.guilds:1 of -msgid "Whether guild related events are enabled." -msgstr "" - -#: discord.Intents.bans:3 discord.Intents.dm_messages:5 -#: discord.Intents.dm_reactions:5 discord.Intents.dm_typing:5 -#: discord.Intents.emojis:3 discord.Intents.guild_messages:5 -#: discord.Intents.guild_reactions:5 discord.Intents.guild_typing:5 -#: discord.Intents.guilds:3 discord.Intents.integrations:3 -#: discord.Intents.invites:3 discord.Intents.members:3 -#: discord.Intents.messages:5 discord.Intents.presences:3 -#: discord.Intents.reactions:5 discord.Intents.typing:5 -#: discord.Intents.voice_states:3 discord.Intents.webhooks:3 of -msgid "This corresponds to the following events:" -msgstr "" - -#: discord.Intents.guilds:5 of -msgid ":func:`on_guild_join`" -msgstr "" - -#: discord.Intents.guilds:6 of -msgid ":func:`on_guild_remove`" -msgstr "" - -#: discord.Intents.guilds:7 of -msgid ":func:`on_guild_available`" -msgstr "" - -#: discord.Intents.guilds:8 of -msgid ":func:`on_guild_unavailable`" -msgstr "" - -#: discord.Intents.guilds:9 of -msgid ":func:`on_guild_channel_update`" -msgstr "" - -#: discord.Intents.guilds:10 of -msgid ":func:`on_guild_channel_create`" -msgstr "" - -#: discord.Intents.guilds:11 of -msgid ":func:`on_guild_channel_delete`" -msgstr "" - -#: discord.Intents.guilds:12 of -msgid ":func:`on_guild_channel_pins_update`" -msgstr "" - -#: discord.Intents.dm_messages:14 discord.Intents.dm_reactions:14 -#: discord.Intents.emojis:7 discord.Intents.guild_messages:13 -#: discord.Intents.guild_reactions:14 discord.Intents.guilds:14 -#: discord.Intents.members:10 discord.Intents.messages:14 -#: discord.Intents.presences:7 discord.Intents.reactions:14 -#: discord.Intents.voice_states:7 of -msgid "" -"This also corresponds to the following attributes and classes in terms of" -" cache:" -msgstr "" - -#: discord.Intents.guilds:16 of -#, fuzzy -msgid ":attr:`Client.guilds`" -msgstr ":attr:`created_at`" - -#: discord.Intents.guilds:17 of -msgid ":class:`Guild` and all its attributes." -msgstr "" - -#: discord.Intents.guilds:18 of -msgid ":meth:`Client.get_channel`" -msgstr "" - -#: discord.Intents.guilds:19 of -msgid ":meth:`Client.get_all_channels`" -msgstr "" - -#: discord.Intents.guilds:21 of -msgid "" -"It is highly advisable to leave this intent enabled for your bot to " -"function." -msgstr "" - -#: discord.Intents.members:1 of -msgid "Whether guild member related events are enabled." -msgstr "" - -#: discord.Intents.members:7 of -msgid ":func:`on_member_update` (nickname, roles)" -msgstr "" - -#: discord.Intents.members:8 of -msgid ":func:`on_user_update`" -msgstr "" - -#: discord.Intents.members:12 of -msgid ":meth:`Client.get_all_members`" -msgstr "" - -#: discord.Intents.members:13 of -msgid ":meth:`Guild.chunk`" -msgstr "" - -#: discord.Intents.members:14 of -msgid ":meth:`Guild.fetch_members`" -msgstr "" - -#: discord.Intents.members:15 of -msgid ":meth:`Guild.get_member`" -msgstr "" - -#: discord.Intents.members:16 of -#, fuzzy -msgid ":attr:`Guild.members`" -msgstr ":attr:`uses`" - -#: discord.Intents.members:17 of -#, fuzzy -msgid ":attr:`Member.roles`" -msgstr ":attr:`uses`" - -#: discord.Intents.members:18 of -#, fuzzy -msgid ":attr:`Member.nick`" -msgstr ":attr:`temporary`" - -#: discord.Intents.members:19 of -msgid ":attr:`Member.premium_since`" -msgstr "" - -#: discord.Intents.members:20 of -#, fuzzy -msgid ":attr:`User.name`" -msgstr ":attr:`uses`" - -#: discord.Intents.members:21 of -msgid "" -":attr:`User.avatar` (:meth:`User.avatar_url` and " -":meth:`User.avatar_url_as`)" -msgstr "" - -#: discord.Intents.members:22 of -#, fuzzy -msgid ":attr:`User.discriminator`" -msgstr "識別子" - -#: discord.Intents.members:24 of -msgid "" -"For more information go to the :ref:`member intent documentation " -"`." -msgstr "" - -#: discord.Intents.members:28 discord.Intents.presences:17 of -msgid "" -"Currently, this requires opting in explicitly via the developer portal as" -" well. Bots in over 100 guilds will need to apply to Discord for " -"verification." -msgstr "" - -#: discord.Intents.bans:1 of -msgid "Whether guild ban related events are enabled." -msgstr "" - -#: discord.Intents.bans:5 of -msgid ":func:`on_member_ban`" -msgstr "" - -#: discord.Intents.bans:6 of -msgid ":func:`on_member_unban`" -msgstr "" - -#: discord.Intents.bans:8 discord.Intents.dm_typing:9 -#: discord.Intents.guild_typing:9 discord.Intents.integrations:7 -#: discord.Intents.invites:8 discord.Intents.typing:9 -#: discord.Intents.webhooks:7 of -msgid "" -"This does not correspond to any attributes or classes in the library in " -"terms of cache." -msgstr "" - -#: discord.Intents.emojis:1 of -msgid "Whether guild emoji related events are enabled." -msgstr "" - -#: discord.Intents.emojis:5 of -msgid ":func:`on_guild_emojis_update`" -msgstr "" - -#: discord.Intents.emojis:10 of -msgid ":meth:`Client.get_emoji`" -msgstr "" - -#: discord.Intents.emojis:11 of -msgid ":meth:`Client.emojis`" -msgstr "" - -#: discord.Intents.emojis:12 of -#, fuzzy -msgid ":attr:`Guild.emojis`" -msgstr ":attr:`uses`" - -#: discord.Intents.integrations:1 of -msgid "Whether guild integration related events are enabled." -msgstr "" - -#: discord.Intents.integrations:5 of -msgid ":func:`on_guild_integrations_update`" -msgstr "" - -#: discord.Intents.webhooks:1 of -msgid "Whether guild webhook related events are enabled." -msgstr "" - -#: discord.Intents.webhooks:5 of -msgid ":func:`on_webhooks_update`" -msgstr "" - -#: discord.Intents.invites:1 of -#, fuzzy -msgid "Whether guild invite related events are enabled." -msgstr "ギルドで表現のフィルターが有効ではない。" - -#: discord.Intents.invites:5 of -msgid ":func:`on_invite_create`" -msgstr "" - -#: discord.Intents.invites:6 of -msgid ":func:`on_invite_delete`" -msgstr "" - -#: discord.Intents.voice_states:1 of -msgid "Whether guild voice state related events are enabled." -msgstr "" - -#: discord.Intents.voice_states:5 of -msgid ":func:`on_voice_state_update`" -msgstr "" - -#: discord.Intents.voice_states:9 of -#, fuzzy -msgid ":attr:`VoiceChannel.members`" -msgstr ":attr:`Permissions.mute_members`" - -#: discord.Intents.voice_states:10 of -msgid ":attr:`VoiceChannel.voice_states`" -msgstr "" - -#: discord.Intents.voice_states:11 of -msgid ":attr:`Member.voice`" -msgstr "" - -#: discord.Intents.presences:1 of -#, fuzzy -msgid "Whether guild presence related events are enabled." -msgstr "ギルドで表現のフィルターが有効ではない。" - -#: discord.Intents.presences:5 of -msgid ":func:`on_member_update` (activities, status)" -msgstr "" - -#: discord.Intents.presences:9 of -msgid ":attr:`Member.activities`" -msgstr "" - -#: discord.Intents.presences:10 of -#, fuzzy -msgid ":attr:`Member.status`" -msgstr ":attr:`max_uses`" - -#: discord.Intents.presences:11 of -#, fuzzy -msgid ":attr:`Member.raw_status`" -msgstr ":attr:`max_uses`" - -#: discord.Intents.presences:13 of -msgid "" -"For more information go to the :ref:`presence intent documentation " -"`." -msgstr "" - -#: discord.Intents.messages:1 of -msgid "Whether guild and direct message related events are enabled." -msgstr "" - -#: discord.Intents.messages:3 of -msgid "" -"This is a shortcut to set or get both :attr:`guild_messages` and " -":attr:`dm_messages`." -msgstr "" - -#: discord.Intents.messages:7 of -msgid ":func:`on_message` (both guilds and DMs)" -msgstr "" - -#: discord.Intents.messages:8 of -msgid ":func:`on_message_edit` (both guilds and DMs)" -msgstr "" - -#: discord.Intents.messages:9 of -msgid ":func:`on_message_delete` (both guilds and DMs)" -msgstr "" - -#: discord.Intents.messages:10 of -msgid ":func:`on_raw_message_delete` (both guilds and DMs)" -msgstr "" - -#: discord.Intents.messages:11 of -msgid ":func:`on_raw_message_edit` (both guilds and DMs)" -msgstr "" - -#: discord.Intents.dm_messages:12 discord.Intents.messages:12 of -msgid ":func:`on_private_channel_create`" -msgstr "" - -#: discord.Intents.messages:17 of -#, fuzzy -msgid ":attr:`Client.cached_messages`" -msgstr ":attr:`created_at`" - -#: discord.Intents.dm_messages:19 discord.Intents.guild_messages:18 -#: discord.Intents.messages:19 of -msgid "" -"Note that due to an implicit relationship this also corresponds to the " -"following events:" -msgstr "" - -#: discord.Intents.messages:21 discord.Intents.reactions:7 of -msgid ":func:`on_reaction_add` (both guilds and DMs)" -msgstr "" - -#: discord.Intents.messages:22 discord.Intents.reactions:8 of -msgid ":func:`on_reaction_remove` (both guilds and DMs)" -msgstr "" - -#: discord.Intents.messages:23 discord.Intents.reactions:9 of -msgid ":func:`on_reaction_clear` (both guilds and DMs)" -msgstr "" - -#: discord.Intents.guild_messages:1 of -#, fuzzy -msgid "Whether guild message related events are enabled." -msgstr "ギルドで表現のフィルターが有効ではない。" - -#: discord.Intents.guild_messages:3 of -msgid "See also :attr:`dm_messages` for DMs or :attr:`messages` for both." -msgstr "" - -#: discord.Intents.guild_messages:7 of -msgid ":func:`on_message` (only for guilds)" -msgstr "" - -#: discord.Intents.guild_messages:8 of -msgid ":func:`on_message_edit` (only for guilds)" -msgstr "" - -#: discord.Intents.guild_messages:9 of -msgid ":func:`on_message_delete` (only for guilds)" -msgstr "" - -#: discord.Intents.guild_messages:10 of -msgid ":func:`on_raw_message_delete` (only for guilds)" -msgstr "" - -#: discord.Intents.guild_messages:11 of -msgid ":func:`on_raw_message_edit` (only for guilds)" -msgstr "" - -#: discord.Intents.guild_messages:16 of -msgid ":attr:`Client.cached_messages` (only for guilds)" -msgstr "" - -#: discord.Intents.guild_messages:20 discord.Intents.guild_reactions:7 of -msgid ":func:`on_reaction_add` (only for guilds)" -msgstr "" - -#: discord.Intents.guild_messages:21 discord.Intents.guild_reactions:8 of -msgid ":func:`on_reaction_remove` (only for guilds)" -msgstr "" - -#: discord.Intents.guild_messages:22 discord.Intents.guild_reactions:9 of -msgid ":func:`on_reaction_clear` (only for guilds)" -msgstr "" - -#: discord.Intents.dm_messages:1 of -msgid "Whether direct message related events are enabled." -msgstr "" - -#: discord.Intents.dm_messages:3 of -msgid "See also :attr:`guild_messages` for guilds or :attr:`messages` for both." -msgstr "" - -#: discord.Intents.dm_messages:7 of -msgid ":func:`on_message` (only for DMs)" -msgstr "" - -#: discord.Intents.dm_messages:8 of -msgid ":func:`on_message_edit` (only for DMs)" -msgstr "" - -#: discord.Intents.dm_messages:9 of -msgid ":func:`on_message_delete` (only for DMs)" -msgstr "" - -#: discord.Intents.dm_messages:10 of -msgid ":func:`on_raw_message_delete` (only for DMs)" -msgstr "" - -#: discord.Intents.dm_messages:11 of -msgid ":func:`on_raw_message_edit` (only for DMs)" -msgstr "" - -#: discord.Intents.dm_messages:17 of -msgid ":attr:`Client.cached_messages` (only for DMs)" -msgstr "" - -#: discord.Intents.dm_messages:21 discord.Intents.dm_reactions:7 of -msgid ":func:`on_reaction_add` (only for DMs)" -msgstr "" - -#: discord.Intents.dm_messages:22 discord.Intents.dm_reactions:8 of -msgid ":func:`on_reaction_remove` (only for DMs)" -msgstr "" - -#: discord.Intents.dm_messages:23 discord.Intents.dm_reactions:9 of -msgid ":func:`on_reaction_clear` (only for DMs)" -msgstr "" - -#: discord.Intents.reactions:1 of -msgid "Whether guild and direct message reaction related events are enabled." -msgstr "" - -#: discord.Intents.reactions:3 of -msgid "" -"This is a shortcut to set or get both :attr:`guild_reactions` and " -":attr:`dm_reactions`." -msgstr "" - -#: discord.Intents.reactions:10 of -msgid ":func:`on_raw_reaction_add` (both guilds and DMs)" -msgstr "" - -#: discord.Intents.reactions:11 of -msgid ":func:`on_raw_reaction_remove` (both guilds and DMs)" -msgstr "" - -#: discord.Intents.reactions:12 of -msgid ":func:`on_raw_reaction_clear` (both guilds and DMs)" -msgstr "" - -#: discord.Intents.reactions:16 of -msgid ":attr:`Message.reactions` (both guild and DM messages)" -msgstr "" - -#: discord.Intents.guild_reactions:1 of -msgid "Whether guild message reaction related events are enabled." -msgstr "" - -#: discord.Intents.guild_reactions:3 of -msgid "See also :attr:`dm_reactions` for DMs or :attr:`reactions` for both." -msgstr "" - -#: discord.Intents.guild_reactions:10 of -msgid ":func:`on_raw_reaction_add` (only for guilds)" -msgstr "" - -#: discord.Intents.guild_reactions:11 of -msgid ":func:`on_raw_reaction_remove` (only for guilds)" -msgstr "" - -#: discord.Intents.guild_reactions:12 of -msgid ":func:`on_raw_reaction_clear` (only for guilds)" -msgstr "" - -#: discord.Intents.guild_reactions:16 of -msgid ":attr:`Message.reactions` (only for guild messages)" -msgstr "" - -#: discord.Intents.dm_reactions:1 of -msgid "Whether direct message reaction related events are enabled." -msgstr "" - -#: discord.Intents.dm_reactions:3 of -msgid "See also :attr:`guild_reactions` for guilds or :attr:`reactions` for both." -msgstr "" - -#: discord.Intents.dm_reactions:10 of -msgid ":func:`on_raw_reaction_add` (only for DMs)" -msgstr "" - -#: discord.Intents.dm_reactions:11 of -msgid ":func:`on_raw_reaction_remove` (only for DMs)" -msgstr "" - -#: discord.Intents.dm_reactions:12 of -msgid ":func:`on_raw_reaction_clear` (only for DMs)" -msgstr "" - -#: discord.Intents.dm_reactions:16 of -msgid ":attr:`Message.reactions` (only for DM messages)" -msgstr "" - -#: discord.Intents.dm_typing:1 discord.Intents.guild_typing:1 -#: discord.Intents.typing:1 of -msgid "Whether guild and direct message typing related events are enabled." -msgstr "" - -#: discord.Intents.typing:3 of -msgid "" -"This is a shortcut to set or get both :attr:`guild_typing` and " -":attr:`dm_typing`." -msgstr "" - -#: discord.Intents.typing:7 of -msgid ":func:`on_typing` (both guilds and DMs)" -msgstr "" - -#: discord.Intents.guild_typing:3 of -msgid "See also :attr:`dm_typing` for DMs or :attr:`typing` for both." -msgstr "" - -#: discord.Intents.guild_typing:7 of -msgid ":func:`on_typing` (only for guilds)" -msgstr "" - -#: discord.Intents.dm_typing:3 of -msgid "See also :attr:`guild_typing` for guilds or :attr:`typing` for both." -msgstr "" - -#: discord.Intents.dm_typing:7 of -msgid ":func:`on_typing` (only for DMs)" -msgstr "" - -#: ../../api.rst:2902 -msgid "MemberCacheFlags" -msgstr "" - -#: discord.MemberCacheFlags:1 of -msgid "Controls the library's cache policy when it comes to members." -msgstr "" - -#: discord.MemberCacheFlags:3 of -msgid "" -"This allows for finer grained control over what members are cached. Note " -"that the bot's own member is always cached. This class is passed to the " -"``member_cache_flags`` parameter in :class:`Client`." -msgstr "" - -#: discord.MemberCacheFlags:7 of -msgid "" -"Due to a quirk in how Discord works, in order to ensure proper cleanup of" -" cache resources it is recommended to have :attr:`Intents.members` " -"enabled. Otherwise the library cannot know when a member leaves a guild " -"and is thus unable to cleanup after itself." -msgstr "" - -#: discord.MemberCacheFlags:15 of -msgid "The default value is all flags enabled." -msgstr "" - -#: discord.MemberCacheFlags.all:1 of -msgid "" -"A factory method that creates a :class:`MemberCacheFlags` with everything" -" enabled." -msgstr "" - -#: discord.MemberCacheFlags.none:1 of -msgid "" -"A factory method that creates a :class:`MemberCacheFlags` with everything" -" disabled." -msgstr "" - -#: discord.MemberCacheFlags.online:1 of -msgid "Whether to cache members with a status." -msgstr "" - -#: discord.MemberCacheFlags.online:3 of -msgid "" -"For example, members that are part of the initial ``GUILD_CREATE`` or " -"become online at a later point. This requires :attr:`Intents.presences`." -msgstr "" - -#: discord.MemberCacheFlags.online:6 of -msgid "Members that go offline are no longer cached." -msgstr "" - -#: discord.MemberCacheFlags.voice:1 of -msgid "Whether to cache members that are in voice." -msgstr "" - -#: discord.MemberCacheFlags.voice:3 of -msgid "This requires :attr:`Intents.voice_states`." -msgstr "" - -#: discord.MemberCacheFlags.voice:5 of -msgid "Members that leave voice are no longer cached." -msgstr "" - -#: discord.MemberCacheFlags.joined:1 of -msgid "" -"Whether to cache members that joined the guild or are chunked as part of " -"the initial log in flow." -msgstr "" - -#: discord.MemberCacheFlags.joined:4 of -msgid "This requires :attr:`Intents.members`." -msgstr "" - -#: discord.MemberCacheFlags.joined:6 of -msgid "Members that leave the guild are no longer cached." -msgstr "" - -#: discord.MemberCacheFlags.from_intents:1 of -msgid "" -"A factory method that creates a :class:`MemberCacheFlags` based on the " -"currently selected :class:`Intents`." -msgstr "" - -#: discord.MemberCacheFlags.from_intents:4 of -#, fuzzy -msgid "The intents to select from." -msgstr "メンションをエスケープするテキスト。" - -#: discord.MemberCacheFlags.from_intents:7 of -msgid "The resulting member cache flags." -msgstr "" - -#: discord.MemberCacheFlags.from_intents:8 of -#, fuzzy -msgid ":class:`MemberCacheFlags`" -msgstr ":class:`bytes`" - -#: ../../api.rst:2908 -msgid "File" -msgstr "" - -#: discord.File:1 of -msgid "" -"A parameter object used for :meth:`abc.Messageable.send` for sending file" -" objects." -msgstr "" - -#: discord.File:6 of -msgid "" -"File objects are single use and are not meant to be reused in multiple " -":meth:`abc.Messageable.send`\\s." -msgstr "" - -#: discord.File:11 of -msgid "" -"A file-like object opened in binary mode and read mode or a filename " -"representing a file in the hard drive to open." -msgstr "" - -#: discord.File:17 of -msgid "" -"If the file-like object passed is opened via ``open`` then the modes 'rb'" -" should be used." -msgstr "" - -#: discord.File:20 of -msgid "To pass binary data, consider usage of ``io.BytesIO``." -msgstr "" - -#: discord.File:22 of -msgid "Union[:class:`str`, :class:`io.BufferedIOBase`]" -msgstr "" - -#: discord.File:26 of -msgid "" -"The filename to display when uploading to Discord. If this is not given " -"then it defaults to ``fp.name`` or if ``fp`` is a string then the " -"``filename`` will default to the string given." -msgstr "" - -#: discord.File:34 of -msgid "Whether the attachment is a spoiler." -msgstr "" - -#: ../../api.rst:2914 -msgid "Colour" -msgstr "" - -#: discord.Colour:1 of -msgid "" -"Represents a Discord role colour. This class is similar to a (red, green," -" blue) :class:`tuple`." -msgstr "" - -#: discord.Colour:4 of -msgid "There is an alias for this called Color." -msgstr "" - -#: discord.Colour:10 of -msgid "Checks if two colours are equal." -msgstr "" - -#: discord.Colour:14 of -msgid "Checks if two colours are not equal." -msgstr "" - -#: discord.Colour:18 of -msgid "Return the colour's hash." -msgstr "" - -#: discord.Colour:22 of -msgid "Returns the hex format for the colour." -msgstr "" - -#: discord.Colour:26 of -msgid "The raw integer colour value." -msgstr "" - -#: discord.Colour.r:1 of -msgid "Returns the red component of the colour." -msgstr "" - -#: discord.Colour.g:1 of -msgid "Returns the green component of the colour." -msgstr "" - -#: discord.Colour.b:1 of -msgid "Returns the blue component of the colour." -msgstr "" - -#: discord.Colour.to_rgb:1 of -msgid "" -"Tuple[:class:`int`, :class:`int`, :class:`int`]: Returns an (r, g, b) " -"tuple representing the colour." -msgstr "" - -#: discord.Colour.from_rgb:1 of -msgid "Constructs a :class:`Colour` from an RGB tuple." -msgstr "" - -#: discord.Colour.from_hsv:1 of -msgid "Constructs a :class:`Colour` from an HSV tuple." -msgstr "" - -#: discord.Colour.default:1 of -msgid "A factory method that returns a :class:`Colour` with a value of ``0``." -msgstr "" - -#: discord.Colour.teal:1 of -msgid "" -"A factory method that returns a :class:`Colour` with a value of " -"``0x1abc9c``." -msgstr "" - -#: discord.Colour.dark_teal:1 of -msgid "" -"A factory method that returns a :class:`Colour` with a value of " -"``0x11806a``." -msgstr "" - -#: discord.Colour.green:1 of -msgid "" -"A factory method that returns a :class:`Colour` with a value of " -"``0x2ecc71``." -msgstr "" - -#: discord.Colour.dark_green:1 of -msgid "" -"A factory method that returns a :class:`Colour` with a value of " -"``0x1f8b4c``." -msgstr "" - -#: discord.Colour.blue:1 of -msgid "" -"A factory method that returns a :class:`Colour` with a value of " -"``0x3498db``." -msgstr "" - -#: discord.Colour.dark_blue:1 of -msgid "" -"A factory method that returns a :class:`Colour` with a value of " -"``0x206694``." -msgstr "" - -#: discord.Colour.purple:1 of -msgid "" -"A factory method that returns a :class:`Colour` with a value of " -"``0x9b59b6``." -msgstr "" - -#: discord.Colour.dark_purple:1 of -msgid "" -"A factory method that returns a :class:`Colour` with a value of " -"``0x71368a``." -msgstr "" - -#: discord.Colour.magenta:1 of -msgid "" -"A factory method that returns a :class:`Colour` with a value of " -"``0xe91e63``." -msgstr "" - -#: discord.Colour.dark_magenta:1 of -msgid "" -"A factory method that returns a :class:`Colour` with a value of " -"``0xad1457``." -msgstr "" - -#: discord.Colour.gold:1 of -msgid "" -"A factory method that returns a :class:`Colour` with a value of " -"``0xf1c40f``." -msgstr "" - -#: discord.Colour.dark_gold:1 of -msgid "" -"A factory method that returns a :class:`Colour` with a value of " -"``0xc27c0e``." -msgstr "" - -#: discord.Colour.orange:1 of -msgid "" -"A factory method that returns a :class:`Colour` with a value of " -"``0xe67e22``." -msgstr "" - -#: discord.Colour.dark_orange:1 of -msgid "" -"A factory method that returns a :class:`Colour` with a value of " -"``0xa84300``." -msgstr "" - -#: discord.Colour.red:1 of -msgid "" -"A factory method that returns a :class:`Colour` with a value of " -"``0xe74c3c``." -msgstr "" - -#: discord.Colour.dark_red:1 of -msgid "" -"A factory method that returns a :class:`Colour` with a value of " -"``0x992d22``." -msgstr "" - -#: discord.Colour.lighter_gray:1 discord.Colour.lighter_grey:1 of -msgid "" -"A factory method that returns a :class:`Colour` with a value of " -"``0x95a5a6``." -msgstr "" - -#: discord.Colour.dark_gray:1 discord.Colour.dark_grey:1 of -msgid "" -"A factory method that returns a :class:`Colour` with a value of " -"``0x607d8b``." -msgstr "" - -#: discord.Colour.light_gray:1 discord.Colour.light_grey:1 of -msgid "" -"A factory method that returns a :class:`Colour` with a value of " -"``0x979c9f``." -msgstr "" - -#: discord.Colour.darker_gray:1 discord.Colour.darker_grey:1 of -msgid "" -"A factory method that returns a :class:`Colour` with a value of " -"``0x546e7a``." -msgstr "" - -#: discord.Colour.blurple:1 of -msgid "" -"A factory method that returns a :class:`Colour` with a value of " -"``0x7289da``." -msgstr "" - -#: discord.Colour.greyple:1 of -msgid "" -"A factory method that returns a :class:`Colour` with a value of " -"``0x99aab5``." -msgstr "" - -#: discord.Colour.dark_theme:1 of -msgid "" -"A factory method that returns a :class:`Colour` with a value of " -"``0x36393F``. This will appear transparent on Discord's dark theme." -msgstr "" - -#: ../../api.rst:2920 -msgid "BaseActivity" -msgstr "" - -#: discord.BaseActivity:1 of -msgid "" -"The base activity that all user-settable activities inherit from. A user-" -"settable activity is one that can be used in " -":meth:`Client.change_presence`." -msgstr "" - -#: discord.BaseActivity:4 of -msgid "The following types currently count as user-settable:" -msgstr "" - -#: discord.BaseActivity:6 of -#, fuzzy -msgid ":class:`Activity`" -msgstr ":class:`.Invite`" - -#: discord.Activity:9 discord.BaseActivity:7 of -msgid ":class:`Game`" -msgstr "" - -#: discord.Activity:10 discord.BaseActivity:8 of -msgid ":class:`Streaming`" -msgstr "" - -#: discord.BaseActivity:9 of -#, fuzzy -msgid ":class:`CustomActivity`" -msgstr ":class:`str`" - -#: discord.BaseActivity:11 of -msgid "" -"Note that although these types are considered user-settable by the " -"library, Discord typically ignores certain combinations of activity " -"depending on what is currently set. This behaviour may change in the " -"future so there are no guarantees on whether Discord will actually let " -"you set these types." -msgstr "" - -#: discord.BaseActivity.created_at:1 of -msgid "When the user started doing this activity in UTC." -msgstr "" - -#: ../../api.rst:2926 -msgid "Activity" -msgstr "" - -#: discord.Activity:1 of -msgid "Represents an activity in Discord." -msgstr "" - -#: discord.Activity:3 of -msgid "" -"This could be an activity such as streaming, playing, listening or " -"watching." -msgstr "" - -#: discord.Activity:6 of -msgid "" -"For memory optimisation purposes, some activities are offered in slimmed " -"down versions:" -msgstr "" - -#: discord.Activity:14 of -msgid "The application ID of the game." -msgstr "" - -#: discord.Activity:20 of -#, fuzzy -msgid "The name of the activity." -msgstr "ギルドの名前。" - -#: discord.Activity:26 of -msgid "A stream URL that the activity could be doing." -msgstr "" - -#: discord.Activity:32 of -msgid "The type of activity currently being done." -msgstr "" - -#: discord.Activity:38 of -msgid "The user's current state. For example, \"In Game\"." -msgstr "" - -#: discord.Activity:44 of -msgid "The detail of the user's current activity." -msgstr "" - -#: discord.Activity:50 of -msgid "A dictionary of timestamps. It contains the following optional keys:" -msgstr "" - -#: discord.Activity:52 of -msgid "" -"``start``: Corresponds to when the user started doing the activity in " -"milliseconds since Unix epoch." -msgstr "" - -#: discord.Activity:54 of -msgid "" -"``end``: Corresponds to when the user will finish doing the activity in " -"milliseconds since Unix epoch." -msgstr "" - -#: discord.Activity:61 of -msgid "" -"A dictionary representing the images and their hover text of an activity." -" It contains the following optional keys:" -msgstr "" - -#: discord.Activity:64 of -msgid "``large_image``: A string representing the ID for the large image asset." -msgstr "" - -#: discord.Activity:65 of -msgid "" -"``large_text``: A string representing the text when hovering over the " -"large image asset." -msgstr "" - -#: discord.Activity:66 of -msgid "``small_image``: A string representing the ID for the small image asset." -msgstr "" - -#: discord.Activity:67 of -msgid "" -"``small_text``: A string representing the text when hovering over the " -"small image asset." -msgstr "" - -#: discord.Activity:73 of -msgid "" -"A dictionary representing the activity party. It contains the following " -"optional keys:" -msgstr "" - -#: discord.Activity:75 of -msgid "``id``: A string representing the party ID." -msgstr "" - -#: discord.Activity:76 of -msgid "" -"``size``: A list of up to two integer elements denoting (current_size, " -"maximum_size)." -msgstr "" - -#: discord.Activity:82 of -msgid "The emoji that belongs to this activity." -msgstr "" - -#: discord.Activity:84 discord.CustomActivity:33 of -msgid "Optional[:class:`PartialEmoji`]" -msgstr "" - -#: discord.Activity.start:1 of -msgid "When the user started doing this activity in UTC, if applicable." -msgstr "" - -#: discord.Activity.end:1 of -msgid "When the user will stop doing this activity in UTC, if applicable." -msgstr "" - -#: discord.Activity.large_image_url:1 of -msgid "" -"Returns a URL pointing to the large image asset of this activity if " -"applicable." -msgstr "" - -#: discord.Activity.small_image_url:1 of -msgid "" -"Returns a URL pointing to the small image asset of this activity if " -"applicable." -msgstr "" - -#: discord.Activity.large_image_text:1 of -msgid "Returns the large image asset hover text of this activity if applicable." -msgstr "" - -#: discord.Activity.small_image_text:1 of -msgid "Returns the small image asset hover text of this activity if applicable." -msgstr "" - -#: ../../api.rst:2932 -msgid "Game" -msgstr "" - -#: discord.Game:1 of -msgid "" -"A slimmed down version of :class:`Activity` that represents a Discord " -"game." -msgstr "" - -#: discord.Game:3 of -msgid "" -"This is typically displayed via **Playing** on the official Discord " -"client." -msgstr "" - -#: discord.Game:9 of -msgid "Checks if two games are equal." -msgstr "" - -#: discord.Game:13 of -msgid "Checks if two games are not equal." -msgstr "" - -#: discord.Game:17 of -msgid "Returns the game's hash." -msgstr "" - -#: discord.Game:21 of -msgid "Returns the game's name." -msgstr "" - -#: discord.Game:23 discord.Game:32 of -msgid "The game's name." -msgstr "" - -#: discord.Game:25 of -msgid "" -"A naive UTC timestamp representing when the game started. Keyword-only " -"parameter. Ignored for bots." -msgstr "" - -#: discord.Game:27 of -msgid "" -"A naive UTC timestamp representing when the game ends. Keyword-only " -"parameter. Ignored for bots." -msgstr "" - -#: discord.Game.type:1 discord.Streaming.type:1 of -msgid "Returns the game's type. This is for compatibility with :class:`Activity`." -msgstr "" - -#: discord.Game.type:3 of -msgid "It always returns :attr:`ActivityType.playing`." -msgstr "" - -#: discord.Game.start:1 of -msgid "When the user started playing this game in UTC, if applicable." -msgstr "" - -#: discord.Game.end:1 of -msgid "When the user will stop playing this game in UTC, if applicable." -msgstr "" - -#: ../../api.rst:2938 -msgid "Streaming" -msgstr "" - -#: discord.Streaming:1 of -msgid "" -"A slimmed down version of :class:`Activity` that represents a Discord " -"streaming status." -msgstr "" - -#: discord.Streaming:3 of -msgid "" -"This is typically displayed via **Streaming** on the official Discord " -"client." -msgstr "" - -#: discord.Streaming:9 of -msgid "Checks if two streams are equal." -msgstr "" - -#: discord.Streaming:13 of -msgid "Checks if two streams are not equal." -msgstr "" - -#: discord.Streaming:17 of -msgid "Returns the stream's hash." -msgstr "" - -#: discord.Streaming:21 of -msgid "Returns the stream's name." -msgstr "" - -#: discord.Streaming:25 of -msgid "Where the user is streaming from (ie. YouTube, Twitch)." -msgstr "" - -#: discord.Streaming:33 of -#, fuzzy -msgid "The stream's name." -msgstr "役職の名前を返します。" - -#: discord.Streaming:39 of -#, fuzzy -msgid "An alias for :attr:`name`" -msgstr ":attr:`dnd` のエイリアス。" - -#: discord.Streaming:45 of -#, fuzzy -msgid "The game being streamed." -msgstr "更新された後のギルド。" - -#: discord.Streaming:53 of -msgid "The stream's URL." -msgstr "" - -#: discord.Streaming:59 of -msgid "" -"A dictionary comprising of similar keys than those in " -":attr:`Activity.assets`." -msgstr "" - -#: discord.Streaming.type:3 of -msgid "It always returns :attr:`ActivityType.streaming`." -msgstr "" - -#: discord.Streaming.twitch_name:1 of -msgid "If provided, the twitch name of the user streaming." -msgstr "" - -#: discord.Streaming.twitch_name:3 of -msgid "" -"This corresponds to the ``large_image`` key of the " -":attr:`Streaming.assets` dictionary if it starts with ``twitch:``. " -"Typically set by the Discord client." -msgstr "" - -#: ../../api.rst:2944 -msgid "CustomActivity" -msgstr "" - -#: discord.CustomActivity:1 of -#, fuzzy -msgid "Represents a Custom activity from Discord." -msgstr "Discordのリレーションシップを表します。" - -#: discord.CustomActivity:19 of -#, fuzzy -msgid "Returns the custom status text." -msgstr "カテゴリの名前を返します。" - -#: discord.CustomActivity:25 of -msgid "The custom activity's name." -msgstr "" - -#: discord.CustomActivity:31 of -msgid "The emoji to pass to the activity, if any." -msgstr "" - -#: discord.CustomActivity.type:3 of -msgid "It always returns :attr:`ActivityType.custom`." -msgstr "" - -#: ../../api.rst:2950 -msgid "Permissions" -msgstr "" - -#: discord.Permissions:1 of -msgid "Wraps up the Discord permission value." -msgstr "" - -#: discord.Permissions:3 of -msgid "" -"The properties provided are two way. You can set and retrieve individual " -"bits using the properties as if they were regular bools. This allows you " -"to edit permissions." -msgstr "" - -#: discord.Permissions:7 of -msgid "" -"You can now use keyword arguments to initialize :class:`Permissions` " -"similar to :meth:`update`." -msgstr "" - -#: discord.Permissions:15 of -msgid "Checks if two permissions are equal." -msgstr "" - -#: discord.Permissions:18 of -msgid "Checks if two permissions are not equal." -msgstr "" - -#: discord.Permissions:21 of -msgid "Checks if a permission is a subset of another permission." -msgstr "" - -#: discord.Permissions:24 of -msgid "Checks if a permission is a superset of another permission." -msgstr "" - -#: discord.Permissions:27 of -msgid "Checks if a permission is a strict subset of another permission." -msgstr "" - -#: discord.Permissions:30 of -msgid "Checks if a permission is a strict superset of another permission." -msgstr "" - -#: discord.Permissions:33 of -msgid "Return the permission's hash." -msgstr "" - -#: discord.PermissionOverwrite:22 discord.Permissions:36 of -msgid "" -"Returns an iterator of ``(perm, value)`` pairs. This allows it to be, for" -" example, constructed as a dict or a list of pairs. Note that aliases are" -" not shown." -msgstr "" - -#: discord.Permissions:42 of -msgid "" -"The raw value. This value is a bit array field of a 53-bit integer " -"representing the currently available permissions. You should query " -"permissions via the properties rather than using this raw value." -msgstr "" - -#: discord.Permissions.is_subset:1 of -msgid "Returns ``True`` if self has the same or fewer permissions as other." -msgstr "" - -#: discord.Permissions.is_superset:1 of -msgid "Returns ``True`` if self has the same or more permissions as other." -msgstr "" - -#: discord.Permissions.is_strict_subset:1 of -msgid "" -"Returns ``True`` if the permissions on other are a strict subset of those" -" on self." -msgstr "" - -#: discord.Permissions.is_strict_superset:1 of -msgid "" -"Returns ``True`` if the permissions on other are a strict superset of " -"those on self." -msgstr "" - -#: discord.Permissions.none:1 of -msgid "" -"A factory method that creates a :class:`Permissions` with all permissions" -" set to ``False``." -msgstr "" - -#: discord.Permissions.all:1 of -msgid "" -"A factory method that creates a :class:`Permissions` with all permissions" -" set to ``True``." -msgstr "" - -#: discord.Permissions.all_channel:1 of -msgid "" -"A :class:`Permissions` with all channel-specific permissions set to " -"``True`` and the guild-specific ones set to ``False``. The guild-specific" -" permissions are currently:" -msgstr "" - -#: discord.Permissions.all_channel:5 of -msgid "manage_guild" -msgstr "" - -#: discord.Permissions.all_channel:6 of -msgid "kick_members" -msgstr "" - -#: discord.Permissions.all_channel:7 of -msgid "ban_members" -msgstr "" - -#: discord.Permissions.all_channel:8 of -msgid "administrator" -msgstr "" - -#: discord.Permissions.all_channel:9 of -msgid "change_nickname" -msgstr "" - -#: discord.Permissions.all_channel:10 of -msgid "manage_nicknames" -msgstr "" - -#: discord.Permissions.general:1 of -msgid "" -"A factory method that creates a :class:`Permissions` with all \"General\"" -" permissions from the official Discord UI set to ``True``." -msgstr "" - -#: discord.Permissions.text:1 of -msgid "" -"A factory method that creates a :class:`Permissions` with all \"Text\" " -"permissions from the official Discord UI set to ``True``." -msgstr "" - -#: discord.Permissions.voice:1 of -msgid "" -"A factory method that creates a :class:`Permissions` with all \"Voice\" " -"permissions from the official Discord UI set to ``True``." -msgstr "" - -#: discord.Permissions.update:1 of -msgid "Bulk updates this permission object." -msgstr "" - -#: discord.PermissionOverwrite.update:3 discord.Permissions.update:3 of -msgid "" -"Allows you to set multiple attributes by using keyword arguments. The " -"names must be equivalent to the properties listed. Extraneous key/value " -"pairs will be silently ignored." -msgstr "" - -#: discord.Permissions.update:7 of -msgid "A list of key/value pairs to bulk update permissions with." -msgstr "" - -#: discord.Permissions.create_instant_invite:1 of -msgid "Returns ``True`` if the user can create instant invites." -msgstr "" - -#: discord.Permissions.kick_members:1 of -msgid "Returns ``True`` if the user can kick users from the guild." -msgstr "" - -#: discord.Permissions.ban_members:1 of -msgid "Returns ``True`` if a user can ban users from the guild." -msgstr "" - -#: discord.Permissions.administrator:1 of -msgid "" -"Returns ``True`` if a user is an administrator. This role overrides all " -"other permissions." -msgstr "" - -#: discord.Permissions.administrator:3 of -msgid "This also bypasses all channel-specific overrides." -msgstr "" - -#: discord.Permissions.manage_channels:1 of -msgid "" -"Returns ``True`` if a user can edit, delete, or create channels in the " -"guild." -msgstr "" - -#: discord.Permissions.manage_channels:3 of -msgid "This also corresponds to the \"Manage Channel\" channel-specific override." -msgstr "" - -#: discord.Permissions.manage_guild:1 of -msgid "Returns ``True`` if a user can edit guild properties." -msgstr "" - -#: discord.Permissions.add_reactions:1 of -msgid "Returns ``True`` if a user can add reactions to messages." -msgstr "" - -#: discord.Permissions.view_audit_log:1 of -msgid "Returns ``True`` if a user can view the guild's audit log." -msgstr "" - -#: discord.Permissions.priority_speaker:1 of -msgid "Returns ``True`` if a user can be more easily heard while talking." -msgstr "" - -#: discord.Permissions.stream:1 of -msgid "Returns ``True`` if a user can stream in a voice channel." -msgstr "" - -#: discord.Permissions.read_messages:1 of -msgid "" -"Returns ``True`` if a user can read messages from all or specific text " -"channels." -msgstr "" - -#: discord.Permissions.view_channel:1 of -#, fuzzy -msgid "An alias for :attr:`read_messages`." -msgstr ":attr:`extreme` のエイリアス。" - -#: discord.Permissions.send_messages:1 of -msgid "" -"Returns ``True`` if a user can send messages from all or specific text " -"channels." -msgstr "" - -#: discord.Permissions.send_tts_messages:1 of -msgid "" -"Returns ``True`` if a user can send TTS messages from all or specific " -"text channels." -msgstr "" - -#: discord.Permissions.manage_messages:1 of -msgid "Returns ``True`` if a user can delete or pin messages in a text channel." -msgstr "" - -#: discord.Permissions.manage_messages:5 of -msgid "Note that there are currently no ways to edit other people's messages." -msgstr "" - -#: discord.Permissions.embed_links:1 of -msgid "" -"Returns ``True`` if a user's messages will automatically be embedded by " -"Discord." -msgstr "" - -#: discord.Permissions.attach_files:1 of -msgid "Returns ``True`` if a user can send files in their messages." -msgstr "" - -#: discord.Permissions.read_message_history:1 of -msgid "Returns ``True`` if a user can read a text channel's previous messages." -msgstr "" - -#: discord.Permissions.mention_everyone:1 of -msgid "" -"Returns ``True`` if a user's @everyone or @here will mention everyone in " -"the text channel." -msgstr "" - -#: discord.Permissions.external_emojis:1 of -msgid "Returns ``True`` if a user can use emojis from other guilds." -msgstr "" - -#: discord.Permissions.use_external_emojis:1 of -#, fuzzy -msgid "An alias for :attr:`external_emojis`." -msgstr ":attr:`extreme` のエイリアス。" - -#: discord.Permissions.view_guild_insights:1 of -msgid "Returns ``True`` if a user can view the guild's insights." -msgstr "" - -#: discord.Permissions.connect:1 of -msgid "Returns ``True`` if a user can connect to a voice channel." -msgstr "" - -#: discord.Permissions.speak:1 of -msgid "Returns ``True`` if a user can speak in a voice channel." -msgstr "" - -#: discord.Permissions.mute_members:1 of -msgid "Returns ``True`` if a user can mute other users." -msgstr "" - -#: discord.Permissions.deafen_members:1 of -msgid "Returns ``True`` if a user can deafen other users." -msgstr "" - -#: discord.Permissions.move_members:1 of -msgid "Returns ``True`` if a user can move users between other voice channels." -msgstr "" - -#: discord.Permissions.use_voice_activation:1 of -msgid "Returns ``True`` if a user can use voice activation in voice channels." -msgstr "" - -#: discord.Permissions.change_nickname:1 of -msgid "Returns ``True`` if a user can change their nickname in the guild." -msgstr "" - -#: discord.Permissions.manage_nicknames:1 of -msgid "Returns ``True`` if a user can change other user's nickname in the guild." -msgstr "" - -#: discord.Permissions.manage_roles:1 of -msgid "" -"Returns ``True`` if a user can create or edit roles less than their " -"role's position." -msgstr "" - -#: discord.Permissions.manage_roles:3 of -msgid "" -"This also corresponds to the \"Manage Permissions\" channel-specific " -"override." -msgstr "" - -#: discord.Permissions.manage_permissions:1 of -#, fuzzy -msgid "An alias for :attr:`manage_roles`." -msgstr ":attr:`extreme` のエイリアス。" - -#: discord.Permissions.manage_webhooks:1 of -msgid "Returns ``True`` if a user can create, edit, or delete webhooks." -msgstr "" - -#: discord.Permissions.manage_emojis:1 of -msgid "Returns ``True`` if a user can create, edit, or delete emojis." -msgstr "" - -#: ../../api.rst:2956 -msgid "PermissionOverwrite" -msgstr "" - -#: discord.PermissionOverwrite:1 of -msgid "A type that is used to represent a channel specific permission." -msgstr "" - -#: discord.PermissionOverwrite:3 of -msgid "" -"Unlike a regular :class:`Permissions`\\, the default value of a " -"permission is equivalent to ``None`` and not ``False``. Setting a value " -"to ``False`` is **explicitly** denying that permission, while setting a " -"value to ``True`` is **explicitly** allowing that permission." -msgstr "" - -#: discord.PermissionOverwrite:9 of -msgid "" -"The values supported by this are the same as :class:`Permissions` with " -"the added possibility of it being set to ``None``." -msgstr "" - -#: discord.PermissionOverwrite:16 of -msgid "Checks if two overwrites are equal." -msgstr "" - -#: discord.PermissionOverwrite:19 of -msgid "Checks if two overwrites are not equal." -msgstr "" - -#: discord.PermissionOverwrite:26 of -msgid "Set the value of permissions by their name." -msgstr "" - -#: discord.PermissionOverwrite.pair:1 of -msgid "" -"Tuple[:class:`Permissions`, :class:`Permissions`]: Returns the (allow, " -"deny) pair from this overwrite." -msgstr "" - -#: discord.PermissionOverwrite.from_pair:1 of -msgid "Creates an overwrite from an allow/deny pair of :class:`Permissions`." -msgstr "" - -#: discord.PermissionOverwrite.is_empty:1 of -msgid "Checks if the permission overwrite is currently empty." -msgstr "" - -#: discord.PermissionOverwrite.is_empty:3 of -msgid "" -"An empty permission overwrite is one that has no overwrites set to " -"``True`` or ``False``." -msgstr "" - -#: discord.PermissionOverwrite.is_empty:6 of -msgid "Indicates if the overwrite is empty." -msgstr "" - -#: discord.PermissionOverwrite.update:1 of -msgid "Bulk updates this permission overwrite object." -msgstr "" - -#: discord.PermissionOverwrite.update:7 of -msgid "A list of key/value pairs to bulk update with." -msgstr "" - -#: ../../api.rst:2962 -msgid "ShardInfo" -msgstr "" - -#: discord.ShardInfo:1 of -msgid "A class that gives information and control over a specific shard." -msgstr "" - -#: discord.ShardInfo:3 of -msgid "" -"You can retrieve this object via :meth:`AutoShardedClient.get_shard` or " -":attr:`AutoShardedClient.shards`." -msgstr "" - -#: discord.ShardInfo:10 of -#, fuzzy -msgid "The shard ID for this shard." -msgstr "準備が完了したShard ID。" - -#: discord.ShardInfo:16 of -msgid "" -"The shard count for this cluster. If this is ``None`` then the bot has " -"not started yet." -msgstr "" - -#: discord.ShardInfo.is_closed:1 of -msgid ":class:`bool`: Whether the shard connection is currently closed." -msgstr "" - -#: discord.ShardInfo.disconnect:3 of -msgid "" -"Disconnects a shard. When this is called, the shard connection will no " -"longer be open." -msgstr "" - -#: discord.ShardInfo.disconnect:6 of -msgid "If the shard is already disconnected this does nothing." -msgstr "" - -#: discord.ShardInfo.reconnect:3 of -msgid "Disconnects and then connects the shard again." -msgstr "" - -#: discord.ShardInfo.connect:3 of -msgid "Connects a shard. If the shard is already connected this does nothing." -msgstr "" - -#: discord.ShardInfo.latency:1 of -msgid "" -"Measures latency between a HEARTBEAT and a HEARTBEAT_ACK in seconds for " -"this shard." -msgstr "" - -#: ../../api.rst:2968 -msgid "SystemChannelFlags" -msgstr "" - -#: discord.SystemChannelFlags:1 of -msgid "Wraps up a Discord system channel flag value." -msgstr "" - -#: discord.SystemChannelFlags:3 of -msgid "" -"Similar to :class:`Permissions`\\, the properties provided are two way. " -"You can set and retrieve individual bits using the properties as if they " -"were regular bools. This allows you to edit the system flags easily." -msgstr "" - -#: discord.MessageFlags:25 discord.PublicUserFlags:24 -#: discord.SystemChannelFlags:28 of -msgid "" -"The raw value. This value is a bit array field of a 53-bit integer " -"representing the currently available flags. You should query flags via " -"the properties rather than using this raw value." -msgstr "" - -#: discord.SystemChannelFlags.join_notifications:1 of -msgid "" -"Returns ``True`` if the system channel is used for member join " -"notifications." -msgstr "" - -#: discord.SystemChannelFlags.premium_subscriptions:1 of -msgid "" -"Returns ``True`` if the system channel is used for Nitro boosting " -"notifications." -msgstr "" - -#: ../../api.rst:2974 -msgid "MessageFlags" -msgstr "" - -#: discord.MessageFlags:1 of -msgid "Wraps up a Discord Message flag value." -msgstr "" - -#: discord.MessageFlags:3 of -msgid "See :class:`SystemChannelFlags`." -msgstr "" - -#: discord.MessageFlags.crossposted:1 of -msgid "Returns ``True`` if the message is the original crossposted message." -msgstr "" - -#: discord.MessageFlags.is_crossposted:1 of -msgid "Returns ``True`` if the message was crossposted from another channel." -msgstr "" - -#: discord.MessageFlags.suppress_embeds:1 of -msgid "Returns ``True`` if the message's embeds have been suppressed." -msgstr "" - -#: discord.MessageFlags.source_message_deleted:1 of -msgid "" -"Returns ``True`` if the source message for this crosspost has been " -"deleted." -msgstr "" - -#: discord.MessageFlags.urgent:1 of -msgid "Returns ``True`` if the source message is an urgent message." -msgstr "" - -#: discord.MessageFlags.urgent:3 of -msgid "An urgent message is one sent by Discord Trust and Safety." -msgstr "" - -#: ../../api.rst:2980 -msgid "PublicUserFlags" -msgstr "" - -#: discord.PublicUserFlags:1 of -msgid "Wraps up the Discord User Public flags." -msgstr "" - -#: discord.PublicUserFlags:7 of -#, fuzzy -msgid "Checks if two PublicUserFlags are equal." -msgstr "二つのユーザーが等しいかを比較します。" - -#: discord.PublicUserFlags:10 of -#, fuzzy -msgid "Checks if two PublicUserFlags are not equal." -msgstr "二つのユーザーが等しいものではないか比較します。" - -#: discord.PublicUserFlags:16 of -msgid "" -"Returns an iterator of ``(name, value)`` pairs. This allows it to be, for" -" example, constructed as a dict or a list of pairs. Note that aliases are" -" not shown." -msgstr "" - -#: discord.PublicUserFlags.staff:1 of -msgid "Returns ``True`` if the user is a Discord Employee." -msgstr "" - -#: discord.PublicUserFlags.partner:1 of -#, fuzzy -msgid "Returns ``True`` if the user is a Discord Partner." -msgstr "ユーザーがDiscordパートナーかを示す真偽値。" - -#: discord.PublicUserFlags.hypesquad:1 of -msgid "Returns ``True`` if the user is a HypeSquad Events member." -msgstr "" - -#: discord.PublicUserFlags.bug_hunter:1 of -#, fuzzy -msgid "Returns ``True`` if the user is a Bug Hunter" -msgstr "ユーザーがバグハンターかを示す真偽値。" - -#: discord.PublicUserFlags.hypesquad_bravery:1 of -msgid "Returns ``True`` if the user is a HypeSquad Bravery member." -msgstr "" - -#: discord.PublicUserFlags.hypesquad_brilliance:1 of -msgid "Returns ``True`` if the user is a HypeSquad Brilliance member." -msgstr "" - -#: discord.PublicUserFlags.hypesquad_balance:1 of -msgid "Returns ``True`` if the user is a HypeSquad Balance member." -msgstr "" - -#: discord.PublicUserFlags.early_supporter:1 of -msgid "Returns ``True`` if the user is an Early Supporter." -msgstr "" - -#: discord.PublicUserFlags.team_user:1 of -msgid "Returns ``True`` if the user is a Team User." -msgstr "" - -#: discord.PublicUserFlags.system:1 of -msgid "" -"Returns ``True`` if the user is a system user (i.e. represents Discord " -"officially)." -msgstr "" - -#: discord.PublicUserFlags.bug_hunter_level_2:1 of -msgid "Returns ``True`` if the user is a Bug Hunter Level 2" -msgstr "" - -#: discord.PublicUserFlags.verified_bot:1 of -#, fuzzy -msgid "Returns ``True`` if the user is a Verified Bot." -msgstr ":class:`bool` -- ユーザーが認証済みアカウントであるかを表します。" - -#: discord.PublicUserFlags.verified_bot_developer:1 of -msgid "Returns ``True`` if the user is an Early Verified Bot Developer." -msgstr "" - -#: discord.PublicUserFlags.early_verified_bot_developer:1 of -#, fuzzy -msgid "An alias for :attr:`verified_bot_developer`." -msgstr ":attr:`dnd` のエイリアス。" - -#: discord.PublicUserFlags.all:1 of -#, fuzzy -msgid "List[:class:`UserFlags`]: Returns all public flags the user has." -msgstr "List[:class:`User`] -- ユーザーが持つすべてのリレーションシップを返します。" - -#: ../../api.rst:2987 -msgid "Exceptions" -msgstr "例外" - -#: ../../api.rst:2989 -msgid "The following exceptions are thrown by the library." -msgstr "" - -#: discord.DiscordException:1 of -msgid "Base exception class for discord.py" -msgstr "" - -#: discord.DiscordException:3 of -msgid "" -"Ideally speaking, this could be caught to handle any exceptions thrown " -"from this library." -msgstr "" - -#: discord.ClientException:1 of -msgid "Exception that's thrown when an operation in the :class:`Client` fails." -msgstr "" - -#: discord.ClientException:3 of -msgid "These are usually for exceptions that happened due to user input." -msgstr "" - -#: discord.LoginFailure:1 of -msgid "" -"Exception that's thrown when the :meth:`Client.login` function fails to " -"log you in from improper credentials or some other misc. failure." -msgstr "" - -#: discord.NoMoreItems:1 of -msgid "" -"Exception that is thrown when an async iteration operation has no more " -"items." -msgstr "" - -#: discord.HTTPException:1 of -msgid "Exception that's thrown when an HTTP request operation fails." -msgstr "" - -#: discord.HTTPException:5 of -msgid "" -"The response of the failed HTTP request. This is an instance of " -":class:`aiohttp.ClientResponse`. In some cases this could also be a " -":class:`requests.Response`." -msgstr "" - -#: discord.HTTPException:9 of -#, fuzzy -msgid ":class:`aiohttp.ClientResponse`" -msgstr ":class:`~discord.ClientUser`" - -#: discord.HTTPException:13 of -msgid "The text of the error. Could be an empty string." -msgstr "" - -#: discord.HTTPException:19 of -msgid "The status code of the HTTP request." -msgstr "" - -#: discord.HTTPException:25 of -msgid "The Discord specific error code for the failure." -msgstr "" - -#: discord.Forbidden:1 of -msgid "Exception that's thrown for when status code 403 occurs." -msgstr "" - -#: discord.Forbidden:3 discord.NotFound:3 of -msgid "Subclass of :exc:`HTTPException`" -msgstr ":exc:`HTTPException` のサブクラス" - -#: discord.NotFound:1 of -msgid "Exception that's thrown for when status code 404 occurs." -msgstr "" - -#: discord.DiscordServerError:1 of -msgid "Exception that's thrown for when a 500 range status code occurs." -msgstr "" - -#: discord.DiscordServerError:3 of -#, fuzzy -msgid "Subclass of :exc:`HTTPException`." -msgstr ":exc:`HTTPException` のサブクラス" - -#: discord.InvalidData:1 of -msgid "" -"Exception that's raised when the library encounters unknown or invalid " -"data from Discord." -msgstr "" - -#: discord.InvalidArgument:1 of -msgid "" -"Exception that's thrown when an argument to a function is invalid some " -"way (e.g. wrong value or wrong type)." -msgstr "" - -#: discord.InvalidArgument:4 of -msgid "" -"This could be considered the analogous of ``ValueError`` and " -"``TypeError`` except inherited from :exc:`ClientException` and thus " -":exc:`DiscordException`." -msgstr "" - -#: discord.GatewayNotFound:1 of -msgid "" -"An exception that is usually thrown when the gateway hub for the " -":class:`Client` websocket is not found." -msgstr "" - -#: discord.ConnectionClosed:1 of -msgid "" -"Exception that's thrown when the gateway connection is closed for reasons" -" that could not be handled internally." -msgstr "" - -#: discord.ConnectionClosed:6 of -msgid "The close code of the websocket." -msgstr "" - -#: discord.ConnectionClosed:12 of -#, fuzzy -msgid "The reason provided for the closure." -msgstr "クライアントによって提供されるデフォルトのエラーハンドラ。" - -#: discord.ConnectionClosed:18 discord.PrivilegedIntentsRequired:12 of -msgid "The shard ID that got closed if applicable." -msgstr "" - -#: discord.PrivilegedIntentsRequired:1 of -msgid "" -"Exception that's thrown when the gateway is requesting privileged intents" -" but they're not ticked in the developer page yet." -msgstr "" - -#: discord.PrivilegedIntentsRequired:4 of -msgid "" -"Go to https://discord.com/developers/applications/ and enable the intents" -" that are required. Currently these are as follows:" -msgstr "" - -#: discord.PrivilegedIntentsRequired:7 of -#, fuzzy -msgid ":attr:`Intents.members`" -msgstr ":attr:`Permissions.mute_members`" - -#: discord.PrivilegedIntentsRequired:8 of -#, fuzzy -msgid ":attr:`Intents.presences`" -msgstr ":attr:`approximate_presence_count`" - -#: discord.opus.OpusError:1 of -msgid "An exception that is thrown for libopus related errors." -msgstr "" - -#: discord.opus.OpusError:5 of -msgid "The error code returned." -msgstr "" - -#: discord.opus.OpusNotLoaded:1 of -msgid "An exception that is thrown for when libopus is not loaded." -msgstr "" - -#: ../../api.rst:3023 -msgid "Exception Hierarchy" -msgstr "" - -#: ../../api.rst:3039 -msgid ":exc:`Exception`" -msgstr "" - -#: ../../api.rst:3039 -msgid ":exc:`DiscordException`" -msgstr "" - -#: ../../api.rst:3033 -msgid ":exc:`ClientException`" -msgstr "" - -#: ../../api.rst:3030 -msgid ":exc:`InvalidData`" -msgstr "" - -#: ../../api.rst:3031 -msgid ":exc:`InvalidArgument`" -msgstr "" - -#: ../../api.rst:3032 -msgid ":exc:`LoginFailure`" -msgstr "" - -#: ../../api.rst:3033 -msgid ":exc:`ConnectionClosed`" -msgstr "" - -#: ../../api.rst:3034 -msgid ":exc:`PrivilegedIntentsRequired`" -msgstr "" - -#: ../../api.rst:3035 -msgid ":exc:`NoMoreItems`" -msgstr "" - -#: ../../api.rst:3036 -msgid ":exc:`GatewayNotFound`" -msgstr "" - -#: ../../api.rst:3039 -msgid ":exc:`HTTPException`" -msgstr "" - -#: ../../api.rst:3038 -msgid ":exc:`Forbidden`" -msgstr "" - -#: ../../api.rst:3039 -msgid ":exc:`NotFound`" -msgstr "" - -#: ../../api.rst:3040 -#, fuzzy -msgid ":exc:`DiscordServerError`" -msgstr ":class:`~discord.User`" - -#~ msgid "" -#~ "Indicates if :func:`.on_ready` should be " -#~ "delayed to fetch all offline members " -#~ "from the guilds the bot belongs " -#~ "to. If this is ``False``\\, then " -#~ "no offline members are received and " -#~ ":meth:`request_offline_members` must be used " -#~ "to fetch the offline members of " -#~ "the guild." -#~ msgstr "" -#~ "参加しているすべてのギルドのオフラインメンバーも取得するために、 :func:`.on_ready` " -#~ "を遅延させるかどうかを表します。これが ``False`` の場合、オフラインメンバーの取得は行われず、 " -#~ ":meth:`request_offline_members` を使用してギルドのオフラインメンバーを取得する必要があります。" - -#~ msgid "" -#~ ":class:`float` -- Measures latency between " -#~ "a HEARTBEAT and a HEARTBEAT_ACK in " -#~ "seconds." -#~ msgstr ":class:`float` -- HEARTBEATとHEARTBEAT_ACK間の待ち時間を秒単位で測定します。" - -#~ msgid "List[:class:`.VoiceClient`] -- Represents a list of voice connections." -#~ msgstr "List[:class:`.VoiceClient`] -- 音声接続のリストを表します。" - -#~ msgid "" -#~ "Optional[Union[:class:`.Activity`, :class:`.Game`, " -#~ ":class:`.Streaming`]] -- The activity being" -#~ " used upon logging in." -#~ msgstr "" -#~ "Optional[Union[:class:`.Activity`, :class:`.Game`, " -#~ ":class:`.Streaming`]] -- ログイン時のアクティビティ。" - -#~ msgid "" -#~ "Optional[Union[:class:`.abc.GuildChannel`, :class:`.Thread`, " -#~ ":class:`.abc.PrivateChannel`]]: Returns a channel" -#~ " with the given ID." -#~ msgstr "" -#~ "Optional[Union[:class:`.abc.GuildChannel`, :class:`.Thread`, " -#~ ":class:`.abc.PrivateChannel`]]: 与えられたIDを持つチャンネルを返します。" - -#~ msgid "If not found, returns ``None``." -#~ msgstr "見つからない場合は、 ``None`` を返します。" - -#~ msgid ":exc:`.HTTPException` -- Getting the guilds failed." -#~ msgstr ":exc:`.HTTPException` -- ギルドの取得に失敗した。" - -#~ msgid "" -#~ "The activity parameter is a " -#~ ":class:`.Activity` object (not a string) " -#~ "that represents the activity being done" -#~ " currently. This could also be the" -#~ " slimmed down versions, :class:`.Game` and" -#~ " :class:`.Streaming`." -#~ msgstr "" -#~ "Activityパラメータは現在のアクティビティをあらわす:class:`.Activity` (文字列ではない) " -#~ "です。これはスリム化された :class:`.Game` や :class:`.Streaming`" -#~ " でもいいです。" - -#~ msgid ":exc:`.NotFound` -- Invalid Channel ID." -#~ msgstr ":exc:`.NotFound` -- チャンネルのIDが無効。" - -#~ msgid "" -#~ "Gets an arbitrary user's profile. This" -#~ " can only be used by non-bot" -#~ " accounts." -#~ msgstr "任意のユーザーのプロフィールを取得します。これはBotアカウント以外でのみ使用可能です。" - -#~ msgid ":exc:`.NotFound` -- Invalid webhook ID." -#~ msgstr ":exc:`.NotFound` -- WebhookのIDが無効。" - -#~ msgid "" -#~ ":exc:`.InvalidArgument` -- If any guild " -#~ "is unavailable or not large in the" -#~ " collection." -#~ msgstr ":exc:`.InvalidArgument` -- いずれかのギルドが利用できない、またはコレクション内のギルドが大きくない。" - -#~ msgid "" -#~ "List[Tuple[:class:`int`, :class:`float`]] -- A " -#~ "list of latencies between a HEARTBEAT" -#~ " and a HEARTBEAT_ACK in seconds." -#~ msgstr "" -#~ "List[Tuple[:class:`int`, :class:`float`]] -- " -#~ "HEARTBEATとHEARTBEAT_ACK間の待ち時間を秒単位で表したリスト。" - -#~ msgid "" -#~ "The activity parameter is a " -#~ ":class:`Activity` object (not a string) " -#~ "that represents the activity being done" -#~ " currently. This could also be the" -#~ " slimmed down versions, :class:`Game` and" -#~ " :class:`Streaming`." -#~ msgstr "" -#~ "activityパラメータは現在実行中のアクティビティを表す :class:`Activity` " -#~ "オブジェクト(文字列ではありません)です。これはスリムなダウンバージョン、 :class:`Game` や " -#~ ":class:`Streaming` でも構いません。" - -#~ msgid ":class:`int` -- The application ID." -#~ msgstr ":class:`int` -- アプリケーションID。" - -#~ msgid "" -#~ "Optional[List[:class:`str`]] -- A list of " -#~ "RPC origin URLs, if RPC is " -#~ "enabled." -#~ msgstr "Optional[List[:class:`str`]] -- RPCが有効になっている場合のRPCオリジンURLのリスト。" - -#~ msgid "" -#~ "In order to play audio, you must" -#~ " have loaded the opus library through" -#~ " :func:`opus.load_opus`." -#~ msgstr "オーディオの再生を行うためには :func:`opus.load_opus` を使用してopusライブラリをロードしておく必要があります。" - -#~ msgid "" -#~ "If you don't do this then the " -#~ "library will not be able to " -#~ "transmit audio." -#~ msgstr "ロードを行っていない場合、オーディオの送信ができません。" - -#~ msgid ":exc:`TypeError` -- Not an audio source." -#~ msgstr ":exc:`TypeError` -- オーディオソースでない。" - -#~ msgid "game playing" -#~ msgstr "遊んでいるゲーム" - -#~ msgid "" -#~ "A message was deleted by a " -#~ "moderator. Note that this only triggers" -#~ " if the message was deleted by " -#~ "either bulk delete or deletion by " -#~ "someone other than the author." -#~ msgstr "" - -#~ msgid ":class:`AuditLogAction` -- The action that was done." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`abc.User` -- The user who " -#~ "initiated this action. Usually a " -#~ ":class:`Member`\\, unless gone then it's " -#~ "a :class:`User`." -#~ msgstr "" - -#~ msgid ":class:`int` -- The entry ID." -#~ msgstr "" - -#~ msgid "" -#~ "*Any* -- The target that got " -#~ "changed. The exact type of this " -#~ "depends on the action being done." -#~ msgstr "" - -#~ msgid "Optional[:class:`str`] -- The reason this action was done." -#~ msgstr "" - -#~ msgid "" -#~ "*Any* -- Extra information that this " -#~ "entry has that might be useful. " -#~ "For most actions, this is ``None``. " -#~ "However in some cases it contains " -#~ "extra information. See :class:`AuditLogAction` " -#~ "for which actions have this field " -#~ "filled out." -#~ msgstr "" - -#~ msgid ":class:`datetime.datetime` -- Returns the entry's creation time in UTC." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`AuditLogActionCategory`] -- The " -#~ "category of the action, if applicable." -#~ msgstr "" - -#~ msgid ":class:`AuditLogChanges` -- The list of changes this entry has." -#~ msgstr "" - -#~ msgid ":class:`AuditLogDiff` -- The target's prior state." -#~ msgstr "" - -#~ msgid ":class:`AuditLogDiff` -- The target's subsequent state." -#~ msgstr "" - -#~ msgid ":class:`str` – A name of something." -#~ msgstr "" - -#~ msgid ":class:`str` – A guild's icon hash. See also :attr:`Guild.icon`." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`str` – The guild's invite splash" -#~ " hash. See also :attr:`Guild.splash`." -#~ msgstr "" - -#~ msgid "" -#~ "Union[:class:`Member`, :class:`User`] – The " -#~ "guild's owner. See also :attr:`Guild.owner`" -#~ msgstr "" - -#~ msgid "" -#~ ":class:`VoiceRegion` – The guild's voice " -#~ "region. See also :attr:`Guild.region`." -#~ msgstr "" - -#~ msgid "" -#~ "Union[:class:`VoiceChannel`, :class:`Object`] – The" -#~ " guild's AFK channel." -#~ msgstr "" - -#~ msgid "" -#~ "Union[:class:`TextChannel`, :class:`Object`] – The" -#~ " guild's system channel." -#~ msgstr "" - -#~ msgid ":class:`int` – The guild's AFK timeout. See :attr:`Guild.afk_timeout`." -#~ msgstr "" - -#~ msgid ":class:`int` - The guild's MFA level. See :attr:`Guild.mfa_level`." -#~ msgstr "" - -#~ msgid ":class:`bool` – The guild's widget has been enabled or disabled." -#~ msgstr "" - -#~ msgid "Union[:class:`TextChannel`, :class:`Object`] – The widget's channel." -#~ msgstr "" - -#~ msgid ":class:`VerificationLevel` – The guild's verification level." -#~ msgstr "" - -#~ msgid ":class:`NotificationLevel` – The guild's default notification level." -#~ msgstr "" - -#~ msgid ":class:`ContentFilter` – The guild's content filter." -#~ msgstr "" - -#~ msgid ":class:`int` – The guild's default message notification setting." -#~ msgstr "" - -#~ msgid ":class:`str` – The guild's vanity URL." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`int` – The position of a " -#~ ":class:`Role` or :class:`abc.GuildChannel`." -#~ msgstr "" - -#~ msgid "" -#~ "Union[:class:`int`, :class:`str`] – The type" -#~ " of channel or channel permission " -#~ "overwrite." -#~ msgstr "" - -#~ msgid ":class:`int` – The bitrate of a :class:`VoiceChannel`." -#~ msgstr "" - -#~ msgid "" -#~ "List[Tuple[target, :class:`PermissionOverwrite`]] – " -#~ "A list of permission overwrite tuples" -#~ " that represents a target and a " -#~ ":class:`PermissionOverwrite` for said target." -#~ msgstr "" - -#~ msgid "" -#~ "List[Union[:class:`Role`, :class:`Object`]] – A " -#~ "list of roles being added or " -#~ "removed from a member." -#~ msgstr "" - -#~ msgid "Optional[:class:`str`] – The nickname of a member." -#~ msgstr "" - -#~ msgid ":class:`bool` – Whether the member is being server deafened." -#~ msgstr "" - -#~ msgid ":class:`bool` – Whether the member is being server muted." -#~ msgstr "" - -#~ msgid ":class:`bool` – Whether the role is being hoisted or not." -#~ msgstr "" - -#~ msgid ":class:`bool` – Whether the role is mentionable or not." -#~ msgstr "" - -#~ msgid ":class:`str` – The invite's code." -#~ msgstr "" - -#~ msgid "Union[:class:`abc.GuildChannel`, :class:`Object`] – A guild channel." -#~ msgstr "" - -#~ msgid ":class:`int` – The invite's max age in seconds." -#~ msgstr "" - -#~ msgid ":class:`bool` – If the invite is a temporary invite." -#~ msgstr "" - -#~ msgid ":class:`Permissions` – The permissions being allowed or denied." -#~ msgstr "" - -#~ msgid ":class:`int` – The ID of the object being changed." -#~ msgstr "" - -#~ msgid ":class:`str` – The avatar hash of a member." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`int` – The number of seconds " -#~ "members have to wait before sending " -#~ "another message in the channel." -#~ msgstr "" - -#~ msgid ":class:`int` -- The webhook's ID" -#~ msgstr "" - -#~ msgid ":class:`str` -- The authentication token of the webhook." -#~ msgstr "" - -#~ msgid "Optional[:class:`int`] -- The guild ID this webhook is for." -#~ msgstr "" - -#~ msgid "Optional[:class:`int`] -- The channel ID this webhook is for." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`abc.User`] -- The user this" -#~ " webhook was created by. If the " -#~ "webhook was received without authentication" -#~ " then this will be ``None``." -#~ msgstr "" - -#~ msgid "Optional[:class:`str`] -- The default name of the webhook." -#~ msgstr "" - -#~ msgid "Optional[:class:`str`] -- The default avatar of the webhook." -#~ msgstr "" - -#~ msgid "A partial webhook is just a webhook object with an ID and a token." -#~ msgstr "" - -#~ msgid ":exc:`InvalidArgument` -- The URL is invalid." -#~ msgstr "" - -#~ msgid "Optional[:class:`Guild`] -- The guild this webhook belongs to." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`TextChannel`] -- The text " -#~ "channel this webhook belongs to." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`datetime.datetime` -- Returns the " -#~ "webhook's creation time in UTC." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`InvalidArgument` -- Bad image format " -#~ "passed to ``format`` or invalid " -#~ "``size``." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Deleting the webhook failed." -#~ msgstr "" - -#~ msgid ":exc:`NotFound` -- This webhook does not exist." -#~ msgstr "" - -#~ msgid ":exc:`Forbidden` -- You do not have permissions to delete this webhook." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Editing the webhook failed." -#~ msgstr "" - -#~ msgid ":exc:`Forbidden` -- You do not have permissions to edit this webhook." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Sending the message failed." -#~ msgstr "" - -#~ msgid ":exc:`NotFound` -- This webhook was not found." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`Forbidden` -- The authorization token" -#~ " for the webhook is incorrect." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`InvalidArgument` -- You specified both" -#~ " ``embed`` and ``embeds`` or the " -#~ "length of ``embeds`` was invalid." -#~ msgstr "" - -#~ msgid ":class:`Webhook` -- The webhook that owns this adapter." -#~ msgstr "" - -#~ msgid ":class:`int` -- The model's unique ID." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`datetime.datetime` -- Returns the " -#~ "model's creation time as a naive " -#~ "datetime in UTC." -#~ msgstr "" - -#~ msgid ":class:`str` -- The user's discriminator." -#~ msgstr "" - -#~ msgid "Optional[:class:`str`] -- The avatar hash the user has." -#~ msgstr "" - -#~ msgid ":class:`bool` -- If the user is a bot account." -#~ msgstr "" - -#~ msgid ":class:`str` -- Returns the user's display name." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`str` -- Returns a string that" -#~ " allows you to mention the given " -#~ "user." -#~ msgstr "" - -#~ msgid ":class:`str` -- The channel name." -#~ msgstr "" - -#~ msgid ":class:`~discord.Guild` -- The guild the channel belongs to." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`int` -- The position in the " -#~ "channel list. This is a number " -#~ "that starts at 0. e.g. the top " -#~ "channel is position 0." -#~ msgstr "" - -#~ msgid "" -#~ "List[:class:`~discord.Role`] -- Returns a list" -#~ " of roles that have been overridden" -#~ " from their default values in the " -#~ ":attr:`~discord.Guild.roles` attribute." -#~ msgstr "" - -#~ msgid ":class:`str` -- The string that allows you to mention the channel." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`datetime.datetime` -- Returns the " -#~ "channel's creation time in UTC." -#~ msgstr "" - -#~ msgid "" -#~ "This is returned as a dictionary " -#~ "where the key contains the target " -#~ "which can be either a " -#~ ":class:`~discord.Role` or a :class:`~discord.Member`" -#~ " and the key is the overwrite " -#~ "as a :class:`~discord.PermissionOverwrite`." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`~discord.CategoryChannel`] -- The " -#~ "category this channel belongs to." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`~discord.Forbidden` -- You do not " -#~ "have the proper permissions to create" -#~ " this channel." -#~ msgstr "" - -#~ msgid ":exc:`~discord.HTTPException` -- Creating the channel failed." -#~ msgstr "" - -#~ msgid "" -#~ "You must have the " -#~ ":attr:`~.Permissions.create_instant_invite` permission to" -#~ " do this." -#~ msgstr "" - -#~ msgid "" -#~ "How long the invite should last. " -#~ "If it's 0 then the invite doesn't" -#~ " expire. Defaults to 0." -#~ msgstr "" - -#~ msgid "" -#~ "How many uses the invite could be" -#~ " used for. If it's 0 then there" -#~ " are unlimited uses. Defaults to 0." -#~ msgstr "" - -#~ msgid ":exc:`~discord.HTTPException` -- Invite creation failed." -#~ msgstr "" - -#~ msgid "" -#~ "You must have :attr:`~.Permissions.manage_channels`" -#~ " permission to use this." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`~discord.Forbidden` -- You do not " -#~ "have proper permissions to delete the" -#~ " channel." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`~discord.NotFound` -- The channel was" -#~ " not found or was already deleted." -#~ msgstr "" - -#~ msgid ":exc:`~discord.HTTPException` -- Deleting the channel failed." -#~ msgstr "" - -#~ msgid "" -#~ "You must have :attr:`~.Permissions.manage_guild` " -#~ "to get this information." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`~discord.Forbidden` -- You do not " -#~ "have proper permissions to get the " -#~ "information." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`~discord.HTTPException` -- An error " -#~ "occurred while fetching the information." -#~ msgstr "" - -#~ msgid "" -#~ "You must have the " -#~ ":attr:`~.Permissions.manage_roles` permission to use" -#~ " this." -#~ msgstr "" - -#~ msgid "The permissions to allow and deny to the target." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`~discord.Forbidden` -- You do not " -#~ "have permissions to edit channel " -#~ "specific permissions." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`~discord.HTTPException` -- Editing channel " -#~ "specific permissions failed." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`~discord.NotFound` -- The role or " -#~ "member being edited is not part of" -#~ " the guild." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`~discord.InvalidArgument` -- The overwrite " -#~ "parameter invalid or the target type " -#~ "was not :class:`~discord.Role` or " -#~ ":class:`~discord.Member`." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`~discord.Forbidden` -- You do not " -#~ "have permissions to get channel message" -#~ " history." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`~discord.HTTPException` -- The request " -#~ "to get message history failed." -#~ msgstr "" - -#~ msgid ":exc:`~discord.NotFound` -- The specified message was not found." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`~discord.Forbidden` -- You do not " -#~ "have the permissions required to get " -#~ "a message." -#~ msgstr "" - -#~ msgid ":exc:`~discord.HTTPException` -- Retrieving the message failed." -#~ msgstr "" - -#~ msgid ":exc:`~discord.HTTPException` -- Retrieving the pinned messages failed." -#~ msgstr "" - -#~ msgid ":exc:`~discord.HTTPException` -- Sending the message failed." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`~discord.Forbidden` -- You do not " -#~ "have the proper permissions to send " -#~ "the message." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`~discord.InvalidArgument` -- The ``files`` " -#~ "list is not of the appropriate " -#~ "size or you specified both ``file`` " -#~ "and ``files``." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`InvalidArgument` -- Bad image format " -#~ "passed to ``format`` or ``static_format``, " -#~ "or invalid ``size``." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`Colour` -- A property that " -#~ "returns a color denoting the rendered" -#~ " color for the user. This always " -#~ "returns :meth:`Colour.default`." -#~ msgstr "" - -#~ msgid "There is an alias for this named :meth:`colour`." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`Colour` -- A property that " -#~ "returns a colour denoting the rendered" -#~ " colour for the user. This always " -#~ "returns :meth:`Colour.default`." -#~ msgstr "" - -#~ msgid "There is an alias for this named :meth:`color`." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`ClientException` -- Attempted to create" -#~ " a group with only one recipient. " -#~ "This does not include yourself." -#~ msgstr "" - -#~ msgid ":class:`datetime.datetime` -- Returns the user's creation time in UTC." -#~ msgstr "" - -#~ msgid "" -#~ "*class* -- `DefaultAvatar` -- Returns " -#~ "the default avatar for a given " -#~ "user. This is calculated by the " -#~ "user's discriminator." -#~ msgstr "" - -#~ msgid ":class:`Asset` -- Returns a URL for a user's default avatar." -#~ msgstr "" - -#~ msgid "Indicates if the user has an animated avatar." -#~ msgstr "" - -#~ msgid ":class:`User` -- The user you have the relationship with." -#~ msgstr "" - -#~ msgid ":class:`RelationshipType` -- The type of relationship you have." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Accepting the relationship failed." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Deleting the relationship failed." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`DMChannel`] -- Returns the " -#~ "channel associated with this user if " -#~ "it exists." -#~ msgstr "" - -#~ msgid ":exc:`Forbidden` -- Not allowed to block this user." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Blocking the user failed." -#~ msgstr "" - -#~ msgid ":exc:`Forbidden` -- Not allowed to get mutual friends of this user." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Getting mutual friends failed." -#~ msgstr "" - -#~ msgid ":exc:`Forbidden` -- Not allowed to fetch profiles." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Fetching the profile failed." -#~ msgstr "" - -#~ msgid ":exc:`Forbidden` -- Not allowed to remove this user as a friend." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Removing the user as a friend failed." -#~ msgstr "" - -#~ msgid ":exc:`Forbidden` -- Not allowed to send a friend request to the user." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Sending the friend request failed." -#~ msgstr "" - -#~ msgid ":exc:`Forbidden` -- Not allowed to unblock this user." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Unblocking the user failed." -#~ msgstr "" - -#~ msgid "Checks if the user is your friend." -#~ msgstr "" - -#~ msgid "Checks if the user is blocked." -#~ msgstr "" - -#~ msgid ":class:`int` -- The attachment ID." -#~ msgstr "" - -#~ msgid ":class:`int` -- The attachment size in bytes." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`int`] -- The attachment's " -#~ "height, in pixels. Only applicable to" -#~ " images." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`int`] -- The attachment's " -#~ "width, in pixels. Only applicable to " -#~ "images." -#~ msgstr "" - -#~ msgid ":class:`str` -- The attachment's filename." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`str` -- The attachment URL. If" -#~ " the message this attachment was " -#~ "attached to is deleted, then this " -#~ "will 404." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`str` -- The proxy URL. This " -#~ "is a cached version of the " -#~ ":attr:`~Attachment.url` in the case of " -#~ "images. When the message is deleted, " -#~ "this URL might be valid for a " -#~ "few minutes or not valid at all." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Downloading the attachment failed." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`Forbidden` -- You do not have " -#~ "permissions to access this attachment" -#~ msgstr "" - -#~ msgid ":exc:`NotFound` -- The attachment was deleted." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Saving the attachment failed." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`DiscordException` -- There was no " -#~ "valid URL or internal connection state." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Downloading the asset failed." -#~ msgstr "" - -#~ msgid ":exc:`NotFound` -- The asset was deleted." -#~ msgstr "" - -#~ msgid "Same as :meth:`read`." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- Specifies if the " -#~ "message was done with text-to-" -#~ "speech. This can only be accurately " -#~ "received in :func:`on_message` due to a" -#~ " discord limitation." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`MessageType` -- The type of " -#~ "message. In most cases this should " -#~ "not be checked, but it is helpful" -#~ " in cases where it might be a" -#~ " system message for :attr:`system_content`." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`abc.User` -- A :class:`Member` that" -#~ " sent the message. If :attr:`channel` " -#~ "is a private channel or the user" -#~ " has the left the guild, then " -#~ "it is a :class:`User` instead." -#~ msgstr "" - -#~ msgid ":class:`str` -- The actual contents of the message." -#~ msgstr "" - -#~ msgid "List[:class:`Embed`] -- A list of embeds the message has." -#~ msgstr "" - -#~ msgid "" -#~ "Union[:class:`abc.Messageable`] -- The " -#~ ":class:`TextChannel` that the message was " -#~ "sent from. Could be a :class:`DMChannel`" -#~ " or :class:`GroupChannel` if it's a " -#~ "private message." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`CallMessage`] -- The call " -#~ "that the message refers to. This " -#~ "is only applicable to messages of " -#~ "type :attr:`MessageType.call`." -#~ msgstr "" - -#~ msgid ":class:`bool` -- Specifies if the message mentions everyone." -#~ msgstr "" - -#~ msgid "" -#~ "List[:class:`abc.User`] -- A list of " -#~ ":class:`Member` that were mentioned. If " -#~ "the message is in a private " -#~ "message then the list will be of" -#~ " :class:`User` instead. For messages that" -#~ " are not of type " -#~ ":attr:`MessageType.default`\\, this array can " -#~ "be used to aid in system messages." -#~ " For more information, see " -#~ ":attr:`system_content`." -#~ msgstr "" - -#~ msgid "" -#~ "List[:class:`abc.GuildChannel`] -- A list of" -#~ " :class:`abc.GuildChannel` that were mentioned." -#~ " If the message is in a private" -#~ " message then the list is always " -#~ "empty." -#~ msgstr "" - -#~ msgid "" -#~ "List[:class:`Role`] -- A list of " -#~ ":class:`Role` that were mentioned. If " -#~ "the message is in a private " -#~ "message then the list is always " -#~ "empty." -#~ msgstr "" - -#~ msgid ":class:`int` -- The message ID." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`int`] -- If this message " -#~ "was sent by a webhook, then this" -#~ " is the webhook ID's that sent " -#~ "this message." -#~ msgstr "" - -#~ msgid "List[:class:`Attachment`] -- A list of attachments given to a message." -#~ msgstr "" - -#~ msgid ":class:`bool` -- Specifies if the message is currently pinned." -#~ msgstr "" - -#~ msgid "" -#~ "List[:class:`Reaction`] -- Reactions to a " -#~ "message. Reactions can be either custom" -#~ " emoji or standard unicode emoji." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`dict`] -- The activity " -#~ "associated with this message. Sent with" -#~ " Rich-Presence related messages that " -#~ "for example, request joining, spectating, " -#~ "or listening to or with another " -#~ "member." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`dict`] -- The rich presence" -#~ " enabled application associated with this" -#~ " message." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`Guild`] -- The guild that " -#~ "the message belongs to, if applicable." -#~ msgstr "" - -#~ msgid "" -#~ "List[:class:`int`] -- A property that " -#~ "returns an array of user IDs " -#~ "matched with the syntax of " -#~ "``<@user_id>`` in the message content." -#~ msgstr "" - -#~ msgid "" -#~ "List[:class:`int`] -- A property that " -#~ "returns an array of channel IDs " -#~ "matched with the syntax of " -#~ "``<#channel_id>`` in the message content." -#~ msgstr "" - -#~ msgid "" -#~ "List[:class:`int`] -- A property that " -#~ "returns an array of role IDs " -#~ "matched with the syntax of " -#~ "``<@&role_id>`` in the message content." -#~ msgstr "" - -#~ msgid ":class:`datetime.datetime` -- The message's creation time in UTC." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`datetime.datetime`] -- A naive " -#~ "UTC datetime object containing the " -#~ "edited time of the message." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`str` -- Returns a URL that " -#~ "allows the client to jump to this" -#~ " message." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Acking failed." -#~ msgstr "" - -#~ msgid ":exc:`ClientException` -- You must not be a bot user." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Adding the reaction failed." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`Forbidden` -- You do not have " -#~ "the proper permissions to react to " -#~ "the message." -#~ msgstr "" - -#~ msgid ":exc:`NotFound` -- The emoji you specified was not found." -#~ msgstr "" - -#~ msgid ":exc:`InvalidArgument` -- The emoji parameter is invalid." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Removing the reactions failed." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`Forbidden` -- You do not have " -#~ "the proper permissions to remove all " -#~ "the reactions." -#~ msgstr "" - -#~ msgid "" -#~ "If provided, the number of seconds " -#~ "to wait in the background before " -#~ "deleting the message." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`Forbidden` -- You do not have " -#~ "proper permissions to delete the " -#~ "message." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Deleting the message failed." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Editing the message failed." -#~ msgstr "" - -#~ msgid ":exc:`Forbidden` -- You do not have permissions to pin the message." -#~ msgstr "" - -#~ msgid ":exc:`NotFound` -- The message or channel was not found or deleted." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`HTTPException` -- Pinning the message" -#~ " failed, probably due to the channel" -#~ " having more than 50 pinned messages." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Removing the reaction failed." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`Forbidden` -- You do not have " -#~ "the proper permissions to remove the " -#~ "reaction." -#~ msgstr "" - -#~ msgid ":exc:`NotFound` -- The member or emoji you specified was not found." -#~ msgstr "" - -#~ msgid ":exc:`Forbidden` -- You do not have permissions to unpin the message." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Unpinning the message failed." -#~ msgstr "" - -#~ msgid "" -#~ "Union[:class:`Emoji`, :class:`str`] -- The " -#~ "reaction emoji. May be a custom " -#~ "emoji, or a unicode emoji." -#~ msgstr "" - -#~ msgid ":class:`int` -- Number of times this reaction was made" -#~ msgstr "" - -#~ msgid ":class:`bool` -- If the user sent this reaction." -#~ msgstr "" - -#~ msgid ":class:`Message` -- Message this reaction is for." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Getting the users for the reaction failed." -#~ msgstr "" - -#~ msgid ":class:`bool` -- If this is a custom emoji." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`NotFound` -- The user you " -#~ "specified, or the reaction's message was" -#~ " not found." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`datetime.datetime`] -- A naive " -#~ "UTC datetime object that represents the" -#~ " time that the call has ended." -#~ msgstr "" - -#~ msgid "" -#~ "List[:class:`User`] -- The list of users" -#~ " that are participating in this call." -#~ msgstr "" - -#~ msgid ":class:`Message` -- The message associated with this call message." -#~ msgstr "" - -#~ msgid ":class:`bool` -- Indicates if the call has ended." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`GroupChannel`\\ -- The private channel" -#~ " associated with this message." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`CallMessage` -- The call message " -#~ "associated with this group call." -#~ msgstr "" - -#~ msgid ":class:`bool` -- Denotes if this group call is unavailable." -#~ msgstr "" - -#~ msgid "" -#~ "List[:class:`User`] -- A list of users" -#~ " that are currently being rung to " -#~ "join the call." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`VoiceRegion` -- The guild region " -#~ "the group call is being hosted on." -#~ msgstr "" - -#~ msgid "" -#~ "List[:class:`User`] -- A property that " -#~ "returns all users that are currently " -#~ "in this call." -#~ msgstr "" - -#~ msgid ":class:`GroupChannel`\\ -- Returns the channel the group call is in." -#~ msgstr "" - -#~ msgid ":class:`str` -- The guild name." -#~ msgstr "" - -#~ msgid "Tuple[:class:`Emoji`, ...] -- All emojis that the guild owns." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`VoiceRegion` -- The region the " -#~ "guild belongs on. There is a " -#~ "chance that the region will be a" -#~ " :class:`str` if the value is not " -#~ "recognised by the enumerator." -#~ msgstr "" - -#~ msgid ":class:`int` -- The timeout to get sent to the AFK channel." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`VoiceChannel`] -- The channel " -#~ "that denotes the AFK channel. None " -#~ "if it doesn't exist." -#~ msgstr "" - -#~ msgid "Optional[:class:`str`] -- The guild's icon." -#~ msgstr "" - -#~ msgid ":class:`int` -- The guild's ID." -#~ msgstr "" - -#~ msgid ":class:`int` -- The guild owner's ID. Use :attr:`Guild.owner` instead." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- Indicates if the guild" -#~ " is unavailable. If this is ``True``" -#~ " then the reliability of other " -#~ "attributes outside of :meth:`Guild.id` is " -#~ "slim and they might all be None." -#~ " It is best to not do anything" -#~ " with the guild if it is " -#~ "unavailable." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`int`] -- The maximum amount" -#~ " of presences for the guild." -#~ msgstr "" - -#~ msgid "Optional[:class:`int`] -- The maximum amount of members for the guild." -#~ msgstr "" - -#~ msgid "Optional[:class:`str`] -- The guild's banner." -#~ msgstr "" - -#~ msgid "Optional[:class:`str`] -- The guild's description." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`int` -- Indicates the guild's " -#~ "two factor authorisation level. If this" -#~ " value is 0 then the guild does" -#~ " not require 2FA for their " -#~ "administrative members. If the value is" -#~ " 1 then they do." -#~ msgstr "" - -#~ msgid ":class:`VerificationLevel` -- The guild's verification level." -#~ msgstr "" - -#~ msgid ":class:`ContentFilter` -- The guild's explicit content filter." -#~ msgstr "" - -#~ msgid ":class:`NotificationLevel` -- The guild's notification settings." -#~ msgstr "" - -#~ msgid "" -#~ "List[:class:`str`] -- A list of features" -#~ " that the guild has. They are " -#~ "currently as follows:" -#~ msgstr "" - -#~ msgid "``LURKABLE``: Users can lurk in this guild via Server Discovery." -#~ msgstr "" - -#~ msgid "Optional[:class:`str`] -- The guild's invite splash." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`int` -- The premium tier for " -#~ "this guild. Corresponds to \"Nitro " -#~ "Server\" in the official UI. The " -#~ "number goes from 0 to 3 inclusive." -#~ msgstr "" - -#~ msgid ":class:`int` -- How many users have currently \"boosted\" this guild." -#~ msgstr "" - -#~ msgid "" -#~ "If set to ``True``, return entries " -#~ "in oldest->newest order. Defaults to " -#~ "True if ``after`` is specified, " -#~ "otherwise ``False``." -#~ msgstr "" - -#~ msgid ":exc:`Forbidden` -- You are not allowed to fetch audit logs" -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`HTTPException` -- An error occurred " -#~ "while fetching the audit logs." -#~ msgstr "" - -#~ msgid "" -#~ "List[:class:`abc.GuildChannel`] -- A list of" -#~ " channels that belongs to this guild." -#~ msgstr "" - -#~ msgid ":class:`bool` -- Indicates if the guild is a 'large' guild." -#~ msgstr "" - -#~ msgid "" -#~ "List[:class:`VoiceChannel`] -- A list of " -#~ "voice channels that belongs to this " -#~ "guild." -#~ msgstr "" - -#~ msgid "Returns the :class:`VoiceClient` associated with this guild, if any." -#~ msgstr "" - -#~ msgid "" -#~ "List[:class:`TextChannel`] -- A list of " -#~ "text channels that belongs to this " -#~ "guild." -#~ msgstr "" - -#~ msgid "" -#~ "List[:class:`CategoryChannel`] -- A list of" -#~ " categories that belongs to this " -#~ "guild." -#~ msgstr "" - -#~ msgid "" -#~ "Returns a :class:`abc.GuildChannel` with the" -#~ " given ID. If not found, returns " -#~ "None." -#~ msgstr "" - -#~ msgid ":class:`int` -- The maximum number of emoji slots this guild has." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`float` -- The maximum bitrate " -#~ "for voice channels this guild can " -#~ "have." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`int` -- The maximum number of" -#~ " bytes files can have when uploaded" -#~ " to this guild." -#~ msgstr "" - -#~ msgid "List[:class:`Member`] -- A list of members that belong to this guild." -#~ msgstr "" - -#~ msgid "" -#~ "Returns a :class:`Member` with the given" -#~ " ID. If not found, returns None." -#~ msgstr "" - -#~ msgid "" -#~ "List[:class:`Member`] -- A list of " -#~ "members who have \"boosted\" this guild." -#~ msgstr "" - -#~ msgid "Returns a :class:`Role` with the given ID. If not found, returns None." -#~ msgstr "" - -#~ msgid ":class:`Member` -- The member that owns the guild." -#~ msgstr "" - -#~ msgid ":class:`Asset` -- Returns the guild's icon asset." -#~ msgstr "" - -#~ msgid ":class:`Asset` -- Returns the guild's banner asset." -#~ msgstr "" - -#~ msgid ":class:`Asset` -- Returns the guild's invite splash asset." -#~ msgstr "" - -#~ msgid ":class:`int` -- Returns the shard ID for this guild if applicable." -#~ msgstr "" - -#~ msgid ":class:`datetime.datetime` -- Returns the guild's creation time in UTC." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`TextChannel`] -- Returns the " -#~ "guild's channel used for system " -#~ "messages." -#~ msgstr "" - -#~ msgid ":exc:`Forbidden` -- You do not have the proper permissions to ban." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Banning failed." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`Forbidden` -- You do not have " -#~ "proper permissions to get the " -#~ "information." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`HTTPException` -- An error occurred " -#~ "while fetching the information." -#~ msgstr "" - -#~ msgid ":exc:`Forbidden` -- You are not allowed to create emojis." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- An error occurred creating an emoji." -#~ msgstr "" - -#~ msgid ":exc:`Forbidden` -- You do not have permissions to create the role." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Creating the role failed." -#~ msgstr "" - -#~ msgid ":exc:`InvalidArgument` -- An invalid keyword argument was given." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`Forbidden` -- You do not have " -#~ "the proper permissions to create this" -#~ " channel." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Creating the channel failed." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`InvalidArgument` -- The permission " -#~ "overwrite information is not in proper" -#~ " form." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Deleting the guild failed." -#~ msgstr "" - -#~ msgid ":exc:`Forbidden` -- You do not have permissions to delete the guild." -#~ msgstr "" - -#~ msgid "" -#~ "The new description of the guild. " -#~ "This is only available to guilds " -#~ "that contain `VERIFIED` in " -#~ ":attr:`Guild.features`." -#~ msgstr "" - -#~ msgid "" -#~ "A :term:`py:bytes-like object` representing" -#~ " the icon. Only PNG/JPEG supported. " -#~ "Could be ``None`` to denote removal " -#~ "of the icon." -#~ msgstr "" - -#~ msgid "" -#~ "A :term:`py:bytes-like object` representing" -#~ " the invite splash. Only PNG/JPEG " -#~ "supported. Could be ``None`` to denote" -#~ " removing the splash. Only available " -#~ "for partnered guilds with ``INVITE_SPLASH``" -#~ " feature." -#~ msgstr "" - -#~ msgid ":exc:`Forbidden` -- You do not have permissions to edit the guild." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Editing the guild failed." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`InvalidArgument` -- The image format " -#~ "passed in to ``icon`` is invalid. " -#~ "It must be PNG or JPG. This " -#~ "is also raised if you are not " -#~ "the owner of the guild and request" -#~ " an ownership transfer." -#~ msgstr "" - -#~ msgid ":exc:`Forbidden` -- You do not have permissions to prune members." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`HTTPException` -- An error occurred " -#~ "while fetching the prune members " -#~ "estimate." -#~ msgstr "" - -#~ msgid ":exc:`InvalidArgument` -- An integer was not passed for ``days``." -#~ msgstr "" - -#~ msgid ":exc:`NotFound` -- This user is not banned." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`InvalidData` -- An unknown channel " -#~ "type was received from Discord." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Retrieving the channels failed." -#~ msgstr "" - -#~ msgid ":exc:`NotFound` -- The emoji requested could not be found." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- An error occurred fetching the emoji." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- An error occurred fetching the emojis." -#~ msgstr "" - -#~ msgid ":exc:`Forbidden` -- You do not have access to the guild." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Getting the guild failed." -#~ msgstr "" - -#~ msgid ":exc:`Forbidden` -- You do not have the proper permissions to kick." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Kicking failed." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Leaving the guild failed." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- An error occurred while pruning members." -#~ msgstr "" - -#~ msgid ":exc:`Forbidden` -- You do not have the proper permissions to unban." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Unbanning failed." -#~ msgstr "" - -#~ msgid "" -#~ "The guild must be partnered, i.e. " -#~ "have 'VANITY_URL' in :attr:`~Guild.features`." -#~ msgstr "" - -#~ msgid ":exc:`Forbidden` -- You do not have the proper permissions to get this." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Retrieving the vanity invite failed." -#~ msgstr "" - -#~ msgid ":exc:`Forbidden` -- You don't have permissions to get the webhooks." -#~ msgstr "" - -#~ msgid ":exc:`Forbidden` -- The widget for this guild is disabled." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Retrieving the widget failed." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`SystemChannelFlags` -- Returns the " -#~ "guild's system channel settings." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`datetime.datetime`] -- A datetime" -#~ " object that specifies the date and" -#~ " time in UTC that the member " -#~ "joined the guild for the first " -#~ "time. In certain cases, this can " -#~ "be ``None``." -#~ msgstr "" - -#~ msgid "" -#~ "Tuple[Union[:class:`Game`, :class:`Streaming`, " -#~ ":class:`Spotify`, :class:`Activity`]] -- The " -#~ "activities that the user is currently" -#~ " doing." -#~ msgstr "" - -#~ msgid ":class:`Guild` -- The guild that the member belongs to." -#~ msgstr "" - -#~ msgid "Optional[:class:`str`] -- The guild specific nickname of the user." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`datetime.datetime`] -- A datetime" -#~ " object that specifies the date and" -#~ " time in UTC when the member " -#~ "used their Nitro boost on the " -#~ "guild, if available. This could be " -#~ "``None``." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`Status` -- The member's overall " -#~ "status. If the value is unknown, " -#~ "then it will be a :class:`str` " -#~ "instead." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`Status` -- The member's status " -#~ "on a mobile device, if applicable." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`Status` -- The member's status " -#~ "on the desktop client, if applicable." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`Status` -- The member's status " -#~ "on the web client, if applicable." -#~ msgstr "" - -#~ msgid "" -#~ "A helper function that determines if " -#~ "a member is active on a mobile " -#~ "device." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`Colour` -- A property that " -#~ "returns a colour denoting the rendered" -#~ " colour for the member. If the " -#~ "default colour is the one rendered " -#~ "then an instance of :meth:`Colour.default` " -#~ "is returned." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`Colour` -- A property that " -#~ "returns a color denoting the rendered" -#~ " color for the member. If the " -#~ "default color is the one rendered " -#~ "then an instance of :meth:`Colour.default` " -#~ "is returned." -#~ msgstr "" - -#~ msgid ":class:`str` -- Returns a string that allows you to mention the member." -#~ msgstr "" - -#~ msgid "" -#~ "Union[:class:`Game`, :class:`Streaming`, :class:`Spotify`," -#~ " :class:`Activity`] -- Returns the primary" -#~ " activity the user is currently " -#~ "doing. Could be None if no " -#~ "activity is being done." -#~ msgstr "" - -#~ msgid ":class:`Role` -- Returns the member's highest role." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`VoiceState`] -- Returns the " -#~ "member's current voice state." -#~ msgstr "" - -#~ msgid ":exc:`Forbidden` -- You do not have permissions to add these roles." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Adding roles failed." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`Forbidden` -- You do not have " -#~ "the proper permissions to the action " -#~ "requested." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- The operation failed." -#~ msgstr "" - -#~ msgid ":exc:`Forbidden` -- You do not have permissions to remove these roles." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Removing the roles failed." -#~ msgstr "" - -#~ msgid "" -#~ "List[:class:`Role`] -- A :class:`list` of " -#~ ":class:`Role` that the member belongs " -#~ "to. Note that the first element of" -#~ " this list is always the default " -#~ "'@everyone' role." -#~ msgstr "" - -#~ msgid "There is an alias for this named :meth:`color`" -#~ msgstr "" - -#~ msgid "There is an alias for this named :meth:`colour`" -#~ msgstr "" - -#~ msgid "" -#~ ":class:`str` -- The activity's name. " -#~ "This will always return \"Spotify\"." -#~ msgstr "" - -#~ msgid ":class:`str` -- The title of the song being played." -#~ msgstr "" - -#~ msgid "List[:class:`str`] -- The artists of the song being played." -#~ msgstr "" - -#~ msgid ":class:`str` -- The artist of the song being played." -#~ msgstr "" - -#~ msgid ":class:`str` -- The album that the song being played belongs to." -#~ msgstr "" - -#~ msgid ":class:`str` -- The album cover image URL from Spotify's CDN." -#~ msgstr "" - -#~ msgid ":class:`str` -- The track ID used by Spotify to identify this song." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`datetime.datetime` -- When the user" -#~ " started playing this song in UTC." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`datetime.datetime` -- When the user" -#~ " will stop playing this song in " -#~ "UTC." -#~ msgstr "" - -#~ msgid ":class:`datetime.timedelta` -- The duration of the song being played." -#~ msgstr "" - -#~ msgid ":class:`str` -- The party ID of the listening party." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- Indicates if the user" -#~ " is currently deafened by the guild." -#~ msgstr "" - -#~ msgid ":class:`bool` -- Indicates if the user is currently muted by the guild." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- Indicates if the user" -#~ " is currently muted by their own " -#~ "accord." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- Indicates if the user" -#~ " is currently deafened by their own" -#~ " accord." -#~ msgstr "" - -#~ msgid ":class:`bool` -- Indicates if the user is currently broadcasting video." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- Indicates if the user" -#~ " is currently in the AFK channel " -#~ "in the guild." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`VoiceChannel` -- The voice channel " -#~ "that the user is currently connected " -#~ "to. None if the user is not " -#~ "currently in a voice channel." -#~ msgstr "" - -#~ msgid ":class:`str` -- The name of the emoji." -#~ msgstr "" - -#~ msgid ":class:`int` -- The emoji's ID." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- If colons are required" -#~ " to use this emoji in the " -#~ "client (:PJSalt: vs PJSalt)." -#~ msgstr "" - -#~ msgid ":class:`bool` -- Whether an emoji is animated or not." -#~ msgstr "" - -#~ msgid ":class:`bool` -- If this emoji is managed by a Twitch integration." -#~ msgstr "" - -#~ msgid ":class:`int` -- The guild ID the emoji belongs to." -#~ msgstr "" - -#~ msgid ":class:`bool` -- Whether the emoji is available for use." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`User`] -- The user that " -#~ "created the emoji. This can only " -#~ "be retrieved using :meth:`Guild.fetch_emoji` " -#~ "and having the :attr:`~Permissions.manage_emojis`" -#~ " permission." -#~ msgstr "" - -#~ msgid ":class:`datetime.datetime` -- Returns the emoji's creation time in UTC." -#~ msgstr "" - -#~ msgid ":class:`Asset` -- Returns the asset of the emoji." -#~ msgstr "" - -#~ msgid ":class:`Guild` -- The guild this emoji belongs to." -#~ msgstr "" - -#~ msgid ":exc:`Forbidden` -- You are not allowed to delete emojis." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- An error occurred deleting the emoji." -#~ msgstr "" - -#~ msgid ":exc:`Forbidden` -- You are not allowed to edit emojis." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- An error occurred editing the emoji." -#~ msgstr "" - -#~ msgid "" -#~ "List[:class:`Role`] -- A :class:`list` of " -#~ "roles that is allowed to use this" -#~ " emoji." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`str` -- The custom emoji name," -#~ " if applicable, or the unicode " -#~ "codepoint of the non-custom emoji." -#~ msgstr "" - -#~ msgid ":class:`bool` -- Whether the emoji is animated or not." -#~ msgstr "" - -#~ msgid "Optional[:class:`int`] -- The ID of the custom emoji, if applicable." -#~ msgstr "" - -#~ msgid "Checks if this is a custom non-Unicode emoji." -#~ msgstr "" - -#~ msgid "Checks if this is a Unicode emoji." -#~ msgstr "" - -#~ msgid ":class:`Asset` -- Returns an asset of the emoji, if it is custom." -#~ msgstr "" - -#~ msgid ":class:`int` -- The ID for the role." -#~ msgstr "" - -#~ msgid ":class:`str` -- The name of the role." -#~ msgstr "" - -#~ msgid ":class:`Permissions` -- Represents the role's permissions." -#~ msgstr "" - -#~ msgid ":class:`Guild` -- The guild the role belongs to." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`Colour` -- Represents the role " -#~ "colour. An alias exists under ``color``." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- Indicates if the role" -#~ " will be displayed separately from " -#~ "other members." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`int` -- The position of the " -#~ "role. This number is usually positive." -#~ " The bottom role has a position " -#~ "of 0." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- Indicates if the role" -#~ " is managed by the guild through " -#~ "some form of integrations such as " -#~ "Twitch." -#~ msgstr "" - -#~ msgid ":class:`bool` -- Indicates if the role can be mentioned by users." -#~ msgstr "" - -#~ msgid "Checks if the role is the default role." -#~ msgstr "" - -#~ msgid ":class:`datetime.datetime` -- Returns the role's creation time in UTC." -#~ msgstr "" - -#~ msgid ":class:`str` -- Returns a string that allows you to mention a role." -#~ msgstr "" - -#~ msgid "List[:class:`Member`] -- Returns all the members with this role." -#~ msgstr "" - -#~ msgid ":exc:`Forbidden` -- You do not have permissions to delete the role." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Deleting the role failed." -#~ msgstr "" - -#~ msgid ":exc:`Forbidden` -- You do not have permissions to change the role." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Editing the role failed." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`InvalidArgument` -- An invalid position" -#~ " was given or the default role " -#~ "was asked to be moved." -#~ msgstr "" - -#~ msgid ":class:`Guild` -- The guild the channel belongs to." -#~ msgstr "" - -#~ msgid ":class:`int` -- The channel ID." -#~ msgstr "" - -#~ msgid ":class:`int` -- The category channel ID this channel belongs to." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`str`] -- The channel's topic." -#~ " None if it doesn't exist." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`int`] -- The last message " -#~ "ID of the message sent to this " -#~ "channel. It may *not* point to an" -#~ " existing or valid message." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`int` -- The number of seconds" -#~ " a member must wait between sending" -#~ " messages in this channel. A value" -#~ " of `0` denotes that it is " -#~ "disabled. Bots and users with " -#~ ":attr:`~Permissions.manage_channels` or " -#~ ":attr:`~Permissions.manage_messages` bypass slowmode." -#~ msgstr "" - -#~ msgid ":class:`ChannelType` -- The channel's Discord type." -#~ msgstr "" - -#~ msgid "List[:class:`Member`] -- Returns all members that can see this channel." -#~ msgstr "" - -#~ msgid "Checks if the channel is NSFW." -#~ msgstr "" - -#~ msgid "Checks if the channel is a news channel." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Creating the webhook failed." -#~ msgstr "" - -#~ msgid ":exc:`Forbidden` -- You do not have permissions to create a webhook." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`ClientException` -- The number of " -#~ "messages to delete was more than " -#~ "100." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`Forbidden` -- You do not have " -#~ "proper permissions to delete the " -#~ "messages or you're not using a bot" -#~ " account." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Deleting the messages failed." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`InvalidArgument` -- If position is " -#~ "less than 0 or greater than the" -#~ " number of channels." -#~ msgstr "" - -#~ msgid ":exc:`Forbidden` -- You do not have permissions to edit the channel." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Editing the channel failed." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`Forbidden` -- You do not have " -#~ "proper permissions to do the actions " -#~ "required." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Purging the messages failed." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`int` -- The channel's preferred " -#~ "audio bitrate in bits per second." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`int` -- The channel's limit for" -#~ " number of members that can be " -#~ "in a voice channel." -#~ msgstr "" - -#~ msgid "" -#~ "List[:class:`Member`] -- Returns all members" -#~ " that are currently inside this voice" -#~ " channel." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`asyncio.TimeoutError` -- Could not " -#~ "connect to the voice channel in " -#~ "time." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`~discord.ClientException` -- You are " -#~ "already connected to a voice channel." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`~discord.opus.OpusNotLoaded` -- The opus " -#~ "library has not been loaded." -#~ msgstr "" - -#~ msgid ":class:`~discord.VoiceClient`" -#~ msgstr "" - -#~ msgid ":class:`str` -- The category name." -#~ msgstr "" - -#~ msgid ":class:`Guild` -- The guild the category belongs to." -#~ msgstr "" - -#~ msgid ":class:`int` -- The category channel ID." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`int` -- The position in the " -#~ "category list. This is a number " -#~ "that starts at 0. e.g. the top " -#~ "category is position 0." -#~ msgstr "" - -#~ msgid "" -#~ "List[:class:`abc.GuildChannel`] -- Returns the " -#~ "channels that are under this category." -#~ msgstr "" - -#~ msgid "" -#~ "List[:class:`TextChannel`] -- Returns the text" -#~ " channels that are under this " -#~ "category." -#~ msgstr "" - -#~ msgid "" -#~ "List[:class:`VoiceChannel`] -- Returns the " -#~ "voice channels that are under this " -#~ "category." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`InvalidArgument` -- If position is " -#~ "less than 0 or greater than the" -#~ " number of categories." -#~ msgstr "" - -#~ msgid ":exc:`Forbidden` -- You do not have permissions to edit the category." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Editing the category failed." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`User` -- The user you are " -#~ "participating with in the direct message" -#~ " channel." -#~ msgstr "" - -#~ msgid ":class:`ClientUser` -- The user presenting yourself." -#~ msgstr "" - -#~ msgid ":class:`int` -- The direct message channel ID." -#~ msgstr "" - -#~ msgid "" -#~ "List[:class:`User`] -- The users you are" -#~ " participating with in the group " -#~ "channel." -#~ msgstr "" - -#~ msgid ":class:`int` -- The group channel ID." -#~ msgstr "" - -#~ msgid ":class:`User` -- The user that owns the group channel." -#~ msgstr "" - -#~ msgid "Optional[:class:`str`] -- The group channel's icon hash if provided." -#~ msgstr "" - -#~ msgid "Optional[:class:`str`] -- The group channel's name if provided." -#~ msgstr "" - -#~ msgid ":class:`Asset` -- Returns the channel's icon asset if available." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Adding a recipient to this group failed." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Editing the group failed." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Leaving the group failed." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Removing a recipient from this group failed." -#~ msgstr "" - -#~ msgid ":class:`str` -- The partial guild's name." -#~ msgstr "" - -#~ msgid ":class:`int` -- The partial guild's ID." -#~ msgstr "" - -#~ msgid ":class:`VerificationLevel` -- The partial guild's verification level." -#~ msgstr "" - -#~ msgid "" -#~ "List[:class:`str`] -- A list of features" -#~ " the guild has. See :attr:`Guild.features`" -#~ " for more information." -#~ msgstr "" - -#~ msgid "Optional[:class:`str`] -- The partial guild's icon." -#~ msgstr "" - -#~ msgid "Optional[:class:`str`] -- The partial guild's banner." -#~ msgstr "" - -#~ msgid "Optional[:class:`str`] -- The partial guild's invite splash." -#~ msgstr "" - -#~ msgid "Optional[:class:`str`] -- The partial guild's description." -#~ msgstr "" - -#~ msgid ":class:`str` -- The partial channel's name." -#~ msgstr "" - -#~ msgid ":class:`int` -- The partial channel's ID." -#~ msgstr "" - -#~ msgid ":class:`ChannelType` -- The partial channel's type." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`int` -- How long the before " -#~ "the invite expires in seconds. A " -#~ "value of 0 indicates that it " -#~ "doesn't expire." -#~ msgstr "" - -#~ msgid ":class:`str` -- The URL fragment used for the invite." -#~ msgstr "" - -#~ msgid "" -#~ "Union[:class:`Guild`, :class:`PartialInviteGuild`] -- " -#~ "The guild the invite is for." -#~ msgstr "" - -#~ msgid ":class:`bool` -- Indicates if the invite has been revoked." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`datetime.datetime` -- A datetime " -#~ "object denoting the time the invite " -#~ "was created." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- Indicates that the " -#~ "invite grants temporary membership. If " -#~ "``True``, members who joined via this" -#~ " invite will be kicked upon " -#~ "disconnect." -#~ msgstr "" - -#~ msgid ":class:`int` -- How many times the invite has been used." -#~ msgstr "" - -#~ msgid ":class:`int` -- How many times the invite can be used." -#~ msgstr "" - -#~ msgid ":class:`User` -- The user who created the invite." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`int`] -- The approximate " -#~ "number of members in the guild." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`int`] -- The approximate " -#~ "number of members currently active in" -#~ " the guild. This includes idle, dnd," -#~ " online, and invisible members. Offline " -#~ "members are excluded." -#~ msgstr "" - -#~ msgid "" -#~ "Union[:class:`abc.GuildChannel`, :class:`PartialInviteChannel`]" -#~ " -- The channel the invite is " -#~ "for." -#~ msgstr "" - -#~ msgid ":class:`str` -- Returns the proper code portion of the invite." -#~ msgstr "" - -#~ msgid ":class:`str` -- A property that retrieves the invite URL." -#~ msgstr "" - -#~ msgid ":exc:`Forbidden` -- You do not have permissions to revoke invites." -#~ msgstr "" - -#~ msgid ":exc:`NotFound` -- The invite is invalid or expired." -#~ msgstr "" - -#~ msgid ":exc:`HTTPException` -- Revoking the invite failed." -#~ msgstr "" - -#~ msgid ":class:`int` -- The channel's ID." -#~ msgstr "" - -#~ msgid ":class:`str` -- The channel's name." -#~ msgstr "" - -#~ msgid ":class:`int` -- The channel's position" -#~ msgstr "" - -#~ msgid ":class:`int` -- The member's ID." -#~ msgstr "" - -#~ msgid ":class:`str` -- The member's username." -#~ msgstr "" - -#~ msgid ":class:`str` -- The member's discriminator." -#~ msgstr "" - -#~ msgid ":class:`bool` -- Whether the member is a bot." -#~ msgstr "" - -#~ msgid ":class:`Status` -- The member's status." -#~ msgstr "" - -#~ msgid "Optional[:class:`str`] -- The member's nickname." -#~ msgstr "" - -#~ msgid "Optional[:class:`str`] -- The member's avatar hash." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[Union[:class:`Activity`, :class:`Game`, " -#~ ":class:`Streaming`, :class:`Spotify`]] -- The " -#~ "member's activity." -#~ msgstr "" - -#~ msgid "Optional[:class:`bool`] -- Whether the member is currently deafened." -#~ msgstr "" - -#~ msgid "Optional[:class:`bool`] -- Whether the member is currently muted." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`bool`] -- Whether the member" -#~ " is currently being suppressed." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`VoiceChannel`] -- Which channel " -#~ "the member is connected to." -#~ msgstr "" - -#~ msgid ":class:`str` -- Returns the member's display name." -#~ msgstr "" - -#~ msgid ":class:`str` -- The guild's name." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[List[:class:`WidgetChannel`]] -- The " -#~ "accessible voice channels in the guild." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[List[:class:`Member`]] -- The online " -#~ "members in the server. Offline members" -#~ " do not appear in the widget." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`datetime.datetime` -- Returns the " -#~ "member's creation time in UTC." -#~ msgstr "" - -#~ msgid ":class:`str` -- The JSON URL of the widget." -#~ msgstr "" - -#~ msgid "Optiona[:class:`str`] -- The invite URL for the guild, if available." -#~ msgstr "" - -#~ msgid ":class:`int` -- The channel ID where the deletion took place." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`int`] -- The guild ID " -#~ "where the deletion took place, if " -#~ "applicable." -#~ msgstr "" - -#~ msgid ":class:`int` -- The message ID that got deleted." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`Message`] -- The cached " -#~ "message, if found in the internal " -#~ "message cache." -#~ msgstr "" - -#~ msgid "" -#~ "Set[:class:`int`] -- A :class:`set` of " -#~ "the message IDs that were deleted." -#~ msgstr "" - -#~ msgid ":class:`int` -- The channel ID where the message got deleted." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`int`] -- The guild ID " -#~ "where the message got deleted, if " -#~ "applicable." -#~ msgstr "" - -#~ msgid "" -#~ "List[:class:`Message`] -- The cached messages," -#~ " if found in the internal message " -#~ "cache." -#~ msgstr "" - -#~ msgid ":class:`int` -- The message ID that got updated." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`dict` -- The raw data given " -#~ "by the `gateway " -#~ "`_" -#~ msgstr "" - -#~ msgid ":class:`int` -- The message ID that got or lost a reaction." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`int` -- The user ID who " -#~ "added the reaction or whose reaction " -#~ "was removed." -#~ msgstr "" - -#~ msgid ":class:`int` -- The channel ID where the reaction got added or removed." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`int`] -- The guild ID " -#~ "where the reaction got added or " -#~ "removed, if applicable." -#~ msgstr "" - -#~ msgid ":class:`PartialEmoji` -- The custom or unicode emoji being used." -#~ msgstr "" - -#~ msgid ":class:`int` -- The message ID that got its reactions cleared." -#~ msgstr "" - -#~ msgid ":class:`int` -- The channel ID where the reactions got cleared." -#~ msgstr "" - -#~ msgid "Optional[:class:`int`] -- The guild ID where the reactions got cleared." -#~ msgstr "" - -#~ msgid "" -#~ "Unlike :ref:`models ` you " -#~ "are allowed to create these yourself," -#~ " even if they can also be used" -#~ " to hold attributes." -#~ msgstr "" - -#~ msgid ":class:`str` -- The ID of the object." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`datetime.datetime` -- Returns the " -#~ "snowflake's creation time in UTC." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`str` -- The title of the " -#~ "embed. This can be set during " -#~ "initialisation." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`str` -- The type of embed. " -#~ "Usually \"rich\". This can be set " -#~ "during initialisation." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`str` -- The description of the" -#~ " embed. This can be set during " -#~ "initialisation." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`str` -- The URL of the " -#~ "embed. This can be set during " -#~ "initialisation." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`datetime.datetime` -- The timestamp of" -#~ " the embed content. This could be " -#~ "a naive or aware datetime." -#~ msgstr "" - -#~ msgid "" -#~ "Union[:class:`Colour`, :class:`int`] -- The " -#~ "colour code of the embed. Aliased " -#~ "to ``color`` as well. This can be" -#~ " set during initialisation." -#~ msgstr "" - -#~ msgid ":exc:`IndexError` -- An invalid index was provided." -#~ msgstr "" - -#~ msgid "" -#~ "Union[:class:`str`, :class:`io.BufferedIOBase`] -- A" -#~ " file-like object opened in binary" -#~ " mode and read mode or a " -#~ "filename representing a file in the " -#~ "hard drive to open." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`str`] -- The filename to " -#~ "display when uploading to Discord. If" -#~ " this is not given then it " -#~ "defaults to ``fp.name`` or if ``fp`` " -#~ "is a string then the ``filename`` " -#~ "will default to the string given." -#~ msgstr "" - -#~ msgid ":class:`bool` -- Whether the attachment is a spoiler." -#~ msgstr "" - -#~ msgid "" -#~ "Represents a Discord role colour. This" -#~ " class is similar to an (red, " -#~ "green, blue) :class:`tuple`." -#~ msgstr "" - -#~ msgid ":class:`int` -- The raw integer colour value." -#~ msgstr "" - -#~ msgid ":class:`int` -- Returns the red component of the colour." -#~ msgstr "" - -#~ msgid ":class:`int` -- Returns the green component of the colour." -#~ msgstr "" - -#~ msgid ":class:`int` -- Returns the blue component of the colour." -#~ msgstr "" - -#~ msgid "A factory method that returns a :class:`Colour` with a value of 0." -#~ msgstr "" - -#~ msgid ":class:`int` -- The application ID of the game." -#~ msgstr "" - -#~ msgid ":class:`str` -- The name of the activity." -#~ msgstr "" - -#~ msgid ":class:`str` -- A stream URL that the activity could be doing." -#~ msgstr "" - -#~ msgid ":class:`ActivityType` -- The type of activity currently being done." -#~ msgstr "" - -#~ msgid ":class:`str` -- The user's current state. For example, \"In Game\"." -#~ msgstr "" - -#~ msgid ":class:`str` -- The detail of the user's current activity." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`dict` -- A dictionary of " -#~ "timestamps. It contains the following " -#~ "optional keys:" -#~ msgstr "" - -#~ msgid "" -#~ ":class:`dict` -- A dictionary representing " -#~ "the images and their hover text of" -#~ " an activity. It contains the " -#~ "following optional keys:" -#~ msgstr "" - -#~ msgid "" -#~ ":class:`dict` -- A dictionary representing " -#~ "the activity party. It contains the " -#~ "following optional keys:" -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`datetime.datetime`] -- When the " -#~ "user started doing this activity in " -#~ "UTC, if applicable." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`datetime.datetime`] -- When the " -#~ "user will stop doing this activity " -#~ "in UTC, if applicable." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`str`] -- Returns a URL " -#~ "pointing to the large image asset " -#~ "of this activity if applicable." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`str`] -- Returns a URL " -#~ "pointing to the small image asset " -#~ "of this activity if applicable." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`str`] -- Returns the large" -#~ " image asset hover text of this " -#~ "activity if applicable." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`str`] -- Returns the small" -#~ " image asset hover text of this " -#~ "activity if applicable." -#~ msgstr "" - -#~ msgid ":class:`str` -- The game's name." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`datetime.datetime`] -- When the " -#~ "user started playing this game in " -#~ "UTC, if applicable." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`datetime.datetime`] -- When the " -#~ "user will stop playing this game " -#~ "in UTC, if applicable." -#~ msgstr "" - -#~ msgid ":class:`str` -- The stream's name." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`str` -- The stream's URL. " -#~ "Currently only twitch.tv URLs are " -#~ "supported. Anything else is silently " -#~ "discarded." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`str`] -- If provided, " -#~ "typically the game the streamer is " -#~ "playing." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`dict` -- A dictionary comprising " -#~ "of similar keys than those in " -#~ ":attr:`Activity.assets`." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`str`] -- If provided, the " -#~ "twitch name of the user streaming." -#~ msgstr "" - -#~ msgid "" -#~ "Returns an iterator of ``(perm, value)``" -#~ " pairs. This allows it to be, " -#~ "for example, constructed as a dict " -#~ "or a list of pairs." -#~ msgstr "" - -#~ msgid "" -#~ "A factory method that creates a " -#~ ":class:`Permissions` with all permissions set" -#~ " to True." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- Returns ``True`` if the" -#~ " user can create instant invites." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- Returns ``True`` if the" -#~ " user can kick users from the " -#~ "guild." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- Returns ``True`` if a" -#~ " user can ban users from the " -#~ "guild." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- Returns ``True`` if a" -#~ " user is an administrator. This role" -#~ " overrides all other permissions." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- Returns ``True`` if a" -#~ " user can edit, delete, or create " -#~ "channels in the guild." -#~ msgstr "" - -#~ msgid ":class:`bool` -- Returns ``True`` if a user can edit guild properties." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- Returns ``True`` if a" -#~ " user can add reactions to messages." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- Returns ``True`` if a" -#~ " user can view the guild's audit " -#~ "log." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- Returns ``True`` if a" -#~ " user can be more easily heard " -#~ "while talking." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- Returns ``True`` if a" -#~ " user can stream in a voice " -#~ "channel." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- Returns ``True`` if a" -#~ " user can read messages from all " -#~ "or specific text channels." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- Returns ``True`` if a" -#~ " user can send messages from all " -#~ "or specific text channels." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- Returns ``True`` if a" -#~ " user can send TTS messages from " -#~ "all or specific text channels." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- Returns ``True`` if a" -#~ " user can delete or pin messages " -#~ "in a text channel." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- Returns ``True`` if a" -#~ " user's messages will automatically be " -#~ "embedded by Discord." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- Returns ``True`` if a" -#~ " user can send files in their " -#~ "messages." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- Returns ``True`` if a" -#~ " user can read a text channel's " -#~ "previous messages." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- Returns ``True`` if a" -#~ " user's @everyone or @here will " -#~ "mention everyone in the text channel." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- Returns ``True`` if a" -#~ " user can use emojis from other " -#~ "guilds." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- Returns ``True`` if a" -#~ " user can connect to a voice " -#~ "channel." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- Returns ``True`` if a" -#~ " user can speak in a voice " -#~ "channel." -#~ msgstr "" - -#~ msgid ":class:`bool` -- Returns ``True`` if a user can mute other users." -#~ msgstr "" - -#~ msgid ":class:`bool` -- Returns ``True`` if a user can deafen other users." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- Returns ``True`` if a" -#~ " user can move users between other" -#~ " voice channels." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- Returns ``True`` if a" -#~ " user can use voice activation in " -#~ "voice channels." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- Returns ``True`` if a" -#~ " user can change their nickname in" -#~ " the guild." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- Returns ``True`` if a" -#~ " user can change other user's " -#~ "nickname in the guild." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- Returns ``True`` if a" -#~ " user can create or edit roles " -#~ "less than their role's position." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- Returns ``True`` if a" -#~ " user can create, edit, or delete " -#~ "webhooks." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- Returns ``True`` if a" -#~ " user can create, edit, or delete " -#~ "emojis." -#~ msgstr "" - -#~ msgid "Supported operations:" -#~ msgstr "サポートされている操作:" - -#~ msgid "Operation" -#~ msgstr "" - -#~ msgid "x == y" -#~ msgstr "" - -#~ msgid "x != y" -#~ msgstr "" - -#~ msgid "iter(x)" -#~ msgstr "" - -#~ msgid "" -#~ "Returns an iterator of (perm, value) " -#~ "pairs. This allows this class to " -#~ "be used as an iterable in e.g. " -#~ "set/list/dict constructions." -#~ msgstr "" - -#~ msgid "Returns the (allow, deny) pair from this overwrite." -#~ msgstr "" - -#~ msgid "The value of these pairs is :class:`Permissions`." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`int` -- The raw value. This " -#~ "value is a bit array field of " -#~ "a 53-bit integer representing the " -#~ "currently available flags. You should " -#~ "query flags via the properties rather" -#~ " than using this raw value." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- Returns True if the " -#~ "system channel is used for member " -#~ "join notifications." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- Returns True if the " -#~ "system channel is used for Nitro " -#~ "boosting notifications." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`aiohttp.ClientResponse` -- The response " -#~ "of the failed HTTP request. This " -#~ "is an instance of " -#~ ":class:`aiohttp.ClientResponse`. In some cases " -#~ "this could also be a " -#~ ":class:`requests.Response`." -#~ msgstr "" - -#~ msgid ":class:`str` -- The text of the error. Could be an empty string." -#~ msgstr "" - -#~ msgid ":class:`int` -- The status code of the HTTP request." -#~ msgstr "" - -#~ msgid ":class:`int` -- The Discord specific error code for the failure." -#~ msgstr "" - -#~ msgid ":class:`int` -- The close code of the websocket." -#~ msgstr "" - -#~ msgid ":class:`str` -- The reason provided for the closure." -#~ msgstr "" - -#~ msgid "Optional[:class:`int`] -- The shard ID that got closed if applicable." -#~ msgstr "" - -#~ msgid ":class:`int` -- The error code returned." -#~ msgstr "" - diff --git a/docs/locale/ja/LC_MESSAGES/discord.po b/docs/locale/ja/LC_MESSAGES/discord.po deleted file mode 100644 index 7963ed9107..0000000000 --- a/docs/locale/ja/LC_MESSAGES/discord.po +++ /dev/null @@ -1,179 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: discordpy\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-10-23 22:41-0400\n" -"PO-Revision-Date: 2020-10-24 02:41+0000\n" -"Last-Translator: \n" -"Language: ja_JP\n" -"Language-Team: Japanese\n" -"Plural-Forms: nplurals=1; plural=0\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.5.3\n" - -#: ../../discord.rst:4 -msgid "Creating a Bot Account" -msgstr "Botアカウント作成" - -#: ../../discord.rst:6 -msgid "" -"In order to work with the library and the Discord API in general, we must" -" first create a Discord Bot account." -msgstr "ライブラリとDiscord APIを使用するには、BotのDiscordアカウントを用意する必要があります。" - -#: ../../discord.rst:8 -msgid "Creating a Bot account is a pretty straightforward process." -msgstr "Botのアカウント作成はとても簡単です。" - -#: ../../discord.rst:10 ../../discord.rst:64 -#, fuzzy -msgid "" -"Make sure you're logged on to the `Discord website " -"`_." -msgstr "まずは `Discordのウェブサイト `_ にログインしてください。" - -#: ../../discord.rst:11 ../../discord.rst:65 -#, fuzzy -msgid "" -"Navigate to the `application page " -"`_" -msgstr "`アプリケーションページ `_ に移動します。" - -#: ../../discord.rst:12 -msgid "Click on the \"New Application\" button." -msgstr "「New Application」ボタンをクリックします。" - -#: ../../discord.rst:17 -msgid "Give the application a name and click \"Create\"." -msgstr "アプリケーションの名前を決めて、「Create」をクリックします。" - -#: ../../discord.rst:22 -msgid "" -"Create a Bot User by navigating to the \"Bot\" tab and clicking \"Add " -"Bot\"." -msgstr "「Bot」タブへ移動し、「Add Bot」をクリックしてBotユーザーを作成します。" - -#: ../../discord.rst:24 -msgid "Click \"Yes, do it!\" to continue." -msgstr "「Yes, do it!」をクリックして続行します。" - -#: ../../discord.rst:28 -msgid "" -"Make sure that **Public Bot** is ticked if you want others to invite your" -" bot." -msgstr "他人にBotの招待を許可する場合には、 **Public Bot** にチェックを入れてください。" - -#: ../../discord.rst:30 -msgid "" -"You should also make sure that **Require OAuth2 Code Grant** is unchecked" -" unless you are developing a service that needs it. If you're unsure, " -"then **leave it unchecked**." -msgstr "" -"また、必要なサービスを開発している場合を除いて、 **Require OAuth2 Code Grant** " -"がオフになっていることを確認する必要があります。わからない場合は **チェックを外してください** 。" - -#: ../../discord.rst:36 -msgid "Copy the token using the \"Copy\" button." -msgstr "「Copy」ボタンを使ってトークンをコピーします。" - -#: ../../discord.rst:38 -msgid "**This is not the Client Secret at the General Information page**" -msgstr "**General InformationページのClient Secretではないので注意してください**" - -#: ../../discord.rst:42 -msgid "" -"It should be worth noting that this token is essentially your bot's " -"password. You should **never** share this to someone else. In doing so, " -"someone can log in to your bot and do malicious things, such as leaving " -"servers, ban all members inside a server, or pinging everyone " -"maliciously." -msgstr "このトークンは、あなたのBotのパスワードと同義であることを覚えておきましょう。誰か他の人とトークンを共有することは絶対に避けてください。トークンがあれば、誰かがあなたのBotにログインし、サーバーから退出したり、サーバー内のすべてのメンバーをBANしたり、すべての人にメンションを送るなどといった悪質な行為を行える様になってしまいます。" - -#: ../../discord.rst:47 -msgid "The possibilities are endless, so **do not share this token.**" -msgstr "可能性は無限にあるので、絶対に **トークンを共有しないでください** 。" - -#: ../../discord.rst:49 -msgid "" -"If you accidentally leaked your token, click the \"Regenerate\" button as" -" soon as possible. This revokes your old token and re-generates a new " -"one. Now you need to use the new token to login." -msgstr "誤ってトークンを流出させてしまった場合、可能な限り速急に「Regenerate」ボタンをクリックしましょう。これによって古いトークンが無効になり、新しいトークンが再生成されます。今度からは新しいトークンを利用してログインを行う必要があります。" - -#: ../../discord.rst:53 -msgid "" -"And that's it. You now have a bot account and you can login with that " -"token." -msgstr "以上です。 これでボットアカウントが作成され、そのトークンでログインできます。" - -#: ../../discord.rst:58 -msgid "Inviting Your Bot" -msgstr "Botを招待する" - -#: ../../discord.rst:60 -msgid "So you've made a Bot User but it's not actually in any server." -msgstr "Botのユーザーを作成しましたが、現時点ではどのサーバーにも参加していない状態です。" - -#: ../../discord.rst:62 -msgid "If you want to invite your bot you must create an invite URL for it." -msgstr "Botを招待したい場合は、そのための招待URLを作成する必要があります。" - -#: ../../discord.rst:66 -msgid "Click on your bot's page." -msgstr "Botのページを開きます。" - -#: ../../discord.rst:67 -msgid "Go to the \"OAuth2\" tab." -msgstr "「OAuth2」タブへ移動します。" - -#: ../../discord.rst:72 -msgid "Tick the \"bot\" checkbox under \"scopes\"." -msgstr "「scopes」下にある「bot」チェックボックスを選択してください。" - -#: ../../discord.rst:77 -msgid "" -"Tick the permissions required for your bot to function under \"Bot " -"Permissions\"." -msgstr "「Bot Permissions」からBotの機能に必要な権限を選択してください。" - -#: ../../discord.rst:79 -msgid "" -"Please be aware of the consequences of requiring your bot to have the " -"\"Administrator\" permission." -msgstr "Botに「管理者」権限を要求させることによる影響は認識しておきましょう。" - -#: ../../discord.rst:81 -#, fuzzy -msgid "" -"Bot owners must have 2FA enabled for certain actions and permissions when" -" added in servers that have Server-Wide 2FA enabled. Check the `2FA " -"support page `_ for more information." -msgstr "" -"二段階認証が有効になっているサーバーにBotが追加された場合、Botの所有者は特定の動作と権限のために二段階認証を有効化させなければいけません。詳細は" -" `二段階認証のサポートページ `_ を参照してください。" - -#: ../../discord.rst:86 -msgid "" -"Now the resulting URL can be used to add your bot to a server. Copy and " -"paste the URL into your browser, choose a server to invite the bot to, " -"and click \"Authorize\"." -msgstr "結果的に生成されたURLを使ってBotをサーバーに追加することができます。URLをコピーしてブラウザに貼り付け、Botを招待したいサーバーを選択した後、「認証」をクリックしてください。" - -#: ../../discord.rst:91 -msgid "The person adding the bot needs \"Manage Server\" permissions to do so." -msgstr "Botを追加する人には「サーバー管理」権限が必要です。" - -#: ../../discord.rst:93 -msgid "" -"If you want to generate this URL dynamically at run-time inside your bot " -"and using the :class:`discord.Permissions` interface, you can use " -":func:`discord.utils.oauth_url`." -msgstr "" -"このURLを実行時に動的に生成したい場合は、 :class:`discord.Permissions` インターフェイスから " -":func:`discord.utils.oauth_url` を使用できます。" - diff --git a/docs/locale/ja/LC_MESSAGES/ext/commands/api.po b/docs/locale/ja/LC_MESSAGES/ext/commands/api.po deleted file mode 100644 index 722ff7986f..0000000000 --- a/docs/locale/ja/LC_MESSAGES/ext/commands/api.po +++ /dev/null @@ -1,6780 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: discordpy\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-10-23 22:41-0400\n" -"PO-Revision-Date: 2020-10-24 02:41+0000\n" -"Last-Translator: \n" -"Language: ja_JP\n" -"Language-Team: Japanese\n" -"Plural-Forms: nplurals=1; plural=0\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.5.3\n" - -#: ../../ext/commands/api.rst:4 -msgid "API Reference" -msgstr "APIリファレンス" - -#: ../../ext/commands/api.rst:6 -msgid "" -"The following section outlines the API of discord.py's command extension " -"module." -msgstr "この項目ではdiscord.pyのAPIが持つコマンド拡張モジュールについて解説します。" - -#: ../../ext/commands/api.rst:11 -msgid "Bot" -msgstr "Bot" - -#: discord.ext.commands.Bot:1 of -msgid "Represents a discord bot." -msgstr "Discord Botを表します。" - -#: discord.ext.commands.Bot:3 of -msgid "" -"This class is a subclass of :class:`discord.Client` and as a result " -"anything that you can do with a :class:`discord.Client` you can do with " -"this bot." -msgstr "" -"このクラスは :class:`discord.Client` のサブクラスのため、 :class:`discord.Client` " -"でできることと同じことをこのBotで行うことができます。" - -#: discord.ext.commands.Bot:7 of -msgid "" -"This class also subclasses :class:`.GroupMixin` to provide the " -"functionality to manage commands." -msgstr "また、 :class:`.GroupMixin` も継承しており、コマンド管理の機能も使用可能です。" - -#: discord.ext.commands.Bot:12 of -msgid "" -"The command prefix is what the message content must contain initially to " -"have a command invoked. This prefix could either be a string to indicate " -"what the prefix should be, or a callable that takes in the bot as its " -"first parameter and :class:`discord.Message` as its second parameter and " -"returns the prefix. This is to facilitate \"dynamic\" command prefixes. " -"This callable can be either a regular function or a coroutine." -msgstr "" -"コマンドの接頭詞とは、コマンドの判定のためにメッセージの先頭に付けなければならないものです。接頭詞には、そのまま接頭詞として使用する文字列、または" -" :class:`discord.Message` " -"を二つ目の引数として受け取り、接頭詞を返す呼び出し可能な関数を渡すことができます。これは「動的な」接頭詞の実装を容易にするためです。" - -#: discord.ext.commands.Bot:20 of -msgid "" -"An empty string as the prefix always matches, enabling prefix-less " -"command invocation. While this may be useful in DMs it should be avoided " -"in servers, as it's likely to cause performance issues and unintended " -"command invocations." -msgstr "接頭詞に空文字列を渡せば、接頭詞なしでコマンドの呼び出しができます。これはDM上では有用ですが、サーバーでは意図せずコマンドを呼び出してしまうことに繋がるため、避けるべきです。" - -#: discord.ext.commands.Bot:25 of -msgid "" -"The command prefix could also be an iterable of strings indicating that " -"multiple checks for the prefix should be used and the first one to match " -"will be the invocation prefix. You can get this prefix via " -":attr:`.Context.prefix`. To avoid confusion empty iterables are not " -"allowed." -msgstr "" -"接頭詞は複数設定することもできます。複数の接頭詞がイテラブルで渡された場合、メッセージと最初に一致するものが接頭詞として使用されます。この接頭詞は" -" :attr:`.Context.prefix` で取得することができます。また、空のイテラブルオブジェクトは使用できません。" - -#: discord.ext.commands.Bot:33 of -msgid "" -"When passing multiple prefixes be careful to not pass a prefix that " -"matches a longer prefix occurring later in the sequence. For example, if" -" the command prefix is ``('!', '!?')`` the ``'!?'`` prefix will never be" -" matched to any message as the previous one matches messages starting " -"with ``!?``. This is especially important when passing an empty string, " -"it should always be last as no prefix after it will be matched." -msgstr "" -"複数の接頭辞を渡すとき、後の接頭辞にマッチする接頭辞を、それよりも前に渡さないよう注意してください。たとえば、接頭辞が``('!', " -"'!?')``のとき、``!?``の接頭辞は、その前のものが``!?``で始まるメッセージにマッチするため、どのメッセージにも反応しません。これは空文字列を渡すときは特に重要で、その後の接頭辞は無視されるため、空文字列は最後に置かないといけません。" - -#: discord.ext.commands.Bot:43 of -msgid "" -"Whether the commands should be case insensitive. Defaults to ``False``. " -"This attribute does not carry over to groups. You must set it to every " -"group if you require group commands to be case insensitive as well." -msgstr "" - -#: discord.ext.commands.BadBoolArgument discord.ext.commands.BadUnionArgument -#: discord.ext.commands.Bot discord.ext.commands.Bot.activity -#: discord.ext.commands.Bot.allowed_mentions -#: discord.ext.commands.Bot.cached_messages discord.ext.commands.Bot.cogs -#: discord.ext.commands.Bot.commands discord.ext.commands.Bot.emojis -#: discord.ext.commands.Bot.extensions discord.ext.commands.Bot.guilds -#: discord.ext.commands.Bot.intents discord.ext.commands.Bot.latency -#: discord.ext.commands.Bot.private_channels discord.ext.commands.Bot.user -#: discord.ext.commands.Bot.users discord.ext.commands.Bot.voice_clients -#: discord.ext.commands.BotMissingAnyRole -#: discord.ext.commands.BotMissingPermissions -#: discord.ext.commands.BotMissingRole discord.ext.commands.ChannelNotFound -#: discord.ext.commands.ChannelNotReadable discord.ext.commands.CheckAnyFailure -#: discord.ext.commands.Cog.description discord.ext.commands.Cog.qualified_name -#: discord.ext.commands.CogMeta discord.ext.commands.Command -#: discord.ext.commands.Command.cog_name -#: discord.ext.commands.Command.full_parent_name -#: discord.ext.commands.Command.parents -#: discord.ext.commands.Command.qualified_name -#: discord.ext.commands.Command.root_parent -#: discord.ext.commands.Command.short_doc -#: discord.ext.commands.Command.signature -#: discord.ext.commands.CommandInvokeError -#: discord.ext.commands.CommandOnCooldown -#: discord.ext.commands.CommandRegistrationError discord.ext.commands.Context -#: discord.ext.commands.Context.cog discord.ext.commands.Context.guild -#: discord.ext.commands.Context.valid discord.ext.commands.Context.voice_client -#: discord.ext.commands.ConversionError discord.ext.commands.DefaultHelpCommand -#: discord.ext.commands.EmojiNotFound -#: discord.ext.commands.ExpectedClosingQuoteError -#: discord.ext.commands.ExtensionError discord.ext.commands.ExtensionFailed -#: discord.ext.commands.ExtensionNotFound discord.ext.commands.Group -#: discord.ext.commands.Group.cog_name discord.ext.commands.Group.commands -#: discord.ext.commands.Group.full_parent_name -#: discord.ext.commands.Group.parents discord.ext.commands.Group.qualified_name -#: discord.ext.commands.Group.root_parent discord.ext.commands.Group.short_doc -#: discord.ext.commands.Group.signature discord.ext.commands.GroupMixin -#: discord.ext.commands.GroupMixin.commands discord.ext.commands.HelpCommand -#: discord.ext.commands.HelpCommand.clean_prefix -#: discord.ext.commands.InvalidEndOfQuotedStringError -#: discord.ext.commands.MaxConcurrencyReached -#: discord.ext.commands.MemberNotFound discord.ext.commands.MessageNotFound -#: discord.ext.commands.MinimalHelpCommand discord.ext.commands.MissingAnyRole -#: discord.ext.commands.MissingPermissions -#: discord.ext.commands.MissingRequiredArgument -#: discord.ext.commands.MissingRole discord.ext.commands.Paginator -#: discord.ext.commands.Paginator.pages -#: discord.ext.commands.PartialEmojiConversionFailure -#: discord.ext.commands.RoleNotFound discord.ext.commands.UnexpectedQuoteError -#: discord.ext.commands.UserNotFound discord.ext.commands.clean_content of -msgid "type" -msgstr "" - -#: discord.ext.commands.Bot:47 discord.ext.commands.Bot:61 -#: discord.ext.commands.Bot.is_owner:17 discord.ext.commands.Command:49 -#: discord.ext.commands.Command:86 discord.ext.commands.Command:97 -#: discord.ext.commands.Command:112 discord.ext.commands.Command:121 -#: discord.ext.commands.Command:129 discord.ext.commands.Command.can_run:16 -#: discord.ext.commands.Command.is_on_cooldown:7 -#: discord.ext.commands.CommandRegistrationError:18 -#: discord.ext.commands.Context:77 discord.ext.commands.Context.valid:3 -#: discord.ext.commands.DefaultHelpCommand:18 discord.ext.commands.Group:18 -#: discord.ext.commands.Group:25 discord.ext.commands.Group.can_run:16 -#: discord.ext.commands.Group.is_on_cooldown:7 -#: discord.ext.commands.GroupMixin:15 discord.ext.commands.HelpCommand:24 -#: discord.ext.commands.HelpCommand:31 -#: discord.ext.commands.MinimalHelpCommand:9 -#: discord.ext.commands.clean_content:10 discord.ext.commands.clean_content:16 -#: discord.ext.commands.clean_content:22 of -msgid ":class:`bool`" -msgstr "" - -#: discord.ext.commands.Bot:51 of -#, fuzzy -msgid "The content prefixed into the default help message." -msgstr ":class:`str` -- この属性に入力されたテキストは、デフォルトのヘルプメッセージの先頭に表示されます。" - -#: discord.ext.commands.BadBoolArgument:11 discord.ext.commands.Bot:53 -#: discord.ext.commands.ChannelNotFound:11 -#: discord.ext.commands.Cog.description:3 -#: discord.ext.commands.Cog.qualified_name:3 discord.ext.commands.CogMeta:37 -#: discord.ext.commands.Command:10 discord.ext.commands.Command:22 -#: discord.ext.commands.Command:34 discord.ext.commands.Command:79 -#: discord.ext.commands.Command.full_parent_name:6 -#: discord.ext.commands.Command.qualified_name:7 -#: discord.ext.commands.Command.short_doc:7 -#: discord.ext.commands.Command.signature:3 -#: discord.ext.commands.CommandRegistrationError:12 -#: discord.ext.commands.Context:41 discord.ext.commands.Context:54 -#: discord.ext.commands.DefaultHelpCommand:49 -#: discord.ext.commands.DefaultHelpCommand:56 -#: discord.ext.commands.EmojiNotFound:11 -#: discord.ext.commands.ExpectedClosingQuoteError:9 -#: discord.ext.commands.ExtensionError:9 discord.ext.commands.ExtensionFailed:9 -#: discord.ext.commands.ExtensionNotFound:12 -#: discord.ext.commands.Group.full_parent_name:6 -#: discord.ext.commands.Group.qualified_name:7 -#: discord.ext.commands.Group.short_doc:7 -#: discord.ext.commands.Group.signature:3 -#: discord.ext.commands.HelpCommand.clean_prefix:3 -#: discord.ext.commands.HelpCommand.command_not_found:13 -#: discord.ext.commands.HelpCommand.get_command_signature:7 -#: discord.ext.commands.HelpCommand.invoked_with:10 -#: discord.ext.commands.HelpCommand.remove_mentions:6 -#: discord.ext.commands.HelpCommand.subcommand_not_found:20 -#: discord.ext.commands.InvalidEndOfQuotedStringError:10 -#: discord.ext.commands.MemberNotFound:12 -#: discord.ext.commands.MessageNotFound:11 -#: discord.ext.commands.MinimalHelpCommand:16 -#: discord.ext.commands.MinimalHelpCommand:23 -#: discord.ext.commands.MinimalHelpCommand:48 -#: discord.ext.commands.MinimalHelpCommand.get_command_signature:7 -#: discord.ext.commands.MinimalHelpCommand.get_ending_note:6 -#: discord.ext.commands.MinimalHelpCommand.get_opening_note:9 -#: discord.ext.commands.Paginator:13 discord.ext.commands.Paginator:19 -#: discord.ext.commands.PartialEmojiConversionFailure:12 -#: discord.ext.commands.RoleNotFound:11 -#: discord.ext.commands.UnexpectedQuoteError:9 -#: discord.ext.commands.UserNotFound:12 of -msgid ":class:`str`" -msgstr "" - -#: discord.ext.commands.Bot:57 of -#, fuzzy -msgid "" -"If ``True``, the bot will only listen to commands invoked by itself " -"rather than ignoring itself. If ``False`` (the default) then the bot will" -" ignore itself. This cannot be changed once initialised." -msgstr "" -":class:`bool` -- ``True`` の場合、Botは自分自身を無視せず、自分自身を呼び出したコマンドのみをトリガーとします。 " -"``False`` (デフォルト)なら自分自身を無視します。初期化後には変更できません。" - -#: discord.ext.commands.Bot:65 of -#, fuzzy -msgid "" -"The help command implementation to use. This can be dynamically set at " -"runtime. To remove the help command pass ``None``. For more information " -"on implementing a help command, see :ref:`ext_commands_help_command`." -msgstr "" -"Optional[:class:`.HelpCommand`] -- " -"ヘルプコマンドの実装。これは、実行時に動的に設定できます。ヘルプコマンドを削除するには、``None`` " -"を入力してください。ヘルプコマンドの実装の詳細については、 :ref:'ext_commands_help_command' を参照してください。" - -#: discord.ext.commands.Bot:69 of -msgid "Optional[:class:`.HelpCommand`]" -msgstr "" - -#: discord.ext.commands.Bot:73 of -#, fuzzy -msgid "" -"The user ID that owns the bot. If this is not set and is then queried via" -" :meth:`.is_owner` then it is fetched automatically using " -":meth:`~.Bot.application_info`." -msgstr "" -"Optional[:class:`int`] -- Botを管理するユーザーのID。 設定されていない場合、 :meth:`.is_owner` " -"を介して参照されたとき、 :meth:`~.Bot.application_info` を用いて自動的に取得されます。" - -#: discord.ext.commands.Bot:77 discord.ext.commands.DefaultHelpCommand:36 -#: discord.ext.commands.MinimalHelpCommand:41 of -msgid "Optional[:class:`int`]" -msgstr "" - -#: discord.ext.commands.Bot:81 of -msgid "" -"The user IDs that owns the bot. This is similar to :attr:`owner_id`. If " -"this is not set and the application is team based, then it is fetched " -"automatically using :meth:`~.Bot.application_info`. For performance " -"reasons it is recommended to use a :class:`set` for the collection. You " -"cannot set both ``owner_id`` and ``owner_ids``." -msgstr "" - -#: discord.ext.commands.Bot:89 of -msgid "Optional[Collection[:class:`int`]]" -msgstr "" - -#: discord.ext.commands.Bot.activity:1 of -msgid "The activity being used upon logging in." -msgstr "" - -#: discord.ext.commands.Bot.activity:4 of -msgid "Optional[:class:`.BaseActivity`]" -msgstr "" - -#: discord.ext.commands.Bot.add_check:1 of -msgid "Adds a global check to the bot." -msgstr "ボットにグローバルチェックを追加します。" - -#: discord.ext.commands.Bot.add_check:3 of -msgid "" -"This is the non-decorator interface to :meth:`.check` and " -":meth:`.check_once`." -msgstr "これは:meth:`.check`と:meth:`.check_once`のデコレータでない実装です。" - -#: ../../ext/commands/api.rst discord.ext.commands.Bot.add_check -#: discord.ext.commands.Bot.add_cog discord.ext.commands.Bot.add_command -#: discord.ext.commands.Bot.add_listener discord.ext.commands.Bot.after_invoke -#: discord.ext.commands.Bot.before_identify_hook -#: discord.ext.commands.Bot.before_invoke -#: discord.ext.commands.Bot.change_presence discord.ext.commands.Bot.connect -#: discord.ext.commands.Bot.create_guild discord.ext.commands.Bot.delete_invite -#: discord.ext.commands.Bot.fetch_guild discord.ext.commands.Bot.fetch_guilds -#: discord.ext.commands.Bot.fetch_invite -#: discord.ext.commands.Bot.fetch_template discord.ext.commands.Bot.fetch_user -#: discord.ext.commands.Bot.fetch_user_profile -#: discord.ext.commands.Bot.fetch_widget discord.ext.commands.Bot.get_channel -#: discord.ext.commands.Bot.get_cog discord.ext.commands.Bot.get_command -#: discord.ext.commands.Bot.get_context discord.ext.commands.Bot.get_emoji -#: discord.ext.commands.Bot.get_guild discord.ext.commands.Bot.get_prefix -#: discord.ext.commands.Bot.get_user discord.ext.commands.Bot.invoke -#: discord.ext.commands.Bot.is_owner discord.ext.commands.Bot.load_extension -#: discord.ext.commands.Bot.login discord.ext.commands.Bot.process_commands -#: discord.ext.commands.Bot.reload_extension -#: discord.ext.commands.Bot.remove_check discord.ext.commands.Bot.remove_cog -#: discord.ext.commands.Bot.remove_command -#: discord.ext.commands.Bot.remove_listener -#: discord.ext.commands.Bot.request_offline_members -#: discord.ext.commands.Bot.unload_extension discord.ext.commands.Bot.wait_for -#: discord.ext.commands.CategoryChannelConverter.convert -#: discord.ext.commands.Cog.cog_after_invoke -#: discord.ext.commands.Cog.cog_before_invoke -#: discord.ext.commands.Cog.cog_command_error discord.ext.commands.Cog.listener -#: discord.ext.commands.ColourConverter.convert -#: discord.ext.commands.Command.add_check -#: discord.ext.commands.Command.after_invoke -#: discord.ext.commands.Command.before_invoke -#: discord.ext.commands.Command.can_run discord.ext.commands.Command.error -#: discord.ext.commands.Command.get_cooldown_retry_after -#: discord.ext.commands.Command.is_on_cooldown -#: discord.ext.commands.Command.remove_check -#: discord.ext.commands.Command.reset_cooldown -#: discord.ext.commands.Context.fetch_message -#: discord.ext.commands.Context.history discord.ext.commands.Context.invoke -#: discord.ext.commands.Context.reinvoke discord.ext.commands.Context.send -#: discord.ext.commands.Context.send_help -#: discord.ext.commands.Converter.convert -#: discord.ext.commands.DefaultHelpCommand.add_command_formatting -#: discord.ext.commands.DefaultHelpCommand.add_indented_commands -#: discord.ext.commands.EmojiConverter.convert -#: discord.ext.commands.GameConverter.convert -#: discord.ext.commands.Group.add_check discord.ext.commands.Group.add_command -#: discord.ext.commands.Group.after_invoke -#: discord.ext.commands.Group.before_invoke discord.ext.commands.Group.can_run -#: discord.ext.commands.Group.error discord.ext.commands.Group.get_command -#: discord.ext.commands.Group.get_cooldown_retry_after -#: discord.ext.commands.Group.is_on_cooldown -#: discord.ext.commands.Group.remove_check -#: discord.ext.commands.Group.remove_command -#: discord.ext.commands.Group.reset_cooldown -#: discord.ext.commands.GroupMixin.add_command -#: discord.ext.commands.GroupMixin.get_command -#: discord.ext.commands.GroupMixin.remove_command -#: discord.ext.commands.HelpCommand.add_check -#: discord.ext.commands.HelpCommand.command_not_found -#: discord.ext.commands.HelpCommand.filter_commands -#: discord.ext.commands.HelpCommand.get_command_signature -#: discord.ext.commands.HelpCommand.get_max_size -#: discord.ext.commands.HelpCommand.on_help_command_error -#: discord.ext.commands.HelpCommand.prepare_help_command -#: discord.ext.commands.HelpCommand.remove_check -#: discord.ext.commands.HelpCommand.send_bot_help -#: discord.ext.commands.HelpCommand.send_cog_help -#: discord.ext.commands.HelpCommand.send_command_help -#: discord.ext.commands.HelpCommand.send_error_message -#: discord.ext.commands.HelpCommand.send_group_help -#: discord.ext.commands.HelpCommand.subcommand_not_found -#: discord.ext.commands.InviteConverter.convert -#: discord.ext.commands.MemberConverter.convert -#: discord.ext.commands.MessageConverter.convert -#: discord.ext.commands.MinimalHelpCommand.add_aliases_formatting -#: discord.ext.commands.MinimalHelpCommand.add_bot_commands_formatting -#: discord.ext.commands.MinimalHelpCommand.add_command_formatting -#: discord.ext.commands.MinimalHelpCommand.add_subcommand_formatting -#: discord.ext.commands.MinimalHelpCommand.get_command_signature -#: discord.ext.commands.NSFWChannelRequired -#: discord.ext.commands.Paginator.add_line -#: discord.ext.commands.PartialEmojiConverter.convert -#: discord.ext.commands.RoleConverter.convert -#: discord.ext.commands.TextChannelConverter.convert -#: discord.ext.commands.UserConverter.convert -#: discord.ext.commands.VoiceChannelConverter.convert -#: discord.ext.commands.check discord.ext.commands.check_any -#: discord.ext.commands.clean_content.convert discord.ext.commands.command -#: discord.ext.commands.cooldown discord.ext.commands.has_any_role -#: discord.ext.commands.has_permissions discord.ext.commands.has_role -#: discord.ext.commands.max_concurrency of -msgid "Parameters" -msgstr "パラメータ" - -#: discord.ext.commands.Bot.add_check:6 of -msgid "The function that was used as a global check." -msgstr "グローバルチェックとして使用される関数。" - -#: discord.ext.commands.Bot.add_check:7 of -#, fuzzy -msgid "" -"If the function should only be called once per :meth:`.Command.invoke` " -"call." -msgstr "その関数が :meth:`Command.invoke` の呼び出し時に、一度だけ呼び出されるべきかどうか。" - -#: discord.ext.commands.Bot.add_cog:1 of -msgid "Adds a \"cog\" to the bot." -msgstr "botに「コグ」を追加します。" - -#: discord.ext.commands.Bot.add_cog:3 of -msgid "A cog is a class that has its own event listeners and commands." -msgstr "コグは、イベントリスナーとコマンドを持つクラスです。" - -#: discord.ext.commands.Bot.add_cog:5 of -msgid "The cog to register to the bot." -msgstr "ボットに登録するコグ。" - -#: discord.ext.commands.Bot.add_cog discord.ext.commands.Bot.add_command -#: discord.ext.commands.Bot.after_invoke -#: discord.ext.commands.Bot.application_info -#: discord.ext.commands.Bot.before_invoke -#: discord.ext.commands.Bot.change_presence discord.ext.commands.Bot.connect -#: discord.ext.commands.Bot.create_guild discord.ext.commands.Bot.delete_invite -#: discord.ext.commands.Bot.event discord.ext.commands.Bot.fetch_channel -#: discord.ext.commands.Bot.fetch_guild discord.ext.commands.Bot.fetch_guilds -#: discord.ext.commands.Bot.fetch_invite -#: discord.ext.commands.Bot.fetch_template discord.ext.commands.Bot.fetch_user -#: discord.ext.commands.Bot.fetch_user_profile -#: discord.ext.commands.Bot.fetch_webhook discord.ext.commands.Bot.fetch_widget -#: discord.ext.commands.Bot.listen discord.ext.commands.Bot.load_extension -#: discord.ext.commands.Bot.login discord.ext.commands.Bot.reload_extension -#: discord.ext.commands.Bot.request_offline_members -#: discord.ext.commands.Bot.start discord.ext.commands.Bot.unload_extension -#: discord.ext.commands.Bot.wait_for -#: discord.ext.commands.CategoryChannelConverter.convert -#: discord.ext.commands.Cog.listener -#: discord.ext.commands.ColourConverter.convert -#: discord.ext.commands.Command.after_invoke -#: discord.ext.commands.Command.before_invoke -#: discord.ext.commands.Command.can_run discord.ext.commands.Command.error -#: discord.ext.commands.Context.fetch_message -#: discord.ext.commands.Context.history discord.ext.commands.Context.invoke -#: discord.ext.commands.Context.pins discord.ext.commands.Context.reinvoke -#: discord.ext.commands.Context.send discord.ext.commands.Converter.convert -#: discord.ext.commands.EmojiConverter.convert -#: discord.ext.commands.GameConverter.convert -#: discord.ext.commands.Group.add_command -#: discord.ext.commands.Group.after_invoke -#: discord.ext.commands.Group.before_invoke discord.ext.commands.Group.can_run -#: discord.ext.commands.Group.error discord.ext.commands.GroupMixin.add_command -#: discord.ext.commands.InviteConverter.convert -#: discord.ext.commands.MemberConverter.convert -#: discord.ext.commands.MessageConverter.convert -#: discord.ext.commands.Paginator.add_line -#: discord.ext.commands.PartialEmojiConverter.convert -#: discord.ext.commands.RoleConverter.convert -#: discord.ext.commands.TextChannelConverter.convert -#: discord.ext.commands.UserConverter.convert -#: discord.ext.commands.VoiceChannelConverter.convert -#: discord.ext.commands.check_any discord.ext.commands.clean_content.convert -#: discord.ext.commands.command of -#, fuzzy -msgid "Raises" -msgstr "例外" - -#: discord.ext.commands.Bot.add_cog:8 of -#, fuzzy -msgid "The cog does not inherit from :class:`.Cog`." -msgstr ":exc:`TypeError -- コグが :class:`.Cog` を継承していない。" - -#: discord.ext.commands.Bot.add_cog:9 of -#, fuzzy -msgid "An error happened during loading." -msgstr ":exc:`CommandError` -- 読み込み中にエラーが発生した。" - -#: discord.ext.commands.Bot.add_command:1 -#: discord.ext.commands.Group.add_command:1 -#: discord.ext.commands.GroupMixin.add_command:1 of -#, fuzzy -msgid "Adds a :class:`.Command` into the internal list of commands." -msgstr ":class:`.Command`やそのサブクラスを内部のコマンドリストに追加します。" - -#: discord.ext.commands.Bot.add_command:3 -#: discord.ext.commands.Group.add_command:3 -#: discord.ext.commands.GroupMixin.add_command:3 of -msgid "" -"This is usually not called, instead the :meth:`~.GroupMixin.command` or " -":meth:`~.GroupMixin.group` shortcut decorators are used instead." -msgstr "" -"これは通常、呼び出されません。代わりに :meth:`~.GroupMixin.command` か " -":meth:`~.GroupMixin.group` のショートカットデコレータが使われます。" - -#: discord.ext.commands.Bot.add_command:6 -#: discord.ext.commands.Group.add_command:6 -#: discord.ext.commands.GroupMixin.add_command:6 of -msgid "" -"Raise :exc:`.CommandRegistrationError` instead of generic " -":exc:`.ClientException`" -msgstr "" - -#: discord.ext.commands.Bot.add_command:9 -#: discord.ext.commands.Group.add_command:9 -#: discord.ext.commands.GroupMixin.add_command:9 of -msgid "The command to add." -msgstr "追加するコマンド。" - -#: discord.ext.commands.Bot.add_command:12 -#: discord.ext.commands.Group.add_command:12 -#: discord.ext.commands.GroupMixin.add_command:12 of -msgid "If the command or its alias is already registered by different command." -msgstr "" - -#: discord.ext.commands.Bot.add_command:13 -#: discord.ext.commands.Group.add_command:13 -#: discord.ext.commands.GroupMixin.add_command:13 of -#, fuzzy -msgid "If the command passed is not a subclass of :class:`.Command`." -msgstr ":exc:`TypeError` -- 渡されたコマンドが:class:`.Command`のサブコマンドではないという例外" - -#: discord.ext.commands.Bot.add_listener:1 of -msgid "The non decorator alternative to :meth:`.listen`." -msgstr ":meth:`.listen` の代替の非デコレータ" - -#: discord.ext.commands.Bot.add_listener:3 of -msgid "The function to call." -msgstr "呼び出される関数" - -#: discord.ext.commands.Bot.add_listener:5 of -msgid "The name of the event to listen for. Defaults to ``func.__name__``." -msgstr "待機するイベントの名前。デフォルトでは ``func.__name__`` です。" - -#: discord.ext.commands.Bot.add_listener:9 -#: discord.ext.commands.Bot.change_presence:6 discord.ext.commands.Bot.check:16 -#: discord.ext.commands.Bot.check_once:26 discord.ext.commands.Bot.event:8 -#: discord.ext.commands.Bot.listen:8 discord.ext.commands.before_invoke:9 -#: discord.ext.commands.has_any_role:20 discord.ext.commands.has_permissions:16 -#: discord.ext.commands.when_mentioned_or:6 of -msgid "Example" -msgstr "例" - -#: discord.ext.commands.Bot.after_invoke:1 -#: discord.ext.commands.Command.after_invoke:1 -#: discord.ext.commands.Group.after_invoke:1 -#: discord.ext.commands.after_invoke:1 of -msgid "A decorator that registers a coroutine as a post-invoke hook." -msgstr "" - -#: discord.ext.commands.Bot.after_invoke:3 -#: discord.ext.commands.Command.after_invoke:3 -#: discord.ext.commands.Group.after_invoke:3 of -msgid "" -"A post-invoke hook is called directly after the command is called. This " -"makes it a useful function to clean-up database connections or any type " -"of clean up required." -msgstr "" - -#: discord.ext.commands.Bot.after_invoke:7 -#: discord.ext.commands.Command.after_invoke:7 -#: discord.ext.commands.Group.after_invoke:7 of -msgid "This post-invoke hook takes a sole parameter, a :class:`.Context`." -msgstr "" - -#: discord.ext.commands.Bot.after_invoke:11 of -msgid "" -"Similar to :meth:`~.Bot.before_invoke`\\, this is not called unless " -"checks and argument parsing procedures succeed. This hook is, however, " -"**always** called regardless of the internal command callback raising an " -"error (i.e. :exc:`.CommandInvokeError`\\). This makes it ideal for clean-" -"up scenarios." -msgstr "" - -#: discord.ext.commands.Bot.after_invoke:17 -#: discord.ext.commands.Command.after_invoke:11 -#: discord.ext.commands.Group.after_invoke:11 of -msgid "The coroutine to register as the post-invoke hook." -msgstr "" - -#: discord.ext.commands.Bot.after_invoke:20 -#: discord.ext.commands.Bot.before_invoke:19 discord.ext.commands.Bot.event:15 -#: discord.ext.commands.Command.after_invoke:14 -#: discord.ext.commands.Command.before_invoke:14 -#: discord.ext.commands.Command.error:10 -#: discord.ext.commands.Group.after_invoke:14 -#: discord.ext.commands.Group.before_invoke:14 -#: discord.ext.commands.Group.error:10 of -#, fuzzy -msgid "The coroutine passed is not actually a coroutine." -msgstr ":exc:`TypeError` -- 渡されたコルーチンが実際はコルーチンではない。" - -#: discord.ext.commands.Bot.allowed_mentions:1 of -msgid "The allowed mention configuration." -msgstr "" - -#: discord.ext.commands.Bot.allowed_mentions:5 of -msgid "Optional[:class:`~discord.AllowedMentions`]" -msgstr "" - -#: discord.ext.commands.Bot.application_info:1 -#: discord.ext.commands.Bot.before_identify_hook:1 -#: discord.ext.commands.Bot.change_presence:1 -#: discord.ext.commands.Bot.connect:1 discord.ext.commands.Bot.create_guild:1 -#: discord.ext.commands.Bot.delete_invite:1 -#: discord.ext.commands.Bot.fetch_channel:1 -#: discord.ext.commands.Bot.fetch_guild:1 -#: discord.ext.commands.Bot.fetch_guilds:1 -#: discord.ext.commands.Bot.fetch_invite:1 -#: discord.ext.commands.Bot.fetch_template:1 -#: discord.ext.commands.Bot.fetch_user:1 -#: discord.ext.commands.Bot.fetch_user_profile:1 -#: discord.ext.commands.Bot.fetch_webhook:1 -#: discord.ext.commands.Bot.fetch_widget:1 -#: discord.ext.commands.Bot.get_context:1 discord.ext.commands.Bot.get_prefix:1 -#: discord.ext.commands.Bot.invoke:1 discord.ext.commands.Bot.is_owner:1 -#: discord.ext.commands.Bot.login:1 discord.ext.commands.Bot.logout:1 -#: discord.ext.commands.Bot.on_command_error:1 -#: discord.ext.commands.Bot.on_error:1 -#: discord.ext.commands.Bot.process_commands:1 -#: discord.ext.commands.Bot.request_offline_members:1 -#: discord.ext.commands.Bot.start:1 discord.ext.commands.Bot.wait_for:1 -#: discord.ext.commands.Bot.wait_until_ready:1 -#: discord.ext.commands.CategoryChannelConverter.convert:1 -#: discord.ext.commands.ColourConverter.convert:1 -#: discord.ext.commands.Command.__call__:1 -#: discord.ext.commands.Command.can_run:1 -#: discord.ext.commands.Context.fetch_message:1 -#: discord.ext.commands.Context.invoke:1 discord.ext.commands.Context.pins:1 -#: discord.ext.commands.Context.reinvoke:1 discord.ext.commands.Context.send:1 -#: discord.ext.commands.Context.send_help:1 -#: discord.ext.commands.Context.trigger_typing:1 -#: discord.ext.commands.Converter.convert:1 -#: discord.ext.commands.EmojiConverter.convert:1 -#: discord.ext.commands.GameConverter.convert:1 -#: discord.ext.commands.Group.can_run:1 -#: discord.ext.commands.HelpCommand.command_callback:1 -#: discord.ext.commands.HelpCommand.filter_commands:1 -#: discord.ext.commands.HelpCommand.on_help_command_error:1 -#: discord.ext.commands.HelpCommand.prepare_help_command:1 -#: discord.ext.commands.HelpCommand.send_bot_help:1 -#: discord.ext.commands.HelpCommand.send_cog_help:1 -#: discord.ext.commands.HelpCommand.send_command_help:1 -#: discord.ext.commands.HelpCommand.send_error_message:1 -#: discord.ext.commands.HelpCommand.send_group_help:1 -#: discord.ext.commands.InviteConverter.convert:1 -#: discord.ext.commands.MemberConverter.convert:1 -#: discord.ext.commands.MessageConverter.convert:1 -#: discord.ext.commands.PartialEmojiConverter.convert:1 -#: discord.ext.commands.RoleConverter.convert:1 -#: discord.ext.commands.TextChannelConverter.convert:1 -#: discord.ext.commands.UserConverter.convert:1 -#: discord.ext.commands.VoiceChannelConverter.convert:1 -#: discord.ext.commands.clean_content.convert:1 of -msgid "|coro|" -msgstr "|coro|" - -#: discord.ext.commands.Bot.application_info:3 of -msgid "Retrieves the bot's application information." -msgstr "Botのアプリケーション情報を取得します。" - -#: discord.ext.commands.Bot.application_info:5 of -#, fuzzy -msgid "Retrieving the information failed somehow." -msgstr ":exc:`.HTTPException` -- 何らかの要因で情報の取得に失敗した。" - -#: discord.ext.commands.Bot.application_info discord.ext.commands.Bot.command -#: discord.ext.commands.Bot.create_guild discord.ext.commands.Bot.fetch_channel -#: discord.ext.commands.Bot.fetch_guild discord.ext.commands.Bot.fetch_invite -#: discord.ext.commands.Bot.fetch_template discord.ext.commands.Bot.fetch_user -#: discord.ext.commands.Bot.fetch_user_profile -#: discord.ext.commands.Bot.fetch_webhook discord.ext.commands.Bot.fetch_widget -#: discord.ext.commands.Bot.get_channel discord.ext.commands.Bot.get_cog -#: discord.ext.commands.Bot.get_command discord.ext.commands.Bot.get_context -#: discord.ext.commands.Bot.get_emoji discord.ext.commands.Bot.get_guild -#: discord.ext.commands.Bot.get_prefix discord.ext.commands.Bot.get_user -#: discord.ext.commands.Bot.group discord.ext.commands.Bot.is_owner -#: discord.ext.commands.Bot.remove_command discord.ext.commands.Bot.wait_for -#: discord.ext.commands.Cog.get_commands discord.ext.commands.Cog.get_listeners -#: discord.ext.commands.Command.can_run discord.ext.commands.Command.copy -#: discord.ext.commands.Command.get_cooldown_retry_after -#: discord.ext.commands.Command.is_on_cooldown -#: discord.ext.commands.Context.fetch_message discord.ext.commands.Context.pins -#: discord.ext.commands.Context.send discord.ext.commands.Context.send_help -#: discord.ext.commands.DefaultHelpCommand.get_destination -#: discord.ext.commands.Group.can_run discord.ext.commands.Group.command -#: discord.ext.commands.Group.copy discord.ext.commands.Group.get_command -#: discord.ext.commands.Group.get_cooldown_retry_after -#: discord.ext.commands.Group.group discord.ext.commands.Group.is_on_cooldown -#: discord.ext.commands.Group.remove_command -#: discord.ext.commands.GroupMixin.command -#: discord.ext.commands.GroupMixin.get_command -#: discord.ext.commands.GroupMixin.group -#: discord.ext.commands.GroupMixin.remove_command -#: discord.ext.commands.HelpCommand.cog -#: discord.ext.commands.HelpCommand.command_not_found -#: discord.ext.commands.HelpCommand.filter_commands -#: discord.ext.commands.HelpCommand.get_command_signature -#: discord.ext.commands.HelpCommand.get_destination -#: discord.ext.commands.HelpCommand.get_max_size -#: discord.ext.commands.HelpCommand.invoked_with -#: discord.ext.commands.HelpCommand.remove_mentions -#: discord.ext.commands.HelpCommand.subcommand_not_found -#: discord.ext.commands.MinimalHelpCommand.get_command_signature -#: discord.ext.commands.MinimalHelpCommand.get_destination -#: discord.ext.commands.MinimalHelpCommand.get_ending_note -#: discord.ext.commands.MinimalHelpCommand.get_opening_note of -msgid "Returns" -msgstr "戻り値" - -#: discord.ext.commands.Bot.application_info:7 of -msgid "The bot's application information." -msgstr "Botのアプリケーション情報。" - -#: discord.ext.commands.Bot.application_info discord.ext.commands.Bot.command -#: discord.ext.commands.Bot.create_guild discord.ext.commands.Bot.fetch_channel -#: discord.ext.commands.Bot.fetch_guild discord.ext.commands.Bot.fetch_invite -#: discord.ext.commands.Bot.fetch_template discord.ext.commands.Bot.fetch_user -#: discord.ext.commands.Bot.fetch_user_profile -#: discord.ext.commands.Bot.fetch_webhook discord.ext.commands.Bot.fetch_widget -#: discord.ext.commands.Bot.get_channel discord.ext.commands.Bot.get_cog -#: discord.ext.commands.Bot.get_command discord.ext.commands.Bot.get_context -#: discord.ext.commands.Bot.get_emoji discord.ext.commands.Bot.get_guild -#: discord.ext.commands.Bot.get_prefix discord.ext.commands.Bot.get_user -#: discord.ext.commands.Bot.group discord.ext.commands.Bot.is_owner -#: discord.ext.commands.Bot.remove_command discord.ext.commands.Bot.wait_for -#: discord.ext.commands.Cog.get_commands discord.ext.commands.Cog.get_listeners -#: discord.ext.commands.Command.can_run discord.ext.commands.Command.copy -#: discord.ext.commands.Command.get_cooldown_retry_after -#: discord.ext.commands.Command.is_on_cooldown -#: discord.ext.commands.Context.fetch_message discord.ext.commands.Context.pins -#: discord.ext.commands.Context.send discord.ext.commands.Context.send_help -#: discord.ext.commands.DefaultHelpCommand.get_destination -#: discord.ext.commands.Group.can_run discord.ext.commands.Group.command -#: discord.ext.commands.Group.copy discord.ext.commands.Group.get_command -#: discord.ext.commands.Group.get_cooldown_retry_after -#: discord.ext.commands.Group.group discord.ext.commands.Group.is_on_cooldown -#: discord.ext.commands.Group.remove_command -#: discord.ext.commands.GroupMixin.command -#: discord.ext.commands.GroupMixin.get_command -#: discord.ext.commands.GroupMixin.group -#: discord.ext.commands.GroupMixin.remove_command -#: discord.ext.commands.HelpCommand.cog -#: discord.ext.commands.HelpCommand.command_not_found -#: discord.ext.commands.HelpCommand.filter_commands -#: discord.ext.commands.HelpCommand.get_command_signature -#: discord.ext.commands.HelpCommand.get_destination -#: discord.ext.commands.HelpCommand.get_max_size -#: discord.ext.commands.HelpCommand.invoked_with -#: discord.ext.commands.HelpCommand.remove_mentions -#: discord.ext.commands.HelpCommand.subcommand_not_found -#: discord.ext.commands.MinimalHelpCommand.get_command_signature -#: discord.ext.commands.MinimalHelpCommand.get_destination -#: discord.ext.commands.MinimalHelpCommand.get_ending_note -#: discord.ext.commands.MinimalHelpCommand.get_opening_note of -msgid "Return type" -msgstr "戻り値の型" - -#: discord.ext.commands.Bot.application_info:8 of -msgid ":class:`.AppInfo`" -msgstr ":class:`.AppInfo`" - -#: discord.ext.commands.Bot.before_identify_hook:3 of -msgid "" -"A hook that is called before IDENTIFYing a session. This is useful if you" -" wish to have more control over the synchronization of multiple " -"IDENTIFYing clients." -msgstr "" - -#: discord.ext.commands.Bot.before_identify_hook:7 of -msgid "The default implementation sleeps for 5 seconds." -msgstr "" - -#: discord.ext.commands.Bot.before_identify_hook:11 of -msgid "The shard ID that requested being IDENTIFY'd" -msgstr "" - -#: discord.ext.commands.Bot.before_identify_hook:13 of -msgid "Whether this IDENTIFY is the first initial IDENTIFY." -msgstr "" - -#: discord.ext.commands.Bot.before_invoke:1 -#: discord.ext.commands.Command.before_invoke:1 -#: discord.ext.commands.Group.before_invoke:1 -#: discord.ext.commands.before_invoke:1 of -msgid "A decorator that registers a coroutine as a pre-invoke hook." -msgstr "" - -#: discord.ext.commands.Bot.before_invoke:3 -#: discord.ext.commands.Command.before_invoke:3 -#: discord.ext.commands.Group.before_invoke:3 of -msgid "" -"A pre-invoke hook is called directly before the command is called. This " -"makes it a useful function to set up database connections or any type of " -"set up required." -msgstr "" - -#: discord.ext.commands.Bot.before_invoke:7 -#: discord.ext.commands.Command.before_invoke:7 -#: discord.ext.commands.Group.before_invoke:7 of -msgid "This pre-invoke hook takes a sole parameter, a :class:`.Context`." -msgstr "" - -#: discord.ext.commands.Bot.before_invoke:11 of -msgid "" -"The :meth:`~.Bot.before_invoke` and :meth:`~.Bot.after_invoke` hooks are " -"only called if all checks and argument parsing procedures pass without " -"error. If any check or argument parsing procedures fail then the hooks " -"are not called." -msgstr "" - -#: discord.ext.commands.Bot.before_invoke:16 -#: discord.ext.commands.Command.before_invoke:11 -#: discord.ext.commands.Group.before_invoke:11 of -msgid "The coroutine to register as the pre-invoke hook." -msgstr "" - -#: discord.ext.commands.Bot.cached_messages:1 of -#, fuzzy -msgid "Read-only list of messages the connected client has cached." -msgstr "Sequence[:class:`.Message`] -- 接続されたクライアントにキャッシュされたメッセージの、読み取り専用リスト。" - -#: discord.ext.commands.Bot.cached_messages:5 of -msgid "Sequence[:class:`.Message`]" -msgstr "" - -#: discord.ext.commands.Bot.change_presence:3 of -msgid "Changes the client's presence." -msgstr "クライアントのステータスを変更します。" - -#: discord.ext.commands.Bot.change_presence:12 of -msgid "The activity being done. ``None`` if no currently active activity is done." -msgstr "実行中のアクティビティ。何も実行していない場合は ``None`` を返します。" - -#: discord.ext.commands.Bot.change_presence:14 of -msgid "" -"Indicates what status to change to. If ``None``, then " -":attr:`.Status.online` is used." -msgstr "変更するステータスを示します。 ``None`` の場合、 :attr:`.Status.online` が使用されます。" - -#: discord.ext.commands.Bot.change_presence:17 of -msgid "" -"Indicates if you are going AFK. This allows the discord client to know " -"how to handle push notifications better for you in case you are actually " -"idle and not lying." -msgstr "ステータスを退席中に変更するかどうかを返します。これによって、実際にアイドル状態に移行した場合において、Discordクライアントにプッシュ通知をより適切に処理させることができます。" - -#: discord.ext.commands.Bot.change_presence:22 of -#, fuzzy -msgid "If the ``activity`` parameter is not the proper type." -msgstr ":exc:`.InvalidArgument` -- ``activity`` に渡された値が適切な型でない。" - -#: discord.ext.commands.Bot.check:1 of -msgid "A decorator that adds a global check to the bot." -msgstr "Botにグローバルチェックを追加するデコレーター" - -#: discord.ext.commands.Bot.check:3 of -msgid "" -"A global check is similar to a :func:`.check` that is applied on a per " -"command basis except it is run before any command checks have been " -"verified and applies to every command the bot has." -msgstr "" -"このグローバルチェックは、 :func:`.check` " -"がコマンドごとに適用されるのと似ていますが、コマンドチェックが検証され、かつBotが持つすべてのコマンドが適用される前に実行される点で異なります。" - -#: discord.ext.commands.Bot.check:9 discord.ext.commands.Bot.check_once:19 of -msgid "This function can either be a regular function or a coroutine." -msgstr "この関数は、通常の関数かコルーチン、どちらでも成り得ます。" - -#: discord.ext.commands.Bot.check:11 discord.ext.commands.Bot.check_once:21 of -msgid "" -"Similar to a command :func:`.check`\\, this takes a single parameter of " -"type :class:`.Context` and can only raise exceptions inherited from " -":exc:`.CommandError`." -msgstr "" -":func:`.check` コマンドと同様、 :class:`.Context` 型の単一のパラメータを取り、 " -":exc:`.CommandError` から継承された例外のみを投げることができます。" - -#: discord.ext.commands.Bot.check_once:1 of -msgid "A decorator that adds a \"call once\" global check to the bot." -msgstr "Botに「一度だけ実行される」グローバルチェックを追加するデコレーター" - -#: discord.ext.commands.Bot.check_once:3 of -#, fuzzy -msgid "" -"Unlike regular global checks, this one is called only once per " -":meth:`.Command.invoke` call." -msgstr "通常のグローバルチェックと違って、これは :meth:`Command.invoke` が呼ばれる毎に一度だけ実行されます。" - -#: discord.ext.commands.Bot.check_once:6 of -msgid "" -"Regular global checks are called whenever a command is called or " -":meth:`.Command.can_run` is called. This type of check bypasses that and " -"ensures that it's called only once, even inside the default help command." -msgstr "" -"通常のグローバルチェックは、コマンドが呼び出されるか :meth:`.Command.can_run` " -"が呼び出されるたび、実行されます。しかしこのグローバルチェックはそれを迂回し、デフォルトのhelpコマンドの中であっても、たった一度だけ呼ばれます。" - -#: discord.ext.commands.Bot.check_once:13 of -msgid "" -"When using this function the :class:`.Context` sent to a group subcommand" -" may only parse the parent command and not the subcommands due to it " -"being invoked once per :meth:`.Bot.invoke` call." -msgstr "" - -#: discord.ext.commands.Bot.clear:1 of -msgid "Clears the internal state of the bot." -msgstr "Botの内部状態をクリアします。" - -#: discord.ext.commands.Bot.clear:3 of -msgid "" -"After this, the bot can be considered \"re-opened\", i.e. " -":meth:`is_closed` and :meth:`is_ready` both return ``False`` along with " -"the bot's internal cache cleared." -msgstr "" -"これが実行されると、Botは「再実行」されたと見なされます。また、これにより :meth:`is_closed` や " -":meth:`is_ready` は ``False`` を返し、内部のキャッシュもクリアされます。" - -#: discord.ext.commands.Bot.cogs:1 of -#, fuzzy -msgid "A read-only mapping of cog name to cog." -msgstr "Mapping[:class:`str`, :class:`Cog`] -- コグ名から、コグへの読み取り専用マッピング。" - -#: discord.ext.commands.Bot.cogs:3 of -msgid "Mapping[:class:`str`, :class:`Cog`]" -msgstr "" - -#: discord.ext.commands.Bot.command:1 discord.ext.commands.Group.command:1 -#: discord.ext.commands.GroupMixin.command:1 of -msgid "" -"A shortcut decorator that invokes :func:`.command` and adds it to the " -"internal command list via :meth:`~.GroupMixin.add_command`." -msgstr "" -":func:`.command` を呼び出し、 :meth:`~.GroupMixin.add_command` " -"を介して内部コマンドリストに追加するショートカットデコレータ。" - -#: discord.ext.commands.Bot.command:4 discord.ext.commands.Group.command:4 -#: discord.ext.commands.GroupMixin.command:4 of -msgid "" -"A decorator that converts the provided method into a Command, adds it to " -"the bot, then returns it." -msgstr "" - -#: discord.ext.commands.Bot.command:5 discord.ext.commands.Group.command:5 -#: discord.ext.commands.GroupMixin.command:5 of -msgid "Callable[..., :class:`Command`]" -msgstr "" - -#: discord.ext.commands.Bot.commands:1 discord.ext.commands.Group.commands:1 -#: discord.ext.commands.GroupMixin.commands:1 of -#, fuzzy -msgid "A unique set of commands without aliases that are registered." -msgstr "Set[:class:`.Command`] -- 登録済みの別名がない固有のコマンドセット。" - -#: discord.ext.commands.Bot.commands:3 discord.ext.commands.Group.commands:3 -#: discord.ext.commands.GroupMixin.commands:3 of -#, fuzzy -msgid "Set[:class:`.Command`]" -msgstr ":class:`Command` またはサブクラス" - -#: discord.ext.commands.Bot.connect:3 of -msgid "" -"Creates a websocket connection and lets the websocket listen to messages " -"from Discord. This is a loop that runs the entire event system and " -"miscellaneous aspects of the library. Control is not resumed until the " -"WebSocket connection is terminated." -msgstr "WebSocket接続を作成し、Discordからのメッセージをリッスンできるようにします。これはイベントシステム全体とライブラリの様々な機能を実行するループです。WebSocket接続が終了するまで、プログラムは再開されません。" - -#: discord.ext.commands.Bot.connect:8 of -msgid "" -"If we should attempt reconnecting, either due to internet failure or a " -"specific failure on Discord's part. Certain disconnects that lead to bad " -"state will not be handled (such as invalid sharding payloads or bad " -"tokens)." -msgstr "" -"インターネットの障害やDiscord側の特定の障害が発生した際、再接続を試みるかどうかを表します。不正な状態へ移行する可能性がある特定の切断(無効なシャーディングpayloadや不正なトークンなど)" -" は処理されません。" - -#: discord.ext.commands.Bot.connect:14 of -#, fuzzy -msgid "" -"If the gateway to connect to Discord is not found. Usually if this is" -" thrown then there is a Discord API outage." -msgstr "" -":exc:`.GatewayNotFound` -- " -"Discordに接続するためのゲートウェイが見つからない。通常、これが発生した場合はDiscordAPIのエラーが考えられます。" - -#: discord.ext.commands.Bot.connect:15 of -#, fuzzy -msgid "The websocket connection has been terminated." -msgstr ":exc:`.ConnectionClosed` -- WebSocket接続は既に終了した。" - -#: discord.ext.commands.Bot.create_guild:3 of -msgid "Creates a :class:`.Guild`." -msgstr ":class:`.Guild` を作成します。" - -#: discord.ext.commands.Bot.create_guild:5 of -msgid "Bot accounts in more than 10 guilds are not allowed to create guilds." -msgstr "10以上のギルドに参加しているBotアカウントは、ギルドの作成ができません。" - -#: discord.ext.commands.Bot.create_guild:7 of -msgid "The name of the guild." -msgstr "ギルドの名前。" - -#: discord.ext.commands.Bot.create_guild:9 of -msgid "" -"The region for the voice communication server. Defaults to " -":attr:`.VoiceRegion.us_west`." -msgstr "音声通話に利用されるサーバーの地域。デフォルト値は :attr:`.VoiceRegion.us_west` 。" - -#: discord.ext.commands.Bot.create_guild:12 of -msgid "" -"The :term:`py:bytes-like object` representing the icon. See " -":meth:`.ClientUser.edit` for more details on what is expected." -msgstr "" - -#: discord.ext.commands.Bot.create_guild:15 of -msgid "The code for a template to create the guild with. .. versionadded:: 1.4" -msgstr "" - -#: discord.ext.commands.Bot.create_guild:15 of -msgid "The code for a template to create the guild with." -msgstr "" - -#: discord.ext.commands.Bot.create_guild:20 of -#, fuzzy -msgid "Guild creation failed." -msgstr ":exc:`.HTTPException` -- ギルドの作成に失敗した。" - -#: discord.ext.commands.Bot.create_guild:21 of -msgid "Invalid icon image format given. Must be PNG or JPG." -msgstr "" - -#: discord.ext.commands.Bot.create_guild:23 of -msgid "The guild created. This is not the same guild that is added to cache." -msgstr "" - -#: discord.ext.commands.Bot.create_guild:25 -#: discord.ext.commands.Bot.fetch_guild:21 of -msgid ":class:`.Guild`" -msgstr ":class:`.Guild`" - -#: discord.ext.commands.Bot.delete_invite:3 of -msgid "Revokes an :class:`.Invite`, URL, or ID to an invite." -msgstr ":class:`.Invite` や、招待のURL、IDを削除します。" - -#: discord.ext.commands.Bot.delete_invite:5 of -msgid "" -"You must have the :attr:`~.Permissions.manage_channels` permission in the" -" associated guild to do this." -msgstr "これを行うには、関連付けられたGuildにて、 :attr:`~.Permissions.manage_channels` 権限が必要です。" - -#: discord.ext.commands.Bot.delete_invite:8 of -msgid "The invite to revoke." -msgstr "取り消す招待。" - -#: discord.ext.commands.Bot.delete_invite:11 of -#, fuzzy -msgid "You do not have permissions to revoke invites." -msgstr ":exc:`.Forbidden` -- 招待を取り消す権限が無い。" - -#: discord.ext.commands.Bot.delete_invite:12 of -#, fuzzy -msgid "The invite is invalid or expired." -msgstr ":exc:`.NotFound` -- 招待が無効、あるいは期限切れになっている。" - -#: discord.ext.commands.Bot.delete_invite:13 of -#, fuzzy -msgid "Revoking the invite failed." -msgstr ":exc:`.HTTPException` -- 招待の取り消しに失敗した。" - -#: discord.ext.commands.Bot.emojis:1 of -#, fuzzy -msgid "The emojis that the connected client has." -msgstr "List[:class:`.Emoji`] -- 接続したクライアントがアクセスできる絵文字。" - -#: discord.ext.commands.Bot.emojis:3 of -#, fuzzy -msgid "List[:class:`.Emoji`]" -msgstr ":class:`.Guild`" - -#: discord.ext.commands.Bot.event:1 of -msgid "A decorator that registers an event to listen to." -msgstr "リッスンするイベントを登録するデコレータ。" - -#: discord.ext.commands.Bot.event:3 of -msgid "" -"You can find more info about the events on the :ref:`documentation below " -"`." -msgstr "イベントの詳細については :ref:`以下のドキュメント ` を参照してください。" - -#: discord.ext.commands.Bot.event:5 of -msgid "" -"The events must be a :ref:`coroutine `, if not, " -":exc:`TypeError` is raised." -msgstr "イベントは :ref:`コルーチン ` でなければいけません。違う場合は :exc:`TypeError` が発生します。" - -#: discord.ext.commands.Bot.extensions:1 of -msgid "A read-only mapping of extension name to extension." -msgstr "" - -#: discord.ext.commands.Bot.extensions:3 of -msgid "Mapping[:class:`str`, :class:`py:types.ModuleType`]" -msgstr "" - -#: discord.ext.commands.Bot.fetch_channel:3 of -msgid "" -"Retrieves a :class:`.abc.GuildChannel` or :class:`.abc.PrivateChannel` " -"with the specified ID." -msgstr "" - -#: discord.ext.commands.Bot.fetch_channel:7 of -msgid "" -"This method is an API call. For general usage, consider " -":meth:`get_channel` instead." -msgstr "" - -#: discord.ext.commands.Bot.fetch_channel:11 of -msgid "An unknown channel type was received from Discord." -msgstr "" - -#: discord.ext.commands.Bot.fetch_channel:12 of -#, fuzzy -msgid "Retrieving the channel failed." -msgstr ":exc:`.HTTPException` -- チャンネルの取得に失敗した。" - -#: discord.ext.commands.Bot.fetch_channel:13 of -msgid "Invalid Channel ID." -msgstr "" - -#: discord.ext.commands.Bot.fetch_channel:14 of -#, fuzzy -msgid "You do not have permission to fetch this channel." -msgstr ":exc:`.Forbidden` -- 指定のチャンネルを取得する権限がない。" - -#: discord.ext.commands.Bot.fetch_channel:16 of -msgid "The channel from the ID." -msgstr "IDから取得したチャンネル。" - -#: discord.ext.commands.Bot.fetch_channel:17 of -msgid "Union[:class:`.abc.GuildChannel`, :class:`.abc.PrivateChannel`]" -msgstr "Union[ :class:`.abc.GuildChannel` , :class:`.abc.PrivateChannel` ]" - -#: discord.ext.commands.Bot.fetch_guild:3 of -msgid "Retrieves a :class:`.Guild` from an ID." -msgstr "IDから :class:`.Guild` を取得します。" - -#: discord.ext.commands.Bot.fetch_guild:7 of -#, fuzzy -msgid "" -"Using this, you will **not** receive :attr:`.Guild.channels`, " -":attr:`.Guild.members`, :attr:`.Member.activity` and " -":attr:`.Member.voice` per :class:`.Member`." -msgstr "" -"これを使用した場合、 :attr:`.Guild.channels` 、 :class:`.Guild.members` 、そして各 " -":class:`.Member` ごとの :attr:`.Member.activity` 、 :attr:`.Member.voice` " -"を取得することは **できません** 。" - -#: discord.ext.commands.Bot.fetch_guild:12 of -msgid "" -"This method is an API call. For general usage, consider :meth:`get_guild`" -" instead." -msgstr "このメソッドはAPIを呼び出します。通常は :meth:`get_guild` を代わりとして使用してください。" - -#: discord.ext.commands.Bot.fetch_guild:14 of -msgid "The guild's ID to fetch from." -msgstr "取得したいギルドのID。" - -#: discord.ext.commands.Bot.fetch_guild:17 of -#, fuzzy -msgid "You do not have access to the guild." -msgstr ":exc:`.Forbidden` -- ギルドにアクセスできない。" - -#: discord.ext.commands.Bot.fetch_guild:18 of -#, fuzzy -msgid "Getting the guild failed." -msgstr ":exc:`.HTTPException` -- ギルドの取得に失敗した。" - -#: discord.ext.commands.Bot.fetch_guild:20 of -msgid "The guild from the ID." -msgstr "IDから取得したギルド。" - -#: discord.ext.commands.Bot.fetch_guilds:3 of -msgid "Retrieves an :class:`.AsyncIterator` that enables receiving your guilds." -msgstr "Botが所属するGuildを取得できる、 :class:`AsyncIterator` を取得します。" - -#: discord.ext.commands.Bot.fetch_guilds:7 of -msgid "" -"Using this, you will only receive :attr:`.Guild.owner`, " -":attr:`.Guild.icon`, :attr:`.Guild.id`, and :attr:`.Guild.name` per " -":class:`.Guild`." -msgstr "" -"これを使った場合、各 :class:`Guild` の :attr:`Guild.owner` 、 :attr:`Guild.icon` 、 " -":attr:`Guild.id` 、 :attr:`Guild.name` のみ取得できます。" - -#: discord.ext.commands.Bot.fetch_guilds:12 of -msgid "" -"This method is an API call. For general usage, consider :attr:`guilds` " -"instead." -msgstr "これはAPIを呼び出します。通常は :attr:`guilds` を代わりに使用してください。" - -#: discord.ext.commands.Bot.fetch_guilds:15 -#: discord.ext.commands.Bot.wait_for:22 discord.ext.commands.Context.history:6 -#: discord.ext.commands.check:37 discord.ext.commands.check_any:20 of -msgid "Examples" -msgstr "例" - -#: discord.ext.commands.Bot.fetch_guilds:16 -#: discord.ext.commands.Context.history:7 of -msgid "Usage ::" -msgstr "使い方 ::" - -#: discord.ext.commands.Bot.fetch_guilds:21 of -msgid "Flattening into a list ::" -msgstr "リストへフラット化 ::" - -#: discord.ext.commands.Bot.fetch_guilds:26 -#: discord.ext.commands.Context.history:19 of -msgid "All parameters are optional." -msgstr "すべてのパラメータがオプションです。" - -#: discord.ext.commands.Bot.fetch_guilds:28 of -#, fuzzy -msgid "" -"The number of guilds to retrieve. If ``None``, it retrieves every guild " -"you have access to. Note, however, that this would make it a slow " -"operation. Defaults to ``100``." -msgstr "" -"取得するギルドの数。 ``None`` " -"の場合、あなたがアクセスできるギルドすべてを取得します。ただし、これには時間がかかります。デフォルトは100です。" - -#: discord.ext.commands.Bot.fetch_guilds:33 of -msgid "" -"Retrieves guilds before this date or object. If a date is provided it " -"must be a timezone-naive datetime representing UTC time." -msgstr "" -"この日付またはオブジェクトの前のGuildを取得します。もし日付が与えられた場合は、それはUTC時刻を表し、timezone " -"naiveであるdatetimeでないといけません。" - -#: discord.ext.commands.Bot.fetch_guilds:36 of -msgid "" -"Retrieve guilds after this date or object. If a date is provided it must " -"be a timezone-naive datetime representing UTC time." -msgstr "" -"この日付またはオブジェクトの後のGuildを取得します。もし日付が与えられた場合は、それはUTC時刻を表し、timezone " -"naiveであるdatetimeでないといけません。" - -#: discord.ext.commands.Bot.fetch_guilds:40 of -#, fuzzy -msgid "Getting the guilds failed." -msgstr ":exc:`.HTTPException` -- ギルドの取得に失敗した。" - -#: discord.ext.commands.Bot.fetch_guilds -#: discord.ext.commands.Bot.get_all_channels -#: discord.ext.commands.Bot.get_all_members -#: discord.ext.commands.Bot.walk_commands -#: discord.ext.commands.Cog.walk_commands discord.ext.commands.Context.history -#: discord.ext.commands.Group.walk_commands -#: discord.ext.commands.GroupMixin.walk_commands of -msgid "Yields" -msgstr "Yieldする値" - -#: discord.ext.commands.Bot.fetch_guilds:42 of -msgid ":class:`.Guild` -- The guild with the guild data parsed." -msgstr ":class:`.Guild` -- データを解析したGuild。" - -#: discord.ext.commands.Bot.fetch_invite:3 of -msgid "Gets an :class:`.Invite` from a discord.gg URL or ID." -msgstr "" - -#: discord.ext.commands.Bot.fetch_invite:7 of -msgid "" -"If the invite is for a guild you have not joined, the guild and channel " -"attributes of the returned :class:`.Invite` will be " -":class:`.PartialInviteGuild` and :class:`.PartialInviteChannel` " -"respectively." -msgstr "" - -#: discord.ext.commands.Bot.fetch_invite:11 of -msgid "The Discord invite ID or URL (must be a discord.gg URL)." -msgstr "" - -#: discord.ext.commands.Bot.fetch_invite:13 of -msgid "" -"Whether to include count information in the invite. This fills the " -":attr:`.Invite.approximate_member_count` and " -":attr:`.Invite.approximate_presence_count` fields." -msgstr "" - -#: discord.ext.commands.Bot.fetch_invite:18 of -msgid "The invite has expired or is invalid." -msgstr "" - -#: discord.ext.commands.Bot.fetch_invite:19 of -#, fuzzy -msgid "Getting the invite failed." -msgstr ":exc:`.HTTPException` -- 招待の取り消しに失敗した。" - -#: discord.ext.commands.Bot.fetch_invite:21 of -msgid "The invite from the URL/ID." -msgstr "" - -#: discord.ext.commands.Bot.fetch_invite:22 of -msgid ":class:`.Invite`" -msgstr "" - -#: discord.ext.commands.Bot.fetch_template:3 of -msgid "Gets a :class:`.Template` from a discord.new URL or code." -msgstr "" - -#: discord.ext.commands.Bot.fetch_template:5 of -msgid "The Discord Template Code or URL (must be a discord.new URL)." -msgstr "" - -#: discord.ext.commands.Bot.fetch_template:8 of -msgid "The template is invalid." -msgstr "" - -#: discord.ext.commands.Bot.fetch_template:9 of -msgid "Getting the template failed." -msgstr "" - -#: discord.ext.commands.Bot.fetch_template:11 of -#, fuzzy -msgid "The template from the URL/code." -msgstr "ギルドの名前。" - -#: discord.ext.commands.Bot.fetch_template:12 of -#, fuzzy -msgid ":class:`.Template`" -msgstr ":class:`.Guild`" - -#: discord.ext.commands.Bot.fetch_user:3 of -msgid "" -"Retrieves a :class:`~discord.User` based on their ID. This can only be " -"used by bot accounts. You do not have to share any guilds with the user " -"to get this information, however many operations do require that you do." -msgstr "" - -#: discord.ext.commands.Bot.fetch_user:10 of -msgid "" -"This method is an API call. For general usage, consider :meth:`get_user` " -"instead." -msgstr "" - -#: discord.ext.commands.Bot.fetch_user:12 of -msgid "The user's ID to fetch from." -msgstr "" - -#: discord.ext.commands.Bot.fetch_user:15 of -msgid "A user with this ID does not exist." -msgstr "" - -#: discord.ext.commands.Bot.fetch_user:16 of -msgid "Fetching the user failed." -msgstr "" - -#: discord.ext.commands.Bot.fetch_user:18 of -msgid "The user you requested." -msgstr "" - -#: discord.ext.commands.Bot.fetch_user:19 of -msgid ":class:`~discord.User`" -msgstr "" - -#: discord.ext.commands.Bot.fetch_user_profile:3 of -msgid "Gets an arbitrary user's profile." -msgstr "" - -#: discord.ext.commands.Bot.fetch_user_profile:7 of -msgid "This can only be used by non-bot accounts." -msgstr "" - -#: discord.ext.commands.Bot.fetch_user_profile:9 of -msgid "The ID of the user to fetch their profile for." -msgstr "" - -#: discord.ext.commands.Bot.fetch_user_profile:12 of -msgid "Not allowed to fetch profiles." -msgstr "" - -#: discord.ext.commands.Bot.fetch_user_profile:13 of -msgid "Fetching the profile failed." -msgstr "" - -#: discord.ext.commands.Bot.fetch_user_profile:15 of -msgid "The profile of the user." -msgstr "" - -#: discord.ext.commands.Bot.fetch_user_profile:16 of -msgid ":class:`.Profile`" -msgstr "" - -#: discord.ext.commands.Bot.fetch_webhook:3 of -msgid "Retrieves a :class:`.Webhook` with the specified ID." -msgstr "" - -#: discord.ext.commands.Bot.fetch_webhook:5 of -msgid "Retrieving the webhook failed." -msgstr "" - -#: discord.ext.commands.Bot.fetch_webhook:6 of -msgid "Invalid webhook ID." -msgstr "" - -#: discord.ext.commands.Bot.fetch_webhook:7 of -#, fuzzy -msgid "You do not have permission to fetch this webhook." -msgstr ":exc:`.Forbidden` -- 指定のチャンネルを取得する権限がない。" - -#: discord.ext.commands.Bot.fetch_webhook:9 of -msgid "The webhook you requested." -msgstr "" - -#: discord.ext.commands.Bot.fetch_webhook:10 of -msgid ":class:`.Webhook`" -msgstr "" - -#: discord.ext.commands.Bot.fetch_widget:3 of -msgid "Gets a :class:`.Widget` from a guild ID." -msgstr "" - -#: discord.ext.commands.Bot.fetch_widget:7 of -msgid "The guild must have the widget enabled to get this information." -msgstr "" - -#: discord.ext.commands.Bot.fetch_widget:9 of -msgid "The ID of the guild." -msgstr "" - -#: discord.ext.commands.Bot.fetch_widget:12 of -msgid "The widget for this guild is disabled." -msgstr "" - -#: discord.ext.commands.Bot.fetch_widget:13 of -msgid "Retrieving the widget failed." -msgstr "" - -#: discord.ext.commands.Bot.fetch_widget:15 of -msgid "The guild's widget." -msgstr "" - -#: discord.ext.commands.Bot.fetch_widget:16 of -msgid ":class:`.Widget`" -msgstr "" - -#: discord.ext.commands.Bot.get_all_channels:1 of -msgid "" -"A generator that retrieves every :class:`.abc.GuildChannel` the client " -"can 'access'." -msgstr "" - -#: discord.ext.commands.Bot.get_all_channels:3 -#: discord.ext.commands.Bot.get_all_members:3 of -msgid "This is equivalent to: ::" -msgstr "" - -#: discord.ext.commands.Bot.get_all_channels:11 of -msgid "" -"Just because you receive a :class:`.abc.GuildChannel` does not mean that " -"you can communicate in said channel. " -":meth:`.abc.GuildChannel.permissions_for` should be used for that." -msgstr "" - -#: discord.ext.commands.Bot.get_all_channels:15 of -msgid ":class:`.abc.GuildChannel` -- A channel the client can 'access'." -msgstr "" - -#: discord.ext.commands.Bot.get_all_members:1 of -msgid "Returns a generator with every :class:`.Member` the client can see." -msgstr "" - -#: discord.ext.commands.Bot.get_all_members:9 of -msgid ":class:`.Member` -- A member the client can see." -msgstr "" - -#: discord.ext.commands.Bot.get_channel:1 of -msgid "Returns a channel or thread with the given ID." -msgstr "" - -#: discord.ext.commands.Bot.get_channel:3 discord.ext.commands.Bot.get_emoji:3 -#: discord.ext.commands.Bot.get_guild:3 discord.ext.commands.Bot.get_user:3 of -#, fuzzy -msgid "The ID to search for." -msgstr "取得したいギルドのID。" - -#: discord.ext.commands.Bot.get_channel:6 of -msgid "The returned channel or ``None`` if not found." -msgstr "" - -#: discord.ext.commands.Bot.get_channel:7 of -#, fuzzy -msgid "Optional[Union[:class:`.abc.GuildChannel`, :class:`.Thread`, :class:`.abc.PrivateChannel`]]" -msgstr "Union[:class:`.abc.GuildChannel`, :class:`.Thread`, :class:`.abc.PrivateChannel`]" - -#: discord.ext.commands.Bot.get_cog:1 of -msgid "Gets the cog instance requested." -msgstr "" - -#: discord.ext.commands.Bot.get_cog:3 of -msgid "If the cog is not found, ``None`` is returned instead." -msgstr "" - -#: discord.ext.commands.Bot.get_cog:5 of -msgid "" -"The name of the cog you are requesting. This is equivalent to the name " -"passed via keyword argument in class creation or the class name if " -"unspecified." -msgstr "" - -#: discord.ext.commands.Bot.get_cog:10 of -msgid "The cog that was requested. If not found, returns ``None``." -msgstr "" - -#: discord.ext.commands.Bot.get_cog:11 discord.ext.commands.Command:62 -#: discord.ext.commands.HelpCommand.cog:10 of -msgid "Optional[:class:`Cog`]" -msgstr "" - -#: discord.ext.commands.Bot.get_command:1 -#: discord.ext.commands.Group.get_command:1 -#: discord.ext.commands.GroupMixin.get_command:1 of -#, fuzzy -msgid "Get a :class:`.Command` from the internal list of commands." -msgstr ":class:`.Command`やそのサブクラスを内部のコマンドリストに追加します。" - -#: discord.ext.commands.Bot.get_command:4 -#: discord.ext.commands.Group.get_command:4 -#: discord.ext.commands.GroupMixin.get_command:4 of -msgid "This could also be used as a way to get aliases." -msgstr "" - -#: discord.ext.commands.Bot.get_command:6 -#: discord.ext.commands.Group.get_command:6 -#: discord.ext.commands.GroupMixin.get_command:6 of -msgid "" -"The name could be fully qualified (e.g. ``'foo bar'``) will get the " -"subcommand ``bar`` of the group command ``foo``. If a subcommand is not " -"found then ``None`` is returned just as usual." -msgstr "" - -#: discord.ext.commands.Bot.get_command:10 -#: discord.ext.commands.Group.get_command:10 -#: discord.ext.commands.GroupMixin.get_command:10 of -msgid "The name of the command to get." -msgstr "" - -#: discord.ext.commands.Bot.get_command:13 -#: discord.ext.commands.Group.get_command:13 -#: discord.ext.commands.GroupMixin.get_command:13 of -msgid "The command that was requested. If not found, returns ``None``." -msgstr "" - -#: discord.ext.commands.Bot.get_command:14 discord.ext.commands.Command:56 -#: discord.ext.commands.Command:103 discord.ext.commands.Command.root_parent:7 -#: discord.ext.commands.Group.get_command:14 -#: discord.ext.commands.Group.root_parent:7 -#: discord.ext.commands.GroupMixin.get_command:14 of -msgid "Optional[:class:`Command`]" -msgstr "" - -#: discord.ext.commands.Bot.get_context:3 of -msgid "Returns the invocation context from the message." -msgstr "" - -#: discord.ext.commands.Bot.get_context:5 of -msgid "" -"This is a more low-level counter-part for :meth:`.process_commands` to " -"allow users more fine grained control over the processing." -msgstr "" - -#: discord.ext.commands.Bot.get_context:8 of -msgid "" -"The returned context is not guaranteed to be a valid invocation context, " -":attr:`.Context.valid` must be checked to make sure it is. If the context" -" is not valid then it is not a valid candidate to be invoked under " -":meth:`~.Bot.invoke`." -msgstr "" - -#: discord.ext.commands.Bot.get_context:13 of -msgid "The message to get the invocation context from." -msgstr "" - -#: discord.ext.commands.Bot.get_context:15 of -msgid "" -"The factory class that will be used to create the context. By default, " -"this is :class:`.Context`. Should a custom class be provided, it must be " -"similar enough to :class:`.Context`\\'s interface." -msgstr "" - -#: discord.ext.commands.Bot.get_context:20 of -msgid "" -"The invocation context. The type of this can change via the ``cls`` " -"parameter." -msgstr "" - -#: discord.ext.commands.Bot.get_context:22 of -msgid ":class:`.Context`" -msgstr "" - -#: discord.ext.commands.Bot.get_emoji:1 of -msgid "Returns an emoji with the given ID." -msgstr "" - -#: discord.ext.commands.Bot.get_emoji:6 of -msgid "The custom emoji or ``None`` if not found." -msgstr "" - -#: discord.ext.commands.Bot.get_emoji:7 of -msgid "Optional[:class:`.Emoji`]" -msgstr "" - -#: discord.ext.commands.Bot.get_guild:1 of -msgid "Returns a guild with the given ID." -msgstr "" - -#: discord.ext.commands.Bot.get_guild:6 of -msgid "The guild or ``None`` if not found." -msgstr "" - -#: discord.ext.commands.Bot.get_guild:7 discord.ext.commands.Context.guild:3 of -#, fuzzy -msgid "Optional[:class:`.Guild`]" -msgstr ":class:`.Guild`" - -#: discord.ext.commands.Bot.get_prefix:3 of -msgid "" -"Retrieves the prefix the bot is listening to with the message as a " -"context." -msgstr "" - -#: discord.ext.commands.Bot.get_prefix:6 of -msgid "The message context to get the prefix of." -msgstr "" - -#: discord.ext.commands.Bot.get_prefix:9 of -msgid "A list of prefixes or a single prefix that the bot is listening for." -msgstr "" - -#: discord.ext.commands.Bot.get_prefix:11 of -msgid "Union[List[:class:`str`], :class:`str`]" -msgstr "" - -#: discord.ext.commands.Bot.get_user:1 of -msgid "Returns a user with the given ID." -msgstr "" - -#: discord.ext.commands.Bot.get_user:6 of -msgid "The user or ``None`` if not found." -msgstr "" - -#: discord.ext.commands.Bot.get_user:7 of -msgid "Optional[:class:`~discord.User`]" -msgstr "" - -#: discord.ext.commands.Bot.group:1 discord.ext.commands.Group.group:1 -#: discord.ext.commands.GroupMixin.group:1 of -msgid "" -"A shortcut decorator that invokes :func:`.group` and adds it to the " -"internal command list via :meth:`~.GroupMixin.add_command`." -msgstr "" - -#: discord.ext.commands.Bot.group:4 discord.ext.commands.Group.group:4 -#: discord.ext.commands.GroupMixin.group:4 of -msgid "" -"A decorator that converts the provided method into a Group, adds it to " -"the bot, then returns it." -msgstr "" - -#: discord.ext.commands.Bot.group:5 discord.ext.commands.Group.group:5 -#: discord.ext.commands.GroupMixin.group:5 of -msgid "Callable[..., :class:`Group`]" -msgstr "" - -#: discord.ext.commands.Bot.guilds:1 of -msgid "The guilds that the connected client is a member of." -msgstr "" - -#: discord.ext.commands.Bot.guilds:3 of -#, fuzzy -msgid "List[:class:`.Guild`]" -msgstr ":class:`.Guild`" - -#: discord.ext.commands.Bot.intents:1 of -msgid "The intents configured for this connection." -msgstr "" - -#: discord.ext.commands.Bot.intents:5 of -#, fuzzy -msgid ":class:`Intents`" -msgstr ":class:`.Guild`" - -#: discord.ext.commands.Bot.invoke:3 of -msgid "" -"Invokes the command given under the invocation context and handles all " -"the internal event dispatch mechanisms." -msgstr "" - -#: discord.ext.commands.Bot.invoke:6 of -msgid "The invocation context to invoke." -msgstr "" - -#: discord.ext.commands.Bot.is_closed:1 of -msgid ":class:`bool`: Indicates if the websocket connection is closed." -msgstr "" - -#: discord.ext.commands.Bot.is_owner:3 of -msgid "" -"Checks if a :class:`~discord.User` or :class:`~discord.Member` is the " -"owner of this bot." -msgstr "" - -#: discord.ext.commands.Bot.is_owner:6 of -msgid "" -"If an :attr:`owner_id` is not set, it is fetched automatically through " -"the use of :meth:`~.Bot.application_info`." -msgstr "" - -#: discord.ext.commands.Bot.is_owner:9 of -msgid "" -"The function also checks if the application is team-owned if " -":attr:`owner_ids` is not set." -msgstr "" - -#: discord.ext.commands.Bot.is_owner:13 of -msgid "The user to check for." -msgstr "" - -#: discord.ext.commands.Bot.is_owner:16 of -msgid "Whether the user is the owner." -msgstr "" - -#: discord.ext.commands.Bot.is_ready:1 of -msgid ":class:`bool`: Specifies if the client's internal cache is ready for use." -msgstr "" - -#: discord.ext.commands.Bot.latency:1 of -msgid "Measures latency between a HEARTBEAT and a HEARTBEAT_ACK in seconds." -msgstr "" - -#: discord.ext.commands.Bot.latency:3 of -msgid "This could be referred to as the Discord WebSocket protocol latency." -msgstr "" - -#: discord.ext.commands.Bot.latency:5 -#: discord.ext.commands.Command.get_cooldown_retry_after:10 -#: discord.ext.commands.CommandOnCooldown:16 -#: discord.ext.commands.Group.get_cooldown_retry_after:10 of -#, fuzzy -msgid ":class:`float`" -msgstr ":class:`.AppInfo`" - -#: discord.ext.commands.Bot.listen:1 of -msgid "" -"A decorator that registers another function as an external event " -"listener. Basically this allows you to listen to multiple events from " -"different places e.g. such as :func:`.on_ready`" -msgstr "" - -#: discord.ext.commands.Bot.listen:5 of -msgid "The functions being listened to must be a :ref:`coroutine `." -msgstr "" - -#: discord.ext.commands.Bot.listen:21 of -msgid "Would print one and two in an unspecified order." -msgstr "" - -#: discord.ext.commands.Bot.listen:23 of -#, fuzzy -msgid "The function being listened to is not a coroutine." -msgstr ":exc:`TypeError` -- 渡された関数がコルーチンでない。" - -#: discord.ext.commands.Bot.load_extension:1 of -msgid "Loads an extension." -msgstr "" - -#: discord.ext.commands.Bot.load_extension:3 of -msgid "" -"An extension is a python module that contains commands, cogs, or " -"listeners." -msgstr "" - -#: discord.ext.commands.Bot.load_extension:6 of -msgid "" -"An extension must have a global function, ``setup`` defined as the entry " -"point on what to do when the extension is loaded. This entry point must " -"have a single argument, the ``bot``." -msgstr "" - -#: discord.ext.commands.Bot.load_extension:10 of -msgid "" -"The extension name to load. It must be dot separated like regular Python " -"imports if accessing a sub-module. e.g. ``foo.test`` if you want to " -"import ``foo/test.py``." -msgstr "" - -#: discord.ext.commands.Bot.load_extension:15 -#: discord.ext.commands.Bot.reload_extension:14 of -msgid "The extension could not be imported." -msgstr "" - -#: discord.ext.commands.Bot.load_extension:16 of -msgid "The extension is already loaded." -msgstr "" - -#: discord.ext.commands.Bot.load_extension:17 -#: discord.ext.commands.Bot.reload_extension:15 of -msgid "The extension does not have a setup function." -msgstr "" - -#: discord.ext.commands.Bot.load_extension:18 of -msgid "The extension or its setup function had an execution error." -msgstr "" - -#: discord.ext.commands.Bot.login:3 of -msgid "Logs in the client with the specified credentials." -msgstr "" - -#: discord.ext.commands.Bot.login:5 of -msgid "This function can be used in two different ways." -msgstr "" - -#: discord.ext.commands.Bot.login:9 of -msgid "" -"Logging on with a user token is against the Discord `Terms of Service " -"`_ and doing " -"so might potentially get your account banned. Use this at your own risk." -msgstr "" - -#: discord.ext.commands.Bot.login:14 of -msgid "" -"The authentication token. Do not prefix this token with anything as the " -"library will do it for you." -msgstr "" - -#: discord.ext.commands.Bot.login:17 of -msgid "" -"Keyword argument that specifies if the account logging on is a bot token " -"or not." -msgstr "" - -#: discord.ext.commands.Bot.login:21 of -msgid "The wrong credentials are passed." -msgstr "" - -#: discord.ext.commands.Bot.login:22 of -msgid "" -"An unknown HTTP related error occurred, usually when it isn't 200 or " -"the known incorrect credentials passing status code." -msgstr "" - -#: discord.ext.commands.Bot.logout:3 of -msgid "Logs out of Discord and closes all connections." -msgstr "" - -#: discord.ext.commands.Bot.logout:7 of -msgid "" -"This is just an alias to :meth:`close`. If you want to do extraneous " -"cleanup when subclassing, it is suggested to override :meth:`close` " -"instead." -msgstr "" - -#: discord.ext.commands.Bot.on_command_error:3 of -msgid "The default command error handler provided by the bot." -msgstr "" - -#: discord.ext.commands.Bot.on_command_error:5 of -msgid "" -"By default this prints to :data:`sys.stderr` however it could be " -"overridden to have a different implementation." -msgstr "" - -#: discord.ext.commands.Bot.on_command_error:8 of -msgid "This only fires if you do not specify any listeners for command error." -msgstr "" - -#: discord.ext.commands.Bot.on_error:3 of -msgid "The default error handler provided by the client." -msgstr "" - -#: discord.ext.commands.Bot.on_error:5 of -msgid "" -"By default this prints to :data:`sys.stderr` however it could be " -"overridden to have a different implementation. Check " -":func:`~discord.on_error` for more details." -msgstr "" - -#: discord.ext.commands.Bot.private_channels:1 of -msgid "The private channels that the connected client is participating on." -msgstr "" - -#: discord.ext.commands.Bot.private_channels:5 of -msgid "" -"This returns only up to 128 most recent private channels due to an " -"internal working on how Discord deals with private channels." -msgstr "" - -#: discord.ext.commands.Bot.private_channels:8 of -msgid "List[:class:`.abc.PrivateChannel`]" -msgstr "" - -#: discord.ext.commands.Bot.process_commands:3 of -msgid "" -"This function processes the commands that have been registered to the bot" -" and other groups. Without this coroutine, none of the commands will be " -"triggered." -msgstr "" - -#: discord.ext.commands.Bot.process_commands:7 of -msgid "" -"By default, this coroutine is called inside the :func:`.on_message` " -"event. If you choose to override the :func:`.on_message` event, then you " -"should invoke this coroutine as well." -msgstr "" - -#: discord.ext.commands.Bot.process_commands:11 of -msgid "" -"This is built using other low level tools, and is equivalent to a call to" -" :meth:`~.Bot.get_context` followed by a call to :meth:`~.Bot.invoke`." -msgstr "" - -#: discord.ext.commands.Bot.process_commands:14 of -msgid "" -"This also checks if the message's author is a bot and doesn't call " -":meth:`~.Bot.get_context` or :meth:`~.Bot.invoke` if so." -msgstr "" - -#: discord.ext.commands.Bot.process_commands:17 of -msgid "The message to process commands for." -msgstr "" - -#: discord.ext.commands.Bot.reload_extension:1 of -msgid "Atomically reloads an extension." -msgstr "" - -#: discord.ext.commands.Bot.reload_extension:3 of -msgid "" -"This replaces the extension with the same extension, only refreshed. This" -" is equivalent to a :meth:`unload_extension` followed by a " -":meth:`load_extension` except done in an atomic way. That is, if an " -"operation fails mid-reload then the bot will roll-back to the prior " -"working state." -msgstr "" - -#: discord.ext.commands.Bot.reload_extension:8 of -msgid "" -"The extension name to reload. It must be dot separated like regular " -"Python imports if accessing a sub-module. e.g. ``foo.test`` if you want " -"to import ``foo/test.py``." -msgstr "" - -#: discord.ext.commands.Bot.reload_extension:13 -#: discord.ext.commands.Bot.unload_extension:16 of -msgid "The extension was not loaded." -msgstr "" - -#: discord.ext.commands.Bot.reload_extension:16 of -msgid "The extension setup function had an execution error." -msgstr "" - -#: discord.ext.commands.Bot.remove_check:1 of -msgid "Removes a global check from the bot." -msgstr "" - -#: discord.ext.commands.Bot.remove_check:3 of -msgid "" -"This function is idempotent and will not raise an exception if the " -"function is not in the global checks." -msgstr "" - -#: discord.ext.commands.Bot.remove_check:6 of -msgid "The function to remove from the global checks." -msgstr "" - -#: discord.ext.commands.Bot.remove_check:7 of -msgid "" -"If the function was added with ``call_once=True`` in the " -":meth:`.Bot.add_check` call or using :meth:`.check_once`." -msgstr "" - -#: discord.ext.commands.Bot.remove_cog:1 of -msgid "Removes a cog from the bot." -msgstr "" - -#: discord.ext.commands.Bot.remove_cog:3 of -msgid "" -"All registered commands and event listeners that the cog has registered " -"will be removed as well." -msgstr "" - -#: discord.ext.commands.Bot.remove_cog:6 of -msgid "If no cog is found then this method has no effect." -msgstr "" - -#: discord.ext.commands.Bot.remove_cog:8 of -msgid "The name of the cog to remove." -msgstr "" - -#: discord.ext.commands.Bot.remove_command:1 -#: discord.ext.commands.Group.remove_command:1 -#: discord.ext.commands.GroupMixin.remove_command:1 of -#, fuzzy -msgid "Remove a :class:`.Command` from the internal list of commands." -msgstr ":class:`.Command`やそのサブクラスを内部のコマンドリストに追加します。" - -#: discord.ext.commands.Bot.remove_command:4 -#: discord.ext.commands.Group.remove_command:4 -#: discord.ext.commands.GroupMixin.remove_command:4 of -msgid "This could also be used as a way to remove aliases." -msgstr "" - -#: discord.ext.commands.Bot.remove_command:6 -#: discord.ext.commands.Group.remove_command:6 -#: discord.ext.commands.GroupMixin.remove_command:6 of -msgid "The name of the command to remove." -msgstr "" - -#: discord.ext.commands.Bot.remove_command:9 -#: discord.ext.commands.Group.remove_command:9 -#: discord.ext.commands.GroupMixin.remove_command:9 of -msgid "" -"The command that was removed. If the name is not valid then ``None`` is " -"returned instead." -msgstr "" - -#: discord.ext.commands.Bot.remove_command:11 -#: discord.ext.commands.Group.remove_command:11 -#: discord.ext.commands.GroupMixin.remove_command:11 of -msgid "Optional[:class:`.Command`]" -msgstr "" - -#: discord.ext.commands.Bot.remove_listener:1 of -msgid "Removes a listener from the pool of listeners." -msgstr "" - -#: discord.ext.commands.Bot.remove_listener:3 of -msgid "The function that was used as a listener to remove." -msgstr "" - -#: discord.ext.commands.Bot.remove_listener:4 of -msgid "The name of the event we want to remove. Defaults to ``func.__name__``." -msgstr "削除したいイベントの名前。デフォルトでは ``func.__name__`` です。" - -#: discord.ext.commands.Bot.request_offline_members:3 of -msgid "" -"Requests previously offline members from the guild to be filled up into " -"the :attr:`.Guild.members` cache. This function is usually not called. It" -" should only be used if you have the ``fetch_offline_members`` parameter " -"set to ``False``." -msgstr "" - -#: discord.ext.commands.Bot.request_offline_members:8 of -msgid "" -"When the client logs on and connects to the websocket, Discord does not " -"provide the library with offline members if the number of members in the " -"guild is larger than 250. You can check if a guild is large if " -":attr:`.Guild.large` is ``True``." -msgstr "" - -#: discord.ext.commands.Bot.request_offline_members:15 of -#, fuzzy -msgid "This method is deprecated. Use :meth:`Guild.chunk` instead." -msgstr "このメソッドはAPIを呼び出します。通常は :meth:`get_guild` を代わりとして使用してください。" - -#: discord.ext.commands.Bot.request_offline_members:17 of -msgid "An argument list of guilds to request offline members for." -msgstr "" - -#: discord.ext.commands.Bot.request_offline_members:20 of -msgid "If any guild is unavailable in the collection." -msgstr "" - -#: discord.ext.commands.Bot.run:1 of -msgid "" -"A blocking call that abstracts away the event loop initialisation from " -"you." -msgstr "" - -#: discord.ext.commands.Bot.run:4 of -msgid "" -"If you want more control over the event loop then this function should " -"not be used. Use :meth:`start` coroutine or :meth:`connect` + " -":meth:`login`." -msgstr "" - -#: discord.ext.commands.Bot.run:8 of -msgid "Roughly Equivalent to: ::" -msgstr "" - -#: discord.ext.commands.Bot.run:20 of -msgid "" -"This function must be the last function to call due to the fact that it " -"is blocking. That means that registration of events or anything being " -"called after this function call will not execute until it returns." -msgstr "" - -#: discord.ext.commands.Bot.start:3 of -msgid "A shorthand coroutine for :meth:`login` + :meth:`connect`." -msgstr "" - -#: discord.ext.commands.Bot.start:5 of -msgid "An unexpected keyword argument was received." -msgstr "" - -#: discord.ext.commands.Bot.unload_extension:1 of -msgid "Unloads an extension." -msgstr "" - -#: discord.ext.commands.Bot.unload_extension:3 of -msgid "" -"When the extension is unloaded, all commands, listeners, and cogs are " -"removed from the bot and the module is un-imported." -msgstr "" - -#: discord.ext.commands.Bot.unload_extension:6 of -msgid "" -"The extension can provide an optional global function, ``teardown``, to " -"do miscellaneous clean-up if necessary. This function takes a single " -"parameter, the ``bot``, similar to ``setup`` from " -":meth:`~.Bot.load_extension`." -msgstr "" - -#: discord.ext.commands.Bot.unload_extension:11 of -msgid "" -"The extension name to unload. It must be dot separated like regular " -"Python imports if accessing a sub-module. e.g. ``foo.test`` if you want " -"to import ``foo/test.py``." -msgstr "" - -#: discord.ext.commands.Bot.user:1 of -msgid "Represents the connected client. ``None`` if not logged in." -msgstr "" - -#: discord.ext.commands.Bot.user:3 of -msgid "Optional[:class:`.ClientUser`]" -msgstr "" - -#: discord.ext.commands.Bot.users:1 of -msgid "Returns a list of all the users the bot can see." -msgstr "" - -#: discord.ext.commands.Bot.users:3 of -msgid "List[:class:`~discord.User`]" -msgstr "" - -#: discord.ext.commands.Bot.voice_clients:1 of -msgid "Represents a list of voice connections." -msgstr "" - -#: discord.ext.commands.Bot.voice_clients:3 of -msgid "These are usually :class:`.VoiceClient` instances." -msgstr "" - -#: discord.ext.commands.Bot.voice_clients:5 of -msgid "List[:class:`.VoiceProtocol`]" -msgstr "" - -#: discord.ext.commands.Bot.wait_for:3 of -msgid "Waits for a WebSocket event to be dispatched." -msgstr "" - -#: discord.ext.commands.Bot.wait_for:5 of -msgid "" -"This could be used to wait for a user to reply to a message, or to react " -"to a message, or to edit a message in a self-contained way." -msgstr "" - -#: discord.ext.commands.Bot.wait_for:9 of -msgid "" -"The ``timeout`` parameter is passed onto :func:`asyncio.wait_for`. By " -"default, it does not timeout. Note that this does propagate the " -":exc:`asyncio.TimeoutError` for you in case of timeout and is provided " -"for ease of use." -msgstr "" - -#: discord.ext.commands.Bot.wait_for:14 of -msgid "" -"In case the event returns multiple arguments, a :class:`tuple` containing" -" those arguments is returned instead. Please check the " -":ref:`documentation ` for a list of events and their " -"parameters." -msgstr "" - -#: discord.ext.commands.Bot.wait_for:19 of -msgid "This function returns the **first event that meets the requirements**." -msgstr "" - -#: discord.ext.commands.Bot.wait_for:23 of -msgid "Waiting for a user reply: ::" -msgstr "" - -#: discord.ext.commands.Bot.wait_for:37 of -msgid "Waiting for a thumbs up reaction from the message author: ::" -msgstr "" - -#: discord.ext.commands.Bot.wait_for:55 of -msgid "" -"The event name, similar to the :ref:`event reference `, but without the ``on_`` prefix, to wait for." -msgstr "" - -#: discord.ext.commands.Bot.wait_for:58 of -msgid "" -"A predicate to check what to wait for. The arguments must meet the " -"parameters of the event being waited for." -msgstr "" - -#: discord.ext.commands.Bot.wait_for:61 of -msgid "" -"The number of seconds to wait before timing out and raising " -":exc:`asyncio.TimeoutError`." -msgstr "" - -#: discord.ext.commands.Bot.wait_for:65 of -msgid "If a timeout is provided and it was reached." -msgstr "" - -#: discord.ext.commands.Bot.wait_for:67 of -msgid "" -"Returns no arguments, a single argument, or a :class:`tuple` of multiple " -"arguments that mirrors the parameters passed in the :ref:`event reference" -" `." -msgstr "" - -#: discord.ext.commands.Bot.wait_until_ready:3 of -msgid "Waits until the client's internal cache is all ready." -msgstr "" - -#: discord.ext.commands.Bot.walk_commands:1 -#: discord.ext.commands.Group.walk_commands:1 -#: discord.ext.commands.GroupMixin.walk_commands:1 of -msgid "An iterator that recursively walks through all commands and subcommands." -msgstr "" - -#: discord.ext.commands.Bot.walk_commands:3 -#: discord.ext.commands.Group.walk_commands:3 -#: discord.ext.commands.GroupMixin.walk_commands:3 of -msgid "Duplicates due to aliases are no longer returned" -msgstr "" - -#: discord.ext.commands.Bot.walk_commands:6 -#: discord.ext.commands.Group.walk_commands:6 -#: discord.ext.commands.GroupMixin.walk_commands:6 of -#, fuzzy -msgid "" -"Union[:class:`.Command`, :class:`.Group`] -- A command or group from the " -"internal list of commands." -msgstr ":class:`.Command`やそのサブクラスを内部のコマンドリストに追加します。" - -#: discord.ext.commands.AutoShardedBot:1 of -msgid "" -"This is similar to :class:`.Bot` except that it is inherited from " -":class:`discord.AutoShardedClient` instead." -msgstr "" - -#: discord.ext.commands.when_mentioned:1 of -msgid "A callable that implements a command prefix equivalent to being mentioned." -msgstr "" - -#: discord.ext.commands.when_mentioned:3 -#: discord.ext.commands.when_mentioned_or:3 of -msgid "" -"These are meant to be passed into the :attr:`.Bot.command_prefix` " -"attribute." -msgstr "" - -#: discord.ext.commands.when_mentioned_or:1 of -msgid "A callable that implements when mentioned or other prefixes provided." -msgstr "" - -#: discord.ext.commands.when_mentioned_or:13 of -msgid "" -"This callable returns another callable, so if this is done inside a " -"custom callable, you must call the returned callable, for example:" -msgstr "" - -#: discord.ext.commands.when_mentioned_or:23 of -msgid ":func:`.when_mentioned`" -msgstr "" - -#: ../../ext/commands/api.rst:27 -msgid "Event Reference" -msgstr "イベントリファレンス" - -#: ../../ext/commands/api.rst:29 -msgid "" -"These events function similar to :ref:`the regular events `, except they are custom to the command extension module." -msgstr "" - -#: ../../ext/commands/api.rst:34 -msgid "" -"An error handler that is called when an error is raised inside a command " -"either through user input error, check failure, or an error in your own " -"code." -msgstr "" - -#: ../../ext/commands/api.rst:38 -msgid "A default one is provided (:meth:`.Bot.on_command_error`)." -msgstr "" - -#: ../../ext/commands/api.rst:40 ../../ext/commands/api.rst:52 -#: ../../ext/commands/api.rst:62 discord.ext.commands.Cog.cog_after_invoke:7 -#: discord.ext.commands.Cog.cog_before_invoke:7 -#: discord.ext.commands.HelpCommand.on_help_command_error:11 -#: discord.ext.commands.HelpCommand.prepare_help_command:15 of -msgid "The invocation context." -msgstr "" - -#: ../../ext/commands/api.rst:42 -#: discord.ext.commands.HelpCommand.on_help_command_error:13 of -msgid "The error that was raised." -msgstr "" - -#: ../../ext/commands/api.rst:47 -msgid "" -"An event that is called when a command is found and is about to be " -"invoked." -msgstr "" - -#: ../../ext/commands/api.rst:49 -msgid "" -"This event is called regardless of whether the command itself succeeds " -"via error or completes." -msgstr "" - -#: ../../ext/commands/api.rst:57 -msgid "An event that is called when a command has completed its invocation." -msgstr "" - -#: ../../ext/commands/api.rst:59 -msgid "" -"This event is called only if the command succeeded, i.e. all checks have " -"passed and the user input it correctly." -msgstr "" - -#: ../../ext/commands/api.rst:68 -msgid "Command" -msgstr "Command" - -#: discord.ext.commands.command:1 of -msgid "" -"A decorator that transforms a function into a :class:`.Command` or if " -"called with :func:`.group`, :class:`.Group`." -msgstr "" - -#: discord.ext.commands.command:4 of -msgid "" -"By default the ``help`` attribute is received automatically from the " -"docstring of the function and is cleaned up with the use of " -"``inspect.cleandoc``. If the docstring is ``bytes``, then it is decoded " -"into :class:`str` using utf-8 encoding." -msgstr "" - -#: discord.ext.commands.command:9 of -msgid "" -"All checks added using the :func:`.check` & co. decorators are added into" -" the function. There is no way to supply your own checks through this " -"decorator." -msgstr "" - -#: discord.ext.commands.command:13 of -msgid "" -"The name to create the command with. By default this uses the function " -"name unchanged." -msgstr "" - -#: discord.ext.commands.command:16 of -msgid "" -"The class to construct with. By default this is :class:`.Command`. You " -"usually do not change this." -msgstr "" - -#: discord.ext.commands.command:18 of -msgid "" -"Keyword arguments to pass into the construction of the class denoted by " -"``cls``." -msgstr "" - -#: discord.ext.commands.command:21 of -msgid "If the function is not a coroutine or is already a command." -msgstr "" - -#: discord.ext.commands.group:1 of -msgid "A decorator that transforms a function into a :class:`.Group`." -msgstr "" - -#: discord.ext.commands.group:3 of -msgid "" -"This is similar to the :func:`.command` decorator but the ``cls`` " -"parameter is set to :class:`Group` by default." -msgstr "" - -#: discord.ext.commands.group:6 of -msgid "The ``cls`` parameter can now be passed." -msgstr "" - -#: discord.ext.commands.Command:1 of -msgid "A class that implements the protocol for a bot text command." -msgstr "" - -#: discord.ext.commands.Command:3 of -msgid "" -"These are not created manually, instead they are created via the " -"decorator or functional interface." -msgstr "" - -#: discord.ext.commands.Command:8 of -#, fuzzy -msgid "The name of the command." -msgstr "ギルドの名前。" - -#: discord.ext.commands.Command:14 of -#, fuzzy -msgid "The coroutine that is executed when the command is called." -msgstr "呼び出そうとしたコマンドが無効化されていた際に発生する例外。" - -#: discord.ext.commands.Command:16 of -msgid ":ref:`coroutine `" -msgstr "" - -#: discord.ext.commands.Command:20 of -msgid "The long help text for the command." -msgstr "" - -#: discord.ext.commands.Command:26 of -msgid "The short help text for the command." -msgstr "" - -#: discord.ext.commands.Command:28 discord.ext.commands.Command.cog_name:3 -#: discord.ext.commands.Context:70 discord.ext.commands.Group.cog_name:3 of -msgid "Optional[:class:`str`]" -msgstr "" - -#: discord.ext.commands.Command:32 of -msgid "A replacement for arguments in the default help text." -msgstr "" - -#: discord.ext.commands.Command:38 of -msgid "The list of aliases the command can be invoked under." -msgstr "" - -#: discord.ext.commands.Command:40 of -msgid "Union[List[:class:`str`], Tuple[:class:`str`]]" -msgstr "" - -#: discord.ext.commands.Command:44 of -msgid "" -"A boolean that indicates if the command is currently enabled. If the " -"command is invoked while it is disabled, then :exc:`.DisabledCommand` is " -"raised to the :func:`.on_command_error` event. Defaults to ``True``." -msgstr "" - -#: discord.ext.commands.Command:53 of -msgid "" -"The parent command that this command belongs to. ``None`` if there isn't " -"one." -msgstr "" - -#: discord.ext.commands.Command:60 of -msgid "The cog that this command belongs to. ``None`` if there isn't one." -msgstr "" - -#: discord.ext.commands.Command:66 of -msgid "" -"A list of predicates that verifies if the command could be executed with " -"the given :class:`.Context` as the sole parameter. If an exception is " -"necessary to be thrown to signal failure, then one inherited from " -":exc:`.CommandError` should be used. Note that if the checks fail then " -":exc:`.CheckFailure` exception is raised to the :func:`.on_command_error`" -" event." -msgstr "" - -#: discord.ext.commands.Command:73 of -msgid "List[Callable[..., :class:`bool`]]" -msgstr "" - -#: discord.ext.commands.Command:77 of -#, fuzzy -msgid "The message prefixed into the default help command." -msgstr ":class:`str` -- この属性に入力されたテキストは、デフォルトのヘルプメッセージの先頭に表示されます。" - -#: discord.ext.commands.Command:83 of -msgid "" -"If ``True``\\, the default help command does not show this in the help " -"output." -msgstr "" - -#: discord.ext.commands.Command:90 of -msgid "" -"If ``False`` and a keyword-only argument is provided then the keyword " -"only argument is stripped and handled as if it was a regular argument " -"that handles :exc:`.MissingRequiredArgument` and default values in a " -"regular matter rather than passing the rest completely raw. If ``True`` " -"then the keyword-only argument will pass in the rest of the arguments in " -"a completely raw matter. Defaults to ``False``." -msgstr "" - -#: discord.ext.commands.Command:101 of -msgid "The subcommand that was invoked, if any." -msgstr "" - -#: discord.ext.commands.Command:107 of -msgid "" -"If ``True`` and a variadic positional argument is specified, requires the" -" user to specify at least one argument. Defaults to ``False``." -msgstr "" - -#: discord.ext.commands.Command:116 of -msgid "" -"If ``True``\\, ignores extraneous strings passed to a command if all its " -"requirements are met (e.g. ``?foo a b c`` when only expecting ``a`` and " -"``b``). Otherwise :func:`.on_command_error` and local error handlers are " -"called with :exc:`.TooManyArguments`. Defaults to ``True``." -msgstr "" - -#: discord.ext.commands.Command:125 of -msgid "" -"If ``True``\\, cooldown processing is done after argument parsing, which " -"calls converters. If ``False`` then cooldown processing is done first and" -" then the converters are called second. Defaults to ``False``." -msgstr "" - -#: discord.ext.commands.Command.add_check:1 -#: discord.ext.commands.Group.add_check:1 of -#, fuzzy -msgid "Adds a check to the command." -msgstr "ボットにグローバルチェックを追加します。" - -#: discord.ext.commands.Command.add_check:3 -#: discord.ext.commands.Group.add_check:3 of -#, fuzzy -msgid "This is the non-decorator interface to :func:`.check`." -msgstr "これは:meth:`.check`と:meth:`.check_once`のデコレータでない実装です。" - -#: discord.ext.commands.Command.add_check:7 -#: discord.ext.commands.Group.add_check:7 -#: discord.ext.commands.HelpCommand.add_check:5 of -#, fuzzy -msgid "The function that will be used as a check." -msgstr "グローバルチェックとして使用される関数。" - -#: discord.ext.commands.Command.remove_check:1 -#: discord.ext.commands.Group.remove_check:1 of -msgid "Removes a check from the command." -msgstr "" - -#: discord.ext.commands.Command.remove_check:3 -#: discord.ext.commands.Group.remove_check:3 -#: discord.ext.commands.HelpCommand.remove_check:3 of -msgid "" -"This function is idempotent and will not raise an exception if the " -"function is not in the command's checks." -msgstr "" - -#: discord.ext.commands.Command.remove_check:8 -#: discord.ext.commands.Group.remove_check:8 -#: discord.ext.commands.HelpCommand.remove_check:8 of -msgid "The function to remove from the checks." -msgstr "" - -#: discord.ext.commands.Command.update:1 discord.ext.commands.Group.update:1 of -msgid "Updates :class:`Command` instance with updated attributes." -msgstr "" - -#: discord.ext.commands.Command.update:3 discord.ext.commands.Group.update:3 of -msgid "" -"This works similarly to the :func:`.command` decorator in terms of " -"parameters in that they are passed to the :class:`Command` or subclass " -"constructors, sans the name and callback." -msgstr "" - -#: discord.ext.commands.Command.__call__:3 of -msgid "Calls the internal callback that the command holds." -msgstr "" - -#: discord.ext.commands.Command.__call__:7 of -msgid "" -"This bypasses all mechanisms -- including checks, converters, invoke " -"hooks, cooldowns, etc. You must take care to pass the proper arguments " -"and types to this function." -msgstr "" - -#: discord.ext.commands.Command.copy:1 of -msgid "Creates a copy of this command." -msgstr "" - -#: discord.ext.commands.Command.copy:3 of -msgid "A new instance of this command." -msgstr "" - -#: discord.ext.commands.Command.copy:4 discord.ext.commands.Context:47 -#: discord.ext.commands.Context:61 of -#, fuzzy -msgid ":class:`Command`" -msgstr ":class:`Command` またはサブクラス" - -#: discord.ext.commands.Command.clean_params:1 -#: discord.ext.commands.Group.clean_params:1 of -msgid "" -"OrderedDict[:class:`str`, :class:`inspect.Parameter`]: Retrieves the " -"parameter OrderedDict without the context or self parameters." -msgstr "" - -#: discord.ext.commands.Command.clean_params:4 -#: discord.ext.commands.Group.clean_params:4 of -msgid "Useful for inspecting signature." -msgstr "" - -#: discord.ext.commands.Command.full_parent_name:1 -#: discord.ext.commands.Group.full_parent_name:1 of -msgid "Retrieves the fully qualified parent command name." -msgstr "" - -#: discord.ext.commands.Command.full_parent_name:3 -#: discord.ext.commands.Group.full_parent_name:3 of -msgid "" -"This the base command name required to execute it. For example, in ``?one" -" two three`` the parent name would be ``one two``." -msgstr "" - -#: discord.ext.commands.Command.parents:1 discord.ext.commands.Group.parents:1 -#: of -msgid "Retrieves the parents of this command." -msgstr "" - -#: discord.ext.commands.Command.parents:3 discord.ext.commands.Group.parents:3 -#: of -msgid "If the command has no parents then it returns an empty :class:`list`." -msgstr "" - -#: discord.ext.commands.Command.parents:5 discord.ext.commands.Group.parents:5 -#: of -msgid "For example in commands ``?a b c test``, the parents are ``[c, b, a]``." -msgstr "" - -#: discord.ext.commands.Command.parents:9 discord.ext.commands.Group.parents:9 -#: discord.ext.commands.HelpCommand.filter_commands:18 of -msgid "List[:class:`Command`]" -msgstr "" - -#: discord.ext.commands.Command.root_parent:1 -#: discord.ext.commands.Group.root_parent:1 of -msgid "Retrieves the root parent of this command." -msgstr "" - -#: discord.ext.commands.Command.root_parent:3 -#: discord.ext.commands.Group.root_parent:3 of -msgid "If the command has no parents then it returns ``None``." -msgstr "" - -#: discord.ext.commands.Command.root_parent:5 -#: discord.ext.commands.Group.root_parent:5 of -msgid "For example in commands ``?a b c test``, the root parent is ``a``." -msgstr "" - -#: discord.ext.commands.Command.qualified_name:1 -#: discord.ext.commands.Group.qualified_name:1 of -msgid "Retrieves the fully qualified command name." -msgstr "" - -#: discord.ext.commands.Command.qualified_name:3 -#: discord.ext.commands.Group.qualified_name:3 of -msgid "" -"This is the full parent name with the command name as well. For example, " -"in ``?one two three`` the qualified name would be ``one two three``." -msgstr "" - -#: discord.ext.commands.Command.is_on_cooldown:1 -#: discord.ext.commands.Group.is_on_cooldown:1 of -msgid "Checks whether the command is currently on cooldown." -msgstr "" - -#: discord.ext.commands.Command.is_on_cooldown:3 -#: discord.ext.commands.Group.is_on_cooldown:3 of -msgid "The invocation context to use when checking the commands cooldown status." -msgstr "" - -#: discord.ext.commands.Command.is_on_cooldown:6 -#: discord.ext.commands.Group.is_on_cooldown:6 of -msgid "A boolean indicating if the command is on cooldown." -msgstr "" - -#: discord.ext.commands.Command.reset_cooldown:1 -#: discord.ext.commands.Group.reset_cooldown:1 of -msgid "Resets the cooldown on this command." -msgstr "" - -#: discord.ext.commands.Command.reset_cooldown:3 -#: discord.ext.commands.Group.reset_cooldown:3 of -msgid "The invocation context to reset the cooldown under." -msgstr "" - -#: discord.ext.commands.Command.get_cooldown_retry_after:1 -#: discord.ext.commands.Group.get_cooldown_retry_after:1 of -msgid "Retrieves the amount of seconds before this command can be tried again." -msgstr "" - -#: discord.ext.commands.Command.get_cooldown_retry_after:5 -#: discord.ext.commands.Group.get_cooldown_retry_after:5 of -msgid "The invocation context to retrieve the cooldown from." -msgstr "" - -#: discord.ext.commands.Command.get_cooldown_retry_after:8 -#: discord.ext.commands.Group.get_cooldown_retry_after:8 of -msgid "" -"The amount of time left on this command's cooldown in seconds. If this is" -" ``0.0`` then the command isn't on cooldown." -msgstr "" - -#: discord.ext.commands.Command.error:1 discord.ext.commands.Group.error:1 of -msgid "A decorator that registers a coroutine as a local error handler." -msgstr "" - -#: discord.ext.commands.Command.error:3 discord.ext.commands.Group.error:3 of -msgid "" -"A local error handler is an :func:`.on_command_error` event limited to a " -"single command. However, the :func:`.on_command_error` is still invoked " -"afterwards as the catch-all." -msgstr "" - -#: discord.ext.commands.Command.error:7 discord.ext.commands.Group.error:7 of -msgid "The coroutine to register as the local error handler." -msgstr "" - -#: discord.ext.commands.Command.before_invoke:9 -#: discord.ext.commands.Group.before_invoke:9 of -msgid "See :meth:`.Bot.before_invoke` for more info." -msgstr "" - -#: discord.ext.commands.Command.after_invoke:9 -#: discord.ext.commands.Group.after_invoke:9 of -msgid "See :meth:`.Bot.after_invoke` for more info." -msgstr "" - -#: discord.ext.commands.Command.cog_name:1 -#: discord.ext.commands.Group.cog_name:1 of -msgid "The name of the cog this command belongs to, if any." -msgstr "" - -#: discord.ext.commands.Command.short_doc:1 -#: discord.ext.commands.Group.short_doc:1 of -msgid "Gets the \"short\" documentation of a command." -msgstr "" - -#: discord.ext.commands.Command.short_doc:3 -#: discord.ext.commands.Group.short_doc:3 of -msgid "" -"By default, this is the :attr:`brief` attribute. If that lookup leads to " -"an empty string then the first line of the :attr:`help` attribute is used" -" instead." -msgstr "" - -#: discord.ext.commands.Command.signature:1 -#: discord.ext.commands.Group.signature:1 of -msgid "Returns a POSIX-like signature useful for help command output." -msgstr "" - -#: discord.ext.commands.Command.can_run:3 discord.ext.commands.Group.can_run:3 -#: of -msgid "" -"Checks if the command can be executed by checking all the predicates " -"inside the :attr:`checks` attribute. This also checks whether the command" -" is disabled." -msgstr "" - -#: discord.ext.commands.Command.can_run:7 discord.ext.commands.Group.can_run:7 -#: of -msgid "Checks whether the command is disabled or not" -msgstr "" - -#: discord.ext.commands.Command.can_run:10 -#: discord.ext.commands.Group.can_run:10 of -msgid "The ctx of the command currently being invoked." -msgstr "" - -#: discord.ext.commands.Command.can_run:13 -#: discord.ext.commands.Group.can_run:13 of -msgid "" -"Any command error that was raised during a check call will be propagated" -" by this function." -msgstr "" - -#: discord.ext.commands.Command.can_run:15 -#: discord.ext.commands.Group.can_run:15 of -msgid "A boolean indicating if the command can be invoked." -msgstr "" - -#: discord.ext.commands.Group:1 of -msgid "" -"A class that implements a grouping protocol for commands to be executed " -"as subcommands." -msgstr "" - -#: discord.ext.commands.Group:4 of -msgid "" -"This class is a subclass of :class:`.Command` and thus all options valid " -"in :class:`.Command` are valid in here as well." -msgstr "" - -#: discord.ext.commands.Group:9 of -msgid "" -"Indicates if the group callback should begin parsing and invocation only " -"if no subcommand was found. Useful for making it an error handling " -"function to tell the user that no subcommand was found or to have " -"different functionality in case no subcommand was found. If this is " -"``False``, then the group callback will always be invoked first. This " -"means that the checks and the parsing dictated by its parameters will be " -"executed. Defaults to ``False``." -msgstr "" - -#: discord.ext.commands.Group:22 of -msgid "" -"Indicates if the group's commands should be case insensitive. Defaults to" -" ``False``." -msgstr "" - -#: discord.ext.commands.Group.copy:1 of -msgid "Creates a copy of this :class:`Group`." -msgstr "" - -#: discord.ext.commands.Group.copy:3 of -msgid "A new instance of this group." -msgstr "" - -#: discord.ext.commands.Group.copy:4 of -#, fuzzy -msgid ":class:`Group`" -msgstr ":class:`.Guild`" - -#: discord.ext.commands.GroupMixin:1 of -msgid "" -"A mixin that implements common functionality for classes that behave " -"similar to :class:`.Group` and are allowed to register commands." -msgstr "" - -#: discord.ext.commands.GroupMixin:6 of -msgid "A mapping of command name to :class:`.Command` objects." -msgstr "" - -#: discord.ext.commands.CogMeta:57 discord.ext.commands.Context:35 -#: discord.ext.commands.GroupMixin:9 discord.ext.commands.HelpCommand:40 of -#, fuzzy -msgid ":class:`dict`" -msgstr ":class:`.Guild`" - -#: discord.ext.commands.GroupMixin:13 of -msgid "Whether the commands should be case insensitive. Defaults to ``False``." -msgstr "" - -#: ../../ext/commands/api.rst:88 -msgid "Cogs" -msgstr "Cogs" - -#: discord.ext.commands.Cog:1 of -msgid "The base class that all cogs must inherit from." -msgstr "" - -#: discord.ext.commands.Cog:3 of -msgid "" -"A cog is a collection of commands, listeners, and optional state to help " -"group commands together. More information on them can be found on the " -":ref:`ext_commands_cogs` page." -msgstr "" - -#: discord.ext.commands.Cog:7 of -msgid "" -"When inheriting from this class, the options shown in :class:`CogMeta` " -"are equally valid here." -msgstr "" - -#: discord.ext.commands.Cog.get_commands:1 of -msgid "" -"A :class:`list` of :class:`.Command`\\s that are defined inside this cog." -" .. note:: This does not include subcommands." -msgstr "" - -#: discord.ext.commands.Cog.get_commands:1 of -msgid "A :class:`list` of :class:`.Command`\\s that are defined inside this cog." -msgstr "" - -#: discord.ext.commands.Cog.get_commands:6 of -msgid "This does not include subcommands." -msgstr "" - -#: discord.ext.commands.Cog.get_commands:7 of -msgid "List[:class:`.Command`]" -msgstr "" - -#: discord.ext.commands.Cog.qualified_name:1 of -msgid "Returns the cog's specified name, not the class name." -msgstr "" - -#: discord.ext.commands.Cog.description:1 of -msgid "Returns the cog's description, typically the cleaned docstring." -msgstr "" - -#: discord.ext.commands.Cog.walk_commands:1 of -msgid "" -"An iterator that recursively walks through this cog's commands and " -"subcommands." -msgstr "" - -#: discord.ext.commands.Cog.walk_commands:3 of -msgid "" -"Union[:class:`.Command`, :class:`.Group`] -- A command or group from the " -"cog." -msgstr "" - -#: discord.ext.commands.Cog.get_listeners:1 of -msgid "" -"Returns a :class:`list` of (name, function) listener pairs that are " -"defined in this cog." -msgstr "" - -#: discord.ext.commands.Cog.get_listeners:3 of -msgid "The listeners defined in this cog." -msgstr "" - -#: discord.ext.commands.Cog.get_listeners:4 of -msgid "List[Tuple[:class:`str`, :ref:`coroutine `]]" -msgstr "" - -#: discord.ext.commands.Cog.listener:1 of -msgid "A decorator that marks a function as a listener." -msgstr "" - -#: discord.ext.commands.Cog.listener:3 of -msgid "This is the cog equivalent of :meth:`.Bot.listen`." -msgstr "" - -#: discord.ext.commands.Cog.listener:5 of -msgid "" -"The name of the event being listened to. If not provided, it defaults to " -"the function's name." -msgstr "" - -#: discord.ext.commands.Cog.listener:9 of -msgid "" -"The function is not a coroutine function or a string was not passed as" -" the name." -msgstr "" - -#: discord.ext.commands.Cog.cog_unload:1 of -msgid "A special method that is called when the cog gets removed." -msgstr "" - -#: discord.ext.commands.Cog.cog_unload:3 of -msgid "This function **cannot** be a coroutine. It must be a regular function." -msgstr "" - -#: discord.ext.commands.Cog.cog_unload:6 of -msgid "Subclasses must replace this if they want special unloading behaviour." -msgstr "" - -#: discord.ext.commands.Cog.bot_check_once:1 of -msgid "A special method that registers as a :meth:`.Bot.check_once` check." -msgstr "" - -#: discord.ext.commands.Cog.bot_check:4 -#: discord.ext.commands.Cog.bot_check_once:4 -#: discord.ext.commands.Cog.cog_check:4 of -msgid "" -"This function **can** be a coroutine and must take a sole parameter, " -"``ctx``, to represent the :class:`.Context`." -msgstr "" - -#: discord.ext.commands.Cog.bot_check:1 of -msgid "A special method that registers as a :meth:`.Bot.check` check." -msgstr "" - -#: discord.ext.commands.Cog.cog_check:1 of -msgid "" -"A special method that registers as a :func:`commands.check` for every " -"command and subcommand in this cog." -msgstr "" - -#: discord.ext.commands.Cog.cog_command_error:1 of -msgid "" -"A special method that is called whenever an error is dispatched inside " -"this cog." -msgstr "" - -#: discord.ext.commands.Cog.cog_command_error:4 of -msgid "" -"This is similar to :func:`.on_command_error` except only applying to the " -"commands inside this cog." -msgstr "" - -#: discord.ext.commands.Cog.cog_after_invoke:5 -#: discord.ext.commands.Cog.cog_before_invoke:5 -#: discord.ext.commands.Cog.cog_command_error:7 of -msgid "This **must** be a coroutine." -msgstr "" - -#: discord.ext.commands.Cog.cog_command_error:9 of -msgid "The invocation context where the error happened." -msgstr "" - -#: discord.ext.commands.Cog.cog_command_error:11 of -msgid "The error that happened." -msgstr "" - -#: discord.ext.commands.Cog.cog_before_invoke:1 of -msgid "A special method that acts as a cog local pre-invoke hook." -msgstr "" - -#: discord.ext.commands.Cog.cog_before_invoke:3 of -msgid "This is similar to :meth:`.Command.before_invoke`." -msgstr "" - -#: discord.ext.commands.Cog.cog_after_invoke:1 of -msgid "A special method that acts as a cog local post-invoke hook." -msgstr "" - -#: discord.ext.commands.Cog.cog_after_invoke:3 of -msgid "This is similar to :meth:`.Command.after_invoke`." -msgstr "" - -#: discord.ext.commands.CogMeta:1 of -msgid "A metaclass for defining a cog." -msgstr "" - -#: discord.ext.commands.CogMeta:3 of -msgid "" -"Note that you should probably not use this directly. It is exposed purely" -" for documentation purposes along with making custom metaclasses to " -"intermix with other metaclasses such as the :class:`abc.ABCMeta` " -"metaclass." -msgstr "" - -#: discord.ext.commands.CogMeta:7 of -msgid "" -"For example, to create an abstract cog mixin class, the following would " -"be done." -msgstr "" - -#: discord.ext.commands.CogMeta:24 of -msgid "" -"When passing an attribute of a metaclass that is documented below, note " -"that you must pass it as a keyword-only argument to the class creation " -"like the following example:" -msgstr "" - -#: discord.ext.commands.CogMeta:35 of -msgid "" -"The cog name. By default, it is the name of the class with no " -"modification." -msgstr "" - -#: discord.ext.commands.CogMeta:41 of -msgid "" -"A list of attributes to apply to every command inside this cog. The " -"dictionary is passed into the :class:`Command` options at ``__init__``. " -"If you specify attributes inside the command attribute in the class, it " -"will override the one specified inside this attribute. For example:" -msgstr "" - -#: ../../ext/commands/api.rst:99 -msgid "Help Commands" -msgstr "" - -#: discord.ext.commands.HelpCommand:1 of -msgid "The base implementation for help command formatting." -msgstr "" - -#: discord.ext.commands.HelpCommand:5 of -msgid "" -"Internally instances of this class are deep copied every time the command" -" itself is invoked to prevent a race condition mentioned in " -":issue:`2123`." -msgstr "" - -#: discord.ext.commands.HelpCommand:9 of -msgid "" -"This means that relying on the state of this class to be the same between" -" command invocations would not work as expected." -msgstr "" - -#: discord.ext.commands.HelpCommand:14 of -msgid "" -"The context that invoked this help formatter. This is generally set after" -" the help command assigned, :func:`command_callback`\\, has been called." -msgstr "" - -#: discord.ext.commands.HelpCommand:17 of -msgid "Optional[:class:`Context`]" -msgstr "" - -#: discord.ext.commands.HelpCommand:21 of -msgid "" -"Specifies if hidden commands should be shown in the output. Defaults to " -"``False``." -msgstr "" - -#: discord.ext.commands.HelpCommand:28 of -msgid "" -"Specifies if commands should have their :attr:`.Command.checks` called " -"and verified. Defaults to ``True``." -msgstr "" - -#: discord.ext.commands.HelpCommand:35 of -msgid "" -"A dictionary of options to pass in for the construction of the help " -"command. This allows you to change the command behaviour without actually" -" changing the implementation of the command. The attributes will be the " -"same as the ones passed in the :class:`.Command` constructor." -msgstr "" - -#: discord.ext.commands.HelpCommand.add_check:1 of -#, fuzzy -msgid "Adds a check to the help command." -msgstr "ボットにグローバルチェックを追加します。" - -#: discord.ext.commands.HelpCommand.remove_check:1 of -msgid "Removes a check from the help command." -msgstr "" - -#: discord.ext.commands.HelpCommand.get_bot_mapping:1 of -msgid "Retrieves the bot mapping passed to :meth:`send_bot_help`." -msgstr "" - -#: discord.ext.commands.HelpCommand.clean_prefix:1 of -msgid "" -"The cleaned up invoke prefix. i.e. mentions are ``@name`` instead of " -"``<@id>``." -msgstr "「クリーンアップ」されたプレフィックスを返します。たとえば、メンションは ``<@id>`` のかわりに ``@name`` となります。" - -#: discord.ext.commands.HelpCommand.invoked_with:1 of -msgid "" -"Similar to :attr:`Context.invoked_with` except properly handles the case " -"where :meth:`Context.send_help` is used." -msgstr "" - -#: discord.ext.commands.HelpCommand.invoked_with:4 of -msgid "" -"If the help command was used regularly then this returns the " -":attr:`Context.invoked_with` attribute. Otherwise, if it the help command" -" was called using :meth:`Context.send_help` then it returns the internal " -"command name of the help command." -msgstr "" - -#: discord.ext.commands.HelpCommand.invoked_with:9 of -msgid "The command name that triggered this invocation." -msgstr "" - -#: discord.ext.commands.HelpCommand.get_command_signature:1 -#: discord.ext.commands.MinimalHelpCommand.get_command_signature:1 of -msgid "Retrieves the signature portion of the help page." -msgstr "ヘルプページに表示される、コマンドの使用方法を示す文字列を返します。" - -#: discord.ext.commands.HelpCommand.get_command_signature:3 -#: discord.ext.commands.MinimalHelpCommand.get_command_signature:3 of -msgid "The command to get the signature of." -msgstr "" - -#: discord.ext.commands.HelpCommand.get_command_signature:6 -#: discord.ext.commands.MinimalHelpCommand.get_command_signature:6 of -msgid "The signature for the command." -msgstr "" - -#: discord.ext.commands.HelpCommand.remove_mentions:1 of -msgid "Removes mentions from the string to prevent abuse." -msgstr "" - -#: discord.ext.commands.HelpCommand.remove_mentions:3 of -msgid "This includes ``@everyone``, ``@here``, member mentions and role mentions." -msgstr "" - -#: discord.ext.commands.HelpCommand.remove_mentions:5 of -msgid "The string with mentions removed." -msgstr "" - -#: discord.ext.commands.HelpCommand.cog:1 of -msgid "A property for retrieving or setting the cog for the help command." -msgstr "" - -#: discord.ext.commands.HelpCommand.cog:3 of -msgid "" -"When a cog is set for the help command, it is as-if the help command " -"belongs to that cog. All cog special methods will apply to the help " -"command and it will be automatically unset on unload." -msgstr "" - -#: discord.ext.commands.HelpCommand.cog:7 of -msgid "To unbind the cog from the help command, you can set it to ``None``." -msgstr "" - -#: discord.ext.commands.HelpCommand.cog:9 of -msgid "The cog that is currently set for the help command." -msgstr "" - -#: discord.ext.commands.HelpCommand.command_not_found:1 -#: discord.ext.commands.HelpCommand.subcommand_not_found:1 of -msgid "|maybecoro|" -msgstr "" - -#: discord.ext.commands.HelpCommand.command_not_found:3 of -msgid "" -"A method called when a command is not found in the help command. This is " -"useful to override for i18n." -msgstr "" - -#: discord.ext.commands.HelpCommand.command_not_found:6 of -msgid "Defaults to ``No command called {0} found.``" -msgstr "" - -#: discord.ext.commands.HelpCommand.command_not_found:8 of -msgid "" -"The string that contains the invalid command. Note that this has had " -"mentions removed to prevent abuse." -msgstr "" - -#: discord.ext.commands.HelpCommand.command_not_found:12 of -msgid "The string to use when a command has not been found." -msgstr "" - -#: discord.ext.commands.HelpCommand.subcommand_not_found:3 of -msgid "" -"A method called when a command did not have a subcommand requested in the" -" help command. This is useful to override for i18n." -msgstr "" - -#: discord.ext.commands.HelpCommand.subcommand_not_found:6 of -msgid "Defaults to either:" -msgstr "" - -#: discord.ext.commands.HelpCommand.subcommand_not_found:8 of -msgid "``'Command \"{command.qualified_name}\" has no subcommands.'``" -msgstr "" - -#: discord.ext.commands.HelpCommand.subcommand_not_found:9 of -msgid "If there is no subcommand in the ``command`` parameter." -msgstr "" - -#: discord.ext.commands.HelpCommand.subcommand_not_found:11 of -msgid "" -"``'Command \"{command.qualified_name}\" has no subcommand named " -"{string}'``" -msgstr "" - -#: discord.ext.commands.HelpCommand.subcommand_not_found:11 of -msgid "If the ``command`` parameter has subcommands but not one named ``string``." -msgstr "" - -#: discord.ext.commands.HelpCommand.subcommand_not_found:13 of -msgid "The command that did not have the subcommand requested." -msgstr "" - -#: discord.ext.commands.HelpCommand.subcommand_not_found:15 of -msgid "" -"The string that contains the invalid subcommand. Note that this has had " -"mentions removed to prevent abuse." -msgstr "" - -#: discord.ext.commands.HelpCommand.subcommand_not_found:19 of -msgid "The string to use when the command did not have the subcommand requested." -msgstr "" - -#: discord.ext.commands.HelpCommand.filter_commands:3 of -msgid "Returns a filtered list of commands and optionally sorts them." -msgstr "" - -#: discord.ext.commands.HelpCommand.filter_commands:5 of -msgid "" -"This takes into account the :attr:`verify_checks` and :attr:`show_hidden`" -" attributes." -msgstr "" - -#: discord.ext.commands.HelpCommand.filter_commands:8 of -msgid "An iterable of commands that are getting filtered." -msgstr "" - -#: discord.ext.commands.HelpCommand.filter_commands:10 of -msgid "Whether to sort the result." -msgstr "" - -#: discord.ext.commands.HelpCommand.filter_commands:12 of -msgid "" -"An optional key function to pass to :func:`py:sorted` that takes a " -":class:`Command` as its sole parameter. If ``sort`` is passed as ``True``" -" then this will default as the command name." -msgstr "" - -#: discord.ext.commands.HelpCommand.filter_commands:17 of -msgid "A list of commands that passed the filter." -msgstr "" - -#: discord.ext.commands.HelpCommand.get_max_size:1 of -msgid "Returns the largest name length of the specified command list." -msgstr "" - -#: discord.ext.commands.HelpCommand.get_max_size:3 of -msgid "A sequence of commands to check for the largest size." -msgstr "" - -#: discord.ext.commands.HelpCommand.get_max_size:6 of -msgid "The maximum width of the commands." -msgstr "" - -#: discord.ext.commands.DefaultHelpCommand:12 -#: discord.ext.commands.DefaultHelpCommand:42 -#: discord.ext.commands.HelpCommand.get_max_size:7 -#: discord.ext.commands.MaxConcurrencyReached:9 -#: discord.ext.commands.Paginator:25 of -msgid ":class:`int`" -msgstr "" - -#: discord.ext.commands.DefaultHelpCommand.get_destination:1 -#: discord.ext.commands.HelpCommand.get_destination:1 -#: discord.ext.commands.MinimalHelpCommand.get_destination:1 of -msgid "" -"Returns the :class:`~discord.abc.Messageable` where the help command will" -" be output." -msgstr "" - -#: discord.ext.commands.DefaultHelpCommand.get_destination:3 -#: discord.ext.commands.HelpCommand.get_destination:3 -#: discord.ext.commands.HelpCommand.send_bot_help:11 -#: discord.ext.commands.HelpCommand.send_cog_help:11 -#: discord.ext.commands.HelpCommand.send_command_help:10 -#: discord.ext.commands.HelpCommand.send_error_message:7 -#: discord.ext.commands.HelpCommand.send_group_help:11 -#: discord.ext.commands.MinimalHelpCommand.get_destination:3 of -msgid "You can override this method to customise the behaviour." -msgstr "" - -#: discord.ext.commands.DefaultHelpCommand.get_destination:5 -#: discord.ext.commands.HelpCommand.get_destination:5 -#: discord.ext.commands.MinimalHelpCommand.get_destination:5 of -msgid "By default this returns the context's channel." -msgstr "" - -#: discord.ext.commands.DefaultHelpCommand.get_destination:7 -#: discord.ext.commands.HelpCommand.get_destination:7 -#: discord.ext.commands.MinimalHelpCommand.get_destination:7 of -msgid "The destination where the help command will be output." -msgstr "" - -#: discord.ext.commands.DefaultHelpCommand.get_destination:8 -#: discord.ext.commands.HelpCommand.get_destination:8 -#: discord.ext.commands.MinimalHelpCommand.get_destination:8 of -msgid ":class:`.abc.Messageable`" -msgstr "" - -#: discord.ext.commands.HelpCommand.send_error_message:3 of -msgid "" -"Handles the implementation when an error happens in the help command. For" -" example, the result of :meth:`command_not_found` or " -":meth:`command_has_no_subcommand_found` will be passed here." -msgstr "" - -#: discord.ext.commands.HelpCommand.send_error_message:9 of -msgid "" -"By default, this sends the error message to the destination specified by " -":meth:`get_destination`." -msgstr "" - -#: discord.ext.commands.HelpCommand.send_bot_help:15 -#: discord.ext.commands.HelpCommand.send_cog_help:15 -#: discord.ext.commands.HelpCommand.send_command_help:14 -#: discord.ext.commands.HelpCommand.send_error_message:14 -#: discord.ext.commands.HelpCommand.send_group_help:15 of -msgid "You can access the invocation context with :attr:`HelpCommand.context`." -msgstr "" - -#: discord.ext.commands.HelpCommand.send_error_message:16 of -msgid "" -"The error message to display to the user. Note that this has had mentions" -" removed to prevent abuse." -msgstr "" - -#: discord.ext.commands.HelpCommand.on_help_command_error:3 of -msgid "" -"The help command's error handler, as specified by " -":ref:`ext_commands_error_handler`." -msgstr "" - -#: discord.ext.commands.HelpCommand.on_help_command_error:5 of -msgid "" -"Useful to override if you need some specific behaviour when the error " -"handler is called." -msgstr "" - -#: discord.ext.commands.HelpCommand.on_help_command_error:8 of -msgid "" -"By default this method does nothing and just propagates to the default " -"error handlers." -msgstr "" - -#: discord.ext.commands.HelpCommand.send_bot_help:3 of -msgid "" -"Handles the implementation of the bot command page in the help command. " -"This function is called when the help command is called with no " -"arguments." -msgstr "" - -#: discord.ext.commands.HelpCommand.send_bot_help:6 -#: discord.ext.commands.HelpCommand.send_cog_help:6 -#: discord.ext.commands.HelpCommand.send_command_help:5 -#: discord.ext.commands.HelpCommand.send_group_help:6 of -msgid "" -"It should be noted that this method does not return anything -- rather " -"the actual message sending should be done inside this method. Well " -"behaved subclasses should use :meth:`get_destination` to know where to " -"send, as this is a customisation point for other users." -msgstr "" - -#: discord.ext.commands.HelpCommand.send_bot_help:17 of -msgid "" -"Also, the commands in the mapping are not filtered. To do the filtering " -"you will have to call :meth:`filter_commands` yourself." -msgstr "" - -#: discord.ext.commands.HelpCommand.send_bot_help:20 of -msgid "" -"A mapping of cogs to commands that have been requested by the user for " -"help. The key of the mapping is the :class:`~.commands.Cog` that the " -"command belongs to, or ``None`` if there isn't one, and the value is a " -"list of commands that belongs to that cog." -msgstr "" - -#: discord.ext.commands.HelpCommand.send_cog_help:3 of -msgid "" -"Handles the implementation of the cog page in the help command. This " -"function is called when the help command is called with a cog as the " -"argument." -msgstr "" - -#: discord.ext.commands.HelpCommand.send_cog_help:17 of -msgid "" -"To get the commands that belong to this cog see :meth:`Cog.get_commands`." -" The commands returned not filtered. To do the filtering you will have to" -" call :meth:`filter_commands` yourself." -msgstr "" - -#: discord.ext.commands.HelpCommand.send_cog_help:21 of -msgid "The cog that was requested for help." -msgstr "" - -#: discord.ext.commands.HelpCommand.send_group_help:3 of -msgid "" -"Handles the implementation of the group page in the help command. This " -"function is called when the help command is called with a group as the " -"argument." -msgstr "" - -#: discord.ext.commands.HelpCommand.send_group_help:17 of -msgid "" -"To get the commands that belong to this group without aliases see " -":attr:`Group.commands`. The commands returned not filtered. To do the " -"filtering you will have to call :meth:`filter_commands` yourself." -msgstr "" - -#: discord.ext.commands.HelpCommand.send_group_help:21 of -msgid "The group that was requested for help." -msgstr "" - -#: discord.ext.commands.HelpCommand.send_command_help:3 of -msgid "Handles the implementation of the single command page in the help command." -msgstr "" - -#: discord.ext.commands.HelpCommand.send_command_help:16 of -msgid "Showing Help" -msgstr "" - -#: discord.ext.commands.HelpCommand.send_command_help:19 of -msgid "" -"There are certain attributes and methods that are helpful for a help " -"command to show such as the following:" -msgstr "" - -#: discord.ext.commands.HelpCommand.send_command_help:22 of -msgid ":attr:`Command.help`" -msgstr "" - -#: discord.ext.commands.HelpCommand.send_command_help:23 of -msgid ":attr:`Command.brief`" -msgstr "" - -#: discord.ext.commands.HelpCommand.send_command_help:24 of -msgid ":attr:`Command.short_doc`" -msgstr "" - -#: discord.ext.commands.HelpCommand.send_command_help:25 of -msgid ":attr:`Command.description`" -msgstr "" - -#: discord.ext.commands.HelpCommand.send_command_help:26 of -msgid ":meth:`get_command_signature`" -msgstr "" - -#: discord.ext.commands.HelpCommand.send_command_help:28 of -msgid "" -"There are more than just these attributes but feel free to play around " -"with these to help you get started to get the output that you want." -msgstr "" - -#: discord.ext.commands.HelpCommand.send_command_help:31 of -msgid "The command that was requested for help." -msgstr "" - -#: discord.ext.commands.HelpCommand.prepare_help_command:3 of -msgid "" -"A low level method that can be used to prepare the help command before it" -" does anything. For example, if you need to prepare some state in your " -"subclass before the command does its processing then this would be the " -"place to do it." -msgstr "" - -#: discord.ext.commands.HelpCommand.prepare_help_command:8 -#: discord.ext.commands.MinimalHelpCommand.get_ending_note:3 of -msgid "The default implementation does nothing." -msgstr "" - -#: discord.ext.commands.HelpCommand.prepare_help_command:12 of -msgid "" -"This is called *inside* the help command callback body. So all the usual " -"rules that happen inside apply here as well." -msgstr "" - -#: discord.ext.commands.HelpCommand.prepare_help_command:17 of -msgid "The argument passed to the help command." -msgstr "" - -#: discord.ext.commands.HelpCommand.command_callback:3 of -msgid "The actual implementation of the help command." -msgstr "" - -#: discord.ext.commands.HelpCommand.command_callback:5 of -msgid "" -"It is not recommended to override this method and instead change the " -"behaviour through the methods that actually get dispatched." -msgstr "" - -#: discord.ext.commands.HelpCommand.command_callback:8 of -msgid ":meth:`send_bot_help`" -msgstr "" - -#: discord.ext.commands.HelpCommand.command_callback:9 of -msgid ":meth:`send_cog_help`" -msgstr "" - -#: discord.ext.commands.HelpCommand.command_callback:10 of -msgid ":meth:`send_group_help`" -msgstr "" - -#: discord.ext.commands.HelpCommand.command_callback:11 of -msgid ":meth:`send_command_help`" -msgstr "" - -#: discord.ext.commands.HelpCommand.command_callback:12 of -msgid ":meth:`get_destination`" -msgstr "" - -#: discord.ext.commands.HelpCommand.command_callback:13 of -msgid ":meth:`command_not_found`" -msgstr "" - -#: discord.ext.commands.HelpCommand.command_callback:14 of -msgid ":meth:`subcommand_not_found`" -msgstr "" - -#: discord.ext.commands.HelpCommand.command_callback:15 of -msgid ":meth:`send_error_message`" -msgstr "" - -#: discord.ext.commands.HelpCommand.command_callback:16 of -msgid ":meth:`on_help_command_error`" -msgstr "" - -#: discord.ext.commands.HelpCommand.command_callback:17 of -msgid ":meth:`prepare_help_command`" -msgstr "" - -#: discord.ext.commands.DefaultHelpCommand:1 of -msgid "The implementation of the default help command." -msgstr "" - -#: discord.ext.commands.DefaultHelpCommand:3 -#: discord.ext.commands.MinimalHelpCommand:3 of -msgid "This inherits from :class:`HelpCommand`." -msgstr "" - -#: discord.ext.commands.DefaultHelpCommand:5 of -msgid "It extends it with the following attributes." -msgstr "" - -#: discord.ext.commands.DefaultHelpCommand:9 of -msgid "The maximum number of characters that fit in a line. Defaults to 80." -msgstr "" - -#: discord.ext.commands.DefaultHelpCommand:16 -#: discord.ext.commands.MinimalHelpCommand:7 of -msgid "" -"Whether to sort the commands in the output alphabetically. Defaults to " -"``True``." -msgstr "" - -#: discord.ext.commands.DefaultHelpCommand:22 -#: discord.ext.commands.MinimalHelpCommand:27 of -msgid "" -"A tribool that indicates if the help command should DM the user instead " -"of sending it to the channel it received it from. If the boolean is set " -"to ``True``, then all help output is DM'd. If ``False``, none of the help" -" output is DM'd. If ``None``, then the bot will only DM when the help " -"message becomes too long (dictated by more than :attr:`dm_help_threshold`" -" characters). Defaults to ``False``." -msgstr "" - -#: discord.ext.commands.DefaultHelpCommand:29 -#: discord.ext.commands.MinimalHelpCommand:34 of -msgid "Optional[:class:`bool`]" -msgstr "" - -#: discord.ext.commands.DefaultHelpCommand:33 -#: discord.ext.commands.MinimalHelpCommand:38 of -msgid "" -"The number of characters the paginator must accumulate before getting " -"DM'd to the user if :attr:`dm_help` is set to ``None``. Defaults to 1000." -msgstr "" - -#: discord.ext.commands.DefaultHelpCommand:40 of -msgid "How much to indent the commands from a heading. Defaults to ``2``." -msgstr "" - -#: discord.ext.commands.DefaultHelpCommand:46 of -msgid "" -"The command list's heading string used when the help command is invoked " -"with a category name. Useful for i18n. Defaults to ``\"Commands:\"``" -msgstr "" - -#: discord.ext.commands.DefaultHelpCommand:53 -#: discord.ext.commands.MinimalHelpCommand:45 of -msgid "" -"The string used when there is a command which does not belong to any " -"category(cog). Useful for i18n. Defaults to ``\"No Category\"``" -msgstr "" - -#: discord.ext.commands.DefaultHelpCommand:60 -#: discord.ext.commands.MinimalHelpCommand:52 of -msgid "The paginator used to paginate the help command output." -msgstr "" - -#: discord.ext.commands.DefaultHelpCommand:62 -#: discord.ext.commands.MinimalHelpCommand:54 of -#, fuzzy -msgid ":class:`Paginator`" -msgstr ":class:`.AppInfo`" - -#: discord.ext.commands.DefaultHelpCommand.shorten_text:1 of -#, fuzzy -msgid ":class:`str`: Shortens text to fit into the :attr:`width`." -msgstr "渡された文字列を、 :attr:`width` に収まるよう省略します。" - -#: discord.ext.commands.DefaultHelpCommand.get_ending_note:1 of -#, fuzzy -msgid "" -":class:`str`: Returns help command's ending note. This is mainly useful " -"to override for i18n purposes." -msgstr "Helpコマンドの末尾の文字列を返します。主に翻訳する際にオーバーライドしてください。" - -#: discord.ext.commands.DefaultHelpCommand.add_indented_commands:1 of -msgid "Indents a list of commands after the specified heading." -msgstr "" - -#: discord.ext.commands.DefaultHelpCommand.add_indented_commands:3 of -msgid "The formatting is added to the :attr:`paginator`." -msgstr "" - -#: discord.ext.commands.DefaultHelpCommand.add_indented_commands:5 of -msgid "" -"The default implementation is the command name indented by :attr:`indent`" -" spaces, padded to ``max_size`` followed by the command's " -":attr:`Command.short_doc` and then shortened to fit into the " -":attr:`width`." -msgstr "" - -#: discord.ext.commands.DefaultHelpCommand.add_indented_commands:10 of -msgid "A list of commands to indent for output." -msgstr "" - -#: discord.ext.commands.DefaultHelpCommand.add_indented_commands:12 of -msgid "" -"The heading to add to the output. This is only added if the list of " -"commands is greater than 0." -msgstr "" - -#: discord.ext.commands.DefaultHelpCommand.add_indented_commands:15 of -msgid "" -"The max size to use for the gap between indents. If unspecified, calls " -":meth:`get_max_size` on the commands parameter." -msgstr "" - -#: discord.ext.commands.DefaultHelpCommand.send_pages:1 -#: discord.ext.commands.MinimalHelpCommand.send_pages:1 of -msgid "" -"A helper utility to send the page output from :attr:`paginator` to the " -"destination." -msgstr "" - -#: discord.ext.commands.DefaultHelpCommand.add_command_formatting:1 of -msgid "" -"A utility function to format the non-indented block of commands and " -"groups." -msgstr "" - -#: discord.ext.commands.DefaultHelpCommand.add_command_formatting:3 -#: discord.ext.commands.MinimalHelpCommand.add_command_formatting:3 of -msgid "The command to format." -msgstr "" - -#: discord.ext.commands.MinimalHelpCommand:1 of -msgid "An implementation of a help command with minimal output." -msgstr "" - -#: discord.ext.commands.MinimalHelpCommand:13 of -msgid "" -"The command list's heading string used when the help command is invoked " -"with a category name. Useful for i18n. Defaults to ``\"Commands\"``" -msgstr "" - -#: discord.ext.commands.MinimalHelpCommand:20 of -msgid "" -"The alias list's heading string used to list the aliases of the command. " -"Useful for i18n. Defaults to ``\"Aliases:\"``." -msgstr "" - -#: discord.ext.commands.MinimalHelpCommand.get_opening_note:1 of -msgid "" -"Returns help command's opening note. This is mainly useful to override " -"for i18n purposes." -msgstr "" - -#: discord.ext.commands.MinimalHelpCommand.get_opening_note:3 of -msgid "The default implementation returns ::" -msgstr "" - -#: discord.ext.commands.MinimalHelpCommand.get_opening_note:8 of -msgid "The help command opening note." -msgstr "" - -#: discord.ext.commands.MinimalHelpCommand.get_ending_note:1 of -msgid "" -"Return the help command's ending note. This is mainly useful to override " -"for i18n purposes." -msgstr "" - -#: discord.ext.commands.MinimalHelpCommand.get_ending_note:5 of -msgid "The help command ending note." -msgstr "" - -#: discord.ext.commands.MinimalHelpCommand.add_bot_commands_formatting:1 of -msgid "Adds the minified bot heading with commands to the output." -msgstr "" - -#: discord.ext.commands.MinimalHelpCommand.add_aliases_formatting:3 -#: discord.ext.commands.MinimalHelpCommand.add_bot_commands_formatting:3 -#: discord.ext.commands.MinimalHelpCommand.add_subcommand_formatting:3 of -msgid "The formatting should be added to the :attr:`paginator`." -msgstr "" - -#: discord.ext.commands.MinimalHelpCommand.add_bot_commands_formatting:5 of -msgid "" -"The default implementation is a bold underline heading followed by " -"commands separated by an EN SPACE (U+2002) in the next line." -msgstr "" - -#: discord.ext.commands.MinimalHelpCommand.add_bot_commands_formatting:8 of -msgid "A list of commands that belong to the heading." -msgstr "" - -#: discord.ext.commands.MinimalHelpCommand.add_bot_commands_formatting:10 of -msgid "The heading to add to the line." -msgstr "" - -#: discord.ext.commands.MinimalHelpCommand.add_subcommand_formatting:1 of -msgid "Adds formatting information on a subcommand." -msgstr "" - -#: discord.ext.commands.MinimalHelpCommand.add_subcommand_formatting:5 of -msgid "" -"The default implementation is the prefix and the " -":attr:`Command.qualified_name` optionally followed by an En dash and the " -"command's :attr:`Command.short_doc`." -msgstr "" - -#: discord.ext.commands.MinimalHelpCommand.add_subcommand_formatting:8 of -msgid "The command to show information of." -msgstr "" - -#: discord.ext.commands.MinimalHelpCommand.add_aliases_formatting:1 of -msgid "Adds the formatting information on a command's aliases." -msgstr "" - -#: discord.ext.commands.MinimalHelpCommand.add_aliases_formatting:5 of -msgid "" -"The default implementation is the :attr:`aliases_heading` bolded followed" -" by a comma separated list of aliases." -msgstr "" - -#: discord.ext.commands.MinimalHelpCommand.add_aliases_formatting:8 of -msgid "This is not called if there are no aliases to format." -msgstr "" - -#: discord.ext.commands.MinimalHelpCommand.add_aliases_formatting:10 of -msgid "A list of aliases to format." -msgstr "" - -#: discord.ext.commands.MinimalHelpCommand.add_command_formatting:1 of -msgid "A utility function to format commands and groups." -msgstr "" - -#: discord.ext.commands.Paginator:1 of -msgid "A class that aids in paginating code blocks for Discord messages." -msgstr "" - -#: discord.ext.commands.Paginator:7 of -msgid "Returns the total number of characters in the paginator." -msgstr "" - -#: discord.ext.commands.Paginator:11 of -msgid "The prefix inserted to every page. e.g. three backticks." -msgstr "" - -#: discord.ext.commands.Paginator:17 of -msgid "The suffix appended at the end of every page. e.g. three backticks." -msgstr "" - -#: discord.ext.commands.Paginator:23 of -msgid "The maximum amount of codepoints allowed in a page." -msgstr "" - -#: discord.ext.commands.Paginator.clear:1 of -msgid "Clears the paginator to have no pages." -msgstr "" - -#: discord.ext.commands.Paginator.add_line:1 of -msgid "Adds a line to the current page." -msgstr "" - -#: discord.ext.commands.Paginator.add_line:3 of -msgid "If the line exceeds the :attr:`max_size` then an exception is raised." -msgstr "" - -#: discord.ext.commands.Paginator.add_line:6 of -msgid "The line to add." -msgstr "" - -#: discord.ext.commands.Paginator.add_line:8 of -msgid "Indicates if another empty line should be added." -msgstr "" - -#: discord.ext.commands.Paginator.add_line:11 of -msgid "The line was too big for the current :attr:`max_size`." -msgstr "" - -#: discord.ext.commands.Paginator.close_page:1 of -msgid "Prematurely terminate a page." -msgstr "" - -#: discord.ext.commands.Paginator.pages:1 of -msgid "Returns the rendered list of pages." -msgstr "" - -#: discord.ext.commands.Paginator.pages:3 of -msgid "List[:class:`str`]" -msgstr "" - -#: ../../ext/commands/api.rst:116 -msgid "Enums" -msgstr "" - -#: ../../ext/commands/api.rst:120 -msgid "Specifies a type of bucket for, e.g. a cooldown." -msgstr "" - -#: ../../ext/commands/api.rst:124 -msgid "The default bucket operates on a global basis." -msgstr "" - -#: ../../ext/commands/api.rst:127 -msgid "The user bucket operates on a per-user basis." -msgstr "" - -#: ../../ext/commands/api.rst:130 -msgid "The guild bucket operates on a per-guild basis." -msgstr "" - -#: ../../ext/commands/api.rst:133 -msgid "The channel bucket operates on a per-channel basis." -msgstr "" - -#: ../../ext/commands/api.rst:136 -msgid "The member bucket operates on a per-member basis." -msgstr "" - -#: ../../ext/commands/api.rst:139 -msgid "The category bucket operates on a per-category basis." -msgstr "" - -#: ../../ext/commands/api.rst:142 -msgid "The role bucket operates on a per-role basis." -msgstr "" - -#: ../../ext/commands/api.rst:150 -msgid "Checks" -msgstr "" - -#: discord.ext.commands.check:1 of -msgid "" -"A decorator that adds a check to the :class:`.Command` or its subclasses." -" These checks could be accessed via :attr:`.Command.checks`." -msgstr "" - -#: discord.ext.commands.check:4 of -msgid "" -"These checks should be predicates that take in a single parameter taking " -"a :class:`.Context`. If the check returns a ``False``\\-like value then " -"during invocation a :exc:`.CheckFailure` exception is raised and sent to " -"the :func:`.on_command_error` event." -msgstr "" - -#: discord.ext.commands.check:9 of -msgid "" -"If an exception should be thrown in the predicate then it should be a " -"subclass of :exc:`.CommandError`. Any exception not subclassed from it " -"will be propagated while those subclassed will be sent to " -":func:`.on_command_error`." -msgstr "" - -#: discord.ext.commands.check:14 of -msgid "" -"A special attribute named ``predicate`` is bound to the value returned by" -" this decorator to retrieve the predicate passed to the decorator. This " -"allows the following introspection and chaining to be done:" -msgstr "" - -#: discord.ext.commands.check:30 of -msgid "" -"The function returned by ``predicate`` is **always** a coroutine, even if" -" the original function was not a coroutine." -msgstr "" - -#: discord.ext.commands.check:33 of -msgid "The ``predicate`` attribute was added." -msgstr "" - -#: discord.ext.commands.check:38 of -msgid "Creating a basic check to see if the command invoker is you." -msgstr "" - -#: discord.ext.commands.check:50 of -msgid "Transforming common checks into its own decorator:" -msgstr "" - -#: discord.ext.commands.check:64 of -msgid "The predicate to check if the command should be invoked." -msgstr "" - -#: discord.ext.commands.check_any:1 of -msgid "" -"A :func:`check` that is added that checks if any of the checks passed " -"will pass, i.e. using logical OR." -msgstr "" - -#: discord.ext.commands.check_any:4 of -msgid "" -"If all checks fail then :exc:`.CheckAnyFailure` is raised to signal the " -"failure. It inherits from :exc:`.CheckFailure`." -msgstr "" - -#: discord.ext.commands.check_any:9 of -msgid "The ``predicate`` attribute for this function **is** a coroutine." -msgstr "" - -#: discord.ext.commands.check_any:13 of -msgid "" -"An argument list of checks that have been decorated with the " -":func:`check` decorator." -msgstr "" - -#: discord.ext.commands.check_any:17 of -msgid "" -"A check passed has not been decorated with the :func:`check` " -"decorator." -msgstr "" - -#: discord.ext.commands.check_any:21 of -msgid "Creating a basic check to see if it's the bot owner or the server owner:" -msgstr "" - -#: discord.ext.commands.has_role:1 of -msgid "" -"A :func:`.check` that is added that checks if the member invoking the " -"command has the role specified via the name or ID specified." -msgstr "" - -#: discord.ext.commands.has_role:4 of -msgid "" -"If a string is specified, you must give the exact name of the role, " -"including caps and spelling." -msgstr "" - -#: discord.ext.commands.has_role:7 of -msgid "" -"If an integer is specified, you must give the exact snowflake ID of the " -"role." -msgstr "" - -#: discord.ext.commands.has_role:9 of -msgid "" -"If the message is invoked in a private message context then the check " -"will return ``False``." -msgstr "" - -#: discord.ext.commands.has_role:12 of -msgid "" -"This check raises one of two special exceptions, :exc:`.MissingRole` if " -"the user is missing a role, or :exc:`.NoPrivateMessage` if it is used in " -"a private message. Both inherit from :exc:`.CheckFailure`." -msgstr "" - -#: discord.ext.commands.has_role:18 of -msgid "" -"Raise :exc:`.MissingRole` or :exc:`.NoPrivateMessage` instead of generic " -":exc:`.CheckFailure`" -msgstr "" - -#: discord.ext.commands.has_role:21 of -msgid "The name or ID of the role to check." -msgstr "" - -#: discord.ext.commands.has_permissions:1 of -msgid "" -"A :func:`.check` that is added that checks if the member has all of the " -"permissions necessary." -msgstr "" - -#: discord.ext.commands.has_permissions:4 of -msgid "" -"Note that this check operates on the current channel permissions, not the" -" guild wide permissions." -msgstr "" - -#: discord.ext.commands.has_permissions:7 of -msgid "" -"The permissions passed in must be exactly like the properties shown under" -" :class:`.discord.Permissions`." -msgstr "" - -#: discord.ext.commands.has_permissions:10 of -msgid "" -"This check raises a special exception, :exc:`.MissingPermissions` that is" -" inherited from :exc:`.CheckFailure`." -msgstr "" - -#: discord.ext.commands.has_permissions:13 of -msgid "An argument list of permissions to check for." -msgstr "" - -#: discord.ext.commands.has_guild_permissions:1 of -msgid "" -"Similar to :func:`.has_permissions`, but operates on guild wide " -"permissions instead of the current channel permissions." -msgstr "" - -#: discord.ext.commands.has_guild_permissions:4 of -msgid "" -"If this check is called in a DM context, it will raise an exception, " -":exc:`.NoPrivateMessage`." -msgstr "" - -#: discord.ext.commands.has_any_role:1 of -msgid "" -"A :func:`.check` that is added that checks if the member invoking the " -"command has **any** of the roles specified. This means that if they have " -"one out of the three roles specified, then this check will return `True`." -msgstr "" - -#: discord.ext.commands.has_any_role:5 of -msgid "Similar to :func:`.has_role`\\, the names or IDs passed in must be exact." -msgstr "" - -#: discord.ext.commands.has_any_role:7 of -msgid "" -"This check raises one of two special exceptions, :exc:`.MissingAnyRole` " -"if the user is missing all roles, or :exc:`.NoPrivateMessage` if it is " -"used in a private message. Both inherit from :exc:`.CheckFailure`." -msgstr "" - -#: discord.ext.commands.has_any_role:13 of -msgid "" -"Raise :exc:`.MissingAnyRole` or :exc:`.NoPrivateMessage` instead of " -"generic :exc:`.CheckFailure`" -msgstr "" - -#: discord.ext.commands.has_any_role:16 of -msgid "An argument list of names or IDs to check that the member has roles wise." -msgstr "" - -#: discord.ext.commands.bot_has_role:1 of -msgid "Similar to :func:`.has_role` except checks if the bot itself has the role." -msgstr "" - -#: discord.ext.commands.bot_has_role:4 of -msgid "" -"This check raises one of two special exceptions, :exc:`.BotMissingRole` " -"if the bot is missing the role, or :exc:`.NoPrivateMessage` if it is used" -" in a private message. Both inherit from :exc:`.CheckFailure`." -msgstr "" - -#: discord.ext.commands.bot_has_role:10 of -msgid "" -"Raise :exc:`.BotMissingRole` or :exc:`.NoPrivateMessage` instead of " -"generic :exc:`.CheckFailure`" -msgstr "" - -#: discord.ext.commands.bot_has_permissions:1 of -msgid "" -"Similar to :func:`.has_permissions` except checks if the bot itself has " -"the permissions listed." -msgstr "" - -#: discord.ext.commands.bot_has_permissions:4 of -msgid "" -"This check raises a special exception, :exc:`.BotMissingPermissions` that" -" is inherited from :exc:`.CheckFailure`." -msgstr "" - -#: discord.ext.commands.bot_has_guild_permissions:1 of -msgid "" -"Similar to :func:`.has_guild_permissions`, but checks the bot members " -"guild permissions." -msgstr "" - -#: discord.ext.commands.bot_has_any_role:1 of -msgid "" -"Similar to :func:`.has_any_role` except checks if the bot itself has any " -"of the roles listed." -msgstr "" - -#: discord.ext.commands.bot_has_any_role:4 of -msgid "" -"This check raises one of two special exceptions, " -":exc:`.BotMissingAnyRole` if the bot is missing all roles, or " -":exc:`.NoPrivateMessage` if it is used in a private message. Both inherit" -" from :exc:`.CheckFailure`." -msgstr "" - -#: discord.ext.commands.bot_has_any_role:10 of -msgid "" -"Raise :exc:`.BotMissingAnyRole` or :exc:`.NoPrivateMessage` instead of " -"generic checkfailure" -msgstr "" - -#: discord.ext.commands.cooldown:1 of -#, fuzzy -msgid "A decorator that adds a cooldown to a :class:`.Command`" -msgstr "Botにグローバルチェックを追加するデコレーター" - -#: discord.ext.commands.cooldown:3 of -msgid "" -"A cooldown allows a command to only be used a specific amount of times in" -" a specific time frame. These cooldowns can be based either on a per-" -"guild, per-channel, per-user, per-role or global basis. Denoted by the " -"third argument of ``type`` which must be of enum type " -":class:`.BucketType`." -msgstr "" - -#: discord.ext.commands.cooldown:9 of -msgid "" -"If a cooldown is triggered, then :exc:`.CommandOnCooldown` is triggered " -"in :func:`.on_command_error` and the local error handler." -msgstr "" - -#: discord.ext.commands.cooldown:12 of -msgid "A command can only have a single cooldown." -msgstr "" - -#: discord.ext.commands.cooldown:14 of -msgid "The number of times a command can be used before triggering a cooldown." -msgstr "" - -#: discord.ext.commands.cooldown:16 of -msgid "The amount of seconds to wait for a cooldown when it's been triggered." -msgstr "" - -#: discord.ext.commands.cooldown:18 of -msgid "The type of cooldown to have." -msgstr "" - -#: discord.ext.commands.max_concurrency:1 of -msgid "" -"A decorator that adds a maximum concurrency to a :class:`.Command` or its" -" subclasses." -msgstr "" - -#: discord.ext.commands.max_concurrency:3 of -msgid "" -"This enables you to only allow a certain number of command invocations at" -" the same time, for example if a command takes too long or if only one " -"user can use it at a time. This differs from a cooldown in that there is " -"no set waiting period or token bucket -- only a set number of people can " -"run the command." -msgstr "" - -#: discord.ext.commands.max_concurrency:10 of -msgid "" -"The maximum number of invocations of this command that can be running at " -"the same time." -msgstr "" - -#: discord.ext.commands.max_concurrency:12 of -msgid "" -"The bucket that this concurrency is based on, e.g. ``BucketType.guild`` " -"would allow it to be used up to ``number`` times per guild." -msgstr "" - -#: discord.ext.commands.max_concurrency:15 of -msgid "" -"Whether the command should wait for the queue to be over. If this is set " -"to ``False`` then instead of waiting until the command can run again, the" -" command raises :exc:`.MaxConcurrencyReached` to its error handler. If " -"this is set to ``True`` then the command waits until it can be executed." -msgstr "" - -#: discord.ext.commands.before_invoke:3 of -msgid "" -"This allows you to refer to one before invoke hook for several commands " -"that do not have to be within the same cog." -msgstr "" - -#: discord.ext.commands.after_invoke:3 of -msgid "" -"This allows you to refer to one after invoke hook for several commands " -"that do not have to be within the same cog." -msgstr "" - -#: discord.ext.commands.guild_only:1 of -msgid "" -"A :func:`.check` that indicates this command must only be used in a guild" -" context only. Basically, no private messages are allowed when using the " -"command." -msgstr "" - -#: discord.ext.commands.guild_only:5 of -msgid "" -"This check raises a special exception, :exc:`.NoPrivateMessage` that is " -"inherited from :exc:`.CheckFailure`." -msgstr "" - -#: discord.ext.commands.dm_only:1 of -msgid "" -"A :func:`.check` that indicates this command must only be used in a DM " -"context. Only private messages are allowed when using the command." -msgstr "" - -#: discord.ext.commands.dm_only:5 of -msgid "" -"This check raises a special exception, :exc:`.PrivateMessageOnly` that is" -" inherited from :exc:`.CheckFailure`." -msgstr "" - -#: discord.ext.commands.is_owner:1 of -msgid "" -"A :func:`.check` that checks if the person invoking this command is the " -"owner of the bot." -msgstr "" - -#: discord.ext.commands.is_owner:4 of -msgid "This is powered by :meth:`.Bot.is_owner`." -msgstr "" - -#: discord.ext.commands.is_owner:6 of -msgid "" -"This check raises a special exception, :exc:`.NotOwner` that is derived " -"from :exc:`.CheckFailure`." -msgstr "" - -#: discord.ext.commands.is_nsfw:1 of -msgid "A :func:`.check` that checks if the channel is a NSFW channel." -msgstr "" - -#: discord.ext.commands.is_nsfw:3 of -msgid "" -"This check raises a special exception, :exc:`.NSFWChannelRequired` that " -"is derived from :exc:`.CheckFailure`." -msgstr "" - -#: discord.ext.commands.is_nsfw:8 of -msgid "" -"Raise :exc:`.NSFWChannelRequired` instead of generic " -":exc:`.CheckFailure`. DM channels will also now pass this check." -msgstr "" - -#: ../../ext/commands/api.rst:191 -msgid "Context" -msgstr "" - -#: discord.ext.commands.Context:1 of -msgid "Represents the context in which a command is being invoked under." -msgstr "" - -#: discord.ext.commands.Context:3 of -msgid "" -"This class contains a lot of meta data to help you understand more about " -"the invocation context. This class is not created manually and is instead" -" passed around to commands as the first parameter." -msgstr "" - -#: discord.ext.commands.Context:7 of -msgid "This class implements the :class:`~discord.abc.Messageable` ABC." -msgstr "" - -#: discord.ext.commands.Context:11 of -msgid "The message that triggered the command being executed." -msgstr "" - -#: discord.ext.commands.Context:13 of -#, fuzzy -msgid ":class:`.Message`" -msgstr ":class:`.Guild`" - -#: discord.ext.commands.Context:17 of -msgid "The bot that contains the command being executed." -msgstr "" - -#: discord.ext.commands.Context:19 of -#, fuzzy -msgid ":class:`.Bot`" -msgstr ":class:`.AppInfo`" - -#: discord.ext.commands.Context:23 of -msgid "" -"The list of transformed arguments that were passed into the command. If " -"this is accessed during the :func:`on_command_error` event then this list" -" could be incomplete." -msgstr "" - -#: discord.ext.commands.BotMissingPermissions:10 -#: discord.ext.commands.Context:27 discord.ext.commands.MissingPermissions:10 -#: of -#, fuzzy -msgid ":class:`list`" -msgstr ":class:`.Guild`" - -#: discord.ext.commands.Context:31 of -msgid "" -"A dictionary of transformed arguments that were passed into the command. " -"Similar to :attr:`args`\\, if this is accessed in the " -":func:`on_command_error` event then this dict could be incomplete." -msgstr "" - -#: discord.ext.commands.Context:39 of -msgid "The prefix that was used to invoke the command." -msgstr "" - -#: discord.ext.commands.Context:45 of -msgid "The command that is being invoked currently." -msgstr "" - -#: discord.ext.commands.Context:51 of -msgid "" -"The command name that triggered this invocation. Useful for finding out " -"which alias called the command." -msgstr "" - -#: discord.ext.commands.Context:58 of -msgid "" -"The subcommand that was invoked. If no valid subcommand was invoked then " -"this is equal to ``None``." -msgstr "" - -#: discord.ext.commands.Context:65 of -msgid "" -"The string that was attempted to call a subcommand. This does not have to" -" point to a valid registered subcommand and could just point to a " -"nonsense string. If nothing was passed to attempt a call to a subcommand " -"then this is set to ``None``." -msgstr "" - -#: discord.ext.commands.Context:74 of -msgid "" -"A boolean that indicates if the command failed to be parsed, checked, or " -"invoked." -msgstr "" - -#: discord.ext.commands.Context.history:1 of -msgid "" -"Returns an :class:`~discord.AsyncIterator` that enables receiving the " -"destination's message history." -msgstr "" - -#: discord.ext.commands.Context.history:3 of -#, fuzzy -msgid "" -"You must have :attr:`~Permissions.read_message_history` permissions to " -"use this." -msgstr "これを行うには、関連付けられたGuildにて、 :attr:`~.Permissions.manage_channels` 権限が必要です。" - -#: discord.ext.commands.Context.history:14 of -msgid "Flattening into a list: ::" -msgstr "" - -#: discord.ext.commands.Context.history:21 of -msgid "" -"The number of messages to retrieve. If ``None``, retrieves every message " -"in the channel. Note, however, that this would make it a slow operation." -msgstr "" - -#: discord.ext.commands.Context.history:25 of -msgid "" -"Retrieve messages before this date or message. If a date is provided it " -"must be a timezone-naive datetime representing UTC time." -msgstr "" - -#: discord.ext.commands.Context.history:28 of -msgid "" -"Retrieve messages after this date or message. If a date is provided it " -"must be a timezone-naive datetime representing UTC time." -msgstr "" - -#: discord.ext.commands.Context.history:31 of -msgid "" -"Retrieve messages around this date or message. If a date is provided it " -"must be a timezone-naive datetime representing UTC time. When using this " -"argument, the maximum limit is 101. Note that if the limit is an even " -"number then this will return at most limit + 1 messages." -msgstr "" - -#: discord.ext.commands.Context.history:36 of -msgid "" -"If set to ``True``, return messages in oldest->newest order. Defaults to " -"``True`` if ``after`` is specified, otherwise ``False``." -msgstr "" - -#: discord.ext.commands.Context.history:40 of -#, fuzzy -msgid "You do not have permissions to get channel message history." -msgstr ":exc:`.Forbidden` -- 指定のチャンネルを取得する権限がない。" - -#: discord.ext.commands.Context.history:41 of -msgid "The request to get message history failed." -msgstr "" - -#: discord.ext.commands.Context.history:43 of -msgid ":class:`~discord.Message` -- The message with the message data parsed." -msgstr "" - -#: discord.ext.commands.Context.typing:1 of -msgid "" -"Returns a context manager that allows you to type for an indefinite " -"period of time." -msgstr "" - -#: discord.ext.commands.Context.typing:3 of -msgid "This is useful for denoting long computations in your bot." -msgstr "" - -#: discord.ext.commands.Context.typing:7 of -msgid "" -"This is both a regular context manager and an async context manager. This" -" means that both ``with`` and ``async with`` work with this." -msgstr "" - -#: discord.ext.commands.Context.typing:10 of -msgid "Example Usage: ::" -msgstr "" - -#: discord.ext.commands.Context.invoke:3 of -msgid "Calls a command with the arguments given." -msgstr "" - -#: discord.ext.commands.Context.invoke:5 of -msgid "" -"This is useful if you want to just call the callback that a " -":class:`.Command` holds internally." -msgstr "" - -#: discord.ext.commands.Context.invoke:10 of -msgid "" -"This does not handle converters, checks, cooldowns, pre-invoke, or after-" -"invoke hooks in any matter. It calls the internal callback directly as-if" -" it was a regular function." -msgstr "" - -#: discord.ext.commands.Context.invoke:14 of -msgid "" -"You must take care in passing the proper arguments when using this " -"function." -msgstr "" - -#: discord.ext.commands.Context.invoke:19 of -msgid "The first parameter passed **must** be the command being invoked." -msgstr "" - -#: discord.ext.commands.Context.invoke:21 of -msgid "The command that is going to be called." -msgstr "" - -#: discord.ext.commands.Context.invoke:23 of -msgid "The arguments to to use." -msgstr "" - -#: discord.ext.commands.Context.invoke:24 of -msgid "The keyword arguments to use." -msgstr "" - -#: discord.ext.commands.Context.invoke:26 of -msgid "The command argument to invoke is missing." -msgstr "" - -#: discord.ext.commands.Context.reinvoke:3 of -msgid "Calls the command again." -msgstr "" - -#: discord.ext.commands.Context.reinvoke:5 of -msgid "" -"This is similar to :meth:`~.Context.invoke` except that it bypasses " -"checks, cooldowns, and error handlers." -msgstr "" - -#: discord.ext.commands.Context.reinvoke:10 of -msgid "" -"If you want to bypass :exc:`.UserInputError` derived exceptions, it is " -"recommended to use the regular :meth:`~.Context.invoke` as it will work " -"more naturally. After all, this will end up using the old arguments the " -"user has used and will thus just fail again." -msgstr "" - -#: discord.ext.commands.Context.reinvoke:16 of -msgid "Whether to call the before and after invoke hooks." -msgstr "" - -#: discord.ext.commands.Context.reinvoke:18 of -msgid "" -"Whether to start the call chain from the very beginning or where we left " -"off (i.e. the command that caused the error). The default is to start " -"where we left off." -msgstr "" - -#: discord.ext.commands.Context.reinvoke:23 of -msgid "The context to reinvoke is not valid." -msgstr "" - -#: discord.ext.commands.Context.valid:1 of -msgid "Checks if the invocation context is valid to be invoked with." -msgstr "" - -#: discord.ext.commands.Context.cog:1 of -msgid "" -"Returns the cog associated with this context's command. None if it does " -"not exist." -msgstr "" - -#: discord.ext.commands.Context.cog:3 of -#, fuzzy -msgid ":class:`.Cog`" -msgstr ":class:`.AppInfo`" - -#: discord.ext.commands.Context.guild:1 of -msgid "" -"Returns the guild associated with this context's command. None if not " -"available." -msgstr "" - -#: discord.ext.commands.Context.channel:1 of -msgid "" -":class:`.TextChannel`: Returns the channel associated with this context's" -" command. Shorthand for :attr:`.Message.channel`." -msgstr "" - -#: discord.ext.commands.Context.author:1 of -msgid "" -"Union[:class:`~discord.User`, :class:`.Member`]: Returns the author " -"associated with this context's command. Shorthand for " -":attr:`.Message.author`" -msgstr "" - -#: discord.ext.commands.Context.me:1 of -msgid "" -"Union[:class:`.Member`, :class:`.ClientUser`]: Similar to " -":attr:`.Guild.me` except it may return the :class:`.ClientUser` in " -"private message contexts." -msgstr "" - -#: discord.ext.commands.Context.voice_client:1 of -msgid "A shortcut to :attr:`.Guild.voice_client`\\, if applicable." -msgstr "" - -#: discord.ext.commands.Context.voice_client:3 of -msgid "Optional[:class:`.VoiceProtocol`]" -msgstr "" - -#: discord.ext.commands.Context.send_help:3 of -msgid "" -"Shows the help command for the specified entity if given. The entity can " -"be a command or a cog." -msgstr "" - -#: discord.ext.commands.Context.send_help:6 of -msgid "If no entity is given, then it'll show help for the entire bot." -msgstr "" - -#: discord.ext.commands.Context.send_help:9 of -msgid "" -"If the entity is a string, then it looks up whether it's a :class:`Cog` " -"or a :class:`Command`." -msgstr "" - -#: discord.ext.commands.Context.send_help:14 of -msgid "" -"Due to the way this function works, instead of returning something " -"similar to :meth:`~.commands.HelpCommand.command_not_found` this returns " -":class:`None` on bad input or no help command." -msgstr "" - -#: discord.ext.commands.Context.send_help:18 of -msgid "The entity to show help for." -msgstr "" - -#: discord.ext.commands.Context.send_help:21 of -msgid "The result of the help command, if any." -msgstr "" - -#: discord.ext.commands.Context.fetch_message:3 of -msgid "Retrieves a single :class:`~discord.Message` from the destination." -msgstr "" - -#: discord.ext.commands.Context.fetch_message:5 of -msgid "This can only be used by bot accounts." -msgstr "" - -#: discord.ext.commands.Context.fetch_message:7 of -msgid "The message ID to look for." -msgstr "" - -#: discord.ext.commands.Context.fetch_message:10 of -msgid "The specified message was not found." -msgstr "" - -#: discord.ext.commands.Context.fetch_message:11 of -msgid "You do not have the permissions required to get a message." -msgstr "" - -#: discord.ext.commands.Context.fetch_message:12 of -msgid "Retrieving the message failed." -msgstr "" - -#: discord.ext.commands.Context.fetch_message:14 of -msgid "The message asked for." -msgstr "" - -#: discord.ext.commands.Context.fetch_message:15 -#: discord.ext.commands.Context.send:49 of -msgid ":class:`~discord.Message`" -msgstr "" - -#: discord.ext.commands.Context.pins:3 of -msgid "Retrieves all messages that are currently pinned in the channel." -msgstr "" - -#: discord.ext.commands.Context.pins:7 of -msgid "" -"Due to a limitation with the Discord API, the :class:`.Message` objects " -"returned by this method do not contain complete " -":attr:`.Message.reactions` data." -msgstr "" - -#: discord.ext.commands.Context.pins:11 of -msgid "Retrieving the pinned messages failed." -msgstr "" - -#: discord.ext.commands.Context.pins:13 of -msgid "The messages that are currently pinned." -msgstr "" - -#: discord.ext.commands.Context.pins:14 of -msgid "List[:class:`~discord.Message`]" -msgstr "" - -#: discord.ext.commands.Context.send:3 of -msgid "Sends a message to the destination with the content given." -msgstr "" - -#: discord.ext.commands.Context.send:5 of -msgid "" -"The content must be a type that can convert to a string through " -"``str(content)``. If the content is set to ``None`` (the default), then " -"the ``embed`` parameter must be provided." -msgstr "" - -#: discord.ext.commands.Context.send:9 of -msgid "" -"To upload a single file, the ``file`` parameter should be used with a " -"single :class:`~discord.File` object. To upload multiple files, the " -"``files`` parameter should be used with a :class:`list` of " -":class:`~discord.File` objects. **Specifying both parameters will lead to" -" an exception**." -msgstr "" - -#: discord.ext.commands.Context.send:14 of -msgid "" -"If the ``embed`` parameter is provided, it must be of type " -":class:`~discord.Embed` and it must be a rich embed type." -msgstr "" - -#: discord.ext.commands.Context.send:17 of -msgid "The content of the message to send." -msgstr "" - -#: discord.ext.commands.Context.send:19 of -msgid "Indicates if the message should be sent using text-to-speech." -msgstr "" - -#: discord.ext.commands.Context.send:21 of -msgid "The rich embed for the content." -msgstr "" - -#: discord.ext.commands.Context.send:23 of -msgid "The file to upload." -msgstr "" - -#: discord.ext.commands.Context.send:25 of -msgid "A list of files to upload. Must be a maximum of 10." -msgstr "" - -#: discord.ext.commands.Context.send:27 of -msgid "" -"The nonce to use for sending this message. If the message was " -"successfully sent, then the message will have a nonce with this value." -msgstr "" - -#: discord.ext.commands.Context.send:30 of -msgid "" -"If provided, the number of seconds to wait in the background before " -"deleting the message we just sent. If the deletion fails, then it is " -"silently ignored." -msgstr "" - -#: discord.ext.commands.Context.send:34 of -msgid "" -"Controls the mentions being processed in this message. If this is passed," -" then the object is merged with :attr:`~discord.Client.allowed_mentions`." -" The merging behaviour only overrides attributes that have been " -"explicitly passed to the object, otherwise it uses the attributes set in " -":attr:`~discord.Client.allowed_mentions`. If no object is passed at all " -"then the defaults given by :attr:`~discord.Client.allowed_mentions` are " -"used instead. .. versionadded:: 1.4" -msgstr "" - -#: discord.ext.commands.Context.send:34 of -msgid "" -"Controls the mentions being processed in this message. If this is passed," -" then the object is merged with :attr:`~discord.Client.allowed_mentions`." -" The merging behaviour only overrides attributes that have been " -"explicitly passed to the object, otherwise it uses the attributes set in " -":attr:`~discord.Client.allowed_mentions`. If no object is passed at all " -"then the defaults given by :attr:`~discord.Client.allowed_mentions` are " -"used instead." -msgstr "" - -#: discord.ext.commands.Context.send:44 of -msgid "Sending the message failed." -msgstr "" - -#: discord.ext.commands.Context.send:45 of -msgid "You do not have the proper permissions to send the message." -msgstr "" - -#: discord.ext.commands.Context.send:46 of -msgid "" -"The ``files`` list is not of the appropriate size or you specified " -"both ``file`` and ``files``." -msgstr "" - -#: discord.ext.commands.Context.send:48 of -msgid "The message that was sent." -msgstr "" - -#: discord.ext.commands.Context.trigger_typing:3 of -msgid "Triggers a *typing* indicator to the destination." -msgstr "" - -#: discord.ext.commands.Context.trigger_typing:5 of -msgid "" -"*Typing* indicator will go away after 10 seconds, or after a message is " -"sent." -msgstr "" - -#: ../../ext/commands/api.rst:207 -msgid "Converters" -msgstr "" - -#: discord.ext.commands.Converter:1 of -msgid "" -"The base class of custom converters that require the :class:`.Context` to" -" be passed to be useful." -msgstr "" - -#: discord.ext.commands.Converter:4 of -msgid "" -"This allows you to implement converters that function similar to the " -"special cased ``discord`` classes." -msgstr "" - -#: discord.ext.commands.Converter:7 of -msgid "" -"Classes that derive from this should override the " -":meth:`~.Converter.convert` method to do its conversion logic. This " -"method must be a :ref:`coroutine `." -msgstr "" - -#: discord.ext.commands.CategoryChannelConverter.convert:3 -#: discord.ext.commands.ColourConverter.convert:3 -#: discord.ext.commands.Converter.convert:3 -#: discord.ext.commands.EmojiConverter.convert:3 -#: discord.ext.commands.GameConverter.convert:3 -#: discord.ext.commands.InviteConverter.convert:3 -#: discord.ext.commands.MemberConverter.convert:3 -#: discord.ext.commands.MessageConverter.convert:3 -#: discord.ext.commands.PartialEmojiConverter.convert:3 -#: discord.ext.commands.RoleConverter.convert:3 -#: discord.ext.commands.TextChannelConverter.convert:3 -#: discord.ext.commands.UserConverter.convert:3 -#: discord.ext.commands.VoiceChannelConverter.convert:3 -#: discord.ext.commands.clean_content.convert:3 of -msgid "The method to override to do conversion logic." -msgstr "" - -#: discord.ext.commands.CategoryChannelConverter.convert:5 -#: discord.ext.commands.ColourConverter.convert:5 -#: discord.ext.commands.Converter.convert:5 -#: discord.ext.commands.EmojiConverter.convert:5 -#: discord.ext.commands.GameConverter.convert:5 -#: discord.ext.commands.InviteConverter.convert:5 -#: discord.ext.commands.MemberConverter.convert:5 -#: discord.ext.commands.MessageConverter.convert:5 -#: discord.ext.commands.PartialEmojiConverter.convert:5 -#: discord.ext.commands.RoleConverter.convert:5 -#: discord.ext.commands.TextChannelConverter.convert:5 -#: discord.ext.commands.UserConverter.convert:5 -#: discord.ext.commands.VoiceChannelConverter.convert:5 -#: discord.ext.commands.clean_content.convert:5 of -msgid "" -"If an error is found while converting, it is recommended to raise a " -":exc:`.CommandError` derived exception as it will properly propagate to " -"the error handlers." -msgstr "" - -#: discord.ext.commands.CategoryChannelConverter.convert:9 -#: discord.ext.commands.ColourConverter.convert:9 -#: discord.ext.commands.Converter.convert:9 -#: discord.ext.commands.EmojiConverter.convert:9 -#: discord.ext.commands.GameConverter.convert:9 -#: discord.ext.commands.InviteConverter.convert:9 -#: discord.ext.commands.MemberConverter.convert:9 -#: discord.ext.commands.MessageConverter.convert:9 -#: discord.ext.commands.PartialEmojiConverter.convert:9 -#: discord.ext.commands.RoleConverter.convert:9 -#: discord.ext.commands.TextChannelConverter.convert:9 -#: discord.ext.commands.UserConverter.convert:9 -#: discord.ext.commands.VoiceChannelConverter.convert:9 -#: discord.ext.commands.clean_content.convert:9 of -msgid "The invocation context that the argument is being used in." -msgstr "" - -#: discord.ext.commands.CategoryChannelConverter.convert:11 -#: discord.ext.commands.ColourConverter.convert:11 -#: discord.ext.commands.Converter.convert:11 -#: discord.ext.commands.EmojiConverter.convert:11 -#: discord.ext.commands.GameConverter.convert:11 -#: discord.ext.commands.InviteConverter.convert:11 -#: discord.ext.commands.MemberConverter.convert:11 -#: discord.ext.commands.MessageConverter.convert:11 -#: discord.ext.commands.PartialEmojiConverter.convert:11 -#: discord.ext.commands.RoleConverter.convert:11 -#: discord.ext.commands.TextChannelConverter.convert:11 -#: discord.ext.commands.UserConverter.convert:11 -#: discord.ext.commands.VoiceChannelConverter.convert:11 -#: discord.ext.commands.clean_content.convert:11 of -msgid "The argument that is being converted." -msgstr "" - -#: discord.ext.commands.CategoryChannelConverter.convert:14 -#: discord.ext.commands.ColourConverter.convert:14 -#: discord.ext.commands.Converter.convert:14 -#: discord.ext.commands.EmojiConverter.convert:14 -#: discord.ext.commands.GameConverter.convert:14 -#: discord.ext.commands.InviteConverter.convert:14 -#: discord.ext.commands.MemberConverter.convert:14 -#: discord.ext.commands.MessageConverter.convert:14 -#: discord.ext.commands.PartialEmojiConverter.convert:14 -#: discord.ext.commands.RoleConverter.convert:14 -#: discord.ext.commands.TextChannelConverter.convert:14 -#: discord.ext.commands.UserConverter.convert:14 -#: discord.ext.commands.VoiceChannelConverter.convert:14 -#: discord.ext.commands.clean_content.convert:14 of -msgid "A generic exception occurred when converting the argument." -msgstr "" - -#: discord.ext.commands.CategoryChannelConverter.convert:15 -#: discord.ext.commands.ColourConverter.convert:15 -#: discord.ext.commands.Converter.convert:15 -#: discord.ext.commands.EmojiConverter.convert:15 -#: discord.ext.commands.GameConverter.convert:15 -#: discord.ext.commands.InviteConverter.convert:15 -#: discord.ext.commands.MemberConverter.convert:15 -#: discord.ext.commands.MessageConverter.convert:15 -#: discord.ext.commands.PartialEmojiConverter.convert:15 -#: discord.ext.commands.RoleConverter.convert:15 -#: discord.ext.commands.TextChannelConverter.convert:15 -#: discord.ext.commands.UserConverter.convert:15 -#: discord.ext.commands.VoiceChannelConverter.convert:15 -#: discord.ext.commands.clean_content.convert:15 of -msgid "The converter failed to convert the argument." -msgstr "" - -#: discord.ext.commands.MemberConverter:1 of -msgid "Converts to a :class:`~discord.Member`." -msgstr "" - -#: discord.ext.commands.CategoryChannelConverter:3 -#: discord.ext.commands.MemberConverter:3 discord.ext.commands.RoleConverter:3 -#: discord.ext.commands.TextChannelConverter:3 -#: discord.ext.commands.VoiceChannelConverter:3 of -msgid "" -"All lookups are via the local guild. If in a DM context, then the lookup " -"is done by the global cache." -msgstr "" - -#: discord.ext.commands.CategoryChannelConverter:6 -#: discord.ext.commands.EmojiConverter:6 discord.ext.commands.MemberConverter:6 -#: discord.ext.commands.MessageConverter:5 discord.ext.commands.RoleConverter:6 -#: discord.ext.commands.TextChannelConverter:6 -#: discord.ext.commands.UserConverter:5 -#: discord.ext.commands.VoiceChannelConverter:6 of -msgid "The lookup strategy is as follows (in order):" -msgstr "" - -#: discord.ext.commands.CategoryChannelConverter:8 -#: discord.ext.commands.EmojiConverter:8 discord.ext.commands.MemberConverter:8 -#: discord.ext.commands.RoleConverter:8 -#: discord.ext.commands.TextChannelConverter:8 -#: discord.ext.commands.UserConverter:7 -#: discord.ext.commands.VoiceChannelConverter:8 of -msgid "Lookup by ID." -msgstr "" - -#: discord.ext.commands.CategoryChannelConverter:9 -#: discord.ext.commands.MemberConverter:9 discord.ext.commands.RoleConverter:9 -#: discord.ext.commands.TextChannelConverter:9 -#: discord.ext.commands.UserConverter:8 -#: discord.ext.commands.VoiceChannelConverter:9 of -msgid "Lookup by mention." -msgstr "" - -#: discord.ext.commands.MemberConverter:10 discord.ext.commands.UserConverter:9 -#: of -msgid "Lookup by name#discrim" -msgstr "" - -#: discord.ext.commands.CategoryChannelConverter:10 -#: discord.ext.commands.EmojiConverter:10 -#: discord.ext.commands.MemberConverter:11 -#: discord.ext.commands.RoleConverter:10 -#: discord.ext.commands.TextChannelConverter:10 -#: discord.ext.commands.UserConverter:10 -#: discord.ext.commands.VoiceChannelConverter:10 of -msgid "Lookup by name" -msgstr "" - -#: discord.ext.commands.MemberConverter:12 of -msgid "Lookup by nickname" -msgstr "" - -#: discord.ext.commands.MemberConverter:14 of -msgid "Raise :exc:`.MemberNotFound` instead of generic :exc:`.BadArgument`" -msgstr "" - -#: discord.ext.commands.MemberConverter:17 of -msgid "" -"This converter now lazily fetches members from the gateway and HTTP APIs," -" optionally caching the result if :attr:`.MemberCacheFlags.joined` is " -"enabled." -msgstr "" - -#: discord.ext.commands.UserConverter:1 of -msgid "Converts to a :class:`~discord.User`." -msgstr "" - -#: discord.ext.commands.UserConverter:3 of -msgid "All lookups are via the global user cache." -msgstr "" - -#: discord.ext.commands.UserConverter:12 of -msgid "Raise :exc:`.UserNotFound` instead of generic :exc:`.BadArgument`" -msgstr "" - -#: discord.ext.commands.MessageConverter:1 of -msgid "Converts to a :class:`discord.Message`." -msgstr "" - -#: discord.ext.commands.MessageConverter:7 of -msgid "" -"Lookup by \"{channel ID}-{message ID}\" (retrieved by shift-clicking on " -"\"Copy ID\")" -msgstr "" - -#: discord.ext.commands.MessageConverter:8 of -msgid "Lookup by message ID (the message **must** be in the context channel)" -msgstr "" - -#: discord.ext.commands.MessageConverter:9 of -msgid "Lookup by message URL" -msgstr "" - -#: discord.ext.commands.MessageConverter:11 of -msgid "" -"Raise :exc:`.ChannelNotFound`, `MessageNotFound` or `ChannelNotReadable` " -"instead of generic :exc:`.BadArgument`" -msgstr "" - -#: discord.ext.commands.TextChannelConverter:1 of -msgid "Converts to a :class:`~discord.TextChannel`." -msgstr "" - -#: discord.ext.commands.CategoryChannelConverter:12 -#: discord.ext.commands.TextChannelConverter:12 -#: discord.ext.commands.VoiceChannelConverter:12 of -msgid "Raise :exc:`.ChannelNotFound` instead of generic :exc:`.BadArgument`" -msgstr "" - -#: discord.ext.commands.VoiceChannelConverter:1 of -msgid "Converts to a :class:`~discord.VoiceChannel`." -msgstr "" - -#: discord.ext.commands.CategoryChannelConverter:1 of -msgid "Converts to a :class:`~discord.CategoryChannel`." -msgstr "" - -#: discord.ext.commands.InviteConverter:1 of -msgid "Converts to a :class:`~discord.Invite`." -msgstr "" - -#: discord.ext.commands.InviteConverter:3 of -msgid "This is done via an HTTP request using :meth:`.Bot.fetch_invite`." -msgstr "" - -#: discord.ext.commands.InviteConverter:5 of -msgid "Raise :exc:`.BadInviteArgument` instead of generic :exc:`.BadArgument`" -msgstr "" - -#: discord.ext.commands.RoleConverter:1 of -msgid "Converts to a :class:`~discord.Role`." -msgstr "" - -#: discord.ext.commands.RoleConverter:12 of -msgid "Raise :exc:`.RoleNotFound` instead of generic :exc:`.BadArgument`" -msgstr "" - -#: discord.ext.commands.GameConverter:1 of -msgid "Converts to :class:`~discord.Game`." -msgstr "" - -#: discord.ext.commands.ColourConverter:1 of -msgid "Converts to a :class:`~discord.Colour`." -msgstr "" - -#: discord.ext.commands.ColourConverter:3 of -msgid "Add an alias named ColorConverter" -msgstr "" - -#: discord.ext.commands.ColourConverter:6 of -msgid "The following formats are accepted:" -msgstr "" - -#: discord.ext.commands.ColourConverter:8 of -msgid "``0x``" -msgstr "" - -#: discord.ext.commands.ColourConverter:9 of -msgid "``#``" -msgstr "" - -#: discord.ext.commands.ColourConverter:10 of -msgid "``0x#``" -msgstr "" - -#: discord.ext.commands.ColourConverter:11 of -msgid "Any of the ``classmethod`` in :class:`Colour`" -msgstr "" - -#: discord.ext.commands.ColourConverter:13 of -msgid "The ``_`` in the name can be optionally replaced with spaces." -msgstr "" - -#: discord.ext.commands.ColourConverter:15 of -msgid "Raise :exc:`.BadColourArgument` instead of generic :exc:`.BadArgument`" -msgstr "" - -#: discord.ext.commands.EmojiConverter:1 of -msgid "Converts to a :class:`~discord.Emoji`." -msgstr "" - -#: discord.ext.commands.EmojiConverter:3 of -msgid "" -"All lookups are done for the local guild first, if available. If that " -"lookup fails, then it checks the client's global cache." -msgstr "" - -#: discord.ext.commands.EmojiConverter:9 of -msgid "Lookup by extracting ID from the emoji." -msgstr "" - -#: discord.ext.commands.EmojiConverter:12 of -msgid "Raise :exc:`.EmojiNotFound` instead of generic :exc:`.BadArgument`" -msgstr "" - -#: discord.ext.commands.PartialEmojiConverter:1 of -msgid "Converts to a :class:`~discord.PartialEmoji`." -msgstr "" - -#: discord.ext.commands.PartialEmojiConverter:3 of -msgid "This is done by extracting the animated flag, name and ID from the emoji." -msgstr "" - -#: discord.ext.commands.PartialEmojiConverter:5 of -msgid "" -"Raise :exc:`.PartialEmojiConversionFailure` instead of generic " -":exc:`.BadArgument`" -msgstr "" - -#: discord.ext.commands.clean_content:1 of -msgid "Converts the argument to mention scrubbed version of said content." -msgstr "" - -#: discord.ext.commands.clean_content:4 of -msgid "This behaves similarly to :attr:`~discord.Message.clean_content`." -msgstr "" - -#: discord.ext.commands.clean_content:8 of -msgid "Whether to clean channel mentions." -msgstr "" - -#: discord.ext.commands.clean_content:14 of -msgid "Whether to use nicknames when transforming mentions." -msgstr "" - -#: discord.ext.commands.clean_content:20 of -msgid "Whether to also escape special markdown characters." -msgstr "" - -#: ../../ext/commands/api.rst:253 -msgid "" -"A special converter that greedily consumes arguments until it can't. As a" -" consequence of this behaviour, most input errors are silently discarded," -" since it is used as an indicator of when to stop parsing." -msgstr "" - -#: ../../ext/commands/api.rst:257 -msgid "" -"When a parser error is met the greedy converter stops converting, undoes " -"the internal string parsing routine, and continues parsing regularly." -msgstr "" - -#: ../../ext/commands/api.rst:260 -msgid "For example, in the following code:" -msgstr "" - -#: ../../ext/commands/api.rst:268 -msgid "" -"An invocation of ``[p]test 1 2 3 4 5 6 hello`` would pass ``numbers`` " -"with ``[1, 2, 3, 4, 5, 6]`` and ``reason`` with ``hello``\\." -msgstr "" - -#: ../../ext/commands/api.rst:271 -msgid "For more information, check :ref:`ext_commands_special_converters`." -msgstr "" - -#: ../../ext/commands/api.rst:276 -msgid "Exceptions" -msgstr "" - -#: discord.ext.commands.CommandError:1 of -msgid "The base exception type for all command related errors." -msgstr "コマンドに関連するエラーすべての基礎となる例外。" - -#: discord.ext.commands.CommandError:3 of -msgid "This inherits from :exc:`discord.DiscordException`." -msgstr "これは :exc:`discord.DiscordException` を継承しています。" - -#: discord.ext.commands.CommandError:5 of -msgid "" -"This exception and exceptions inherited from it are handled in a special " -"way as they are caught and passed into a special event from " -":class:`.Bot`\\, :func:`on_command_error`." -msgstr "" - -#: discord.ext.commands.ConversionError:1 of -msgid "Exception raised when a Converter class raises non-CommandError." -msgstr "Converter クラスで、CommandErrorではない例外が発生した際に、発生する例外。" - -#: discord.ext.commands.CommandNotFound:7 -#: discord.ext.commands.ConversionError:3 -#: discord.ext.commands.MaxConcurrencyReached:3 -#: discord.ext.commands.UserInputError:4 of -msgid "This inherits from :exc:`CommandError`." -msgstr "" - -#: discord.ext.commands.ConversionError:7 of -msgid "The converter that failed." -msgstr "" - -#: discord.ext.commands.ConversionError:9 of -msgid ":class:`discord.ext.commands.Converter`" -msgstr "" - -#: discord.ext.commands.CommandInvokeError:7 -#: discord.ext.commands.ConversionError:13 -#: discord.ext.commands.ExtensionFailed:13 of -msgid "" -"The original exception that was raised. You can also get this via the " -"``__cause__`` attribute." -msgstr "Converter内で発生した元の例外。 ``__cause__`` からも取得できます。" - -#: discord.ext.commands.CommandInvokeError:10 -#: discord.ext.commands.ConversionError:16 -#: discord.ext.commands.ExtensionFailed:16 of -msgid ":exc:`Exception`" -msgstr "" - -#: discord.ext.commands.MissingRequiredArgument:1 of -msgid "" -"Exception raised when parsing a command and a parameter that is required " -"is not encountered." -msgstr "コマンドのパラメータ解析の際、要求されたパラメータに値が渡されていない場合に発生します。" - -#: discord.ext.commands.BadArgument:4 discord.ext.commands.BadUnionArgument:4 -#: discord.ext.commands.MissingRequiredArgument:4 -#: discord.ext.commands.TooManyArguments:4 of -msgid "This inherits from :exc:`UserInputError`" -msgstr "" - -#: discord.ext.commands.MissingRequiredArgument:8 of -msgid "The argument that is missing." -msgstr "" - -#: discord.ext.commands.BadUnionArgument:10 -#: discord.ext.commands.MissingRequiredArgument:10 of -msgid ":class:`inspect.Parameter`" -msgstr "" - -#: discord.ext.commands.ArgumentParsingError:1 of -msgid "An exception raised when the parser fails to parse a user's input." -msgstr "" - -#: discord.ext.commands.ArgumentParsingError:3 of -msgid "This inherits from :exc:`UserInputError`." -msgstr "" - -#: discord.ext.commands.ArgumentParsingError:5 of -msgid "" -"There are child classes that implement more granular parsing errors for " -"i18n purposes." -msgstr "" - -#: discord.ext.commands.UnexpectedQuoteError:1 of -msgid "" -"An exception raised when the parser encounters a quote mark inside a non-" -"quoted string." -msgstr "" - -#: discord.ext.commands.ExpectedClosingQuoteError:3 -#: discord.ext.commands.InvalidEndOfQuotedStringError:4 -#: discord.ext.commands.UnexpectedQuoteError:3 of -msgid "This inherits from :exc:`ArgumentParsingError`." -msgstr "" - -#: discord.ext.commands.UnexpectedQuoteError:7 of -msgid "The quote mark that was found inside the non-quoted string." -msgstr "" - -#: discord.ext.commands.InvalidEndOfQuotedStringError:1 of -msgid "" -"An exception raised when a space is expected after the closing quote in a" -" string but a different character is found." -msgstr "" - -#: discord.ext.commands.InvalidEndOfQuotedStringError:8 of -msgid "The character found instead of the expected string." -msgstr "" - -#: discord.ext.commands.ExpectedClosingQuoteError:1 of -msgid "An exception raised when a quote character is expected but not found." -msgstr "" - -#: discord.ext.commands.ExpectedClosingQuoteError:7 of -msgid "The quote character expected." -msgstr "" - -#: discord.ext.commands.BadArgument:1 of -msgid "" -"Exception raised when a parsing or conversion failure is encountered on " -"an argument to pass into a command." -msgstr "コマンドの引数に渡された値の解析、または変換に失敗した場合に発生する例外。" - -#: discord.ext.commands.BadUnionArgument:1 of -msgid "" -"Exception raised when a :data:`typing.Union` converter fails for all its " -"associated types." -msgstr "" - -#: discord.ext.commands.BadUnionArgument:8 of -msgid "The parameter that failed being converted." -msgstr "" - -#: discord.ext.commands.BadUnionArgument:14 of -msgid "A tuple of converters attempted in conversion, in order of failure." -msgstr "" - -#: discord.ext.commands.BadUnionArgument:16 of -msgid "Tuple[Type, ...]" -msgstr "" - -#: discord.ext.commands.BadUnionArgument:20 of -msgid "A list of errors that were caught from failing the conversion." -msgstr "" - -#: discord.ext.commands.BadUnionArgument:22 of -msgid "List[:class:`CommandError`]" -msgstr "" - -#: discord.ext.commands.PrivateMessageOnly:1 of -msgid "" -"Exception raised when an operation does not work outside of private " -"message contexts." -msgstr "" - -#: discord.ext.commands.BotMissingAnyRole:4 -#: discord.ext.commands.BotMissingPermissions:4 -#: discord.ext.commands.BotMissingRole:3 discord.ext.commands.MissingAnyRole:4 -#: discord.ext.commands.MissingPermissions:4 discord.ext.commands.MissingRole:3 -#: discord.ext.commands.NoPrivateMessage:4 discord.ext.commands.NotOwner:3 -#: discord.ext.commands.PrivateMessageOnly:4 of -msgid "This inherits from :exc:`CheckFailure`" -msgstr "" - -#: discord.ext.commands.NoPrivateMessage:1 of -msgid "" -"Exception raised when an operation does not work in private message " -"contexts." -msgstr "プライベートメッセージコンテキストで、要求された処理が実行できない場合に発生する例外。" - -#: discord.ext.commands.CheckFailure:1 of -msgid "" -"Exception raised when the predicates in :attr:`.Command.checks` have " -"failed." -msgstr "" - -#: discord.ext.commands.CheckFailure:3 -#: discord.ext.commands.CommandInvokeError:3 -#: discord.ext.commands.CommandOnCooldown:3 -#: discord.ext.commands.DisabledCommand:3 of -msgid "This inherits from :exc:`CommandError`" -msgstr "" - -#: discord.ext.commands.CheckAnyFailure:1 of -msgid "Exception raised when all predicates in :func:`check_any` fail." -msgstr "" - -#: discord.ext.commands.CheckAnyFailure:3 -#: discord.ext.commands.NSFWChannelRequired:3 of -msgid "This inherits from :exc:`CheckFailure`." -msgstr "" - -#: discord.ext.commands.CheckAnyFailure:9 of -msgid "A list of errors that were caught during execution." -msgstr "" - -#: discord.ext.commands.CheckAnyFailure:11 of -msgid "List[:class:`CheckFailure`]" -msgstr "" - -#: discord.ext.commands.CheckAnyFailure:15 of -msgid "A list of check predicates that failed." -msgstr "" - -#: discord.ext.commands.CheckAnyFailure:17 of -msgid "List[Callable[[:class:`Context`], :class:`bool`]]" -msgstr "" - -#: discord.ext.commands.CommandNotFound:1 of -msgid "" -"Exception raised when a command is attempted to be invoked but no command" -" under that name is found." -msgstr "コマンドを呼び出す際に、指定された名前を持つコマンドが存在していなかった場合に発生する例外。" - -#: discord.ext.commands.CommandNotFound:4 of -msgid "" -"This is not raised for invalid subcommands, rather just the initial main " -"command that is attempted to be invoked." -msgstr "" - -#: discord.ext.commands.DisabledCommand:1 of -msgid "Exception raised when the command being invoked is disabled." -msgstr "呼び出そうとしたコマンドが無効化されていた際に発生する例外。" - -#: discord.ext.commands.CommandInvokeError:1 of -msgid "Exception raised when the command being invoked raised an exception." -msgstr "" - -#: discord.ext.commands.TooManyArguments:1 of -msgid "" -"Exception raised when the command was passed too many arguments and its " -":attr:`.Command.ignore_extra` attribute was not set to ``True``." -msgstr "" - -#: discord.ext.commands.UserInputError:1 of -msgid "" -"The base exception type for errors that involve errors regarding user " -"input." -msgstr "" - -#: discord.ext.commands.CommandOnCooldown:1 of -msgid "Exception raised when the command being invoked is on cooldown." -msgstr "" - -#: discord.ext.commands.CommandOnCooldown:7 of -msgid "" -"A class with attributes ``rate``, ``per``, and ``type`` similar to the " -":func:`.cooldown` decorator." -msgstr "" - -#: discord.ext.commands.CommandOnCooldown:10 of -msgid "Cooldown" -msgstr "" - -#: discord.ext.commands.CommandOnCooldown:14 of -msgid "The amount of seconds to wait before you can retry again." -msgstr "" - -#: discord.ext.commands.MaxConcurrencyReached:1 of -#, fuzzy -msgid "" -"Exception raised when the command being invoked has reached its maximum " -"concurrency." -msgstr "呼び出そうとしたコマンドが無効化されていた際に発生する例外。" - -#: discord.ext.commands.MaxConcurrencyReached:7 of -msgid "The maximum number of concurrent invokers allowed." -msgstr "" - -#: discord.ext.commands.MaxConcurrencyReached:13 of -msgid "The bucket type passed to the :func:`.max_concurrency` decorator." -msgstr "" - -#: discord.ext.commands.MaxConcurrencyReached:15 of -#, fuzzy -msgid ":class:`.BucketType`" -msgstr ":class:`.Guild`" - -#: discord.ext.commands.NotOwner:1 of -msgid "Exception raised when the message author is not the owner of the bot." -msgstr "" - -#: discord.ext.commands.MessageNotFound:1 of -msgid "Exception raised when the message provided was not found in the channel." -msgstr "" - -#: discord.ext.commands.BadBoolArgument:3 -#: discord.ext.commands.ChannelNotFound:3 -#: discord.ext.commands.ChannelNotReadable:4 -#: discord.ext.commands.EmojiNotFound:3 discord.ext.commands.MemberNotFound:4 -#: discord.ext.commands.MessageNotFound:3 -#: discord.ext.commands.PartialEmojiConversionFailure:4 -#: discord.ext.commands.RoleNotFound:3 discord.ext.commands.UserNotFound:4 of -#, fuzzy -msgid "This inherits from :exc:`BadArgument`" -msgstr "これは :exc:`discord.DiscordException` を継承しています。" - -#: discord.ext.commands.MessageNotFound:9 of -msgid "The message supplied by the caller that was not found" -msgstr "" - -#: discord.ext.commands.MemberNotFound:1 of -msgid "" -"Exception raised when the member provided was not found in the bot's " -"cache." -msgstr "" - -#: discord.ext.commands.MemberNotFound:10 of -msgid "The member supplied by the caller that was not found" -msgstr "" - -#: discord.ext.commands.UserNotFound:1 of -msgid "Exception raised when the user provided was not found in the bot's cache." -msgstr "" - -#: discord.ext.commands.UserNotFound:10 of -msgid "The user supplied by the caller that was not found" -msgstr "" - -#: discord.ext.commands.ChannelNotFound:1 of -#, fuzzy -msgid "Exception raised when the bot can not find the channel." -msgstr "呼び出そうとしたコマンドが無効化されていた際に発生する例外。" - -#: discord.ext.commands.ChannelNotFound:9 of -msgid "The channel supplied by the caller that was not found" -msgstr "" - -#: discord.ext.commands.ChannelNotReadable:1 of -#, fuzzy -msgid "" -"Exception raised when the bot does not have permission to read messages " -"in the channel." -msgstr ":exc:`.Forbidden` -- 指定のチャンネルを取得する権限がない。" - -#: discord.ext.commands.ChannelNotReadable:10 of -msgid "The channel supplied by the caller that was not readable" -msgstr "" - -#: discord.ext.commands.ChannelNotReadable:12 of -#, fuzzy -msgid ":class:`.abc.GuildChannel`" -msgstr ":class:`.Guild`" - -#: discord.ext.commands.RoleNotFound:1 of -#, fuzzy -msgid "Exception raised when the bot can not find the role." -msgstr "呼び出そうとしたコマンドが無効化されていた際に発生する例外。" - -#: discord.ext.commands.RoleNotFound:9 of -msgid "The role supplied by the caller that was not found" -msgstr "" - -#: discord.ext.commands.EmojiNotFound:1 of -msgid "Exception raised when the bot can not find the emoji." -msgstr "" - -#: discord.ext.commands.EmojiNotFound:9 of -msgid "The emoji supplied by the caller that was not found" -msgstr "" - -#: discord.ext.commands.PartialEmojiConversionFailure:1 of -msgid "" -"Exception raised when the emoji provided does not match the correct " -"format." -msgstr "" - -#: discord.ext.commands.PartialEmojiConversionFailure:10 of -msgid "The emoji supplied by the caller that did not match the regex" -msgstr "" - -#: discord.ext.commands.BadBoolArgument:1 of -msgid "Exception raised when a boolean argument was not convertible." -msgstr "" - -#: discord.ext.commands.BadBoolArgument:9 of -msgid "" -"The boolean argument supplied by the caller that is not in the predefined" -" list" -msgstr "" - -#: discord.ext.commands.MissingPermissions:1 of -msgid "" -"Exception raised when the command invoker lacks permissions to run a " -"command." -msgstr "" - -#: discord.ext.commands.BotMissingPermissions:8 -#: discord.ext.commands.MissingPermissions:8 of -msgid "The required permissions that are missing." -msgstr "" - -#: discord.ext.commands.BotMissingPermissions:1 of -msgid "Exception raised when the bot's member lacks permissions to run a command." -msgstr "" - -#: discord.ext.commands.MissingRole:1 of -msgid "Exception raised when the command invoker lacks a role to run a command." -msgstr "" - -#: discord.ext.commands.BotMissingRole:9 discord.ext.commands.MissingRole:9 of -msgid "" -"The required role that is missing. This is the parameter passed to " -":func:`~.commands.has_role`." -msgstr "" - -#: discord.ext.commands.BotMissingRole:12 discord.ext.commands.MissingRole:12 -#: of -msgid "Union[:class:`str`, :class:`int`]" -msgstr "" - -#: discord.ext.commands.BotMissingRole:1 of -msgid "Exception raised when the bot's member lacks a role to run a command." -msgstr "" - -#: discord.ext.commands.MissingAnyRole:1 of -msgid "" -"Exception raised when the command invoker lacks any of the roles " -"specified to run a command." -msgstr "" - -#: discord.ext.commands.MissingAnyRole:10 of -msgid "" -"The roles that the invoker is missing. These are the parameters passed to" -" :func:`~.commands.has_any_role`." -msgstr "" - -#: discord.ext.commands.BotMissingAnyRole:13 -#: discord.ext.commands.MissingAnyRole:13 of -msgid "List[Union[:class:`str`, :class:`int`]]" -msgstr "" - -#: discord.ext.commands.BotMissingAnyRole:1 of -msgid "" -"Exception raised when the bot's member lacks any of the roles specified " -"to run a command." -msgstr "" - -#: discord.ext.commands.BotMissingAnyRole:10 of -msgid "" -"The roles that the bot's member is missing. These are the parameters " -"passed to :func:`~.commands.has_any_role`." -msgstr "" - -#: discord.ext.commands.NSFWChannelRequired:1 of -msgid "Exception raised when a channel does not have the required NSFW setting." -msgstr "" - -#: discord.ext.commands.NSFWChannelRequired:7 of -msgid "The channel that does not have NSFW enabled." -msgstr "" - -#: discord.ext.commands.ExtensionError:1 of -msgid "Base exception for extension related errors." -msgstr "" - -#: discord.ext.commands.ExtensionError:3 of -msgid "This inherits from :exc:`~discord.DiscordException`." -msgstr "" - -#: discord.ext.commands.ExtensionError:7 of -msgid "The extension that had an error." -msgstr "" - -#: discord.ext.commands.ExtensionAlreadyLoaded:1 of -msgid "An exception raised when an extension has already been loaded." -msgstr "" - -#: discord.ext.commands.ExtensionAlreadyLoaded:3 -#: discord.ext.commands.ExtensionFailed:3 -#: discord.ext.commands.ExtensionNotFound:3 -#: discord.ext.commands.ExtensionNotLoaded:3 -#: discord.ext.commands.NoEntryPointError:3 of -msgid "This inherits from :exc:`ExtensionError`" -msgstr "" - -#: discord.ext.commands.ExtensionNotLoaded:1 of -msgid "An exception raised when an extension was not loaded." -msgstr "" - -#: discord.ext.commands.NoEntryPointError:1 of -msgid "" -"An exception raised when an extension does not have a ``setup`` entry " -"point function." -msgstr "" - -#: discord.ext.commands.ExtensionFailed:1 of -msgid "" -"An exception raised when an extension failed to load during execution of " -"the module or ``setup`` entry point." -msgstr "" - -#: discord.ext.commands.ExtensionFailed:7 -#: discord.ext.commands.ExtensionNotFound:10 of -msgid "The extension that had the error." -msgstr "" - -#: discord.ext.commands.ExtensionNotFound:1 of -#, fuzzy -msgid "An exception raised when an extension is not found." -msgstr "プライベートメッセージコンテキストで、要求された処理が実行できない場合に発生する例外。" - -#: discord.ext.commands.ExtensionNotFound:5 of -msgid "Made the ``original`` attribute always None." -msgstr "" - -#: discord.ext.commands.ExtensionNotFound:16 of -msgid "Always ``None`` for backwards compatibility." -msgstr "" - -#: discord.ext.commands.ExtensionNotFound:18 of -msgid ":class:`NoneType`" -msgstr "" - -#: discord.ext.commands.CommandRegistrationError:1 of -msgid "" -"An exception raised when the command can't be added because the name is " -"already taken by a different command." -msgstr "" - -#: discord.ext.commands.CommandRegistrationError:4 of -#, fuzzy -msgid "This inherits from :exc:`discord.ClientException`" -msgstr "これは :exc:`discord.DiscordException` を継承しています。" - -#: discord.ext.commands.CommandRegistrationError:10 of -msgid "The command name that had the error." -msgstr "" - -#: discord.ext.commands.CommandRegistrationError:16 of -msgid "Whether the name that conflicts is an alias of the command we try to add." -msgstr "" - -#: ../../ext/commands/api.rst:412 -msgid "Exception Hierarchy" -msgstr "" - -#: ../../ext/commands/api.rst:460 -msgid ":exc:`~.DiscordException`" -msgstr "" - -#: ../../ext/commands/api.rst:454 -msgid ":exc:`~.commands.CommandError`" -msgstr "" - -#: ../../ext/commands/api.rst:418 -msgid ":exc:`~.commands.ConversionError`" -msgstr "" - -#: ../../ext/commands/api.rst:437 -msgid ":exc:`~.commands.UserInputError`" -msgstr "" - -#: ../../ext/commands/api.rst:420 -msgid ":exc:`~.commands.MissingRequiredArgument`" -msgstr "" - -#: ../../ext/commands/api.rst:421 -msgid ":exc:`~.commands.TooManyArguments`" -msgstr "" - -#: ../../ext/commands/api.rst:432 -msgid ":exc:`~.commands.BadArgument`" -msgstr "" - -#: ../../ext/commands/api.rst:423 -msgid ":exc:`~.commands.MessageNotFound`" -msgstr "" - -#: ../../ext/commands/api.rst:424 -msgid ":exc:`~.commands.MemberNotFound`" -msgstr "" - -#: ../../ext/commands/api.rst:425 -msgid ":exc:`~.commands.UserNotFound`" -msgstr "" - -#: ../../ext/commands/api.rst:426 -msgid ":exc:`~.commands.ChannelNotFound`" -msgstr "" - -#: ../../ext/commands/api.rst:427 -msgid ":exc:`~.commands.ChannelNotReadable`" -msgstr "" - -#: ../../ext/commands/api.rst:428 -msgid ":exc:`~.commands.BadColourArgument`" -msgstr "" - -#: ../../ext/commands/api.rst:429 -msgid ":exc:`~.commands.RoleNotFound`" -msgstr "" - -#: ../../ext/commands/api.rst:430 -msgid ":exc:`~.commands.BadInviteArgument`" -msgstr "" - -#: ../../ext/commands/api.rst:431 -msgid ":exc:`~.commands.EmojiNotFound`" -msgstr "" - -#: ../../ext/commands/api.rst:432 -msgid ":exc:`~.commands.PartialEmojiConversionFailure`" -msgstr "" - -#: ../../ext/commands/api.rst:433 -msgid ":exc:`~.commands.BadBoolArgument`" -msgstr "" - -#: ../../ext/commands/api.rst:434 -msgid ":exc:`~.commands.BadUnionArgument`" -msgstr "" - -#: ../../ext/commands/api.rst:437 -msgid ":exc:`~.commands.ArgumentParsingError`" -msgstr "" - -#: ../../ext/commands/api.rst:436 -msgid ":exc:`~.commands.UnexpectedQuoteError`" -msgstr "" - -#: ../../ext/commands/api.rst:437 -msgid ":exc:`~.commands.InvalidEndOfQuotedStringError`" -msgstr "" - -#: ../../ext/commands/api.rst:438 -msgid ":exc:`~.commands.ExpectedClosingQuoteError`" -msgstr "" - -#: ../../ext/commands/api.rst:439 -msgid ":exc:`~.commands.CommandNotFound`" -msgstr "" - -#: ../../ext/commands/api.rst:450 -msgid ":exc:`~.commands.CheckFailure`" -msgstr "" - -#: ../../ext/commands/api.rst:441 -msgid ":exc:`~.commands.CheckAnyFailure`" -msgstr "" - -#: ../../ext/commands/api.rst:442 -msgid ":exc:`~.commands.PrivateMessageOnly`" -msgstr "" - -#: ../../ext/commands/api.rst:443 -msgid ":exc:`~.commands.NoPrivateMessage`" -msgstr "" - -#: ../../ext/commands/api.rst:444 -msgid ":exc:`~.commands.NotOwner`" -msgstr "" - -#: ../../ext/commands/api.rst:445 -msgid ":exc:`~.commands.MissingPermissions`" -msgstr "" - -#: ../../ext/commands/api.rst:446 -msgid ":exc:`~.commands.BotMissingPermissions`" -msgstr "" - -#: ../../ext/commands/api.rst:447 -msgid ":exc:`~.commands.MissingRole`" -msgstr "" - -#: ../../ext/commands/api.rst:448 -msgid ":exc:`~.commands.BotMissingRole`" -msgstr "" - -#: ../../ext/commands/api.rst:449 -msgid ":exc:`~.commands.MissingAnyRole`" -msgstr "" - -#: ../../ext/commands/api.rst:450 -msgid ":exc:`~.commands.BotMissingAnyRole`" -msgstr "" - -#: ../../ext/commands/api.rst:451 -msgid ":exc:`~.commands.NSFWChannelRequired`" -msgstr "" - -#: ../../ext/commands/api.rst:452 -msgid ":exc:`~.commands.DisabledCommand`" -msgstr "" - -#: ../../ext/commands/api.rst:453 -msgid ":exc:`~.commands.CommandInvokeError`" -msgstr "" - -#: ../../ext/commands/api.rst:454 -msgid ":exc:`~.commands.CommandOnCooldown`" -msgstr "" - -#: ../../ext/commands/api.rst:455 -msgid ":exc:`~.commands.MaxConcurrencyReached`" -msgstr "" - -#: ../../ext/commands/api.rst:460 -msgid ":exc:`~.commands.ExtensionError`" -msgstr "" - -#: ../../ext/commands/api.rst:457 -msgid ":exc:`~.commands.ExtensionAlreadyLoaded`" -msgstr "" - -#: ../../ext/commands/api.rst:458 -msgid ":exc:`~.commands.ExtensionNotLoaded`" -msgstr "" - -#: ../../ext/commands/api.rst:459 -msgid ":exc:`~.commands.NoEntryPointError`" -msgstr "" - -#: ../../ext/commands/api.rst:460 -msgid ":exc:`~.commands.ExtensionFailed`" -msgstr "" - -#: ../../ext/commands/api.rst:461 -msgid ":exc:`~.commands.ExtensionNotFound`" -msgstr "" - -#: ../../ext/commands/api.rst:462 -msgid ":exc:`~.ClientException`" -msgstr "" - -#: ../../ext/commands/api.rst:463 -msgid ":exc:`~.commands.CommandRegistrationError`" -msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- Whether the commands " -#~ "should be case insensitive. Defaults to" -#~ " ``False``. This attribute does not " -#~ "carry over to groups. You must set" -#~ " it to every group if you " -#~ "require group commands to be case " -#~ "insensitive as well." -#~ msgstr "" -#~ ":class:`bool` -- コマンドを大文字と小文字を区別するかどうか。デフォルトでは " -#~ "``False`` " -#~ "です。この属性はグループコマンドには影響されません。もしグループコマンドでも大文字と小文字の区別が必要な場合、すべてのグループでの設定が必要になります。" - -#~ msgid "" -#~ "Optional[Union[:class:`.Activity`, :class:`.Game`, " -#~ ":class:`.Streaming`]] -- The activity being" -#~ " used upon logging in." -#~ msgstr "" -#~ "Optional[Union[:class:`.Activity`, :class:`.Game`, " -#~ ":class:`.Streaming`]] -- ログイン時のアクティビティ。" - -#~ msgid ":exc:`.ClientException` -- If the command is already registered." -#~ msgstr ":exc:`.ClientException` -- コマンドがすでに登録されている。" - -#~ msgid "" -#~ "The activity parameter is a " -#~ ":class:`.Activity` object (not a string) " -#~ "that represents the activity being done" -#~ " currently. This could also be the" -#~ " slimmed down versions, :class:`.Game` and" -#~ " :class:`.Streaming`." -#~ msgstr "" -#~ "activityパラメータは、現在のアクティビティを示す :class:`.Activity` " -#~ "オブジェクトです(これはstringではありません)。スリム化された :class:`.Game` や " -#~ ":class:`.Streaming` でも可能です。" - -#~ msgid "" -#~ ":exc:`.InvalidArgument` -- Invalid icon image" -#~ " format given. Must be PNG or " -#~ "JPG." -#~ msgstr "" - -#~ msgid "" -#~ "Mapping[:class:`str`, :class:`py:types.ModuleType`] -- " -#~ "A read-only mapping of extension " -#~ "name to extension." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`.InvalidData` -- An unknown channel " -#~ "type was received from Discord." -#~ msgstr "" - -#~ msgid ":exc:`.NotFound` -- Invalid Channel ID." -#~ msgstr ":exc:`.NotFound` -- チャンネルのIDが無効。" - -#~ msgid "" -#~ "If the invite is for a guild " -#~ "you have not joined, the guild and" -#~ " channel attributes of the returned " -#~ ":class:`.Invite` will be " -#~ ":class:`.PartialInviteGuild` and " -#~ ":class:`PartialInviteChannel` respectively." -#~ msgstr "" - -#~ msgid ":exc:`.NotFound` -- The invite has expired or is invalid." -#~ msgstr "" - -#~ msgid ":exc:`.HTTPException` -- Getting the invite failed." -#~ msgstr "" - -#~ msgid ":exc:`.NotFound` -- A user with this ID does not exist." -#~ msgstr "" - -#~ msgid ":exc:`.HTTPException` -- Fetching the user failed." -#~ msgstr "" - -#~ msgid "" -#~ "Gets an arbitrary user's profile. This" -#~ " can only be used by non-bot" -#~ " accounts." -#~ msgstr "" - -#~ msgid ":exc:`.Forbidden` -- Not allowed to fetch profiles." -#~ msgstr "" - -#~ msgid ":exc:`.HTTPException` -- Fetching the profile failed." -#~ msgstr "" - -#~ msgid ":exc:`.HTTPException` -- Retrieving the webhook failed." -#~ msgstr "" - -#~ msgid ":exc:`.NotFound` -- Invalid webhook ID." -#~ msgstr "" - -#~ msgid ":exc:`.Forbidden` -- You do not have permission to fetch this webhook." -#~ msgstr "" - -#~ msgid ":exc:`.Forbidden` -- The widget for this guild is disabled." -#~ msgstr "" - -#~ msgid ":exc:`.HTTPException` -- Retrieving the widget failed." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[Union[:class:`.abc.GuildChannel`, :class:`.Thread`, " -#~ ":class:`.abc.PrivateChannel`]]: Returns a channel" -#~ " with the given ID." -#~ msgstr "" - -#~ msgid "If not found, returns ``None``." -#~ msgstr "" - -#~ msgid "" -#~ "Get a :class:`.Command` or subclasses " -#~ "from the internal list of commands." -#~ msgstr "" - -#~ msgid "Optional[:class:`.Emoji`]: Returns an emoji with the given ID." -#~ msgstr "" - -#~ msgid "Optional[:class:`.Guild`]: Returns a guild with the given ID." -#~ msgstr "" - -#~ msgid "Optional[:class:`~discord.User`]: Returns a user with the given ID." -#~ msgstr "" - -#~ msgid "" -#~ "List[:class:`.Guild`] -- The guilds that " -#~ "the connected client is a member " -#~ "of." -#~ msgstr "" - -#~ msgid "Indicates if the websocket connection is closed." -#~ msgstr "" - -#~ msgid "Specifies if the client's internal cache is ready for use." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`float` -- Measures latency between " -#~ "a HEARTBEAT and a HEARTBEAT_ACK in " -#~ "seconds." -#~ msgstr "" - -#~ msgid ":exc:`ExtensionNotFound` -- The extension could not be imported." -#~ msgstr "" - -#~ msgid ":exc:`ExtensionAlreadyLoaded` -- The extension is already loaded." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`NoEntryPointError` -- The extension does" -#~ " not have a setup function." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`ExtensionFailed` -- The extension setup" -#~ " function had an execution error." -#~ msgstr "" - -#~ msgid "" -#~ "Logging on with a user token is" -#~ " against the Discord `Terms of " -#~ "Service `_ and doing so might" -#~ " potentially get your account banned. " -#~ "Use this at your own risk." -#~ msgstr "" - -#~ msgid ":exc:`.LoginFailure` -- The wrong credentials are passed." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`.HTTPException` -- An unknown HTTP " -#~ "related error occurred, usually when it" -#~ " isn't 200 or the known incorrect " -#~ "credentials passing status code." -#~ msgstr "" - -#~ msgid "" -#~ "List[:class:`.abc.PrivateChannel`] -- The private" -#~ " channels that the connected client " -#~ "is participating on." -#~ msgstr "" - -#~ msgid ":exc:`ExtensionNotLoaded` -- The extension was not loaded." -#~ msgstr "" - -#~ msgid "" -#~ "Remove a :class:`.Command` or subclasses " -#~ "from the internal list of commands." -#~ msgstr "" - -#~ msgid "" -#~ "The command that was removed. If " -#~ "the name is not valid then `None`" -#~ " is returned instead." -#~ msgstr "" - -#~ msgid ":class:`.Command` or subclass" -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`.InvalidArgument` -- If any guild " -#~ "is unavailable or not large in the" -#~ " collection." -#~ msgstr "" - -#~ msgid ":exc:`TypeError` -- An unexpected keyword argument was received." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`.ClientUser`] -- Represents the " -#~ "connected client. None if not logged " -#~ "in." -#~ msgstr "" - -#~ msgid "" -#~ "List[:class:`~discord.User`] -- Returns a list" -#~ " of all the users the bot can" -#~ " see." -#~ msgstr "" - -#~ msgid "List[:class:`.VoiceClient`] -- Represents a list of voice connections." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`asyncio.TimeoutError` -- If a timeout" -#~ " is provided and it was reached." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`TypeError` -- If the function is" -#~ " not a coroutine or is already " -#~ "a command." -#~ msgstr "" - -#~ msgid ":class:`str` -- The name of the command." -#~ msgstr "" - -#~ msgid "" -#~ ":ref:`coroutine ` -- The coroutine" -#~ " that is executed when the command" -#~ " is called." -#~ msgstr "" - -#~ msgid ":class:`str` -- The long help text for the command." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`str` -- The short help text " -#~ "for the command. If this is not" -#~ " specified then the first line of " -#~ "the long help text is used " -#~ "instead." -#~ msgstr "" - -#~ msgid ":class:`str` -- A replacement for arguments in the default help text." -#~ msgstr "" - -#~ msgid ":class:`list` -- The list of aliases the command can be invoked under." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- A boolean that " -#~ "indicates if the command is currently" -#~ " enabled. If the command is invoked" -#~ " while it is disabled, then " -#~ ":exc:`.DisabledCommand` is raised to the " -#~ ":func:`.on_command_error` event. Defaults to " -#~ "``True``." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`Command`] -- The parent " -#~ "command that this command belongs to." -#~ " ``None`` if there isn't one." -#~ msgstr "" - -#~ msgid "" -#~ "List[Callable[..., :class:`bool`]] -- A list" -#~ " of predicates that verifies if the" -#~ " command could be executed with the" -#~ " given :class:`.Context` as the sole " -#~ "parameter. If an exception is necessary" -#~ " to be thrown to signal failure, " -#~ "then one inherited from :exc:`.CommandError`" -#~ " should be used. Note that if " -#~ "the checks fail then :exc:`.CheckFailure` " -#~ "exception is raised to the " -#~ ":func:`.on_command_error` event." -#~ msgstr "" - -#~ msgid ":class:`str` -- The message prefixed into the default help command." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- If ``True``\\, the " -#~ "default help command does not show " -#~ "this in the help output." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- If ``False`` and a " -#~ "keyword-only argument is provided then" -#~ " the keyword only argument is " -#~ "stripped and handled as if it was" -#~ " a regular argument that handles " -#~ ":exc:`.MissingRequiredArgument` and default values" -#~ " in a regular matter rather than " -#~ "passing the rest completely raw. If " -#~ "``True`` then the keyword-only argument" -#~ " will pass in the rest of the" -#~ " arguments in a completely raw " -#~ "matter. Defaults to ``False``." -#~ msgstr "" - -#~ msgid "Optional[:class:`Command`] -- The subcommand that was invoked, if any." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- If ``True``\\, ignores " -#~ "extraneous strings passed to a command" -#~ " if all its requirements are met " -#~ "(e.g. ``?foo a b c`` when only " -#~ "expecting ``a`` and ``b``). Otherwise " -#~ ":func:`.on_command_error` and local error " -#~ "handlers are called with " -#~ ":exc:`.TooManyArguments`. Defaults to ``True``." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- If ``True``\\, cooldown " -#~ "processing is done after argument " -#~ "parsing, which calls converters. If " -#~ "``False`` then cooldown processing is " -#~ "done first and then the converters " -#~ "are called second. Defaults to " -#~ "``False``." -#~ msgstr "" - -#~ msgid "" -#~ "Retrieves the parameter OrderedDict without" -#~ " the context or self parameters." -#~ msgstr "" - -#~ msgid ":class:`str` -- Retrieves the fully qualified parent command name." -#~ msgstr "" - -#~ msgid ":class:`Command` -- Retrieves the parents of this command." -#~ msgstr "" - -#~ msgid ":class:`str` -- Retrieves the fully qualified command name." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`str` -- The name of the " -#~ "cog this command belongs to. None " -#~ "otherwise." -#~ msgstr "" - -#~ msgid ":class:`str` -- Gets the \"short\" documentation of a command." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`str` -- Returns a POSIX-like " -#~ "signature useful for help command " -#~ "output." -#~ msgstr "" - -#~ msgid "" -#~ "Checks if the command can be " -#~ "executed by checking all the predicates" -#~ " inside the :attr:`.checks` attribute." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`CommandError` -- Any command error " -#~ "that was raised during a check " -#~ "call will be propagated by this " -#~ "function." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`bool`] -- Indicates if the" -#~ " group callback should begin parsing " -#~ "and invocation only if no subcommand " -#~ "was found. Useful for making it an" -#~ " error handling function to tell the" -#~ " user that no subcommand was found" -#~ " or to have different functionality " -#~ "in case no subcommand was found. " -#~ "If this is ``False``, then the " -#~ "group callback will always be invoked" -#~ " first. This means that the checks" -#~ " and the parsing dictated by its " -#~ "parameters will be executed. Defaults to" -#~ " ``False``." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`bool`] -- Indicates if the" -#~ " group's commands should be case " -#~ "insensitive. Defaults to ``False``." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`dict` -- A mapping of command" -#~ " name to :class:`.Command` or subclass " -#~ "objects." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- Whether the commands " -#~ "should be case insensitive. Defaults to" -#~ " ``False``." -#~ msgstr "" - -#~ msgid "" -#~ "Returns a :class:`list` of " -#~ ":class:`.Command`\\s that are defined inside" -#~ " this cog." -#~ msgstr "" - -#~ msgid ":class:`str` -- Returns the cog's specified name, not the class name." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`str` -- Returns the cog's " -#~ "description, typically the cleaned docstring." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`TypeError` -- The function is not" -#~ " a coroutine function or a string " -#~ "was not passed as the name." -#~ msgstr "" - -#~ msgid "This function **can** be a coroutine." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`str` -- The cog name. By " -#~ "default, it is the name of the " -#~ "class with no modification." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`dict` -- A list of attributes" -#~ " to apply to every command inside " -#~ "this cog. The dictionary is passed " -#~ "into the :class:`Command` (or its " -#~ "subclass) options at ``__init__``. If " -#~ "you specify attributes inside the " -#~ "command attribute in the class, it " -#~ "will override the one specified inside" -#~ " this attribute. For example:" -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`Context`] -- The context that" -#~ " invoked this help formatter. This is" -#~ " generally set after the help command" -#~ " assigned, :func:`command_callback`\\, has been" -#~ " called." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- Specifies if hidden " -#~ "commands should be shown in the " -#~ "output. Defaults to ``False``." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- Specifies if commands " -#~ "should have their :attr:`.Command.checks` " -#~ "called and verified. Defaults to " -#~ "``True``." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`dict` -- A dictionary of options" -#~ " to pass in for the construction " -#~ "of the help command. This allows " -#~ "you to change the command behaviour " -#~ "without actually changing the implementation" -#~ " of the command. The attributes will" -#~ " be the same as the ones passed" -#~ " in the :class:`.Command` constructor." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`int` -- The maximum number of" -#~ " characters that fit in a line. " -#~ "Defaults to 80." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- Whether to sort the " -#~ "commands in the output alphabetically. " -#~ "Defaults to ``True``." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`bool`] -- A tribool that " -#~ "indicates if the help command should " -#~ "DM the user instead of sending it" -#~ " to the channel it received it " -#~ "from. If the boolean is set to " -#~ "``True``, then all help output is " -#~ "DM'd. If ``False``, none of the " -#~ "help output is DM'd. If ``None``, " -#~ "then the bot will only DM when " -#~ "the help message becomes too long " -#~ "(dictated by more than " -#~ ":attr:`dm_help_threshold` characters). Defaults to" -#~ " ``False``." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`int`] -- The number of " -#~ "characters the paginator must accumulate " -#~ "before getting DM'd to the user if" -#~ " :attr:`dm_help` is set to ``None``. " -#~ "Defaults to 1000." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`int` -- How much to intend " -#~ "the commands from a heading. Defaults" -#~ " to ``2``." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`str` -- The command list's " -#~ "heading string used when the help " -#~ "command is invoked with a category " -#~ "name. Useful for i18n. Defaults to " -#~ "``\"Commands:\"``" -#~ msgstr "" - -#~ msgid "" -#~ ":class:`str` -- The string used when " -#~ "there is a command which does not" -#~ " belong to any category(cog). Useful " -#~ "for i18n. Defaults to ``\"No " -#~ "Category\"``" -#~ msgstr "" - -#~ msgid "" -#~ ":class:`Paginator` -- The paginator used " -#~ "to paginate the help command output." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`str` -- The command list's " -#~ "heading string used when the help " -#~ "command is invoked with a category " -#~ "name. Useful for i18n. Defaults to " -#~ "``\"Commands\"``" -#~ msgstr "" - -#~ msgid "" -#~ ":class:`str` -- The alias list's heading" -#~ " string used to list the aliases " -#~ "of the command. Useful for i18n. " -#~ "Defaults to ``\"Aliases:\"``." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`str`] -- The prefix inserted" -#~ " to every page. e.g. three backticks." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`str`] -- The suffix appended" -#~ " at the end of every page. e.g." -#~ " three backticks." -#~ msgstr "" - -#~ msgid ":class:`int` -- The maximum amount of codepoints allowed in a page." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`RuntimeError` -- The line was too" -#~ " big for the current :attr:`max_size`." -#~ msgstr "" - -#~ msgid "These functions can either be regular functions or coroutines." -#~ msgstr "" - -#~ msgid "" -#~ "A decorator that adds a cooldown " -#~ "to a :class:`.Command` or its " -#~ "subclasses." -#~ msgstr "" - -#~ msgid "" -#~ "A cooldown allows a command to " -#~ "only be used a specific amount of" -#~ " times in a specific time frame. " -#~ "These cooldowns can be based either " -#~ "on a per-guild, per-channel, " -#~ "per-user, or global basis. Denoted by" -#~ " the third argument of ``type`` which" -#~ " must be of enum type ``BucketType``" -#~ " which could be either:" -#~ msgstr "" - -#~ msgid "``BucketType.default`` for a global basis." -#~ msgstr "" - -#~ msgid "``BucketType.user`` for a per-user basis." -#~ msgstr "" - -#~ msgid "``BucketType.guild`` for a per-guild basis." -#~ msgstr "" - -#~ msgid "``BucketType.channel`` for a per-channel basis." -#~ msgstr "" - -#~ msgid "``BucketType.member`` for a per-member basis." -#~ msgstr "" - -#~ msgid "``BucketType.category`` for a per-category basis." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`.Message` -- The message that " -#~ "triggered the command being executed." -#~ msgstr "" - -#~ msgid ":class:`.Bot` -- The bot that contains the command being executed." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`list` -- The list of transformed" -#~ " arguments that were passed into the" -#~ " command. If this is accessed during" -#~ " the :func:`on_command_error` event then " -#~ "this list could be incomplete." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`dict` -- A dictionary of " -#~ "transformed arguments that were passed " -#~ "into the command. Similar to " -#~ ":attr:`args`\\, if this is accessed in" -#~ " the :func:`on_command_error` event then " -#~ "this dict could be incomplete." -#~ msgstr "" - -#~ msgid ":class:`str` -- The prefix that was used to invoke the command." -#~ msgstr "" - -#~ msgid "" -#~ "The command (i.e. :class:`.Command` or " -#~ "its subclasses) that is being invoked" -#~ " currently." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`str` -- The command name that" -#~ " triggered this invocation. Useful for " -#~ "finding out which alias called the " -#~ "command." -#~ msgstr "" - -#~ msgid "" -#~ "The subcommand (i.e. :class:`.Command` or " -#~ "its subclasses) that was invoked. If " -#~ "no valid subcommand was invoked then " -#~ "this is equal to ``None``." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`str`] -- The string that " -#~ "was attempted to call a subcommand. " -#~ "This does not have to point to " -#~ "a valid registered subcommand and could" -#~ " just point to a nonsense string. " -#~ "If nothing was passed to attempt a" -#~ " call to a subcommand then this " -#~ "is set to ``None``." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`bool` -- A boolean that " -#~ "indicates if the command failed to " -#~ "be parsed, checked, or invoked." -#~ msgstr "" - -#~ msgid "" -#~ "You must have " -#~ ":attr:`~.Permissions.read_message_history` permissions to" -#~ " use this." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`~discord.Forbidden` -- You do not " -#~ "have permissions to get channel message" -#~ " history." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`~discord.HTTPException` -- The request " -#~ "to get message history failed." -#~ msgstr "" - -#~ msgid "" -#~ "Returns the channel associated with this" -#~ " context's command. Shorthand for " -#~ ":attr:`.Message.channel`." -#~ msgstr "" - -#~ msgid "" -#~ "Returns the author associated with this" -#~ " context's command. Shorthand for " -#~ ":attr:`.Message.author`" -#~ msgstr "" - -#~ msgid ":exc:`~discord.NotFound` -- The specified message was not found." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`~discord.Forbidden` -- You do not " -#~ "have the permissions required to get " -#~ "a message." -#~ msgstr "" - -#~ msgid ":exc:`~discord.HTTPException` -- Retrieving the message failed." -#~ msgstr "" - -#~ msgid "A command or subclass of a command that is going to be called." -#~ msgstr "" - -#~ msgid ":exc:`~discord.HTTPException` -- Retrieving the pinned messages failed." -#~ msgstr "" - -#~ msgid ":exc:`~discord.HTTPException` -- Sending the message failed." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`~discord.Forbidden` -- You do not " -#~ "have the proper permissions to send " -#~ "the message." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`~discord.InvalidArgument` -- The ``files`` " -#~ "list is not of the appropriate " -#~ "size or you specified both ``file`` " -#~ "and ``files``." -#~ msgstr "" - -#~ msgid "" -#~ "Similar to :attr:`.Guild.me` except it " -#~ "may return the :class:`.ClientUser` in " -#~ "private message contexts." -#~ msgstr "" - -#~ msgid "" -#~ "Optional[:class:`.VoiceClient`] -- A shortcut " -#~ "to :attr:`.Guild.voice_client`\\, if applicable." -#~ msgstr "" - -#~ msgid ":class:`bool` -- Whether to clean channel mentions." -#~ msgstr "" - -#~ msgid ":class:`bool` -- Whether to use nicknames when transforming mentions." -#~ msgstr "" - -#~ msgid ":class:`bool` -- Whether to also escape special markdown characters." -#~ msgstr "" - -#~ msgid ":class:`discord.ext.commands.Converter` -- The converter that failed." -#~ msgstr "" - -#~ msgid ":class:`inspect.Parameter` -- The argument that is missing." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`str` -- The quote mark that " -#~ "was found inside the non-quoted " -#~ "string." -#~ msgstr "" - -#~ msgid ":class:`str` -- The character found instead of the expected string." -#~ msgstr "" - -#~ msgid ":class:`str` -- The quote character expected." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`inspect.Parameter` -- The parameter " -#~ "that failed being converted." -#~ msgstr "" - -#~ msgid "" -#~ "*Tuple[Type, ...]* -- A tuple of " -#~ "converters attempted in conversion, in " -#~ "order of failure." -#~ msgstr "" - -#~ msgid "" -#~ "List[:class:`CommandError`] -- A list of " -#~ "errors that were caught from failing " -#~ "the conversion." -#~ msgstr "" - -#~ msgid "" -#~ "*Cooldown* -- A class with attributes" -#~ " ``rate``, ``per``, and ``type`` similar" -#~ " to the :func:`.cooldown` decorator." -#~ msgstr "" - -#~ msgid "" -#~ ":class:`float` -- The amount of seconds" -#~ " to wait before you can retry " -#~ "again." -#~ msgstr "" - -#~ msgid ":class:`list` -- The required permissions that are missing." -#~ msgstr "" - -#~ msgid "" -#~ "Union[:class:`str`, :class:`int`] -- The " -#~ "required role that is missing. This " -#~ "is the parameter passed to " -#~ ":func:`~.commands.has_role`." -#~ msgstr "" - -#~ msgid "" -#~ "List[Union[:class:`str`, :class:`int`]] -- The " -#~ "roles that the invoker is missing. " -#~ "These are the parameters passed to " -#~ ":func:`~.commands.has_any_role`." -#~ msgstr "" - -#~ msgid "" -#~ "List[Union[:class:`str`, :class:`int`]] -- The " -#~ "roles that the bot's member is " -#~ "missing. These are the parameters passed" -#~ " to :func:`~.commands.has_any_role`." -#~ msgstr "" - -#~ msgid ":class:`str` -- The extension that had an error." -#~ msgstr "" - -#~ msgid "" -#~ "An exception raised when an extension" -#~ " failed to load during execution of" -#~ " the ``setup`` entry point." -#~ msgstr "" - -#~ msgid ":class:`str` -- The extension that had the error." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`Exception` -- The original exception " -#~ "that was raised. You can also get" -#~ " this via the ``__cause__`` attribute." -#~ msgstr "" - -#~ msgid "An exception raised when an extension failed to be imported." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`ImportError` -- The original exception" -#~ " that was raised. You can also " -#~ "get this via the ``__cause__`` " -#~ "attribute." -#~ msgstr "" - diff --git a/docs/locale/ja/LC_MESSAGES/ext/commands/cogs.po b/docs/locale/ja/LC_MESSAGES/ext/commands/cogs.po deleted file mode 100644 index c4b657ad30..0000000000 --- a/docs/locale/ja/LC_MESSAGES/ext/commands/cogs.po +++ /dev/null @@ -1,179 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: discordpy\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-22 09:35-0400\n" -"PO-Revision-Date: 2020-10-24 02:41\n" -"Last-Translator: \n" -"Language-Team: Japanese\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Crowdin-Project: discordpy\n" -"X-Crowdin-Project-ID: 362783\n" -"X-Crowdin-Language: ja\n" -"X-Crowdin-File: /ext/commands/cogs.pot\n" -"X-Crowdin-File-ID: 60\n" -"Language: ja_JP\n" - -#: ../../ext/commands/cogs.rst:6 -msgid "Cogs" -msgstr "コグ" - -#: ../../ext/commands/cogs.rst:8 -msgid "There comes a point in your bot's development when you want to organize a collection of commands, listeners, and some state into one class. Cogs allow you to do just that." -msgstr "Bot開発においてコマンドやリスナー、いくつかの状態を一つのクラスにまとめてしまいたい場合があるでしょう。コグはそれを実現したものです。" - -#: ../../ext/commands/cogs.rst:10 -msgid "The gist:" -msgstr "要旨:" - -#: ../../ext/commands/cogs.rst:12 -msgid "Each cog is a Python class that subclasses :class:`.commands.Cog`." -msgstr "すべてのコグは :class:`.commands.Cog` を継承したPythonクラスです。" - -#: ../../ext/commands/cogs.rst:13 -msgid "Every command is marked with the :func:`.commands.command` decorator." -msgstr "すべてのコマンドは :func:`.commands.command` デコレータでデコレートされます。" - -#: ../../ext/commands/cogs.rst:14 -msgid "Every listener is marked with the :meth:`.commands.Cog.listener` decorator." -msgstr "すべてのリスナーは :meth:`.commands.Cog.listener` デコレータでデコレートされます。" - -#: ../../ext/commands/cogs.rst:15 -msgid "Cogs are then registered with the :meth:`.Bot.add_cog` call." -msgstr "コグは :meth:`.Bot.add_cog` を呼び出して登録します。" - -#: ../../ext/commands/cogs.rst:16 -msgid "Cogs are subsequently removed with the :meth:`.Bot.remove_cog` call." -msgstr "コグは :meth:`.Bot.remove_cog` の呼び出しで削除されます。" - -#: ../../ext/commands/cogs.rst:18 -msgid "It should be noted that cogs are typically used alongside with :ref:`ext_commands_extensions`." -msgstr "コグは :ref:`ext_commands_extensions` とともに使用されるのが一般的であることを覚えておきましょう。" - -#: ../../ext/commands/cogs.rst:21 -msgid "Quick Example" -msgstr "簡単な例" - -#: ../../ext/commands/cogs.rst:23 -msgid "This example cog defines a ``Greetings`` category for your commands, with a single :ref:`command ` named ``hello`` as well as a listener to listen to an :ref:`Event `." -msgstr "この例で紹介するコグは ``hello`` という名前の :ref:`command ` と、 :ref:`Event ` をリッスンするリスナーを実装した ``Greetings`` という名前のコマンドカテゴリを定義しています。" - -#: ../../ext/commands/cogs.rst:48 -msgid "A couple of technical notes to take into consideration:" -msgstr "考慮すべき二つのテクニカルノート:" - -#: ../../ext/commands/cogs.rst:50 -msgid "All listeners must be explicitly marked via decorator, :meth:`~.commands.Cog.listener`." -msgstr "すべてのリスナーは :meth:`~.commands.Cog.listener` で明示的にデコレートする必要があります。" - -#: ../../ext/commands/cogs.rst:51 -msgid "The name of the cog is automatically derived from the class name but can be overridden. See :ref:`ext_commands_cogs_meta_options`." -msgstr "コグの名前は、自動的にクラスの名前が引用されますが、上書きも可能です。 :ref:`ext_commands_cogs_meta_options` を参照してください。" - -#: ../../ext/commands/cogs.rst:52 -msgid "All commands must now take a ``self`` parameter to allow usage of instance attributes that can be used to maintain state." -msgstr "すべてのコマンドは状態を保持するインスタンスの属性を使用するために ``self`` パラメータを持つ必要があります。" - -#: ../../ext/commands/cogs.rst:55 -msgid "Cog Registration" -msgstr "コグの登録" - -#: ../../ext/commands/cogs.rst:57 -msgid "Once you have defined your cogs, you need to tell the bot to register the cogs to be used. We do this via the :meth:`~.commands.Bot.add_cog` method." -msgstr "コグを定義したら、Botにコグを登録する処理が必要になります。 :meth:`~.commands.Bot.add_cog` メソッドを用いて登録ができます。" - -#: ../../ext/commands/cogs.rst:63 -msgid "This binds the cog to the bot, adding all commands and listeners to the bot automatically." -msgstr "これはコグとBotを紐づけ、すべてのコマンドとリスナーを自動的にBotに追加します。" - -#: ../../ext/commands/cogs.rst:65 -msgid "Note that we reference the cog by name, which we can override through :ref:`ext_commands_cogs_meta_options`. So if we ever want to remove the cog eventually, we would have to do the following." -msgstr "コグを名前で参照している点に注意してください。これは :ref:`ext_commands_cogs_meta_options` でオーバーライドが可能です。そのため、最終的にコグを削除したい場合は、次の処理を行う必要があります。" - -#: ../../ext/commands/cogs.rst:72 -msgid "Using Cogs" -msgstr "コグの使用" - -#: ../../ext/commands/cogs.rst:74 -msgid "Just as we remove a cog by its name, we can also retrieve it by its name as well. This allows us to use a cog as an inter-command communication protocol to share data. For example:" -msgstr "コグを名前で削除するのと同様に、名前でコグを検索することもできます。これによってコグをデータ共有のためのコマンド間通信プロトコルとして使うことができます。例えば:" - -#: ../../ext/commands/cogs.rst:109 -msgid "Special Methods" -msgstr "特殊なメソッド" - -#: ../../ext/commands/cogs.rst:111 -msgid "As cogs get more complicated and have more commands, there comes a point where we want to customise the behaviour of the entire cog or bot." -msgstr "コグが複雑化し、多くのコマンドを持つようになるにつれ、コグあるいはBot全体の挙動をカスタマイズしたくなることがあります。" - -#: ../../ext/commands/cogs.rst:113 -msgid "They are as follows:" -msgstr "そのための特殊なメソッドは以下のとおりです:" - -#: ../../ext/commands/cogs.rst:115 -msgid ":meth:`.Cog.cog_unload`" -msgstr ":meth:`.Cog.cog_unload`" - -#: ../../ext/commands/cogs.rst:116 -msgid ":meth:`.Cog.cog_check`" -msgstr ":meth:`.Cog.cog_check`" - -#: ../../ext/commands/cogs.rst:117 -msgid ":meth:`.Cog.cog_command_error`" -msgstr ":meth:`.Cog.cog_command_error`" - -#: ../../ext/commands/cogs.rst:118 -msgid ":meth:`.Cog.cog_before_invoke`" -msgstr ":meth:`.Cog.cog_before_invoke`" - -#: ../../ext/commands/cogs.rst:119 -msgid ":meth:`.Cog.cog_after_invoke`" -msgstr ":meth:`.Cog.cog_after_invoke`" - -#: ../../ext/commands/cogs.rst:120 -msgid ":meth:`.Cog.bot_check`" -msgstr ":meth:`.Cog.bot_check`" - -#: ../../ext/commands/cogs.rst:121 -msgid ":meth:`.Cog.bot_check_once`" -msgstr ":meth:`.Cog.bot_check_once`" - -#: ../../ext/commands/cogs.rst:123 -msgid "You can visit the reference to get more detail." -msgstr "詳細はリファレンスを参照してください。" - -#: ../../ext/commands/cogs.rst:128 -msgid "Meta Options" -msgstr "メタオプション" - -#: ../../ext/commands/cogs.rst:130 -msgid "At the heart of a cog resides a metaclass, :class:`.commands.CogMeta`, which can take various options to customise some of the behaviour. To do this, we pass keyword arguments to the class definition line. For example, to change the cog name we can pass the ``name`` keyword argument as follows:" -msgstr "コグの中核にはメタクラスである :class:`.commands.CogMeta` が存在します。これにはいくつかの挙動を変更ができる様々なオプションが用意されています。オプションを使用する際はキーワード引数をクラス定義の行で渡します。例えば、コグの名前を変更する場合はキーワード引数 ``name`` を次のように渡します。" - -#: ../../ext/commands/cogs.rst:137 -msgid "To see more options that you can set, see the documentation of :class:`.commands.CogMeta`." -msgstr "設定可能な他のオプションについては :class:`.commands.CogMeta` のドキュメントを参照してください。" - -#: ../../ext/commands/cogs.rst:140 -msgid "Inspection" -msgstr "インスペクション" - -#: ../../ext/commands/cogs.rst:142 -msgid "Since cogs ultimately are classes, we have some tools to help us inspect certain properties of the cog." -msgstr "コグは究極的にはクラスのため、コグの特定のプロパティを調べるのに役立つツールがいくつか用意されています。" - -#: ../../ext/commands/cogs.rst:145 -msgid "To get a :class:`list` of commands, we can use :meth:`.Cog.get_commands`. ::" -msgstr ":meth:`.Cog.get_commands` を使うことで、コマンドの :class:`list` を取得できます。" - -#: ../../ext/commands/cogs.rst:151 -msgid "If we want to get the subcommands as well, we can use the :meth:`.Cog.walk_commands` generator. ::" -msgstr "サブコマンドを取得したい場合は :meth:`.Cog.walk_commands` ジェネレータを使うことができます。" - -#: ../../ext/commands/cogs.rst:155 -msgid "To do the same with listeners, we can query them with :meth:`.Cog.get_listeners`. This returns a list of tuples -- the first element being the listener name and the second one being the actual function itself. ::" -msgstr "これ同様の処理をリスナーで行う場合は、 :meth:`.Cog.get_listeners` が使用できます。これはタプルのリストを返します -- 最初の要素がリスナーの名前で、二つ目の要素が関数そのものです。" - diff --git a/docs/locale/ja/LC_MESSAGES/ext/commands/commands.po b/docs/locale/ja/LC_MESSAGES/ext/commands/commands.po deleted file mode 100644 index 6f6d3ecb34..0000000000 --- a/docs/locale/ja/LC_MESSAGES/ext/commands/commands.po +++ /dev/null @@ -1,901 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: discordpy\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-10-23 22:41-0400\n" -"PO-Revision-Date: 2020-10-24 02:41+0000\n" -"Last-Translator: \n" -"Language: ja_JP\n" -"Language-Team: Japanese\n" -"Plural-Forms: nplurals=1; plural=0\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.5.3\n" - -#: ../../ext/commands/commands.rst:6 -msgid "Commands" -msgstr "コマンド" - -#: ../../ext/commands/commands.rst:8 -msgid "" -"One of the most appealing aspect of the command extension is how easy it " -"is to define commands and how you can arbitrarily nest groups and " -"commands to have a rich sub-command system." -msgstr "コマンド拡張の最も魅力的な機能の一つは、簡単にコマンドが定義でき、かつそのコマンドを好きなようにネスト状にして、豊富なサブコマンドを用意することができる点です。" - -#: ../../ext/commands/commands.rst:11 -msgid "" -"Commands are defined by attaching it to a regular Python function. The " -"command is then invoked by the user using a similar signature to the " -"Python function." -msgstr "コマンドは、Pythonの関数と関連付けすることによって定義され、同様のシグネチャを使用してユーザーに呼び出されます。" - -#: ../../ext/commands/commands.rst:14 -msgid "For example, in the given command definition:" -msgstr "例えば、指定されたコマンド定義を使うと次のようになります。" - -#: ../../ext/commands/commands.rst:22 -msgid "With the following prefix (``$``), it would be invoked by the user via:" -msgstr "Prefixを (``$``) としたとすると、このコマンドは次の用に実行できます。" - -#: ../../ext/commands/commands.rst:28 -msgid "" -"A command must always have at least one parameter, ``ctx``, which is the " -":class:`.Context` as the first one." -msgstr "コマンドには、少なくとも :class:`.Context` を渡すための引数 ``ctx`` が必要です。" - -#: ../../ext/commands/commands.rst:30 -msgid "" -"There are two ways of registering a command. The first one is by using " -":meth:`.Bot.command` decorator, as seen in the example above. The second " -"is using the :func:`~ext.commands.command` decorator followed by " -":meth:`.Bot.add_command` on the instance." -msgstr "" -"コマンドを登録するには二通りの方法があります。一つ目は :meth:`.Bot.command` を使用する方法で、二つ目が " -":func:`~ext.commands.command` デコレータを使用して :meth:`.Bot.add_command` " -"でインスタンスにコマンドを追加していく方法です。" - -#: ../../ext/commands/commands.rst:34 -msgid "Essentially, these two are equivalent: ::" -msgstr "本質的に、これら2つは同等になります: ::" - -#: ../../ext/commands/commands.rst:52 -msgid "" -"Since the :meth:`.Bot.command` decorator is shorter and easier to " -"comprehend, it will be the one used throughout the documentation here." -msgstr ":meth:`.Bot.command` が簡単かつ理解がしやすいので、ドキュメント上ではこちらを使っています。" - -#: ../../ext/commands/commands.rst:55 -msgid "" -"Any parameter that is accepted by the :class:`.Command` constructor can " -"be passed into the decorator. For example, to change the name to " -"something other than the function would be as simple as doing this:" -msgstr "" -":class:`.Command` " -"のコンストラクタの引数はデコレータに渡すことで利用できます。例えば、コマンドの名前を関数以外のものへと変更したい場合は以下のように簡単に設定することができます。" - -#: ../../ext/commands/commands.rst:65 -msgid "Parameters" -msgstr "パラメーター" - -#: ../../ext/commands/commands.rst:67 -msgid "" -"Since we define commands by making Python functions, we also define the " -"argument passing behaviour by the function parameters." -msgstr "Pythonの関数定義によって、同時にコマンドを定義するので、関数のパラメーターを設定することにより、コマンドの引数受け渡し動作も定義することができます。" - -#: ../../ext/commands/commands.rst:70 -msgid "" -"Certain parameter types do different things in the user side and most " -"forms of parameter types are supported." -msgstr "特定のパラメータタイプはユーザーサイドで異なる動作を行い、そしてほとんどの形式のパラメータタイプがサポートされています。" - -#: ../../ext/commands/commands.rst:73 -msgid "Positional" -msgstr "位置引数" - -#: ../../ext/commands/commands.rst:75 -msgid "" -"The most basic form of parameter passing is the positional parameter. " -"This is where we pass a parameter as-is:" -msgstr "最も基本的な引数は位置パラメーターです。与えられた値をそのまま渡します。" - -#: ../../ext/commands/commands.rst:84 -msgid "" -"On the bot using side, you can provide positional arguments by just " -"passing a regular string:" -msgstr "Botの使用者側は、通常の文字列を渡すだけで位置引数に値を渡すことができます。" - -#: ../../ext/commands/commands.rst:88 -msgid "To make use of a word with spaces in between, you should quote it:" -msgstr "間に空白を含む文字列を渡す場合は、文字列を引用符で囲む必要があります。" - -#: ../../ext/commands/commands.rst:92 -msgid "" -"As a note of warning, if you omit the quotes, you will only get the first" -" word:" -msgstr "引用符を用いなかった場合、最初の文字列のみが渡されます。" - -#: ../../ext/commands/commands.rst:96 -msgid "" -"Since positional arguments are just regular Python arguments, you can " -"have as many as you want:" -msgstr "位置引数は、Pythonの引数と同じものなので、好きなだけ設定することが可能です。" - -#: ../../ext/commands/commands.rst:105 -msgid "Variable" -msgstr "可変長引数" - -#: ../../ext/commands/commands.rst:107 -msgid "" -"Sometimes you want users to pass in an undetermined number of parameters." -" The library supports this similar to how variable list parameters are " -"done in Python:" -msgstr "場合によっては、可変長のパラメーターを設定したい場合もあるでしょう。このライブラリはPythonの可変長パラメーターと同様にこれをサポートしています。" - -#: ../../ext/commands/commands.rst:116 -msgid "" -"This allows our user to accept either one or many arguments as they " -"please. This works similar to positional arguments, so multi-word " -"parameters should be quoted." -msgstr "これによって一つ、あるいは複数の引数を受け取ることができます。ただし、引数を渡す際の挙動は位置引数と同様のため、複数の単語を含む文字列は引用符で囲む必要があります。" - -#: ../../ext/commands/commands.rst:119 -msgid "For example, on the bot side:" -msgstr "例えば、Bot側ではこのように動きます。" - -#: ../../ext/commands/commands.rst:123 -msgid "" -"If the user wants to input a multi-word argument, they have to quote it " -"like earlier:" -msgstr "複数単語の文字列を渡す際は、引用符で囲んでください。" - -#: ../../ext/commands/commands.rst:127 -msgid "" -"Do note that similar to the Python function behaviour, a user can " -"technically pass no arguments at all:" -msgstr "Pythonの振る舞いと同様に、ユーザーは引数なしの状態を技術的に渡すことができます。" - -#: ../../ext/commands/commands.rst:132 -msgid "" -"Since the ``args`` variable is a :class:`py:tuple`, you can do anything " -"you would usually do with one." -msgstr "" - -#: ../../ext/commands/commands.rst:136 -msgid "Keyword-Only Arguments" -msgstr "キーワード引数" - -#: ../../ext/commands/commands.rst:138 -msgid "" -"When you want to handle parsing of the argument yourself or do not feel " -"like you want to wrap multi-word user input into quotes, you can ask the " -"library to give you the rest as a single argument. We do this by using a " -"**keyword-only argument**, seen below:" -msgstr "引数の構文解析を自分で行う場合や、複数単語の入力を引用符で囲む必要のないようにしたい場合は、渡された値を単一の引数として受け取るようにライブラリに求めることができます。以下のコードのようにキーワード引数のみを使用することでこれが可能になります。" - -#: ../../ext/commands/commands.rst:150 -msgid "You can only have one keyword-only argument due to parsing ambiguities." -msgstr "解析が曖昧になるため、一つのキーワードのみの引数しか扱えません。" - -#: ../../ext/commands/commands.rst:152 -msgid "On the bot side, we do not need to quote input with spaces:" -msgstr "Bot側では、スペースを含む入力を引用符で囲む必要がありません:" - -#: ../../ext/commands/commands.rst:156 -msgid "Do keep in mind that wrapping it in quotes leaves it as-is:" -msgstr "引用符で囲んだ場合、消えずに残るので注意してください:" - -#: ../../ext/commands/commands.rst:160 -msgid "" -"By default, the keyword-only arguments are stripped of white space to " -"make it easier to work with. This behaviour can be toggled by the " -":attr:`.Command.rest_is_raw` argument in the decorator." -msgstr "" -"通常、キーワード引数は利便性のために空白文字で分割されます。この動作はデコレータの引数として " -":attr:`.Command.rest_is_raw` を使うことで切り替えることが可能です。" - -#: ../../ext/commands/commands.rst:166 -msgid "Invocation Context" -msgstr "呼び出しコンテクスト" - -#: ../../ext/commands/commands.rst:168 -msgid "" -"As seen earlier, every command must take at least a single parameter, " -"called the :class:`~ext.commands.Context`." -msgstr "前述の通り、すべてのコマンドは必ず :class:`~ext.commands.Context` と呼ばれるパラメータを受け取らなければいけません。" - -#: ../../ext/commands/commands.rst:170 -msgid "" -"This parameter gives you access to something called the \"invocation " -"context\". Essentially all the information you need to know how the " -"command was executed. It contains a lot of useful information:" -msgstr "このパラメータにより、「呼び出しコンテクスト」というものにアクセスできます。言うなればコマンドがどのように実行されたのかを知るのに必要な基本的情報です。これにはたくさんの有用な情報が含まれています。" - -#: ../../ext/commands/commands.rst:173 -msgid ":attr:`.Context.guild` to fetch the :class:`Guild` of the command, if any." -msgstr "存在する場合に限り、コマンドの :class:`Guild` を取得できる :attr:`.Context.guild` 。" - -#: ../../ext/commands/commands.rst:174 -msgid ":attr:`.Context.message` to fetch the :class:`Message` of the command." -msgstr "コマンドの :class:`Message` を取得できる :attr:`.Context.message` 。" - -#: ../../ext/commands/commands.rst:175 -msgid "" -":attr:`.Context.author` to fetch the :class:`Member` or :class:`User` " -"that called the command." -msgstr "" -"コマンドを実行した :class:`Member` あるいは :class:`User` を取得できる " -":attr:`.Context.author` 。" - -#: ../../ext/commands/commands.rst:176 -msgid "" -":meth:`.Context.send` to send a message to the channel the command was " -"used in." -msgstr "コマンドが実行されたチャンネルにメッセージを送信する :meth:`.Context.send` 。" - -#: ../../ext/commands/commands.rst:178 -msgid "" -"The context implements the :class:`abc.Messageable` interface, so " -"anything you can do on a :class:`abc.Messageable` you can do on the " -":class:`~ext.commands.Context`." -msgstr "" -"コンテクストは :class:`abc.Messageable` インタフェースを実装しているため、 " -":class:`abc.Messageable` 上でできることは :class:`~ext.commands.Context` " -"上でも行うことが可能です。" - -#: ../../ext/commands/commands.rst:182 -msgid "Converters" -msgstr "コンバータ" - -#: ../../ext/commands/commands.rst:184 -msgid "" -"Adding bot arguments with function parameters is only the first step in " -"defining your bot's command interface. To actually make use of the " -"arguments, we usually want to convert the data into a target type. We " -"call these :ref:`ext_commands_api_converters`." -msgstr "" -"Botの引数を関数のパラメータとして設定するのは、Botのコマンドインタフェースを定義する第一歩です。引数を実際に扱うには、大抵の場合、データを目的の型へとと変換する必要があります。私達はこれを" -" :ref:`ext_commands_api_converters` と呼んでいます。" - -#: ../../ext/commands/commands.rst:188 -msgid "Converters come in a few flavours:" -msgstr "コンバータにはいくつかの種類があります:" - -#: ../../ext/commands/commands.rst:190 -msgid "" -"A regular callable object that takes an argument as a sole parameter and " -"returns a different type." -msgstr "引数を一つのパラメータとして受け取り、異なる型として返す、通常の呼び出し可能オブジェクト。" - -#: ../../ext/commands/commands.rst:192 -msgid "" -"These range from your own function, to something like :class:`bool` or " -":class:`int`." -msgstr "これらにはあなたの作った関数、 :class:`bool` や :class:`int` といったものまで含まれます。" - -#: ../../ext/commands/commands.rst:194 -msgid "A custom class that inherits from :class:`~ext.commands.Converter`." -msgstr ":class:`~ext.commands.Converter` を継承したカスタムクラス。" - -#: ../../ext/commands/commands.rst:197 -msgid "Basic Converters" -msgstr "基本的なコンバーター" - -#: ../../ext/commands/commands.rst:199 -msgid "" -"At its core, a basic converter is a callable that takes in an argument " -"and turns it into something else." -msgstr "基本的なコンバーターは、中核をなすものであり、受け取った引数を別のものへと変換します。" - -#: ../../ext/commands/commands.rst:201 -msgid "" -"For example, if we wanted to add two numbers together, we could request " -"that they are turned into integers for us by specifying the converter:" -msgstr "例えば、二つの値を加算したい場合、コンバーターを指定することにより、受け取った値を整数型へ変換するように要求できます。" - -#: ../../ext/commands/commands.rst:210 -msgid "" -"We specify converters by using something called a **function " -"annotation**. This is a Python 3 exclusive feature that was introduced in" -" :pep:`3107`." -msgstr "" -"コンバーターの指定には関数アノテーションというもの用います。これは :pep:`3107` にて追加された Python 3 " -"にのみ実装されている機能です。" - -#: ../../ext/commands/commands.rst:213 -msgid "" -"This works with any callable, such as a function that would convert a " -"string to all upper-case:" -msgstr "これは、文字列をすべて大文字に変換する関数などといった、任意の呼び出し可能関数でも動作します。" - -#: ../../ext/commands/commands.rst:225 -msgid "bool" -msgstr "論理型" - -#: ../../ext/commands/commands.rst:227 -#, fuzzy -msgid "" -"Unlike the other basic converters, the :class:`bool` converter is treated" -" slightly different. Instead of casting directly to the :class:`bool` " -"type, which would result in any non-empty argument returning ``True``, it" -" instead evaluates the argument as ``True`` or ``False`` based on its " -"given content:" -msgstr "" -"他の基本的なコンバーターとは異なり、 :class:`bool` のコンバーターは若干異なる扱いになります。 :class:`bool` " -"型に直接キャストする代わりに、与えられた値に基づいて ``True`` か ``False`` を返します。" - -#: ../../ext/commands/commands.rst:239 -msgid "Advanced Converters" -msgstr "応用的なコンバータ" - -#: ../../ext/commands/commands.rst:241 -msgid "" -"Sometimes a basic converter doesn't have enough information that we need." -" For example, sometimes we want to get some information from the " -":class:`Message` that called the command or we want to do some " -"asynchronous processing." -msgstr "" -"場合によっては、基本的なコンバータを動かすのに必要な情報が不足していることがあります。例えば、実行されたコマンドの " -":class:`Message` から情報を取得したい場合や、非同期処理を行いたい場合です。" - -#: ../../ext/commands/commands.rst:244 -msgid "" -"For this, the library provides the :class:`~ext.commands.Converter` " -"interface. This allows you to have access to the :class:`.Context` and " -"have the callable be asynchronous. Defining a custom converter using this" -" interface requires overriding a single method, " -":meth:`.Converter.convert`." -msgstr "" -"そういった用途のために、このライブラリは :class:`~ext.commands.Converter` " -"インタフェースを提供します。これによって :class:`.Context` " -"にアクセスが可能になり、また、呼び出し可能関数を非同期にもできるようになります。このインタフェースを使用して、カスタムコンバーターを定義したい場合は" -" :meth:`.Converter.convert` をオーバーライドしてください。" - -#: ../../ext/commands/commands.rst:248 -msgid "An example converter:" -msgstr "コンバーターの例" - -#: ../../ext/commands/commands.rst:263 -msgid "" -"The converter provided can either be constructed or not. Essentially " -"these two are equivalent:" -msgstr "コンバーターはインスタンス化されていなくても構いません。以下の例の二つのは同じ処理になります。" - -#: ../../ext/commands/commands.rst:277 -msgid "" -"Having the possibility of the converter be constructed allows you to set " -"up some state in the converter's ``__init__`` for fine tuning the " -"converter. An example of this is actually in the library, " -":class:`~ext.commands.clean_content`." -msgstr "" -"コンバーターをインスタンス化する可能性がある場合、コンバーターの調整を行うために ``__init__`` " -"で何かしらの状態を設定することが出来ます。この例としてライブラリに実際に存在する " -":class:`~ext.commands.clean_content` があります。" - -#: ../../ext/commands/commands.rst:293 -msgid "" -"If a converter fails to convert an argument to its designated target " -"type, the :exc:`.BadArgument` exception must be raised." -msgstr "コンバーターが渡された引数を指定の型に変換できなかった場合は :exc:`.BadArgument` を発生させてください。" - -#: ../../ext/commands/commands.rst:297 -msgid "Inline Advanced Converters" -msgstr "埋込み型の応用的なコンバーター" - -#: ../../ext/commands/commands.rst:299 -msgid "" -"If we don't want to inherit from :class:`~ext.commands.Converter`, we can" -" still provide a converter that has the advanced functionalities of an " -"advanced converter and save us from specifying two types." -msgstr "" -":class:`~ext.commands.Converter` " -"を継承したくない場合のために、応用的なコンバータの高度な機能を備えたコンバータを提供しています。これを使用することで2つのクラスを作成する必要がなくなります。" - -#: ../../ext/commands/commands.rst:302 -msgid "" -"For example, a common idiom would be to have a class and a converter for " -"that class:" -msgstr "例えば、一般的な書き方だと、クラスとそのクラスへのコンバーターを定義します:" - -#: ../../ext/commands/commands.rst:328 -msgid "" -"This can get tedious, so an inline advanced converter is possible through" -" a ``classmethod`` inside the type:" -msgstr "" -"これでは面倒に感じてしまうこともあるでしょう。しかし、埋込み型の応用的なコンバーターは ``classmethod`` " -"としてクラスへ埋め込むことが可能です:" - -#: ../../ext/commands/commands.rst:355 -msgid "Discord Converters" -msgstr "Discord コンバーター" - -#: ../../ext/commands/commands.rst:357 -msgid "" -"Working with :ref:`discord_api_models` is a fairly common thing when " -"defining commands, as a result the library makes working with them easy." -msgstr "" -":ref:`discord_api_models` " -"を使用して作業を行うのは、コマンドを定義する際には一般的なことです。そのため、このライブラリでは簡単に作業が行えるようになっています。" - -#: ../../ext/commands/commands.rst:360 -msgid "" -"For example, to receive a :class:`Member` you can just pass it as a " -"converter:" -msgstr "例えば、 :class:`Member` を受け取るには、これをコンバーターとして渡すだけです。" - -#: ../../ext/commands/commands.rst:368 -msgid "" -"When this command is executed, it attempts to convert the string given " -"into a :class:`Member` and then passes it as a parameter for the " -"function. This works by checking if the string is a mention, an ID, a " -"nickname, a username + discriminator, or just a regular username. The " -"default set of converters have been written to be as easy to use as " -"possible." -msgstr "" -"このコマンドが実行されると、与えられた文字列を :class:`Member` " -"に変換して、それを関数のパラメーターとして渡します。これは文字列がメンション、ID、ニックネーム、ユーザー名 + " -"Discordタグ、または普通のユーザー名かどうかをチェックすることで機能しています。デフォルトで定義されているコンバーターは、できるだけ簡単に使えるように作られています。" - -#: ../../ext/commands/commands.rst:372 -msgid "A lot of discord models work out of the gate as a parameter:" -msgstr "Discordモデルの多くがコンバーターとして動作します。" - -#: ../../ext/commands/commands.rst:374 ../../ext/commands/commands.rst:396 -msgid ":class:`Member`" -msgstr ":class:`Member`" - -#: ../../ext/commands/commands.rst:375 ../../ext/commands/commands.rst:400 -msgid ":class:`User`" -msgstr ":class:`User`" - -#: ../../ext/commands/commands.rst:376 ../../ext/commands/commands.rst:402 -msgid ":class:`TextChannel`" -msgstr ":class:`TextChannel`" - -#: ../../ext/commands/commands.rst:377 ../../ext/commands/commands.rst:404 -msgid ":class:`VoiceChannel`" -msgstr ":class:`VoiceChannel`" - -#: ../../ext/commands/commands.rst:378 ../../ext/commands/commands.rst:406 -msgid ":class:`CategoryChannel`" -msgstr ":class:`CategoryChannel`" - -#: ../../ext/commands/commands.rst:379 ../../ext/commands/commands.rst:408 -msgid ":class:`Role`" -msgstr ":class:`Role`" - -#: ../../ext/commands/commands.rst:380 -msgid ":class:`Message` (since v1.1)" -msgstr ":class:`Message` (v1.1 から)" - -#: ../../ext/commands/commands.rst:381 ../../ext/commands/commands.rst:410 -msgid ":class:`Invite`" -msgstr ":class:`Invite`" - -#: ../../ext/commands/commands.rst:382 ../../ext/commands/commands.rst:412 -msgid ":class:`Game`" -msgstr ":class:`Game`" - -#: ../../ext/commands/commands.rst:383 ../../ext/commands/commands.rst:414 -msgid ":class:`Emoji`" -msgstr ":class:`Emoji`" - -#: ../../ext/commands/commands.rst:384 ../../ext/commands/commands.rst:416 -msgid ":class:`PartialEmoji`" -msgstr ":class:`PartialEmoji`" - -#: ../../ext/commands/commands.rst:385 ../../ext/commands/commands.rst:418 -msgid ":class:`Colour`" -msgstr ":class:`Colour`" - -#: ../../ext/commands/commands.rst:387 -msgid "" -"Having any of these set as the converter will intelligently convert the " -"argument to the appropriate target type you specify." -msgstr "これらをコンバーターとして設定すると、引数を指定した型へとインテリジェントに変換します。" - -#: ../../ext/commands/commands.rst:390 -msgid "" -"Under the hood, these are implemented by the " -":ref:`ext_commands_adv_converters` interface. A table of the equivalent " -"converter is given below:" -msgstr "" -"これらは :ref:`ext_commands_adv_converters` " -"インタフェースによって実装されています。コンバーターとクラスの関係は以下の通りです。" - -#: ../../ext/commands/commands.rst:394 -msgid "Discord Class" -msgstr "Discord クラス" - -#: ../../ext/commands/commands.rst:394 -msgid "Converter" -msgstr "コンバーター" - -#: ../../ext/commands/commands.rst:396 -msgid ":class:`~ext.commands.MemberConverter`" -msgstr ":class:`~ext.commands.MemberConverter`" - -#: ../../ext/commands/commands.rst:398 -msgid ":class:`Message`" -msgstr ":class:`Message`" - -#: ../../ext/commands/commands.rst:398 -msgid ":class:`~ext.commands.MessageConverter`" -msgstr ":class:`~ext.commands.MessageConverter`" - -#: ../../ext/commands/commands.rst:400 -msgid ":class:`~ext.commands.UserConverter`" -msgstr ":class:`~ext.commands.UserConverter`" - -#: ../../ext/commands/commands.rst:402 -msgid ":class:`~ext.commands.TextChannelConverter`" -msgstr ":class:`~ext.commands.TextChannelConverter`" - -#: ../../ext/commands/commands.rst:404 -msgid ":class:`~ext.commands.VoiceChannelConverter`" -msgstr ":class:`~ext.commands.VoiceChannelConverter`" - -#: ../../ext/commands/commands.rst:406 -msgid ":class:`~ext.commands.CategoryChannelConverter`" -msgstr ":class:`~ext.commands.CategoryChannelConverter`" - -#: ../../ext/commands/commands.rst:408 -msgid ":class:`~ext.commands.RoleConverter`" -msgstr ":class:`~ext.commands.RoleConverter`" - -#: ../../ext/commands/commands.rst:410 -msgid ":class:`~ext.commands.InviteConverter`" -msgstr ":class:`~ext.commands.InviteConverter`" - -#: ../../ext/commands/commands.rst:412 -msgid ":class:`~ext.commands.GameConverter`" -msgstr ":class:`~ext.commands.GameConverter`" - -#: ../../ext/commands/commands.rst:414 -msgid ":class:`~ext.commands.EmojiConverter`" -msgstr ":class:`~ext.commands.EmojiConverter`" - -#: ../../ext/commands/commands.rst:416 -msgid ":class:`~ext.commands.PartialEmojiConverter`" -msgstr ":class:`~ext.commands.PartialEmojiConverter`" - -#: ../../ext/commands/commands.rst:418 -msgid ":class:`~ext.commands.ColourConverter`" -msgstr ":class:`~ext.commands.ColourConverter`" - -#: ../../ext/commands/commands.rst:421 -msgid "" -"By providing the converter it allows us to use them as building blocks " -"for another converter:" -msgstr "コンバーターを継承することで、他のコンバーターの一部として使うことができます:" - -#: ../../ext/commands/commands.rst:438 -msgid "Special Converters" -msgstr "特殊なコンバーター" - -#: ../../ext/commands/commands.rst:440 -msgid "" -"The command extension also has support for certain converters to allow " -"for more advanced and intricate use cases that go beyond the generic " -"linear parsing. These converters allow you to introduce some more relaxed" -" and dynamic grammar to your commands in an easy to use manner." -msgstr "コマンド拡張機能は一般的な線形解析を超える、より高度で複雑なユースケースに対応するため、特殊なコンバータをサポートしています。これらのコンバータは、簡単な方法でコマンドに更に容易で動的な文法の導入を可能にします。" - -#: ../../ext/commands/commands.rst:445 -msgid "typing.Union" -msgstr "typing.Union" - -#: ../../ext/commands/commands.rst:447 -msgid "" -"A :data:`typing.Union` is a special type hint that allows for the command" -" to take in any of the specific types instead of a singular type. For " -"example, given the following:" -msgstr ":data:`typing.Union` はコマンドが単数の型の代わりに、複数の特定の型を取り込める特殊な型ヒントです。例えば:" - -#: ../../ext/commands/commands.rst:459 -msgid "" -"The ``what`` parameter would either take a :class:`discord.TextChannel` " -"converter or a :class:`discord.Member` converter. The way this works is " -"through a left-to-right order. It first attempts to convert the input to " -"a :class:`discord.TextChannel`, and if it fails it tries to convert it to" -" a :class:`discord.Member`. If all converters fail, then a special error " -"is raised, :exc:`~ext.commands.BadUnionArgument`." -msgstr "" -"``what`` パラメータには :class:`discord.TextChannel` コンバーターか " -":class:`discord.Member` " -"コンバーターのいずれかが用いられます。これは左から右の順で変換できるか試行することになります。最初に渡された値を " -":class:`discord.TextChannel` へ変換しようと試み、失敗した場合は :class:`discord.Member` " -"に変換しようとします。すべてのコンバーターで失敗した場合は :exc:`~ext.commands.BadUnionArgument` " -"というエラーが発生します。" - -#: ../../ext/commands/commands.rst:464 -msgid "" -"Note that any valid converter discussed above can be passed in to the " -"argument list of a :data:`typing.Union`." -msgstr "以前に説明した有効なコンバーターは、すべて :data:`typing.Union` にわたすことが可能です。" - -#: ../../ext/commands/commands.rst:467 -msgid "typing.Optional" -msgstr "typing.Optional" - -#: ../../ext/commands/commands.rst:469 -msgid "" -"A :data:`typing.Optional` is a special type hint that allows for \"back-" -"referencing\" behaviour. If the converter fails to parse into the " -"specified type, the parser will skip the parameter and then either " -"``None`` or the specified default will be passed into the parameter " -"instead. The parser will then continue on to the next parameters and " -"converters, if any." -msgstr "" -":data:`typing.Optional` " -"は「後方参照」のような動作をする特殊な型ヒントです。コンバーターが指定された型へのパースに失敗した場合、パーサーは代わりに ``None`` " -"または指定されたデフォルト値をパラメータに渡したあと、そのパラメータをスキップします。次のパラメータまたはコンバータがあれば、そちらに進みます。" - -#: ../../ext/commands/commands.rst:473 ../../ext/commands/commands.rst:500 -msgid "Consider the following example:" -msgstr "次の例をみてください:" - -#: ../../ext/commands/commands.rst:486 -msgid "" -"In this example, since the argument could not be converted into an " -"``int``, the default of ``99`` is passed and the parser resumes handling," -" which in this case would be to pass it into the ``liquid`` parameter." -msgstr "" -"この例では引数を ``int`` に変換することができなかったので、デフォルト値である ``99`` " -"を代入し、パーサーは処理を続行しています。この場合、先程の変換に失敗した引数は ``liquid`` パラメータに渡されます。" - -#: ../../ext/commands/commands.rst:491 -msgid "" -"This converter only works in regular positional parameters, not variable " -"parameters or keyword-only parameters." -msgstr "このコンバーターは位置パラメータでのみ動作し、可変長パラメータやキーワードパラメータでは機能しません。" - -#: ../../ext/commands/commands.rst:494 -msgid "Greedy" -msgstr "Greedy" - -#: ../../ext/commands/commands.rst:496 -msgid "" -"The :data:`~ext.commands.Greedy` converter is a generalisation of the " -":data:`typing.Optional` converter, except applied to a list of arguments." -" In simple terms, this means that it tries to convert as much as it can " -"until it can't convert any further." -msgstr "" -":data:`~ext.commands.Greedy` コンバータは引数にリストが適用される以外は " -":data:`typing.Optional` " -"を一般化したものです。簡単に言うと、与えられた引数を変換ができなくなるまで指定の型に変換しようと試みます。" - -#: ../../ext/commands/commands.rst:509 -msgid "When invoked, it allows for any number of members to be passed in:" -msgstr "これが呼び出されると、任意の数のメンバーを渡すことができます:" - -#: ../../ext/commands/commands.rst:513 -msgid "" -"The type passed when using this converter depends on the parameter type " -"that it is being attached to:" -msgstr "" - -#: ../../ext/commands/commands.rst:515 -msgid "" -"Positional parameter types will receive either the default parameter or a" -" :class:`list` of the converted values." -msgstr "" - -#: ../../ext/commands/commands.rst:516 -msgid "Variable parameter types will be a :class:`tuple` as usual." -msgstr "" - -#: ../../ext/commands/commands.rst:517 -msgid "" -"Keyword-only parameter types will be the same as if " -":data:`~ext.commands.Greedy` was not passed at all." -msgstr "" - -#: ../../ext/commands/commands.rst:519 -msgid "" -":data:`~ext.commands.Greedy` parameters can also be made optional by " -"specifying an optional value." -msgstr "" - -#: ../../ext/commands/commands.rst:521 -msgid "" -"When mixed with the :data:`typing.Optional` converter you can provide " -"simple and expressive command invocation syntaxes:" -msgstr "" - -#: ../../ext/commands/commands.rst:536 -msgid "This command can be invoked any of the following ways:" -msgstr "" - -#: ../../ext/commands/commands.rst:546 -msgid "" -"The usage of :data:`~ext.commands.Greedy` and :data:`typing.Optional` are" -" powerful and useful, however as a price, they open you up to some " -"parsing ambiguities that might surprise some people." -msgstr "" - -#: ../../ext/commands/commands.rst:549 -msgid "" -"For example, a signature expecting a :data:`typing.Optional` of a " -":class:`discord.Member` followed by a :class:`int` could catch a member " -"named after a number due to the different ways a " -":class:`~ext.commands.MemberConverter` decides to fetch members. You " -"should take care to not introduce unintended parsing ambiguities in your " -"code. One technique would be to clamp down the expected syntaxes allowed " -"through custom converters or reordering the parameters to minimise " -"clashes." -msgstr "" - -#: ../../ext/commands/commands.rst:555 -msgid "" -"To help aid with some parsing ambiguities, :class:`str`, ``None``, " -":data:`typing.Optional` and :data:`~ext.commands.Greedy` are forbidden as" -" parameters for the :data:`~ext.commands.Greedy` converter." -msgstr "" - -#: ../../ext/commands/commands.rst:561 -msgid "Error Handling" -msgstr "エラーハンドリング" - -#: ../../ext/commands/commands.rst:563 -#, fuzzy -msgid "" -"When our commands fail to parse we will, by default, receive a noisy " -"error in ``stderr`` of our console that tells us that an error has " -"happened and has been silently ignored." -msgstr "" -"コマンドの解析に失敗したとき、通常では煩わしいエラーはエラーの発生を伝えるためにコンソールの ``stderr`` " -"で受け取られ、無視されていました。" - -#: ../../ext/commands/commands.rst:566 -msgid "" -"In order to handle our errors, we must use something called an error " -"handler. There is a global error handler, called :func:`on_command_error`" -" which works like any other event in the :ref:`discord-api-events`. This " -"global error handler is called for every error reached." -msgstr "" - -#: ../../ext/commands/commands.rst:570 -msgid "" -"Most of the time however, we want to handle an error local to the command" -" itself. Luckily, commands come with local error handlers that allow us " -"to do just that. First we decorate an error handler function with " -":meth:`.Command.error`:" -msgstr "" - -#: ../../ext/commands/commands.rst:586 -msgid "" -"The first parameter of the error handler is the :class:`.Context` while " -"the second one is an exception that is derived from " -":exc:`~ext.commands.CommandError`. A list of errors is found in the " -":ref:`ext_commands_api_errors` page of the documentation." -msgstr "" - -#: ../../ext/commands/commands.rst:590 -msgid "Checks" -msgstr "チェック" - -#: ../../ext/commands/commands.rst:592 -msgid "" -"There are cases when we don't want a user to use our commands. They don't" -" have permissions to do so or maybe we blocked them from using our bot " -"earlier. The commands extension comes with full support for these things " -"in a concept called a :ref:`ext_commands_api_checks`." -msgstr "" -"コマンドをユーザーに使ってほしくない場合などがあります。例えば、使用者が権限を持っていない場合や、Botをブロックしている場合などです。コマンド拡張ではこのような機能を" -" :ref:`ext_commands_api_checks` と呼び、完全にサポートしています。" - -#: ../../ext/commands/commands.rst:596 -msgid "" -"A check is a basic predicate that can take in a :class:`.Context` as its " -"sole parameter. Within it, you have the following options:" -msgstr "" - -#: ../../ext/commands/commands.rst:599 -msgid "Return ``True`` to signal that the person can run the command." -msgstr "" - -#: ../../ext/commands/commands.rst:600 -msgid "Return ``False`` to signal that the person cannot run the command." -msgstr "" - -#: ../../ext/commands/commands.rst:601 -msgid "" -"Raise a :exc:`~ext.commands.CommandError` derived exception to signal the" -" person cannot run the command." -msgstr "" - -#: ../../ext/commands/commands.rst:603 -msgid "" -"This allows you to have custom error messages for you to handle in the " -":ref:`error handlers `." -msgstr "" - -#: ../../ext/commands/commands.rst:606 -msgid "" -"To register a check for a command, we would have two ways of doing so. " -"The first is using the :meth:`~ext.commands.check` decorator. For " -"example:" -msgstr "" - -#: ../../ext/commands/commands.rst:620 -msgid "" -"This would only evaluate the command if the function ``is_owner`` returns" -" ``True``. Sometimes we re-use a check often and want to split it into " -"its own decorator. To do that we can just add another level of depth:" -msgstr "" - -#: ../../ext/commands/commands.rst:637 -msgid "" -"Since an owner check is so common, the library provides it for you " -"(:func:`~ext.commands.is_owner`):" -msgstr "" - -#: ../../ext/commands/commands.rst:647 -msgid "When multiple checks are specified, **all** of them must be ``True``:" -msgstr "" - -#: ../../ext/commands/commands.rst:663 -msgid "" -"If any of those checks fail in the example above, then the command will " -"not be run." -msgstr "" - -#: ../../ext/commands/commands.rst:665 -msgid "" -"When an error happens, the error is propagated to the :ref:`error " -"handlers `. If you do not raise a custom " -":exc:`~ext.commands.CommandError` derived exception, then it will get " -"wrapped up into a :exc:`~ext.commands.CheckFailure` exception as so:" -msgstr "" - -#: ../../ext/commands/commands.rst:683 -msgid "" -"If you want a more robust error system, you can derive from the exception" -" and raise it instead of returning ``False``:" -msgstr "" - -#: ../../ext/commands/commands.rst:708 -msgid "" -"Since having a ``guild_only`` decorator is pretty common, it comes built-" -"in via :func:`~ext.commands.guild_only`." -msgstr "" - -#: ../../ext/commands/commands.rst:711 -msgid "Global Checks" -msgstr "グローバルチェック" - -#: ../../ext/commands/commands.rst:713 -msgid "" -"Sometimes we want to apply a check to **every** command, not just certain" -" commands. The library supports this as well using the global check " -"concept." -msgstr "" - -#: ../../ext/commands/commands.rst:716 -msgid "" -"Global checks work similarly to regular checks except they are registered" -" with the :func:`.Bot.check` decorator." -msgstr "" - -#: ../../ext/commands/commands.rst:718 -msgid "For example, to block all DMs we could do the following:" -msgstr "" - -#: ../../ext/commands/commands.rst:728 -msgid "" -"Be careful on how you write your global checks, as it could also lock you" -" out of your own bot." -msgstr "" - -#~ msgid "" -#~ "To help aid with some parsing " -#~ "ambiguities, :class:`str`, ``None`` and " -#~ ":data:`~ext.commands.Greedy` are forbidden as " -#~ "parameters for the :data:`~ext.commands.Greedy` " -#~ "converter." -#~ msgstr "" - diff --git a/docs/locale/ja/LC_MESSAGES/ext/commands/extensions.po b/docs/locale/ja/LC_MESSAGES/ext/commands/extensions.po deleted file mode 100644 index d4bf7e8888..0000000000 --- a/docs/locale/ja/LC_MESSAGES/ext/commands/extensions.po +++ /dev/null @@ -1,83 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: discordpy\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-22 09:35-0400\n" -"PO-Revision-Date: 2020-10-24 02:41\n" -"Last-Translator: \n" -"Language-Team: Japanese\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Crowdin-Project: discordpy\n" -"X-Crowdin-Project-ID: 362783\n" -"X-Crowdin-Language: ja\n" -"X-Crowdin-File: /ext/commands/extensions.pot\n" -"X-Crowdin-File-ID: 68\n" -"Language: ja_JP\n" - -#: ../../ext/commands/extensions.rst:6 -msgid "Extensions" -msgstr "エクステンション" - -#: ../../ext/commands/extensions.rst:8 -msgid "There comes a time in the bot development when you want to extend the bot functionality at run-time and quickly unload and reload code (also called hot-reloading). The command framework comes with this ability built-in, with a concept called **extensions**." -msgstr "Bot開発ではBotを起動している間にコードを素早くアンロードし、再度ロードし直したい (ホットリロードとも呼ばれます) という時があります。コマンドフレームワークでは **エクステンション** と呼ばれる概念でこの機能が組み込まれています。" - -#: ../../ext/commands/extensions.rst:11 -msgid "Primer" -msgstr "はじめに" - -#: ../../ext/commands/extensions.rst:13 -msgid "An extension at its core is a python file with an entry point called ``setup``. This setup must be a plain Python function (not a coroutine). It takes a single parameter -- the :class:`~.commands.Bot` that loads the extension." -msgstr "その中核となるエクステンションは ``setup`` というエントリポイントを持つPythonファイルです。このsetupは通常のPython関数である必要があります (コルーチンではありません)。この関数はエクステンションをロードする :class:`~.commands.Bot` を受け取るための単一のパラメータを持ちます。" - -#: ../../ext/commands/extensions.rst:15 -msgid "An example extension looks like this:" -msgstr "エクステンションの例は以下のとおりです:" - -#: ../../ext/commands/extensions.rst:17 -msgid "hello.py" -msgstr "hello.py" - -#: ../../ext/commands/extensions.rst:30 -msgid "In this example we define a simple command, and when the extension is loaded this command is added to the bot. Now the final step to this is loading the extension, which we do by calling :meth:`.commands.Bot.load_extension`. To load this extension we call ``bot.load_extension('hello')``." -msgstr "この例では単純なコマンドを実装しており、エクステンションがロードされることでこのコマンドがBotに追加されます。最後にこのエクステンションをロードする必要があります。ロードには :meth:`.commands.Bot.load_extension` を実行します。このエクステンションを読み込むために ``bot.load_extension('hello')`` を実行します。" - -#: ../../ext/commands/extensions.rst:32 -msgid "Cogs" -msgstr "コグ" - -#: ../../ext/commands/extensions.rst:35 -msgid "Extensions are usually used in conjunction with cogs. To read more about them, check out the documentation, :ref:`ext_commands_cogs`." -msgstr "エクステンションは通常、コグと組み合わせて使用します。詳細については :ref:`ext_commands_cogs` のドキュメントを参照してください。" - -#: ../../ext/commands/extensions.rst:39 -msgid "Extension paths are ultimately similar to the import mechanism. What this means is that if there is a folder, then it must be dot-qualified. For example to load an extension in ``plugins/hello.py`` then we use the string ``plugins.hello``." -msgstr "エクステンションのパスは究極的にはimportのメカニズムと似ています。これはフォルダ等がある場合、それをドットで区切らなければならないということです。例えば ``plugins/hello.py`` というエクステンションをロードする場合は、 ``plugins.hello`` という文字列を使います。" - -#: ../../ext/commands/extensions.rst:42 -msgid "Reloading" -msgstr "リロード" - -#: ../../ext/commands/extensions.rst:44 -msgid "When you make a change to the extension and want to reload the references, the library comes with a function to do this for you, :meth:`Bot.reload_extension`." -msgstr "エクステンションを更新し、その参照を再読込したい場合のために、ライブラリには :meth:`Bot.reload_extension` が用意されています。" - -#: ../../ext/commands/extensions.rst:50 -msgid "Once the extension reloads, any changes that we did will be applied. This is useful if we want to add or remove functionality without restarting our bot. If an error occurred during the reloading process, the bot will pretend as if the reload never happened." -msgstr "エクステンションを再読込すると、その変更が適用されます。Botを再起動せずに機能の追加や削除を行いたい場合に便利です。再読込処理中にエラーが発生した場合、Botは再読込処理をする前の状態に戻ります。" - -#: ../../ext/commands/extensions.rst:53 -msgid "Cleaning Up" -msgstr "クリーンアップ" - -#: ../../ext/commands/extensions.rst:55 -msgid "Although rare, sometimes an extension needs to clean-up or know when it's being unloaded. For cases like these, there is another entry point named ``teardown`` which is similar to ``setup`` except called when the extension is unloaded." -msgstr "稀ではありますが、エクステンションにクリーンアップが必要だったり、いつアンロードするかを確認したい場合があります。このために ``setup`` に似たエクステンションがアンロードされるときに呼び出される ``teardown`` というエントリポイントが用意されています。" - -#: ../../ext/commands/extensions.rst:57 -msgid "basic_ext.py" -msgstr "basic_ext.py" - diff --git a/docs/locale/ja/LC_MESSAGES/ext/commands/index.po b/docs/locale/ja/LC_MESSAGES/ext/commands/index.po deleted file mode 100644 index 2f65fa0490..0000000000 --- a/docs/locale/ja/LC_MESSAGES/ext/commands/index.po +++ /dev/null @@ -1,27 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: discordpy\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-22 09:35-0400\n" -"PO-Revision-Date: 2020-10-24 02:41\n" -"Last-Translator: \n" -"Language-Team: Japanese\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Crowdin-Project: discordpy\n" -"X-Crowdin-Project-ID: 362783\n" -"X-Crowdin-Language: ja\n" -"X-Crowdin-File: /ext/commands/index.pot\n" -"X-Crowdin-File-ID: 66\n" -"Language: ja_JP\n" - -#: ../../ext/commands/index.rst:4 -msgid "``discord.ext.commands`` -- Bot commands framework" -msgstr "``discord.ext.commands`` -- ボットコマンドのフレームワーク" - -#: ../../ext/commands/index.rst:6 -msgid "``discord.py`` offers a lower level aspect on interacting with Discord. Often times, the library is used for the creation of bots. However this task can be daunting and confusing to get correctly the first time. Many times there comes a repetition in creating a bot command framework that is extensible, flexible, and powerful. For this reason, ``discord.py`` comes with an extension library that handles this for you." -msgstr "``discord.py`` は、Discordと連携するための低レベルな機能を提供します。ときどき、このライブラリーはBotの作成に用いられています。しかしこの作業を正しくやるのは最初のときは気が重くややこしいものです。何度も繰り返し、拡張可能で柔軟、そしてパワフルなBotコマンドフレームワークを作成しています。この理由より、 ``discord.py`` にはこれを扱う拡張ライブラリがついてきます。" - diff --git a/docs/locale/ja/LC_MESSAGES/ext/tasks/index.po b/docs/locale/ja/LC_MESSAGES/ext/tasks/index.po deleted file mode 100644 index bf76ebcc36..0000000000 --- a/docs/locale/ja/LC_MESSAGES/ext/tasks/index.po +++ /dev/null @@ -1,417 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: discordpy\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-10-23 22:41-0400\n" -"PO-Revision-Date: 2020-10-24 02:41+0000\n" -"Last-Translator: \n" -"Language: ja_JP\n" -"Language-Team: Japanese\n" -"Plural-Forms: nplurals=1; plural=0\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.5.3\n" - -#: ../../ext/tasks/index.rst:4 -msgid "``discord.ext.tasks`` -- asyncio.Task helpers" -msgstr "``discord.ext.tasks`` -- asyncio.Task ヘルパー" - -#: ../../ext/tasks/index.rst:8 -msgid "" -"One of the most common operations when making a bot is having a loop run " -"in the background at a specified interval. This pattern is very common " -"but has a lot of things you need to look out for:" -msgstr "ボットを作成するときの最も一般的な操作の1つは、指定した間隔でバックグラウンドでループを実行させることです。このパターンは非常に一般的ですが、注意すべきことがたくさんあります。" - -#: ../../ext/tasks/index.rst:10 -msgid "How do I handle :exc:`asyncio.CancelledError`?" -msgstr ":exc:`asyncio.CancelledError` はどのように処理するべきですか?" - -#: ../../ext/tasks/index.rst:11 -msgid "What do I do if the internet goes out?" -msgstr "インターネット接続が切れた場合はどうするべきですか?" - -#: ../../ext/tasks/index.rst:12 -msgid "What is the maximum number of seconds I can sleep anyway?" -msgstr "スリープできる最大時間は何秒ですか?" - -#: ../../ext/tasks/index.rst:14 -msgid "" -"The goal of this discord.py extension is to abstract all these worries " -"away from you." -msgstr "discord.pyの拡張機能の目的は、こういった苦労の種を抽象化することです。" - -#: ../../ext/tasks/index.rst:17 -msgid "Recipes" -msgstr "レシピ" - -#: ../../ext/tasks/index.rst:19 -msgid "A simple background task in a :class:`~discord.ext.commands.Cog`:" -msgstr ":class:`~discord.ext.commands.Cog` におけるシンプルなバックグラウンドタスク:" - -#: ../../ext/tasks/index.rst:38 -msgid "Adding an exception to handle during reconnect:" -msgstr "再接続中に処理する例外を追加します:" - -#: ../../ext/tasks/index.rst:61 -msgid "Looping a certain amount of times before exiting:" -msgstr "特定の回数ループさせる:" - -#: ../../ext/tasks/index.rst:77 -msgid "Waiting until the bot is ready before the loop starts:" -msgstr "ループが始まる前に、Botの準備が整うまで待機する: " - -#: ../../ext/tasks/index.rst:102 -msgid "Doing something during cancellation:" -msgstr "キャンセルする場合、その間に何らかの処理を行う:" - -#: ../../ext/tasks/index.rst:136 -msgid "API Reference" -msgstr "APIリファレンス" - -#: discord.ext.tasks.Loop:1 of -msgid "" -"A background task helper that abstracts the loop and reconnection logic " -"for you." -msgstr "ループと再接続処理を抽象化するバックグラウンドタスクのヘルパー。" - -#: discord.ext.tasks.Loop:3 of -msgid "The main interface to create this is through :func:`loop`." -msgstr ":func:`loop` はこれを作成するための主要なインタフェースです。" - -#: discord.ext.tasks.Loop.current_loop:1 of -msgid "The current iteration of the loop." -msgstr "" - -#: discord.ext.tasks.Loop.current_loop discord.ext.tasks.Loop.next_iteration of -msgid "type" -msgstr "" - -#: discord.ext.tasks.Loop.current_loop:3 of -#, fuzzy -msgid ":class:`int`" -msgstr ":class:`asyncio.Task`" - -#: discord.ext.tasks.Loop.next_iteration:1 of -msgid "When the next iteration of the loop will occur." -msgstr "" - -#: discord.ext.tasks.Loop.next_iteration:5 of -msgid "Optional[:class:`datetime.datetime`]" -msgstr "" - -#: discord.ext.tasks.Loop.start:1 of -msgid "Starts the internal task in the event loop." -msgstr "" - -#: discord.ext.tasks.Loop.add_exception_type discord.ext.tasks.Loop.after_loop -#: discord.ext.tasks.Loop.before_loop discord.ext.tasks.Loop.change_interval -#: discord.ext.tasks.Loop.error discord.ext.tasks.Loop.remove_exception_type -#: discord.ext.tasks.Loop.restart discord.ext.tasks.Loop.start -#: discord.ext.tasks.loop of -msgid "Parameters" -msgstr "パラメーター" - -#: discord.ext.tasks.Loop.start:3 of -msgid "The arguments to use." -msgstr "" - -#: discord.ext.tasks.Loop.restart:9 discord.ext.tasks.Loop.start:4 of -msgid "The keyword arguments to use." -msgstr "" - -#: discord.ext.tasks.Loop.add_exception_type discord.ext.tasks.Loop.after_loop -#: discord.ext.tasks.Loop.before_loop discord.ext.tasks.Loop.change_interval -#: discord.ext.tasks.Loop.error discord.ext.tasks.Loop.start -#: discord.ext.tasks.loop of -#, fuzzy -msgid "Raises" -msgstr "例外" - -#: discord.ext.tasks.Loop.start:6 of -msgid "A task has already been launched and is running." -msgstr "" - -#: discord.ext.tasks.Loop.remove_exception_type discord.ext.tasks.Loop.start of -msgid "Returns" -msgstr "戻り値" - -#: discord.ext.tasks.Loop.start:8 of -msgid "The task that has been created." -msgstr "タスクが作成されました。" - -#: discord.ext.tasks.Loop.remove_exception_type discord.ext.tasks.Loop.start of -msgid "Return type" -msgstr "戻り値の型" - -#: discord.ext.tasks.Loop.start:9 of -msgid ":class:`asyncio.Task`" -msgstr ":class:`asyncio.Task`" - -#: discord.ext.tasks.Loop.stop:1 of -msgid "Gracefully stops the task from running." -msgstr "" - -#: discord.ext.tasks.Loop.stop:3 of -msgid "" -"Unlike :meth:`cancel`\\, this allows the task to finish its current " -"iteration before gracefully exiting." -msgstr "" - -#: discord.ext.tasks.Loop.stop:8 of -msgid "" -"If the internal function raises an error that can be handled before " -"finishing then it will retry until it succeeds." -msgstr "" - -#: discord.ext.tasks.Loop.stop:12 of -msgid "" -"If this is undesirable, either remove the error handling before stopping " -"via :meth:`clear_exception_types` or use :meth:`cancel` instead." -msgstr "" - -#: discord.ext.tasks.Loop.cancel:1 of -msgid "Cancels the internal task, if it is running." -msgstr "" - -#: discord.ext.tasks.Loop.restart:1 of -msgid "A convenience method to restart the internal task." -msgstr "" - -#: discord.ext.tasks.Loop.restart:5 of -msgid "" -"Due to the way this function works, the task is not returned like " -":meth:`start`." -msgstr "" - -#: discord.ext.tasks.Loop.restart:8 of -msgid "The arguments to to use." -msgstr "" - -#: discord.ext.tasks.Loop.add_exception_type:1 of -#, fuzzy -msgid "Adds exception types to be handled during the reconnect logic." -msgstr "再接続中に処理する例外を追加します:" - -#: discord.ext.tasks.Loop.add_exception_type:3 of -msgid "" -"By default the exception types handled are those handled by " -":meth:`discord.Client.connect`\\, which includes a lot of internet " -"disconnection errors." -msgstr "" - -#: discord.ext.tasks.Loop.add_exception_type:7 of -msgid "" -"This function is useful if you're interacting with a 3rd party library " -"that raises its own set of exceptions." -msgstr "" - -#: discord.ext.tasks.Loop.add_exception_type:10 -#: discord.ext.tasks.Loop.remove_exception_type:3 of -msgid "An argument list of exception classes to handle." -msgstr "" - -#: discord.ext.tasks.Loop.add_exception_type:13 of -msgid "" -"An exception passed is either not a class or not inherited from " -":class:`BaseException`." -msgstr "" - -#: discord.ext.tasks.Loop.clear_exception_types:1 of -msgid "Removes all exception types that are handled." -msgstr "" - -#: discord.ext.tasks.Loop.clear_exception_types:5 of -msgid "This operation obviously cannot be undone!" -msgstr "" - -#: discord.ext.tasks.Loop.remove_exception_type:1 of -#, fuzzy -msgid "Removes exception types from being handled during the reconnect logic." -msgstr "再接続中に処理する例外を追加します:" - -#: discord.ext.tasks.Loop.remove_exception_type:6 of -msgid "Whether all exceptions were successfully removed." -msgstr "" - -#: discord.ext.tasks.Loop.remove_exception_type:7 of -msgid ":class:`bool`" -msgstr "" - -#: discord.ext.tasks.Loop.get_task:1 of -msgid "" -"Optional[:class:`asyncio.Task`]: Fetches the internal task or ``None`` if" -" there isn't one running." -msgstr "" - -#: discord.ext.tasks.Loop.is_being_cancelled:1 of -msgid "Whether the task is being cancelled." -msgstr "" - -#: discord.ext.tasks.Loop.failed:1 of -msgid ":class:`bool`: Whether the internal task has failed." -msgstr "" - -#: discord.ext.tasks.Loop.is_running:1 of -msgid ":class:`bool`: Check if the task is currently running." -msgstr "" - -#: discord.ext.tasks.Loop.before_loop:1 of -msgid "" -"A decorator that registers a coroutine to be called before the loop " -"starts running." -msgstr "" - -#: discord.ext.tasks.Loop.before_loop:3 of -msgid "" -"This is useful if you want to wait for some bot state before the loop " -"starts, such as :meth:`discord.Client.wait_until_ready`." -msgstr "" - -#: discord.ext.tasks.Loop.after_loop:3 discord.ext.tasks.Loop.before_loop:6 of -msgid "The coroutine must take no arguments (except ``self`` in a class context)." -msgstr "" - -#: discord.ext.tasks.Loop.before_loop:8 of -msgid "The coroutine to register before the loop runs." -msgstr "" - -#: discord.ext.tasks.Loop.after_loop:14 discord.ext.tasks.Loop.before_loop:11 -#: discord.ext.tasks.Loop.error:13 discord.ext.tasks.loop:22 of -msgid "The function was not a coroutine." -msgstr "" - -#: discord.ext.tasks.Loop.after_loop:1 of -msgid "" -"A decorator that register a coroutine to be called after the loop " -"finished running." -msgstr "" - -#: discord.ext.tasks.Loop.after_loop:7 of -msgid "" -"This coroutine is called even during cancellation. If it is desirable to " -"tell apart whether something was cancelled or not, check to see whether " -":meth:`is_being_cancelled` is ``True`` or not." -msgstr "" - -#: discord.ext.tasks.Loop.after_loop:11 of -msgid "The coroutine to register after the loop finishes." -msgstr "" - -#: discord.ext.tasks.Loop.error:1 of -msgid "" -"A decorator that registers a coroutine to be called if the task " -"encounters an unhandled exception." -msgstr "" - -#: discord.ext.tasks.Loop.error:3 of -msgid "" -"The coroutine must take only one argument the exception raised (except " -"``self`` in a class context)." -msgstr "" - -#: discord.ext.tasks.Loop.error:5 of -msgid "" -"By default this prints to :data:`sys.stderr` however it could be " -"overridden to have a different implementation." -msgstr "" - -#: discord.ext.tasks.Loop.error:10 of -msgid "The coroutine to register in the event of an unhandled exception." -msgstr "" - -#: discord.ext.tasks.Loop.change_interval:1 of -msgid "Changes the interval for the sleep time." -msgstr "" - -#: discord.ext.tasks.Loop.change_interval:5 of -msgid "" -"This only applies on the next loop iteration. If it is desirable for the " -"change of interval to be applied right away, cancel the task with " -":meth:`cancel`." -msgstr "" - -#: discord.ext.tasks.Loop.change_interval:10 discord.ext.tasks.loop:4 of -msgid "The number of seconds between every iteration." -msgstr "" - -#: discord.ext.tasks.Loop.change_interval:12 discord.ext.tasks.loop:6 of -msgid "The number of minutes between every iteration." -msgstr "" - -#: discord.ext.tasks.Loop.change_interval:14 discord.ext.tasks.loop:8 of -msgid "The number of hours between every iteration." -msgstr "" - -#: discord.ext.tasks.Loop.change_interval:17 discord.ext.tasks.loop:21 of -msgid "An invalid value was given." -msgstr "" - -#: discord.ext.tasks.loop:1 of -msgid "" -"A decorator that schedules a task in the background for you with optional" -" reconnect logic. The decorator returns a :class:`Loop`." -msgstr "" - -#: discord.ext.tasks.loop:10 of -msgid "The number of loops to do, ``None`` if it should be an infinite loop." -msgstr "" - -#: discord.ext.tasks.loop:13 of -msgid "" -"Whether to handle errors and restart the task using an exponential back-" -"off algorithm similar to the one used in :meth:`discord.Client.connect`." -msgstr "" - -#: discord.ext.tasks.loop:17 of -msgid "" -"The loop to use to register the task, if not given defaults to " -":func:`asyncio.get_event_loop`." -msgstr "" - -#~ msgid ":class:`int` -- The current iteration of the loop." -#~ msgstr "" - -#~ msgid ":exc:`RuntimeError` -- A task has already been launched and is running." -#~ msgstr "" - -#~ msgid "Adds an exception type to be handled during the reconnect logic." -#~ msgstr "" - -#~ msgid "The exception class to handle." -#~ msgstr "" - -#~ msgid "" -#~ ":exc:`TypeError` -- The exception passed " -#~ "is either not a class or not " -#~ "inherited from :class:`BaseException`." -#~ msgstr "" - -#~ msgid "" -#~ "Removes an exception type from being " -#~ "handled during the reconnect logic." -#~ msgstr "" - -#~ msgid "Whether it was successfully removed." -#~ msgstr "" - -#~ msgid ":exc:`TypeError` -- The function was not a coroutine." -#~ msgstr "" - -#~ msgid ":exc:`ValueError` -- An invalid value was given." -#~ msgstr "" - -#~ msgid "" -#~ "A decorator that schedules a task " -#~ "in the background for you with " -#~ "optional reconnect logic." -#~ msgstr "" - -#~ msgid "The loop helper that handles the background task." -#~ msgstr "" - -#~ msgid ":class:`Loop`" -#~ msgstr "" - diff --git a/docs/locale/ja/LC_MESSAGES/faq.po b/docs/locale/ja/LC_MESSAGES/faq.po deleted file mode 100644 index 27e21a274c..0000000000 --- a/docs/locale/ja/LC_MESSAGES/faq.po +++ /dev/null @@ -1,582 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: discordpy\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-10-23 22:41-0400\n" -"PO-Revision-Date: 2020-10-24 02:41+0000\n" -"Last-Translator: \n" -"Language: ja_JP\n" -"Language-Team: Japanese\n" -"Plural-Forms: nplurals=1; plural=0\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.5.3\n" - -#: ../../faq.rst:5 -msgid "Frequently Asked Questions" -msgstr "よくある質問" - -#: ../../faq.rst:7 -msgid "" -"This is a list of Frequently Asked Questions regarding using " -"``discord.py`` and its extension modules. Feel free to suggest a new " -"question or submit one via pull requests." -msgstr "これは ``discord.py`` 及び 拡張モジュールに対して、よくある質問をまとめたものです。気軽に質問やプルリクエストを提出してください。" - -#: ../../faq.rst:11 -msgid "Questions" -msgstr "質問" - -#: ../../faq.rst:14 -msgid "Coroutines" -msgstr "コルーチン" - -#: ../../faq.rst:16 -msgid "Questions regarding coroutines and asyncio belong here." -msgstr "コルーチンとasyncioに関する質問。" - -#: ../../faq.rst:19 -msgid "What is a coroutine?" -msgstr "コルーチンとはなんですか。" - -#: ../../faq.rst:21 -msgid "" -"A |coroutine_link|_ is a function that must be invoked with ``await`` or " -"``yield from``. When Python encounters an ``await`` it stops the " -"function's execution at that point and works on other things until it " -"comes back to that point and finishes off its work. This allows for your " -"program to be doing multiple things at the same time without using " -"threads or complicated multiprocessing." -msgstr "" -"|coroutine_link|_ とは ``await`` または ``yield from`` から呼び出さなければならない関数です。 " -"``await`` にエンカウントした場合、そのポイントで関数の実行を停止し、他の作業を実行します。 " -"これは作業が終了し、このポイントに戻ってくるまで続きます。 " -"これにより、スレッドや複雑なマルチプロセッシングを用いずに複数の処理を並列実行することができます。" - -#: ../../faq.rst:26 -msgid "" -"**If you forget to await a coroutine then the coroutine will not run. " -"Never forget to await a coroutine.**" -msgstr "**コルーチンにawaitを記述し忘れた場合、コルーチンは実行されません。awaitの記述を忘れないように注意してください。**" - -#: ../../faq.rst:29 -msgid "Where can I use ``await``\\?" -msgstr "``await`` はどこで使用することができますか。" - -#: ../../faq.rst:31 -msgid "" -"You can only use ``await`` inside ``async def`` functions and nowhere " -"else." -msgstr "``await`` は ``async def`` 関数の中でのみ使用できます。" - -#: ../../faq.rst:34 -msgid "What does \"blocking\" mean?" -msgstr "「ブロッキング」とはなんですか。" - -#: ../../faq.rst:36 -msgid "" -"In asynchronous programming a blocking call is essentially all the parts " -"of the function that are not ``await``. Do not despair however, because " -"not all forms of blocking are bad! Using blocking calls is inevitable, " -"but you must work to make sure that you don't excessively block " -"functions. Remember, if you block for too long then your bot will freeze " -"since it has not stopped the function's execution at that point to do " -"other things." -msgstr "" -"非同期プログラミングにおけるブロッキングとは、関数内の ``await`` 修飾子がないコードすべてを指します。 " -"しかし、全てのブロッキングが悪いというわけではありません。ブロッキングを使用することは避けられませんが、ブロックの発生は出来るだけ少なくする必要があります。長時間のブロックが発生すると、関数の実行が停止しないため、長時間Botがフリーズすることになることを覚えておきましょう。" - -#: ../../faq.rst:41 -msgid "" -"If logging is enabled, this library will attempt to warn you that " -"blocking is occurring with the message: ``Heartbeat blocked for more than" -" N seconds.`` See :ref:`logging_setup` for details on enabling logging." -msgstr "" -"もしロギングを有効にしている場合、ライブラリはブロッキングが起きていることを次のメッセージで警告しようと試みます: ``Heartbeat " -"blocked for more than N seconds.`` " -"ロギングを有効にするには、:ref:`logging_setup`をご覧ください。" - -#: ../../faq.rst:45 -msgid "" -"A common source of blocking for too long is something like " -":func:`time.sleep`. Don't do that. Use :func:`asyncio.sleep` instead. " -"Similar to this example: ::" -msgstr "" -"長時間ブロックの原因として一般的なのは :func:`time.sleep` などです。 これは使用せず、下記の例のように " -":func:`asyncio.sleep` を使用してください。" - -#: ../../faq.rst:54 -msgid "" -"Another common source of blocking for too long is using HTTP requests " -"with the famous module :doc:`req:index`. While :doc:`req:index` is an " -"amazing module for non-asynchronous programming, it is not a good choice " -"for :mod:`asyncio` because certain requests can block the event loop too " -"long. Instead, use the :doc:`aiohttp ` library which is " -"installed on the side with this library." -msgstr "" -"また、これだけでなく、有名なモジュール :doc:`req:index` のHTTPリクエストも長時間ブロックの原因になります。 " -":doc:`req:index` " -"モジュールは非非同期プログラミングでは素晴らしいモジュールですが、特定のリクエストがイベントループを長時間ブロックする可能性があるため、 " -":mod:`asyncio` には適していません。 代わりにこのライブラリと一緒にインストールされた :doc:`aiohttp " -"` を使用してください。" - -#: ../../faq.rst:59 -msgid "Consider the following example: ::" -msgstr "次の例を見てみましょう。" - -#: ../../faq.rst:75 -msgid "General" -msgstr "一般" - -#: ../../faq.rst:77 -msgid "General questions regarding library usage belong here." -msgstr "ライブラリの使用に関する一般的な質問。" - -#: ../../faq.rst:80 -msgid "Where can I find usage examples?" -msgstr "" - -#: ../../faq.rst:82 -msgid "" -"Example code can be found in the `examples folder " -"`_ in the " -"repository." -msgstr "" - -#: ../../faq.rst:86 -msgid "How do I set the \"Playing\" status?" -msgstr "「プレイ中」状態の設定をするにはどうすればいいですか。" - -#: ../../faq.rst:88 -msgid "" -"There is a method for this under :class:`Client` called " -":meth:`Client.change_presence`. The relevant aspect of this is its " -"``activity`` keyword argument which takes in an :class:`Activity` object." -msgstr "" -":class:`Client` 下にプレイ中状態の設定を行うためのメソッド :meth:`Client.change_presence` " -"が用意されています。 これの引数 ``activity`` に :class:`Activity` を渡します。" - -#: ../../faq.rst:91 -msgid "" -"The status type (playing, listening, streaming, watching) can be set " -"using the :class:`ActivityType` enum. For memory optimisation purposes, " -"some activities are offered in slimmed down versions:" -msgstr "" -"ステータスタイプ(プレイ中、再生中、配信中、視聴中)は列挙型の :class:`ActivityType` " -"を指定することで設定が可能です。メモリの最適化のため、一部のアクティビティはスリム化したバージョンで提供しています。" - -#: ../../faq.rst:94 -msgid ":class:`Game`" -msgstr ":class:`Game`" - -#: ../../faq.rst:95 -msgid ":class:`Streaming`" -msgstr ":class:`Streaming`" - -#: ../../faq.rst:97 -msgid "Putting both of these pieces of info together, you get the following: ::" -msgstr "これらの情報をまとめると以下のようになります: ::" - -#: ../../faq.rst:106 -msgid "How do I send a message to a specific channel?" -msgstr "特定のチャンネルにメッセージを送るにはどうすればいいですか。" - -#: ../../faq.rst:108 -msgid "" -"You must fetch the channel directly and then call the appropriate method." -" Example: ::" -msgstr "チャンネルを直接取得してから、適切なメソッドの呼び出しを行う必要があります。以下がその例です。" - -#: ../../faq.rst:114 -msgid "How do I send a DM?" -msgstr "" - -#: ../../faq.rst:116 -msgid "" -"Get the :class:`User` or :class:`Member` object and call " -":meth:`abc.Messageable.send`. For example: ::" -msgstr "" - -#: ../../faq.rst:121 -msgid "" -"If you are responding to an event, such as :func:`on_message`, you " -"already have the :class:`User` object via :attr:`Message.author`: ::" -msgstr "" - -#: ../../faq.rst:126 -#, fuzzy -msgid "How do I get the ID of a sent message?" -msgstr "元の ``message`` を取得するにはどうすればよいですか。" - -#: ../../faq.rst:128 -msgid "" -":meth:`abc.Messageable.send` returns the :class:`Message` that was sent. " -"The ID of a message can be accessed via :attr:`Message.id`: ::" -msgstr "" - -#: ../../faq.rst:135 -msgid "How do I upload an image?" -msgstr "画像をアップロードするにはどうすればいいですか。" - -#: ../../faq.rst:137 -msgid "To upload something to Discord you have to use the :class:`File` object." -msgstr "Discordに何かをアップロードする際には :class:`File` オブジェクトを使用する必要があります。" - -#: ../../faq.rst:139 -msgid "" -"A :class:`File` accepts two parameters, the file-like object (or file " -"path) and the filename to pass to Discord when uploading." -msgstr ":class:`File` は二つのパラメータがあり、ファイルライクなオブジェクト(または、そのファイルパス)と、ファイル名を渡すことができます。" - -#: ../../faq.rst:142 -msgid "If you want to upload an image it's as simple as: ::" -msgstr "画像をアップロードするだけなら、以下のように簡単に行なえます。" - -#: ../../faq.rst:146 -msgid "If you have a file-like object you can do as follows: ::" -msgstr "もし、ファイルライクなオブジェクトがあるなら、以下のような実装が可能です。" - -#: ../../faq.rst:151 -msgid "" -"To upload multiple files, you can use the ``files`` keyword argument " -"instead of ``file``\\: ::" -msgstr "複数のファイルをアップロードするには、 ``file`` の代わりに ``files`` を使用しましょう。" - -#: ../../faq.rst:159 -msgid "" -"If you want to upload something from a URL, you will have to use an HTTP " -"request using :doc:`aiohttp ` and then pass an " -":class:`io.BytesIO` instance to :class:`File` like so:" -msgstr "" -"URLから何かをアップロードする場合は、 :doc:`aiohttp ` のHTTPリクエストを使用し、 " -":class:`io.BytesIO` インスタンスを :class:`File` にわたす必要があります。" - -#: ../../faq.rst:176 -msgid "How can I add a reaction to a message?" -msgstr "メッセージにリアクションをつけるにはどうすればいいですか。" - -#: ../../faq.rst:178 -msgid "You use the :meth:`Message.add_reaction` method." -msgstr ":meth:`Client.add_reaction` を使用してください。" - -#: ../../faq.rst:180 -msgid "" -"If you want to use unicode emoji, you must pass a valid unicode code " -"point in a string. In your code, you can write this in a few different " -"ways:" -msgstr "Unicodeの絵文字を使用する場合は、文字列内の有効なUnicodeのコードポイントを渡す必要があります。 例を挙げると、このようになります。" - -#: ../../faq.rst:182 -msgid "``'👍'``" -msgstr "``'👍'``" - -#: ../../faq.rst:183 -msgid "``'\\U0001F44D'``" -msgstr "``'\\U0001F44D'``" - -#: ../../faq.rst:184 -msgid "``'\\N{THUMBS UP SIGN}'``" -msgstr "``'\\N{THUMBS UP SIGN}'``" - -#: ../../faq.rst:186 ../../faq.rst:202 ../../faq.rst:277 ../../faq.rst:293 -#: ../../faq.rst:313 -msgid "Quick example: ::" -msgstr "簡単な例。" - -#: ../../faq.rst:192 -msgid "" -"In case you want to use emoji that come from a message, you already get " -"their code points in the content without needing to do anything special. " -"You **cannot** send ``':thumbsup:'`` style shorthands." -msgstr "" -"メッセージから来た絵文字を使用したい場合は、特になにをするでもなく、コンテンツのコードポイントをあなたは取得しています。また、 " -"``':thumbsup:'`` のような簡略化したものを送信することは **できません** 。" - -#: ../../faq.rst:195 -msgid "" -"For custom emoji, you should pass an instance of :class:`Emoji`. You can " -"also pass a ``'<:name:id>'`` string, but if you can use said emoji, you " -"should be able to use :meth:`Client.get_emoji` to get an emoji via ID or " -"use :func:`utils.find`/ :func:`utils.get` on :attr:`Client.emojis` or " -":attr:`Guild.emojis` collections." -msgstr "" -"カスタム絵文字については、:class:`Emoji`のインスタンスを渡すといいでしょう。``'<:名前:ID>'``形式の文字列も渡せますが、その絵文字が使えるなら、:meth:`Client.get_emoji`でIDから絵文字を取得したり、:attr:`Client.emojis`" -" や :attr:`Guild.emojis`に対して:func:`utils.find`/ " -":func:`utils.get`を使ったりできるでしょう。" - -#: ../../faq.rst:199 -msgid "" -"The name and ID of a custom emoji can be found with the client by " -"prefixing ``:custom_emoji:`` with a backslash. For example, sending the " -"message ``\\:python3:`` with the client will result in " -"``<:python3:232720527448342530>``." -msgstr "カスタム絵文字の名前とIDをクライアント側で知るには、``:カスタム絵文字:``の頭にバックスラッシュ(円記号)をつけます。たとえば、メッセージ``\\:python3:``を送信すると、結果は``<:python3:232720527448342530>``になります。" - -#: ../../faq.rst:219 -msgid "How do I pass a coroutine to the player's \"after\" function?" -msgstr "どうやってコルーチンをプレイヤーの後処理に渡すのですか。" - -#: ../../faq.rst:221 -msgid "" -"The library's music player launches on a separate thread, ergo it does " -"not execute inside a coroutine. This does not mean that it is not " -"possible to call a coroutine in the ``after`` parameter. To do so you " -"must pass a callable that wraps up a couple of aspects." -msgstr "" -"ライブラリの音楽プレーヤーは別のスレッドで起動するもので、コルーチン内で実行されるものではありません。しかし、 ``after`` " -"にコルーチンが渡せないというわけではありません。コルーチンを渡すためには、いくつかの機能を包括した呼び出し可能コードで渡す必要があります。" - -#: ../../faq.rst:225 -msgid "" -"The first gotcha that you must be aware of is that calling a coroutine is" -" not a thread-safe operation. Since we are technically in another thread," -" we must take caution in calling thread-safe operations so things do not " -"bug out. Luckily for us, :mod:`asyncio` comes with a " -":func:`asyncio.run_coroutine_threadsafe` function that allows us to call " -"a coroutine from another thread." -msgstr "" -"コルーチンを呼び出すという動作はスレッドセーフなものではないということを最初に理解しておく必要があります。技術的に別スレッドなので、スレッドセーフに呼び出す際には注意が必要です。幸運にも、" -" :mod:`asyncio` には :func:`asyncio.run_coroutine_threadsafe` " -"という関数があります。これを用いることで、別スレッドからコルーチンを呼び出すことが可能です。" - -#: ../../faq.rst:230 -msgid "" -"However, this function returns a :class:`concurrent.Future` and to " -"actually call it we have to fetch its result. Putting all of this " -"together we can do the following: ::" -msgstr "" -"しかし、この関数は :class:`concurrent.Future` " -"を返すので、実際にはそこから結果を読み出す必要があります。これをすべてまとめると、次のことができます。" - -#: ../../faq.rst:245 -msgid "How do I run something in the background?" -msgstr "バックグラウンドで何かを動かすにはどうすればいいですか。" - -#: ../../faq.rst:247 -msgid "" -"`Check the background_task.py example. " -"`_" -msgstr "" -"`background_task.pyの例を参照してください。 " -"`_" - -#: ../../faq.rst:250 -msgid "How do I get a specific model?" -msgstr "特定のユーザー、役割、チャンネル、サーバを取得するにはどうすればいいですか。" - -#: ../../faq.rst:252 -msgid "" -"There are multiple ways of doing this. If you have a specific model's ID " -"then you can use one of the following functions:" -msgstr "方法は複数ありますが、特定のモデルのIDがわかっていれば、以下の方法が使えます。" - -#: ../../faq.rst:255 -msgid ":meth:`Client.get_channel`" -msgstr ":meth:`Client.get_channel`" - -#: ../../faq.rst:256 -msgid ":meth:`Client.get_guild`" -msgstr ":meth:`Client.get_guild`" - -#: ../../faq.rst:257 -msgid ":meth:`Client.get_user`" -msgstr ":meth:`Client.get_user`" - -#: ../../faq.rst:258 -msgid ":meth:`Client.get_emoji`" -msgstr ":meth:`Client.get_emoji`" - -#: ../../faq.rst:259 -msgid ":meth:`Guild.get_member`" -msgstr ":meth:`Guild.get_member`" - -#: ../../faq.rst:260 -msgid ":meth:`Guild.get_channel`" -msgstr ":meth:`Guild.get_channel`" - -#: ../../faq.rst:261 -msgid ":meth:`Guild.get_role`" -msgstr ":meth:`Guild.get_role`" - -#: ../../faq.rst:263 -msgid "The following use an HTTP request:" -msgstr "以下の例ではHTTPリクエストを使用します。" - -#: ../../faq.rst:265 -msgid ":meth:`abc.Messageable.fetch_message`" -msgstr ":meth:`abc.Messageable.fetch_message`" - -#: ../../faq.rst:266 -msgid ":meth:`Client.fetch_user`" -msgstr ":meth:`Client.fetch_user`" - -#: ../../faq.rst:267 -msgid ":meth:`Client.fetch_guilds`" -msgstr ":meth:`Client.fetch_guilds`" - -#: ../../faq.rst:268 -msgid ":meth:`Client.fetch_guild`" -msgstr ":meth:`Client.fetch_guild`" - -#: ../../faq.rst:269 -msgid ":meth:`Guild.fetch_emoji`" -msgstr ":meth:`Guild.fetch_emoji`" - -#: ../../faq.rst:270 -msgid ":meth:`Guild.fetch_emojis`" -msgstr ":meth:`Guild.fetch_emojis`" - -#: ../../faq.rst:271 -msgid ":meth:`Guild.fetch_member`" -msgstr ":meth:`Guild.fetch_member`" - -#: ../../faq.rst:274 -msgid "" -"If the functions above do not help you, then use of :func:`utils.find` or" -" :func:`utils.get` would serve some use in finding specific models." -msgstr "上記の関数を使えない状況の場合、 :func:`utils.find` または :func:`utils.get` が役に立つでしょう。" - -#: ../../faq.rst:288 -msgid "How do I make a web request?" -msgstr "Webリクエストはどうやって作ればよいですか。" - -#: ../../faq.rst:290 -msgid "" -"To make a request, you should use a non-blocking library. This library " -"already uses and requires a 3rd party library for making requests, " -"``aiohttp``." -msgstr "" -"リクエストを送るには、ノンブロッキングのライブラリを使わなければなりません。このライブラリは、リクエストを作成するのにサードパーティー製の " -"``aiohttp`` を必要とします。" - -#: ../../faq.rst:300 -msgid "" -"See `aiohttp's full documentation " -"`_ for more information." -msgstr "" -"詳細は `aiohttpの完全なドキュメント `_ " -"を参照してください。" - -#: ../../faq.rst:303 -msgid "How do I use a local image file for an embed image?" -msgstr "Embedの画像にローカルの画像を使用するにはどうすればいいですか。" - -#: ../../faq.rst:305 -msgid "" -"Discord special-cases uploading an image attachment and using it within " -"an embed so that it will not display separately, but instead in the " -"embed's thumbnail, image, footer or author icon." -msgstr "特殊なケースとして、画像が別々に表示されないようDiscordにembedを用いてアップロードする際、画像は代わりにembedのサムネイルや画像、フッター、製作者アイコンに表示されます。" - -#: ../../faq.rst:308 -msgid "" -"To do so, upload the image normally with :meth:`abc.Messageable.send`, " -"and set the embed's image URL to ``attachment://image.png``, where " -"``image.png`` is the filename of the image you will send." -msgstr "" -"これを行うには、通常通り :meth:`abc.Messageable.send` を用いて画像をアップロードし、Embedの画像URLに " -"``attachment://image.png`` を設定します。このとき ``image.png`` は送信したい画像のファイル名にです。" - -#: ../../faq.rst:322 -msgid "Due to a Discord limitation, filenames may not include underscores." -msgstr "Discord側の制限により、ファイル名にアンダースコアが含まれていない場合があります。" - -#: ../../faq.rst:325 -#, fuzzy -msgid "Is there an event for audit log entries being created?" -msgstr "招待、または監査ログのエントリが作成されるイベントはありますか。" - -#: ../../faq.rst:327 -msgid "" -"Since Discord does not dispatch this information in the gateway, the " -"library cannot provide this information. This is currently a Discord " -"limitation." -msgstr "Discordはゲートウェイでこの情報をディスパッチしないため、ライブラリによってこの情報を提供することはできません。これは現在、Discord側の制限です。" - -#: ../../faq.rst:331 -msgid "Commands Extension" -msgstr "コマンド拡張" - -#: ../../faq.rst:333 -msgid "Questions regarding ``discord.ext.commands`` belong here." -msgstr "``discord.ext.commands`` に関する質問。" - -#: ../../faq.rst:336 -msgid "Why does ``on_message`` make my commands stop working?" -msgstr "``on_message`` を使うとコマンドが動作しなくなります。どうしてですか。" - -#: ../../faq.rst:338 -msgid "" -"Overriding the default provided ``on_message`` forbids any extra commands" -" from running. To fix this, add a ``bot.process_commands(message)`` line " -"at the end of your ``on_message``. For example: ::" -msgstr "" -"デフォルトで提供されている ``on_message`` をオーバーライドすると、コマンドが実行されなくなります。これを修正するには " -"``on_message`` の最後に ``bot.process_commands(message)`` を追加してみてください。" - -#: ../../faq.rst:347 -msgid "" -"Alternatively, you can place your ``on_message`` logic into a " -"**listener**. In this setup, you should not manually call " -"``bot.process_commands()``. This also allows you to do multiple things " -"asynchronously in response to a message. Example::" -msgstr "" - -#: ../../faq.rst:357 -msgid "Why do my arguments require quotes?" -msgstr "コマンドの引数にクォーテーションが必要なのはなぜですか。" - -#: ../../faq.rst:359 -msgid "In a simple command defined as: ::" -msgstr "次の簡単なコマンドを見てみましょう。" - -#: ../../faq.rst:365 -msgid "" -"Calling it via ``?echo a b c`` will only fetch the first argument and " -"disregard the rest. To fix this you should either call it via ``?echo \"a" -" b c\"`` or change the signature to have \"consume rest\" behaviour. " -"Example: ::" -msgstr "" -"このコマンドを ``?echo a b c`` " -"のように実行したとき、コマンドに渡されるのは最初の引数だけです。その後の引数はすべて無視されます。これを正常に動かすためには ``?echo " -"\"a b c\"`` のようにしてコマンドを実行するか、コマンドの引数を下記の例のようにしてみましょう" - -#: ../../faq.rst:372 -msgid "This will allow you to use ``?echo a b c`` without needing the quotes." -msgstr "これにより、クォーテーションなしで ``?echo a b c`` を使用することができます。" - -#: ../../faq.rst:375 -msgid "How do I get the original ``message``\\?" -msgstr "元の ``message`` を取得するにはどうすればよいですか。" - -#: ../../faq.rst:377 -msgid "" -"The :class:`~ext.commands.Context` contains an attribute, " -":attr:`~.Context.message` to get the original message." -msgstr "" -":class:`~ext.commands.Context` は元のメッセージを取得するための属性である " -":attr:`~.Context.message` を持っています。" - -#: ../../faq.rst:380 ../../faq.rst:392 -msgid "Example: ::" -msgstr "例:" - -#: ../../faq.rst:387 -msgid "How do I make a subcommand?" -msgstr "サブコマンドを作るにはどうすればいいですか。" - -#: ../../faq.rst:389 -msgid "" -"Use the ``group`` decorator. This will transform the callback into a " -"``Group`` which will allow you to add commands into the group operating " -"as \"subcommands\". These groups can be arbitrarily nested as well." -msgstr "" -"``group`` デコレータを使います。これにより、コールバックが ``Group`` " -"に変換され、groupに「サブコマンド」として動作するコマンドを追加できます。これらのグループは、ネストすることもできます。" - -#: ../../faq.rst:403 -msgid "This could then be used as ``?git push origin master``." -msgstr "これは ``?git push origin master`` のように使うことができます。" - diff --git a/docs/locale/ja/LC_MESSAGES/index.po b/docs/locale/ja/LC_MESSAGES/index.po deleted file mode 100644 index 45e368fb65..0000000000 --- a/docs/locale/ja/LC_MESSAGES/index.po +++ /dev/null @@ -1,83 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: discordpy\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-10-23 22:41-0400\n" -"PO-Revision-Date: 2020-10-24 02:41+0000\n" -"Last-Translator: \n" -"Language: ja_JP\n" -"Language-Team: Japanese\n" -"Plural-Forms: nplurals=1; plural=0\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.5.3\n" - -#: ../../index.rst:7 -msgid "Welcome to discord.py" -msgstr "discord.py へようこそ。" - -#: ../../index.rst:11 -msgid "" -"discord.py is a modern, easy to use, feature-rich, and async ready API " -"wrapper for Discord." -msgstr "discord.py は機能豊富かつモダンで使いやすい、非同期処理にも対応したDiscord用のAPIラッパーです。" - -#: ../../index.rst:14 -msgid "**Features:**" -msgstr "**特徴:**" - -#: ../../index.rst:16 -msgid "Modern Pythonic API using ``async``\\/``await`` syntax" -msgstr "``async``\\/``await`` 構文を使ったモダンなPythonらしいAPI" - -#: ../../index.rst:17 -msgid "Sane rate limit handling that prevents 429s" -msgstr "429エラー防止の為のレート制限" - -#: ../../index.rst:18 -msgid "Implements the entire Discord API" -msgstr "Discord APIを完全にカバー" - -#: ../../index.rst:19 -msgid "Command extension to aid with bot creation" -msgstr "Bot作成に便利なコマンド拡張" - -#: ../../index.rst:20 -msgid "Easy to use with an object oriented design" -msgstr "オブジェクト指向設計で使いやすい" - -#: ../../index.rst:21 -msgid "Optimised for both speed and memory" -msgstr "メモリと速度の両方を最適化" - -#: ../../index.rst:24 -msgid "Documentation Contents" -msgstr "ドキュメントの目次" - -#: ../../index.rst:36 -msgid "Extensions" -msgstr "拡張機能" - -#: ../../index.rst:46 -msgid "Additional Information" -msgstr "追加情報" - -#: ../../index.rst:57 -msgid "" -"If you still can't find what you're looking for, try in one of the " -"following pages:" -msgstr "探しているものが見つからない場合は、以下のページを試してください。" - -#: ../../index.rst:59 -msgid ":ref:`genindex`" -msgstr ":ref:`genindex`" - -#: ../../index.rst:60 -msgid ":ref:`search`" -msgstr ":ref:`search`" - -#~ msgid ":ref:`modindex`" -#~ msgstr ":ref:`modindex`" - diff --git a/docs/locale/ja/LC_MESSAGES/intents.po b/docs/locale/ja/LC_MESSAGES/intents.po deleted file mode 100644 index a3d6d75ee5..0000000000 --- a/docs/locale/ja/LC_MESSAGES/intents.po +++ /dev/null @@ -1,429 +0,0 @@ -# SOME DESCRIPTIVE TITLE. -# Copyright (C) 2015-present, Rapptz -# This file is distributed under the same license as the discord.py package. -# FIRST AUTHOR , 2020. -# -#, fuzzy -msgid "" -msgstr "" -"Project-Id-Version: discord.py 1.5.1\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-10-23 22:41-0400\n" -"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" -"Last-Translator: FULL NAME \n" -"Language-Team: LANGUAGE \n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.5.3\n" - -#: ../../intents.rst:6 -msgid "A Primer to Gateway Intents" -msgstr "" - -#: ../../intents.rst:8 -msgid "" -"In version 1.5 comes the introduction of :class:`Intents`. This is a " -"radical change in how bots are written. An intent basically allows a bot " -"to subscribe into specific buckets of events. The events that correspond " -"to each intent is documented in the individual attribute of the " -":class:`Intents` documentation." -msgstr "" - -#: ../../intents.rst:10 -msgid "" -"These intents are passed to the constructor of :class:`Client` or its " -"subclasses (:class:`AutoShardedClient`, :class:`~.AutoShardedBot`, " -":class:`~.Bot`) with the ``intents`` argument." -msgstr "" - -#: ../../intents.rst:12 -msgid "" -"If intents are not passed, then the library defaults to every intent " -"being enabled except the privileged intents, currently " -":attr:`Intents.members` and :attr:`Intents.presences`." -msgstr "" - -#: ../../intents.rst:15 -msgid "What intents are needed?" -msgstr "" - -#: ../../intents.rst:17 -msgid "" -"The intents that are necessary for your bot can only be dictated by " -"yourself. Each attribute in the :class:`Intents` class documents what " -":ref:`events ` it corresponds to and what kind of " -"cache it enables." -msgstr "" - -#: ../../intents.rst:19 -msgid "" -"For example, if you want a bot that functions without spammy events like " -"presences or typing then we could do the following:" -msgstr "" - -#: ../../intents.rst:34 -msgid "" -"Note that this doesn't enable :attr:`Intents.members` since it's a " -"privileged intent." -msgstr "" - -#: ../../intents.rst:36 -msgid "" -"Another example showing a bot that only deals with messages and guild " -"information:" -msgstr "" - -#: ../../intents.rst:54 -msgid "Privileged Intents" -msgstr "" - -#: ../../intents.rst:56 -msgid "" -"With the API change requiring bot authors to specify intents, some " -"intents were restricted further and require more manual steps. These " -"intents are called **privileged intents**." -msgstr "" - -#: ../../intents.rst:58 -msgid "" -"A privileged intent is one that requires you to go to the developer " -"portal and manually enable it. To enable privileged intents do the " -"following:" -msgstr "" - -#: ../../intents.rst:60 -msgid "" -"Make sure you're logged on to the `Discord website " -"`_." -msgstr "" - -#: ../../intents.rst:61 -msgid "" -"Navigate to the `application page " -"`_" -msgstr "" - -#: ../../intents.rst:62 -msgid "Click on the bot you want to enable privileged intents for." -msgstr "" - -#: ../../intents.rst:63 -msgid "Navigate to the bot tab on the left side of the screen." -msgstr "" - -#: ../../intents.rst:68 -msgid "" -"Scroll down to the \"Privileged Gateway Intents\" section and enable the " -"ones you want." -msgstr "" - -#: ../../intents.rst:75 -msgid "" -"Enabling privileged intents when your bot is in over 100 guilds requires " -"going through `bot verification `_. If your bot is already verified and you " -"would like to enable a privileged intent you must go through `discord " -"support `_ and talk to them about it." -msgstr "" - -#: ../../intents.rst:79 -msgid "" -"Even if you enable intents through the developer portal, you still have " -"to enable the intents through code as well." -msgstr "" - -#: ../../intents.rst:83 -msgid "Do I need privileged intents?" -msgstr "" - -#: ../../intents.rst:85 -msgid "This is a quick checklist to see if you need specific privileged intents." -msgstr "" - -#: ../../intents.rst:90 -msgid "Presence Intent" -msgstr "" - -#: ../../intents.rst:92 -msgid "Whether you use :attr:`Member.status` at all to track member statuses." -msgstr "" - -#: ../../intents.rst:93 -msgid "" -"Whether you use :attr:`Member.activity` or :attr:`Member.activities` to " -"check member's activities." -msgstr "" - -#: ../../intents.rst:98 -msgid "Member Intent" -msgstr "" - -#: ../../intents.rst:100 -msgid "" -"Whether you track member joins or member leaves, corresponds to " -":func:`on_member_join` and :func:`on_member_remove` events." -msgstr "" - -#: ../../intents.rst:101 -msgid "Whether you want to track member updates such as nickname or role changes." -msgstr "" - -#: ../../intents.rst:102 -msgid "" -"Whether you want to track user updates such as usernames, avatars, " -"discriminators, etc." -msgstr "" - -#: ../../intents.rst:103 -msgid "" -"Whether you want to request the guild member list through " -":meth:`Guild.chunk` or :meth:`Guild.fetch_members`." -msgstr "" - -#: ../../intents.rst:104 -msgid "Whether you want high accuracy member cache under :attr:`Guild.members`." -msgstr "" - -#: ../../intents.rst:109 -msgid "Member Cache" -msgstr "" - -#: ../../intents.rst:111 -msgid "" -"Along with intents, Discord now further restricts the ability to cache " -"members and expects bot authors to cache as little as is necessary. " -"However, to properly maintain a cache the :attr:`Intents.members` intent " -"is required in order to track the members who left and properly evict " -"them." -msgstr "" - -#: ../../intents.rst:113 -msgid "" -"To aid with member cache where we don't need members to be cached, the " -"library now has a :class:`MemberCacheFlags` flag to control the member " -"cache. The documentation page for the class goes over the specific " -"policies that are possible." -msgstr "" - -#: ../../intents.rst:115 -msgid "" -"It should be noted that certain things do not need a member cache since " -"Discord will provide full member information if possible. For example:" -msgstr "" - -#: ../../intents.rst:117 -msgid "" -":func:`on_message` will have :attr:`Message.author` be a member even if " -"cache is disabled." -msgstr "" - -#: ../../intents.rst:118 -msgid "" -":func:`on_voice_state_update` will have the ``member`` parameter be a " -"member even if cache is disabled." -msgstr "" - -#: ../../intents.rst:119 -msgid "" -":func:`on_reaction_add` will have the ``user`` parameter be a member even" -" if cache is disabled." -msgstr "" - -#: ../../intents.rst:120 -msgid "" -":func:`on_raw_reaction_add` will have " -":attr:`RawReactionActionEvent.member` be a member even if cache is " -"disabled." -msgstr "" - -#: ../../intents.rst:121 -msgid "" -"The reaction removal events do not have the member information. This is a" -" Discord limitation." -msgstr "" - -#: ../../intents.rst:123 -msgid "" -"Other events that take a :class:`Member` will require the use of the " -"member cache. If absolute accuracy over the member cache is desirable, " -"then it is advisable to have the :attr:`Intents.members` intent enabled." -msgstr "" - -#: ../../intents.rst:128 -msgid "Retrieving Members" -msgstr "" - -#: ../../intents.rst:130 -msgid "" -"If cache is disabled or you disable chunking guilds at startup, we might " -"still need a way to load members. The library offers a few ways to do " -"this:" -msgstr "" - -#: ../../intents.rst:134 -msgid ":meth:`Guild.query_members`" -msgstr "" - -#: ../../intents.rst:133 -msgid "Used to query members by a prefix matching nickname or username." -msgstr "" - -#: ../../intents.rst:134 -msgid "This can also be used to query members by their user ID." -msgstr "" - -#: ../../intents.rst:135 -msgid "This uses the gateway and not the HTTP." -msgstr "" - -#: ../../intents.rst:136 -msgid ":meth:`Guild.chunk`" -msgstr "" - -#: ../../intents.rst:137 -msgid "This can be used to fetch the entire member list through the gateway." -msgstr "" - -#: ../../intents.rst:138 -msgid ":meth:`Guild.fetch_member`" -msgstr "" - -#: ../../intents.rst:139 -msgid "Used to fetch a member by ID through the HTTP API." -msgstr "" - -#: ../../intents.rst:141 -msgid ":meth:`Guild.fetch_members`" -msgstr "" - -#: ../../intents.rst:141 -msgid "used to fetch a large number of members through the HTTP API." -msgstr "" - -#: ../../intents.rst:143 -msgid "" -"It should be noted that the gateway has a strict rate limit of 120 " -"requests per 60 seconds." -msgstr "" - -#: ../../intents.rst:146 -msgid "Troubleshooting" -msgstr "" - -#: ../../intents.rst:148 -msgid "Some common issues relating to the mandatory intent change." -msgstr "" - -#: ../../intents.rst:151 -msgid "Where'd my members go?" -msgstr "" - -#: ../../intents.rst:153 -msgid "" -"Due to an :ref:`API change ` Discord is now forcing" -" developers who want member caching to explicitly opt-in to it. This is a" -" Discord mandated change and there is no way to bypass it. In order to " -"get members back you have to explicitly enable the :ref:`members " -"privileged intent ` and change the " -":attr:`Intents.members` attribute to true." -msgstr "" - -#: ../../intents.rst:155 -msgid "For example:" -msgstr "" - -#: ../../intents.rst:170 -msgid "Why does ``on_ready`` take so long to fire?" -msgstr "" - -#: ../../intents.rst:172 -msgid "" -"As part of the API change regarding intents, Discord also changed how " -"members are loaded in the beginning. Originally the library could request" -" 75 guilds at once and only request members from guilds that have the " -":attr:`Guild.large` attribute set to ``True``. With the new intent " -"changes, Discord mandates that we can only send 1 guild per request. This" -" causes a 75x slowdown which is further compounded by the fact that *all*" -" guilds, not just large guilds are being requested." -msgstr "" - -#: ../../intents.rst:174 -msgid "There are a few solutions to fix this." -msgstr "" - -#: ../../intents.rst:176 -msgid "" -"The first solution is to request the privileged presences intent along " -"with the privileged members intent and enable both of them. This allows " -"the initial member list to contain online members just like the old " -"gateway. Note that we're still limited to 1 guild per request but the " -"number of guilds we request is significantly reduced." -msgstr "" - -#: ../../intents.rst:178 -msgid "" -"The second solution is to disable member chunking by setting " -"``chunk_guilds_at_startup`` to ``False`` when constructing a client. " -"Then, when chunking for a guild is necessary you can use the various " -"techniques to :ref:`retrieve members `." -msgstr "" - -#: ../../intents.rst:180 -msgid "" -"To illustrate the slowdown caused the API change, take a bot who is in " -"840 guilds and 95 of these guilds are \"large\" (over 250 members)." -msgstr "" - -#: ../../intents.rst:182 -msgid "" -"Under the original system this would result in 2 requests to fetch the " -"member list (75 guilds, 20 guilds) roughly taking 60 seconds. With " -":attr:`Intents.members` but not :attr:`Intents.presences` this requires " -"840 requests, with a rate limit of 120 requests per 60 seconds means that" -" due to waiting for the rate limit it totals to around 7 minutes of " -"waiting for the rate limit to fetch all the members. With both " -":attr:`Intents.members` and :attr:`Intents.presences` we mostly get the " -"old behaviour so we're only required to request for the 95 guilds that " -"are large, this is slightly less than our rate limit so it's close to the" -" original timing to fetch the member list." -msgstr "" - -#: ../../intents.rst:184 -msgid "" -"Unfortunately due to this change being required from Discord there is " -"nothing that the library can do to mitigate this." -msgstr "" - -#: ../../intents.rst:187 -msgid "I don't like this, can I go back?" -msgstr "" - -#: ../../intents.rst:189 -msgid "" -"For now, the old gateway will still work so downgrading to discord.py " -"v1.4 is still possible and will continue to be supported until Discord " -"officially kills the v6 gateway, which is imminent. However it is " -"paramount that for the future of your bot that you upgrade your code to " -"the new way things are done." -msgstr "" - -#: ../../intents.rst:191 -msgid "To downgrade you can do the following:" -msgstr "" - -#: ../../intents.rst:197 -msgid "On Windows use ``py -3`` instead of ``python3``." -msgstr "" - -#: ../../intents.rst:201 -msgid "" -"There is no currently set date in which the old gateway will stop working" -" so it is recommended to update your code instead." -msgstr "" - -#: ../../intents.rst:203 -msgid "" -"If you truly dislike the direction Discord is going with their API, you " -"can contact them via `support `_" -msgstr "" diff --git a/docs/locale/ja/LC_MESSAGES/intro.po b/docs/locale/ja/LC_MESSAGES/intro.po deleted file mode 100644 index dcef877811..0000000000 --- a/docs/locale/ja/LC_MESSAGES/intro.po +++ /dev/null @@ -1,127 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: discordpy\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-22 09:35-0400\n" -"PO-Revision-Date: 2020-10-24 02:41\n" -"Last-Translator: \n" -"Language-Team: Japanese\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Crowdin-Project: discordpy\n" -"X-Crowdin-Project-ID: 362783\n" -"X-Crowdin-Language: ja\n" -"X-Crowdin-File: intro.pot\n" -"X-Crowdin-File-ID: 80\n" -"Language: ja_JP\n" - -#: ../../intro.rst:6 -msgid "Introduction" -msgstr "はじめに" - -#: ../../intro.rst:8 -msgid "This is the documentation for discord.py, a library for Python to aid in creating applications that utilise the Discord API." -msgstr "これはDiscord APIを利用したアプリケーションを作成するのに便利なPythonライブラリ、discord.pyのドキュメントです。" - -#: ../../intro.rst:12 -msgid "Prerequisites" -msgstr "前提" - -#: ../../intro.rst:14 -msgid "discord.py works with Python 3.5.3 or higher. Support for earlier versions of Python is not provided. Python 2.7 or lower is not supported. Python 3.4 or lower is not supported due to one of the dependencies (:doc:`aiohttp `) not supporting Python 3.4." -msgstr "discord.pyは3.5.3以降のバージョンのPythonで動作します。Python2.7のような旧バージョンはサポートされていません。Python3.4以下は依存関係にあるライブラリ (:doc:`aiohttp `) がサポートされていないため、サポートしていません。" - -#: ../../intro.rst:22 -msgid "Installing" -msgstr "インストール" - -#: ../../intro.rst:24 -msgid "You can get the library directly from PyPI: ::" -msgstr "PyPIから直接ライブラリをインストールできます。" - -#: ../../intro.rst:28 -msgid "If you are using Windows, then the following should be used instead: ::" -msgstr "Windowsを使用している場合は、以下のコマンドで実行してください。" - -#: ../../intro.rst:34 -msgid "To install additional packages for speedup, you should use ``py-cord[speed]`` instead of ``pycord``, e.g. ::" -msgstr "高速化のために追加のパッケージをインストールするには、 ``py-cord`` ではなく、以下の例のように ``py-cord[speed]`` を使うべきです。" - -#: ../../intro.rst:44 -msgid "To get voice support, you should use ``py-cord[voice]`` instead of ``py-cord``, e.g. ::" -msgstr "音声のサポートが必要な場合は、 ``py-cord`` ではなく、以下の例のように ``py-cord[voice]`` を使うべきです。" - -#: ../../intro.rst:48 -msgid "On Linux environments, installing voice requires getting the following dependencies:" -msgstr "Linux環境では、依存関係にある以下のライブラリが必要になるので注意してください。" - -#: ../../intro.rst:50 -msgid "`libffi `_" -msgstr "`libffi `_" - -#: ../../intro.rst:51 -msgid "`libnacl `_" -msgstr "`libnacl `_" - -#: ../../intro.rst:52 -msgid "`python3-dev `_" -msgstr "`python3-dev `_" - -#: ../../intro.rst:54 -msgid "For a Debian-based system, the following command will get these dependencies:" -msgstr "Debianベースのシステムでは、次のコマンドで依存関係にあるライブラリを取得できます。" - -#: ../../intro.rst:60 -msgid "Remember to check your permissions!" -msgstr "自分の権限の確認は忘れないようにしてください!" - -#: ../../intro.rst:62 -msgid "Virtual Environments" -msgstr "仮想環境" - -#: ../../intro.rst:65 -msgid "Sometimes you want to keep libraries from polluting system installs or use a different version of libraries than the ones installed on the system. You might also not have permissions to install libraries system-wide. For this purpose, the standard library as of Python 3.3 comes with a concept called \"Virtual Environment\"s to help maintain these separate versions." -msgstr "システムへのインストールをライブラリによって汚したくない場合や、現在インストールされているシステムとは異なるバージョンのライブラリを使用したい場合があります。または、システムへのライブラリのインストール権限がない場合などです。こういった目的のため、Python3.3の標準ライブラリには、このように別々のバージョンを保持したい場合のために、「仮想環境」というものが用意されています。" - -#: ../../intro.rst:70 -msgid "A more in-depth tutorial is found on :doc:`py:tutorial/venv`." -msgstr "より詳しいチュートリアルは :doc:`py:tutorial/venv` にあります。" - -#: ../../intro.rst:72 -msgid "However, for the quick and dirty:" -msgstr "簡単に仮想環境を構築する方法。" - -#: ../../intro.rst:74 -msgid "Go to your project's working directory:" -msgstr "プロジェクトの作業ディレクトリに移動してください。" - -#: ../../intro.rst:81 -msgid "Activate the virtual environment:" -msgstr "下記コマンドで仮想環境を有効化します。" - -#: ../../intro.rst:87 -msgid "On Windows you activate it with:" -msgstr "Windowsの場合は、こちらを使ってください。" - -#: ../../intro.rst:93 -msgid "Use pip like usual:" -msgstr "いつものようにpipインストールを実行します。" - -#: ../../intro.rst:99 -msgid "Congratulations. You now have a virtual environment all set up." -msgstr "おめでとうございます。これで仮想環境のセットアップができました。" - -#: ../../intro.rst:102 -msgid "Basic Concepts" -msgstr "基本概念" - -#: ../../intro.rst:104 -msgid "discord.py revolves around the concept of :ref:`events `. An event is something you listen to and then respond to. For example, when a message happens, you will receive an event about it that you can respond to." -msgstr "discord.pyは :ref:`イベント ` の概念を中心としています。イベントは何かを受け取り、それに対する応答を行います。例えば、メッセージが発生すると、メッセージの発生に関連するイベントを受け取り、そのイベントに対して応答を返すことができます。" - -#: ../../intro.rst:108 -msgid "A quick example to showcase how events work:" -msgstr "以下はイベントの仕組みを紹介する簡単な例です。" - diff --git a/docs/locale/ja/LC_MESSAGES/logging.po b/docs/locale/ja/LC_MESSAGES/logging.po deleted file mode 100644 index 85cc2f89f2..0000000000 --- a/docs/locale/ja/LC_MESSAGES/logging.po +++ /dev/null @@ -1,77 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: discordpy\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-10-23 22:41-0400\n" -"PO-Revision-Date: 2020-10-24 02:41+0000\n" -"Last-Translator: \n" -"Language: ja_JP\n" -"Language-Team: Japanese\n" -"Plural-Forms: nplurals=1; plural=0\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.5.3\n" - -#: ../../logging.rst:5 -msgid "Setting Up Logging" -msgstr "ログの設定" - -#: ../../logging.rst:7 -msgid "" -"*discord.py* logs errors and debug information via the :mod:`logging` " -"python module. It is strongly recommended that the logging module is " -"configured, as no errors or warnings will be output if it is not set up. " -"Configuration of the ``logging`` module can be as simple as::" -msgstr "" -"*discord.py* はPythonの :mod:`logging` " -"モジュールを介してエラーやデバッグの情報を記録します。loggingモジュールが設定されていない場合は、エラーや警告が出力されないため、設定するとを強くおすすめします。loggingモジュールの設定は下記手順で簡単に実装が可能です。" - -#: ../../logging.rst:16 -#, fuzzy -msgid "" -"Placed at the start of the application. This will output the logs from " -"discord as well as other libraries that use the ``logging`` module " -"directly to the console." -msgstr "" -"アプリケーションの始めにこれを書き加えるだけです。これはdiscordからのログを ``logging`` " -"モジュールを用いた他のライブラリ同様、コンソールに出力します。" - -#: ../../logging.rst:20 -#, fuzzy -msgid "" -"The optional ``level`` argument specifies what level of events to log out" -" and can be any of ``CRITICAL``, ``ERROR``, ``WARNING``, ``INFO``, and " -"``DEBUG`` and if not specified defaults to ``WARNING``." -msgstr "" -"オプションである ``level`` の引数は出力するイベントのレベルを指定するためのもので、 ``CRITICAL``, ``ERROR``, " -"``WARNING``, ``INFO`` そして ``DEBUG`` を指定することが可能です。指定されていない場合はデフォルトである " -"``WARNING`` に設定されます。" - -#: ../../logging.rst:24 -#, fuzzy -msgid "" -"More advanced setups are possible with the :mod:`logging` module. For " -"example to write the logs to a file called ``discord.log`` instead of " -"outputting them to the console the following snippet can be used::" -msgstr "" -"また、 :mod:`logging` モジュールでは更に高度な設定が可能です。たとえば、コンソールへ出力するのではなく、 " -"``discord.log`` というファイルにログを出力するには、以下のスニペットが利用できます。" - -#: ../../logging.rst:37 -#, fuzzy -msgid "" -"This is recommended, especially at verbose levels such as ``INFO`` and " -"``DEBUG``, as there are a lot of events logged and it would clog the " -"stdout of your program." -msgstr "" -"特に、 ``INFO`` や ``DEBUG`` " -"といった冗長なイベントレベルを設定している場合、プログラムの標準出力をつまらせてしまう原因になるため、ファイルへの出力が推奨されます。" - -#: ../../logging.rst:43 -msgid "" -"For more information, check the documentation and tutorial of the " -":mod:`logging` module." -msgstr "詳細は、:mod:`logging` モジュールのドキュメントを参照してください。" - diff --git a/docs/locale/ja/LC_MESSAGES/migrating.po b/docs/locale/ja/LC_MESSAGES/migrating.po deleted file mode 100644 index 0327ce5e92..0000000000 --- a/docs/locale/ja/LC_MESSAGES/migrating.po +++ /dev/null @@ -1,2548 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: discordpy\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-10-23 22:41-0400\n" -"PO-Revision-Date: 2020-10-24 02:41+0000\n" -"Last-Translator: \n" -"Language: ja_JP\n" -"Language-Team: Japanese\n" -"Plural-Forms: nplurals=1; plural=0\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.5.3\n" - -#: ../../migrating.rst:6 -msgid "Migrating to v1.0" -msgstr "v1.0への移行" - -#: ../../migrating.rst:8 -msgid "" -"v1.0 is one of the biggest breaking changes in the library due to a " -"complete redesign." -msgstr "v1.0 では完全な書き直しが行われたため,このライブラリにおけるもっとも大きな更新のひとつといえます。" - -#: ../../migrating.rst:11 -msgid "" -"The amount of changes are so massive and long that for all intents and " -"purposes, it is a completely new library." -msgstr "すべての意図と目的を達成するために変更点が長大になった結果,ライブラリは完全に新しいものになりました。" - -#: ../../migrating.rst:14 -msgid "" -"Part of the redesign involves making things more easy to use and natural." -" Things are done on the :ref:`models ` instead of " -"requiring a :class:`Client` instance to do any work." -msgstr "" -"一部の書き換えは,より使いやすく自然に物事を表現するために行われています。あらゆる仕事をするのに :class:`Client` " -"インスタンスを要求するのではなく,代わりに :ref:`models ` " -"を用いることができるようになりました。" - -#: ../../migrating.rst:18 -msgid "Python Version Change" -msgstr "Pythonのバージョンの変更" - -#: ../../migrating.rst:20 -msgid "" -"In order to make development easier and also to allow for our " -"dependencies to upgrade to allow usage of 3.7 or higher, the library had " -"to remove support for Python versions lower than 3.5.3, which essentially" -" means that **support for Python 3.4 is dropped**." -msgstr "" -"discord.py の開発をより簡単にし,またその依存関係にあるライブラリをアップグレードして Python 3.7 " -"以上を使えるようにするために,discord.py は Python 3.5.3 " -"より古いバージョンに対するサポートを諦めざるを得ませんでした。これはつまり **Python 3.4 に対するサポートは打ち切られた** " -"ということです。" - -#: ../../migrating.rst:25 -msgid "Major Model Changes" -msgstr "主要モデルの変更" - -#: ../../migrating.rst:27 -msgid "Below are major model changes that have happened in v1.0" -msgstr "以下は v1.0 で発生した主要なモデルの変更点です。" - -#: ../../migrating.rst:30 -msgid "Snowflakes are int" -msgstr "Snowflakeのint型への変更" - -#: ../../migrating.rst:32 -msgid "" -"Before v1.0, all snowflakes (the ``id`` attribute) were strings. This has" -" been changed to :class:`int`." -msgstr "" -"v1.0以前は、全てのsnowflake (``id`` 属性) が文字列として扱われていましたが、これは :class:`int` " -"型に変更されました。" - -#: ../../migrating.rst:34 ../../migrating.rst:254 -msgid "Quick example: ::" -msgstr "簡単な例:" - -#: ../../migrating.rst:46 -msgid "" -"This change allows for fewer errors when using the Copy ID feature in the" -" official client since you no longer have to wrap it in quotes and allows" -" for optimisation opportunities by allowing ETF to be used instead of " -"JSON internally." -msgstr "" -"この変更により,公式クライアントの「 ID をコピー」機能を使用した際に間違いがより起こりにくくなりました。もはや取得した ID " -"をクォーテーションマークで囲う必要はありませんし,内部で JSON の代わりに ETF を用いることで最適化の機会を得ることにもなります。" - -#: ../../migrating.rst:50 -msgid "Server is now Guild" -msgstr "Server から Guild に変更" - -#: ../../migrating.rst:52 -msgid "" -"The official API documentation calls the \"Server\" concept a \"Guild\" " -"instead. In order to be more consistent with the API documentation when " -"necessary, the model has been renamed to :class:`Guild` and all instances" -" referring to it has been changed as well." -msgstr "" -"公式のAPIドキュメントでは、「Server」は「Guild」と呼ばれています。APIドキュメントとの一貫性を保つため、モデルの名称が " -":class:`Guild` へ変更されました。同時にこのモデルを参照するすべてのインスタンスも変更されています。" - -#: ../../migrating.rst:56 -msgid "A list of changes is as follows:" -msgstr "変更点の一覧" - -#: ../../migrating.rst:59 ../../migrating.rst:95 ../../migrating.rst:869 -msgid "Before" -msgstr "変更前" - -#: ../../migrating.rst:59 ../../migrating.rst:95 ../../migrating.rst:869 -msgid "After" -msgstr "変更後" - -#: ../../migrating.rst:61 -msgid "``Message.server``" -msgstr "``Message.server``" - -#: ../../migrating.rst:61 -msgid ":attr:`Message.guild`" -msgstr ":attr:`Message.guild`" - -#: ../../migrating.rst:63 -msgid "``Channel.server``" -msgstr "``Channel.server``" - -#: ../../migrating.rst:63 -msgid ":attr:`.GuildChannel.guild`" -msgstr ":attr:`.GuildChannel.guild`" - -#: ../../migrating.rst:65 -msgid "``Client.servers``" -msgstr "``Client.servers``" - -#: ../../migrating.rst:65 ../../migrating.rst:233 -msgid ":attr:`Client.guilds`" -msgstr ":attr:`Client.guilds`" - -#: ../../migrating.rst:67 -msgid "``Client.get_server``" -msgstr "``Client.get_server``" - -#: ../../migrating.rst:67 -msgid ":meth:`Client.get_guild`" -msgstr ":meth:`Client.get_guild`" - -#: ../../migrating.rst:69 -msgid "``Emoji.server``" -msgstr "``Emoji.server``" - -#: ../../migrating.rst:69 -msgid ":attr:`Emoji.guild`" -msgstr ":attr:`Emoji.guild`" - -#: ../../migrating.rst:71 -msgid "``Role.server``" -msgstr "``Role.server``" - -#: ../../migrating.rst:71 -msgid ":attr:`Role.guild`" -msgstr ":attr:`Role.guild`" - -#: ../../migrating.rst:73 -msgid "``Invite.server``" -msgstr "``Invite.server``" - -#: ../../migrating.rst:73 -msgid ":attr:`Invite.guild`" -msgstr ":attr:`Invite.guild`" - -#: ../../migrating.rst:75 -msgid "``Member.server``" -msgstr "``Member.server``" - -#: ../../migrating.rst:75 -msgid ":attr:`Member.guild`" -msgstr ":attr:`Member.guild`" - -#: ../../migrating.rst:77 -msgid "``Permissions.manage_server``" -msgstr "``Permissions.manage_server``" - -#: ../../migrating.rst:77 -msgid ":attr:`Permissions.manage_guild`" -msgstr ":attr:`Permissions.manage_guild`" - -#: ../../migrating.rst:79 -msgid "``VoiceClient.server``" -msgstr "``VoiceClient.server``" - -#: ../../migrating.rst:79 -msgid ":attr:`VoiceClient.guild`" -msgstr ":attr:`VoiceClient.guild`" - -#: ../../migrating.rst:81 -msgid "``Client.create_server``" -msgstr "``Client.create_server``" - -#: ../../migrating.rst:81 -msgid ":meth:`Client.create_guild`" -msgstr ":meth:`Client.create_guild`" - -#: ../../migrating.rst:87 -msgid "Models are Stateful" -msgstr "モデルのステートフル化" - -#: ../../migrating.rst:89 -msgid "" -"As mentioned earlier, a lot of functionality was moved out of " -":class:`Client` and put into their respective :ref:`model " -"`." -msgstr "" -"前述したように、多くの機能が :class:`Client` から各々の :ref:`model ` " -"へと移されました。" - -#: ../../migrating.rst:92 -msgid "A list of these changes is enumerated below." -msgstr "以下が、これによる変更点の一覧です。" - -#: ../../migrating.rst:97 -msgid "``Client.add_reaction``" -msgstr "``Client.add_reaction``" - -#: ../../migrating.rst:97 -msgid ":meth:`Message.add_reaction`" -msgstr ":meth:`Message.add_reaction`" - -#: ../../migrating.rst:99 -msgid "``Client.add_roles``" -msgstr "``Client.add_roles``" - -#: ../../migrating.rst:99 -msgid ":meth:`Member.add_roles`" -msgstr ":meth:`Member.add_roles`" - -#: ../../migrating.rst:101 -msgid "``Client.ban``" -msgstr "``Client.ban``" - -#: ../../migrating.rst:101 -msgid ":meth:`Member.ban` or :meth:`Guild.ban`" -msgstr ":meth:`Member.ban` または :meth:`Guild.ban`" - -#: ../../migrating.rst:103 -msgid "``Client.change_nickname``" -msgstr "``Client.change_nickname``" - -#: ../../migrating.rst:103 ../../migrating.rst:171 ../../migrating.rst:187 -#: ../../migrating.rst:195 -msgid ":meth:`Member.edit`" -msgstr ":meth:`Member.edit`" - -#: ../../migrating.rst:105 -msgid "``Client.clear_reactions``" -msgstr "``Client.clear_reactions``" - -#: ../../migrating.rst:105 -msgid ":meth:`Message.clear_reactions`" -msgstr ":meth:`Message.clear_reactions`" - -#: ../../migrating.rst:107 -msgid "``Client.create_channel``" -msgstr "``Client.create_channel``" - -#: ../../migrating.rst:107 -msgid ":meth:`Guild.create_text_channel` and :meth:`Guild.create_voice_channel`" -msgstr ":meth:`Guild.create_text_channel` および :meth:`Guild.create_voice_channel`" - -#: ../../migrating.rst:109 -msgid "``Client.create_custom_emoji``" -msgstr "``Client.create_custom_emoji``" - -#: ../../migrating.rst:109 -msgid ":meth:`Guild.create_custom_emoji`" -msgstr ":meth:`Guild.create_custom_emoji`" - -#: ../../migrating.rst:111 -msgid "``Client.create_invite``" -msgstr "``Client.create_invite``" - -#: ../../migrating.rst:111 -msgid ":meth:`abc.GuildChannel.create_invite`" -msgstr ":meth:`abc.GuildChannel.create_invite`" - -#: ../../migrating.rst:113 -msgid "``Client.create_role``" -msgstr "``Client.create_role``" - -#: ../../migrating.rst:113 -msgid ":meth:`Guild.create_role`" -msgstr ":meth:`Guild.create_role`" - -#: ../../migrating.rst:115 -msgid "``Client.delete_channel``" -msgstr "``Client.delete_channel``" - -#: ../../migrating.rst:115 -msgid ":meth:`abc.GuildChannel.delete`" -msgstr ":meth:`abc.GuildChannel.delete`" - -#: ../../migrating.rst:117 -msgid "``Client.delete_channel_permissions``" -msgstr "``Client.delete_channel_permissions``" - -#: ../../migrating.rst:117 -msgid "" -":meth:`abc.GuildChannel.set_permissions` with ``overwrite`` set to " -"``None``" -msgstr "" -":meth:`abc.GuildChannel.set_permissions` の ``overwrite`` を ``None`` " -"に設定しました" - -#: ../../migrating.rst:119 -msgid "``Client.delete_custom_emoji``" -msgstr "``Client.delete_custom_emoji``" - -#: ../../migrating.rst:119 -msgid ":meth:`Emoji.delete`" -msgstr ":meth:`Emoji.delete`" - -#: ../../migrating.rst:121 -msgid "``Client.delete_invite``" -msgstr "``Client.delete_invite``" - -#: ../../migrating.rst:121 -msgid ":meth:`Invite.delete` or :meth:`Client.delete_invite`" -msgstr ":meth:`Invite.delete` または :meth:`Client.delete_invite`" - -#: ../../migrating.rst:123 -msgid "``Client.delete_message``" -msgstr "``Client.delete_message``" - -#: ../../migrating.rst:123 -msgid ":meth:`Message.delete`" -msgstr ":meth:`Message.delete`" - -#: ../../migrating.rst:125 -msgid "``Client.delete_messages``" -msgstr "``Client.delete_messages``" - -#: ../../migrating.rst:125 -msgid ":meth:`TextChannel.delete_messages`" -msgstr ":meth:`TextChannel.delete_messages`" - -#: ../../migrating.rst:127 -msgid "``Client.delete_role``" -msgstr "``Client.delete_role``" - -#: ../../migrating.rst:127 -msgid ":meth:`Role.delete`" -msgstr ":meth:`Role.delete`" - -#: ../../migrating.rst:129 -msgid "``Client.delete_server``" -msgstr "``Client.delete_server``" - -#: ../../migrating.rst:129 -msgid ":meth:`Guild.delete`" -msgstr ":meth:`Guild.delete`" - -#: ../../migrating.rst:131 -msgid "``Client.edit_channel``" -msgstr "``Client.edit_channel``" - -#: ../../migrating.rst:131 ../../migrating.rst:169 -msgid ":meth:`TextChannel.edit` or :meth:`VoiceChannel.edit`" -msgstr ":meth:`TextChannel.edit` または :meth:`VoiceChannel.edit`" - -#: ../../migrating.rst:133 -msgid "``Client.edit_channel_permissions``" -msgstr "``Client.edit_channel_permissions``" - -#: ../../migrating.rst:133 -msgid ":meth:`abc.GuildChannel.set_permissions`" -msgstr ":meth:`abc.GuildChannel.set_permissions`" - -#: ../../migrating.rst:135 -msgid "``Client.edit_custom_emoji``" -msgstr "``Client.edit_custom_emoji``" - -#: ../../migrating.rst:135 -msgid ":meth:`Emoji.edit`" -msgstr ":meth:`Emoji.edit`" - -#: ../../migrating.rst:137 -msgid "``Client.edit_message``" -msgstr "``Client.edit_message``" - -#: ../../migrating.rst:137 -msgid ":meth:`Message.edit`" -msgstr ":meth:`Message.edit`" - -#: ../../migrating.rst:139 -msgid "``Client.edit_profile``" -msgstr "``Client.edit_profile``" - -#: ../../migrating.rst:139 -msgid ":meth:`ClientUser.edit` (you get this from :attr:`Client.user`)" -msgstr ":meth:`ClientUser.edit` ( :attr:`Client.user` から取得可能)" - -#: ../../migrating.rst:141 -msgid "``Client.edit_role``" -msgstr "``Client.edit_role``" - -#: ../../migrating.rst:141 ../../migrating.rst:173 -msgid ":meth:`Role.edit`" -msgstr ":meth:`Role.edit`" - -#: ../../migrating.rst:143 -msgid "``Client.edit_server``" -msgstr "``Client.edit_server``" - -#: ../../migrating.rst:143 -msgid ":meth:`Guild.edit`" -msgstr ":meth:`Guild.edit`" - -#: ../../migrating.rst:145 -msgid "``Client.estimate_pruned_members``" -msgstr "``Client.estimate_pruned_members``" - -#: ../../migrating.rst:145 -msgid ":meth:`Guild.estimate_pruned_members`" -msgstr ":meth:`Guild.estimate_pruned_members`" - -#: ../../migrating.rst:147 ../../migrating.rst:327 -msgid "``Client.get_all_emojis``" -msgstr "``Client.get_all_emojis``" - -#: ../../migrating.rst:147 -msgid ":attr:`Client.emojis`" -msgstr ":attr:`Client.emojis`" - -#: ../../migrating.rst:149 -msgid "``Client.get_bans``" -msgstr "``Client.get_bans``" - -#: ../../migrating.rst:149 -msgid ":meth:`Guild.bans`" -msgstr ":meth:`Guild.bans`" - -#: ../../migrating.rst:151 -msgid "``Client.get_invite``" -msgstr "``Client.get_invite``" - -#: ../../migrating.rst:151 -msgid ":meth:`Client.fetch_invite`" -msgstr ":meth:`Client.fetch_invite`" - -#: ../../migrating.rst:153 -msgid "``Client.get_message``" -msgstr "``Client.get_message``" - -#: ../../migrating.rst:153 -msgid ":meth:`abc.Messageable.fetch_message`" -msgstr ":meth:`abc.Messageable.fetch_message`" - -#: ../../migrating.rst:155 -msgid "``Client.get_reaction_users``" -msgstr "``Client.get_reaction_users``" - -#: ../../migrating.rst:155 ../../migrating.rst:493 -msgid ":meth:`Reaction.users`" -msgstr ":meth:`Reaction.users`" - -#: ../../migrating.rst:157 -msgid "``Client.get_user_info``" -msgstr "``Client.get_user_info``" - -#: ../../migrating.rst:157 -msgid ":meth:`Client.fetch_user`" -msgstr ":meth:`Client.fetch_user`" - -#: ../../migrating.rst:159 -msgid "``Client.invites_from``" -msgstr "``Client.invites_from``" - -#: ../../migrating.rst:159 -msgid ":meth:`abc.GuildChannel.invites` or :meth:`Guild.invites`" -msgstr ":meth:`abc.GuildChannel.invites` または :meth:`Guild.invites`" - -#: ../../migrating.rst:161 -msgid "``Client.join_voice_channel``" -msgstr "``Client.join_voice_channel``" - -#: ../../migrating.rst:161 -msgid ":meth:`VoiceChannel.connect` (see :ref:`migrating_1_0_voice`)" -msgstr ":meth:`VoiceChannel.connect` ( :ref:`migrating_1_0_voice` を参照)" - -#: ../../migrating.rst:163 -msgid "``Client.kick``" -msgstr "``Client.kick``" - -#: ../../migrating.rst:163 -msgid ":meth:`Guild.kick` or :meth:`Member.kick`" -msgstr ":meth:`Guild.kick` または :meth:`Member.kick`" - -#: ../../migrating.rst:165 -msgid "``Client.leave_server``" -msgstr "``Client.leave_server``" - -#: ../../migrating.rst:165 -msgid ":meth:`Guild.leave`" -msgstr ":meth:`Guild.leave`" - -#: ../../migrating.rst:167 -msgid "``Client.logs_from``" -msgstr "``Client.logs_from``" - -#: ../../migrating.rst:167 -msgid ":meth:`abc.Messageable.history` (see :ref:`migrating_1_0_async_iter`)" -msgstr ":meth:`abc.Messageable.history` ( :ref:`migrating_1_0_async_iter` を参照)" - -#: ../../migrating.rst:169 -msgid "``Client.move_channel``" -msgstr "``Client.move_channel``" - -#: ../../migrating.rst:171 -msgid "``Client.move_member``" -msgstr "``Client.move_member``" - -#: ../../migrating.rst:173 -msgid "``Client.move_role``" -msgstr "``Client.move_role``" - -#: ../../migrating.rst:175 -msgid "``Client.pin_message``" -msgstr "``Client.pin_message``" - -#: ../../migrating.rst:175 -msgid ":meth:`Message.pin`" -msgstr ":meth:`Message.pin`" - -#: ../../migrating.rst:177 -msgid "``Client.pins_from``" -msgstr "``Client.pins_from``" - -#: ../../migrating.rst:177 -msgid ":meth:`abc.Messageable.pins`" -msgstr ":meth:`abc.Messageable.pins`" - -#: ../../migrating.rst:179 -msgid "``Client.prune_members``" -msgstr "``Client.prune_members``" - -#: ../../migrating.rst:179 -msgid ":meth:`Guild.prune_members`" -msgstr ":meth:`Guild.prune_members`" - -#: ../../migrating.rst:181 -msgid "``Client.purge_from``" -msgstr "``Client.purge_from``" - -#: ../../migrating.rst:181 -msgid ":meth:`TextChannel.purge`" -msgstr ":meth:`TextChannel.purge`" - -#: ../../migrating.rst:183 -msgid "``Client.remove_reaction``" -msgstr "``Client.remove_reaction``" - -#: ../../migrating.rst:183 -msgid ":meth:`Message.remove_reaction`" -msgstr ":meth:`Message.remove_reaction`" - -#: ../../migrating.rst:185 -msgid "``Client.remove_roles``" -msgstr "``Client.remove_roles``" - -#: ../../migrating.rst:185 -msgid ":meth:`Member.remove_roles`" -msgstr ":meth:`Member.remove_roles`" - -#: ../../migrating.rst:187 -msgid "``Client.replace_roles``" -msgstr "``Client.replace_roles``" - -#: ../../migrating.rst:189 -msgid "``Client.send_file``" -msgstr "``Client.send_file``" - -#: ../../migrating.rst:189 ../../migrating.rst:191 -msgid ":meth:`abc.Messageable.send` (see :ref:`migrating_1_0_sending_messages`)" -msgstr ":meth:`abc.Messageable.send` ( :ref:`migrating_1_0_sending_messages` を参照)" - -#: ../../migrating.rst:191 -msgid "``Client.send_message``" -msgstr "``Client.send_message``" - -#: ../../migrating.rst:193 -msgid "``Client.send_typing``" -msgstr "``Client.send_typing``" - -#: ../../migrating.rst:193 -msgid "" -":meth:`abc.Messageable.trigger_typing` (use " -":meth:`abc.Messageable.typing`)" -msgstr "" -":meth:`abc.Messageable.trigger_typing` (:meth:`abc.Messageable.typing` " -"を使用してください)" - -#: ../../migrating.rst:195 -msgid "``Client.server_voice_state``" -msgstr "``Client.server_voice_state``" - -#: ../../migrating.rst:197 -msgid "``Client.start_private_message``" -msgstr "``Client.start_private_message``" - -#: ../../migrating.rst:197 -msgid ":meth:`User.create_dm`" -msgstr ":meth:`User.create_dm`" - -#: ../../migrating.rst:199 -msgid "``Client.unban``" -msgstr "``Client.unban``" - -#: ../../migrating.rst:199 -msgid ":meth:`Guild.unban` or :meth:`Member.unban`" -msgstr ":meth:`Guild.unban` または :meth:`Member.unban`" - -#: ../../migrating.rst:201 -msgid "``Client.unpin_message``" -msgstr "``Client.unpin_message``" - -#: ../../migrating.rst:201 -msgid ":meth:`Message.unpin`" -msgstr ":meth:`Message.unpin`" - -#: ../../migrating.rst:203 -msgid "``Client.wait_for_message``" -msgstr "``Client.wait_for_message``" - -#: ../../migrating.rst:203 ../../migrating.rst:205 -msgid ":meth:`Client.wait_for` (see :ref:`migrating_1_0_wait_for`)" -msgstr ":meth:`Client.wait_for` ( :ref:`migrating_1_0_wait_for` を参照)" - -#: ../../migrating.rst:205 -msgid "``Client.wait_for_reaction``" -msgstr "``Client.wait_for_reaction``" - -#: ../../migrating.rst:207 -msgid "``Client.wait_until_login``" -msgstr "``Client.wait_until_login``" - -#: ../../migrating.rst:207 -msgid "Removed" -msgstr "削除されました" - -#: ../../migrating.rst:209 -msgid "``Client.wait_until_ready``" -msgstr "``Client.wait_until_ready``" - -#: ../../migrating.rst:209 -msgid "No change" -msgstr "変更なし" - -#: ../../migrating.rst:213 -msgid "Property Changes" -msgstr "プロパティの変更" - -#: ../../migrating.rst:215 -msgid "" -"In order to be a bit more consistent, certain things that were properties" -" were changed to methods instead." -msgstr "一貫性を持たせるために、いくつかのプロパティがメソッドに変更されました。" - -#: ../../migrating.rst:217 -msgid "" -"The following are now methods instead of properties (requires " -"parentheses):" -msgstr "プロパティの代わりに追加されたメソッドは以下のとおりです。(使用の際にはカッコが必要です)" - -#: ../../migrating.rst:219 -msgid ":meth:`Role.is_default`" -msgstr ":meth:`Role.is_default`" - -#: ../../migrating.rst:220 -msgid ":meth:`Client.is_ready`" -msgstr ":meth:`Client.is_ready`" - -#: ../../migrating.rst:221 -msgid ":meth:`Client.is_closed`" -msgstr ":meth:`Client.is_closed`" - -#: ../../migrating.rst:224 -msgid "Dict Value Change" -msgstr "辞書の値の変更" - -#: ../../migrating.rst:226 -msgid "" -"Prior to v1.0 some aggregating properties that retrieved models would " -"return \"dict view\" objects." -msgstr "v1.0以前では、複数のモデルを集約して取得するプロパティは「辞書ビュー」オブジェクトで結果を返していました。" - -#: ../../migrating.rst:228 -msgid "" -"As a consequence, when the dict would change size while you would iterate" -" over it, a RuntimeError would be raised and crash the task. To alleviate" -" this, the \"dict view\" objects were changed into lists." -msgstr "これは、オブジェクトを用いて繰り返し処理を行っている間に、辞書サイズが変更されたとき、RuntimeErrorを発生させてタスクをクラッシュさせていました。これを軽減させるため「辞書ビュー」オブジェクトはリストに変更されました。" - -#: ../../migrating.rst:231 -msgid "The following views were changed to a list:" -msgstr "以下のビューがリストへ変更されています。" - -#: ../../migrating.rst:234 -msgid ":attr:`Client.users` (new in v1.0)" -msgstr ":attr:`Client.users` (v1.0にて追加)" - -#: ../../migrating.rst:235 -msgid ":attr:`Client.emojis` (new in v1.0)" -msgstr ":attr:`Client.emojis` (v1.0にて追加)" - -#: ../../migrating.rst:236 -msgid ":attr:`Guild.channels`" -msgstr ":attr:`Guild.channels`" - -#: ../../migrating.rst:237 -msgid ":attr:`Guild.text_channels` (new in v1.0)" -msgstr ":attr:`Guild.text_channels` (v1.0にて追加)" - -#: ../../migrating.rst:238 -msgid ":attr:`Guild.voice_channels` (new in v1.0)" -msgstr ":attr:`Guild.voice_channels` (v1.0にて追加)" - -#: ../../migrating.rst:239 -msgid ":attr:`Guild.emojis`" -msgstr ":attr:`Guild.emojis`" - -#: ../../migrating.rst:240 -msgid ":attr:`Guild.members`" -msgstr ":attr:`Guild.members`" - -#: ../../migrating.rst:243 -msgid "Voice State Changes" -msgstr "ボイスステートの変更" - -#: ../../migrating.rst:245 -msgid "" -"Earlier, in v0.11.0 a :class:`VoiceState` class was added to refer to " -"voice states along with a :attr:`Member.voice` attribute to refer to it." -msgstr "" -"v0.11.0では、ボイスステートを参照するために :class:`VoiceState` が追加され、このクラスを参照するために " -":attr:`Member.voice` が使われていました。" - -#: ../../migrating.rst:248 -msgid "" -"However, it was transparent to the user. In an effort to make the library" -" save more memory, the voice state change is now more visible." -msgstr "これはユーザーにとって透過的なものでしたが、ライブラリがメモリを節約できるようボイスステートの変化が可視的になりました。" - -#: ../../migrating.rst:251 -msgid "" -"The only way to access voice attributes is via the :attr:`Member.voice` " -"attribute. Note that if the member does not have a voice state this " -"attribute can be ``None``." -msgstr "" -"ボイスの属性にアクセスするには :attr:`Member.voice` を用いる方法しか存在しません。メンバーがボイスステートを持たない場合は " -"``None`` が返ることに注意してください。" - -#: ../../migrating.rst:267 -msgid "User and Member Type Split" -msgstr "ユーザーとメンバーの分離" - -#: ../../migrating.rst:269 -msgid "" -"In v1.0 to save memory, :class:`User` and :class:`Member` are no longer " -"inherited. Instead, they are \"flattened\" by having equivalent " -"properties that map out to the functional underlying :class:`User`. Thus," -" there is no functional change in how they are used. However this breaks " -":func:`isinstance` checks and thus is something to keep in mind." -msgstr "" -"v1.0では、メモリの節約のため、 :class:`Member` は :class:`User` のサブクラスではなくなりました。代わりに、 " -":class:`User` " -"に記述されたものと同等のプロパティを実装することで、この二つのクラスはフラット化されています。そのため、使用方法に機能的変更はありません。ただし、" -" :func:`isinstance` が使えなくなってしまったことは留意しておくべきです。" - -#: ../../migrating.rst:273 -msgid "" -"These memory savings were accomplished by having a global :class:`User` " -"cache, and as a positive consequence you can now easily fetch a " -":class:`User` by their ID by using the new :meth:`Client.get_user`. You " -"can also get a list of all :class:`User` your client can see with " -":attr:`Client.users`." -msgstr "" -"メモリの節約は、グローバルな :class:`User` のキャッシュを持つことで実現しました。これによって " -":meth:`Client.get_user` を使ってIDから簡単に :class:`User` " -"を取得できます。また、あなたのクライアントが見ることができるユーザーを :attr:`Client.users` " -"ですべて取得できるようにもなりました。" - -#: ../../migrating.rst:280 -msgid "Channel Type Split" -msgstr "チャンネルタイプの分割" - -#: ../../migrating.rst:282 -msgid "" -"Prior to v1.0, channels were two different types, ``Channel`` and " -"``PrivateChannel`` with a ``is_private`` property to help differentiate " -"between them." -msgstr "" -"v1.0以前のバージョンでは、チャンネルは ``is_private`` で判別する ``Channel`` と " -"``PrivateChannel`` の二通りしかありませんでした。" - -#: ../../migrating.rst:285 -msgid "" -"In order to save memory the channels have been split into 4 different " -"types:" -msgstr "メモリ使用量を削減するため、チャンネルを4つのタイプへ分割しました。" - -#: ../../migrating.rst:287 -msgid ":class:`TextChannel` for guild text channels." -msgstr "ギルドのテキストチャンネル用である :class:`TextChannel` 。" - -#: ../../migrating.rst:288 -msgid ":class:`VoiceChannel` for guild voice channels." -msgstr "ギルドのボイスチャンネル用である :class:`VoiceChannel` 。" - -#: ../../migrating.rst:289 -msgid ":class:`DMChannel` for DM channels with members." -msgstr "メンバーのDMチャンネル用である :class:`DMChannel` 。" - -#: ../../migrating.rst:290 -msgid ":class:`GroupChannel` for Group DM channels with members." -msgstr "メンバーが参加するグループDMチャンネル用である :class:`GroupChannel` 。" - -#: ../../migrating.rst:292 -msgid "" -"With this split came the removal of the ``is_private`` attribute. You " -"should now use :func:`isinstance`." -msgstr "" -"これらに分割されたことにより、 ``is_private`` は削除されました。v1.0では :func:`isinstance` " -"を使うべきでしょう。" - -#: ../../migrating.rst:294 -msgid "The types are split into two different :ref:`discord_api_abcs`:" -msgstr "型は二通りの :ref:`discord_api_abcs` に分けられます。" - -#: ../../migrating.rst:296 -msgid ":class:`abc.GuildChannel` for guild channels." -msgstr "ギルドのチャンネルを表す :class:`abc.GuildChannel` 。" - -#: ../../migrating.rst:297 -msgid ":class:`abc.PrivateChannel` for private channels (DMs and group DMs)." -msgstr "プライベートチャンネル(DMやグループDM)を表す :class:`abc.PrivateChannel` 。" - -#: ../../migrating.rst:299 -msgid "So to check if something is a guild channel you would do: ::" -msgstr "チャンネルがギルドチャンネルであるかをチェックしたい場合:" - -#: ../../migrating.rst:303 -msgid "And to check if it's a private channel you would do: ::" -msgstr "チャンネルがプライベートチャンネルであるかをチェックしたい場合:" - -#: ../../migrating.rst:307 -msgid "" -"Of course, if you're looking for only a specific type you can pass that " -"too, e.g. ::" -msgstr "もちろん、特定のチャンネルタイプを探したい場合、そのチャンネルタイプを渡すことも可能です。" - -#: ../../migrating.rst:311 -msgid "" -"With this type split also came event changes, which are enumerated in " -":ref:`migrating_1_0_event_changes`." -msgstr "" -"この分割により、イベントにも変更がありました。これについては :ref:`migrating_1_0_event_changes` " -"に詳細があります。" - -#: ../../migrating.rst:315 -msgid "Miscellaneous Model Changes" -msgstr "その他のモデルの変更" - -#: ../../migrating.rst:317 -msgid "There were lots of other things added or removed in the models in general." -msgstr "一般的なモデルには追加、あるいは削除されたものが多くあります。" - -#: ../../migrating.rst:319 -msgid "They will be enumerated here." -msgstr "以下がその一覧です。" - -#: ../../migrating.rst:321 -msgid "**Removed**" -msgstr "**削除**" - -#: ../../migrating.rst:323 -msgid ":meth:`Client.login` no longer accepts email and password logins." -msgstr ":meth:`Client.login` はEメールとパスワードによるログインを受け付けなくなりました。" - -#: ../../migrating.rst:325 -msgid "Use a token and ``bot=False``." -msgstr "トークンと ``bot=False`` を使用してください。" - -#: ../../migrating.rst:329 -msgid "Use :attr:`Client.emojis` instead." -msgstr "代わりに :attr:`Client.emojis` を使用してください。" - -#: ../../migrating.rst:331 -#, fuzzy -msgid "``Client.messages``" -msgstr "` ``Client.messages``" - -#: ../../migrating.rst:333 -msgid "Use read-only :attr:`Client.cached_messages` instead." -msgstr "読み込み専用の :attr:`Client.cached_messages`を代わりに使ってください。" - -#: ../../migrating.rst:335 -msgid "``Client.wait_for_message`` and ``Client.wait_for_reaction`` are gone." -msgstr "``Client.wait_for_message`` および ``Client.wait_for_reaction`` は削除されました。" - -#: ../../migrating.rst:337 -msgid "Use :meth:`Client.wait_for` instead." -msgstr "代わりに :meth:`Client.wait_for` を使用してください。" - -#: ../../migrating.rst:339 -msgid "``Channel.voice_members``" -msgstr "``Channel.voice_members``" - -#: ../../migrating.rst:341 -msgid "Use :attr:`VoiceChannel.members` instead." -msgstr "代わりに :attr:`VoiceChannel.members` を使用してください。" - -#: ../../migrating.rst:343 -msgid "``Channel.is_private``" -msgstr "``Channel.is_private``" - -#: ../../migrating.rst:345 -msgid "" -"Use ``isinstance`` instead with one of the :ref:`discord_api_abcs` " -"instead." -msgstr "代わりに ``isinstance`` と :ref:`discord_api_abcs` を使用してください。" - -#: ../../migrating.rst:346 -msgid "" -"e.g. ``isinstance(channel, discord.abc.GuildChannel)`` will check if it " -"isn't a private channel." -msgstr "" -"例を挙げると ``isinstance(channel, discord.abc.GuildChannel)`` " -"でプライベートチャンネルであるかを確認できます。" - -#: ../../migrating.rst:348 -msgid "``Client.accept_invite``" -msgstr "``Client.accept_invite``" - -#: ../../migrating.rst:350 -msgid "" -"There is no replacement for this one. This functionality is deprecated " -"API wise." -msgstr "これに代わるものはありません。これは非推奨のAPIです。" - -#: ../../migrating.rst:352 -msgid "" -"``Guild.default_channel`` / ``Server.default_channel`` and " -"``Channel.is_default``" -msgstr "" -"``Guild.default_channel`` / ``Server.default_channel`` および " -"``Channel.is_default``" - -#: ../../migrating.rst:354 -msgid "" -"The concept of a default channel was removed from Discord. See `#329 " -"`_." -msgstr "" -"デフォルトチャンネルの概念は、Discordから削除されました。 `#329 " -"`_ " -"を参照してください。" - -#: ../../migrating.rst:357 -msgid "``Message.edited_timestamp``" -msgstr "``Message.edited_timestamp``" - -#: ../../migrating.rst:359 -msgid "Use :attr:`Message.edited_at` instead." -msgstr "代わりに :attr:`Message.edited_at` を使用してください。" - -#: ../../migrating.rst:361 -msgid "``Message.timestamp``" -msgstr "``Message.timestamp``" - -#: ../../migrating.rst:363 -msgid "Use :attr:`Message.created_at` instead." -msgstr "代わりに :attr:`Message.created_at` を使用してください。" - -#: ../../migrating.rst:365 -msgid "``Colour.to_tuple()``" -msgstr "``Colour.to_tuple()``" - -#: ../../migrating.rst:367 -msgid "Use :meth:`Colour.to_rgb` instead." -msgstr "代わりに :meth:`Colour.to_rgb` を使用してください。" - -#: ../../migrating.rst:369 -msgid "``Permissions.view_audit_logs``" -msgstr "``Permissions.view_audit_logs``" - -#: ../../migrating.rst:371 -msgid "Use :attr:`Permissions.view_audit_log` instead." -msgstr "代わりに :attr:`Permissions.view_audit_log` を使用してください。" - -#: ../../migrating.rst:373 -msgid "``Member.game``" -msgstr "``Member.game``" - -#: ../../migrating.rst:375 -msgid "Use :attr:`Member.activities` instead." -msgstr "代わりに :attr:`Member.activities` 使用してください。" - -#: ../../migrating.rst:377 -msgid "``Guild.role_hierarchy`` / ``Server.role_hierarchy``" -msgstr "``Guild.role_hierarchy`` / ``Server.role_hierarchy``" - -#: ../../migrating.rst:379 -msgid "" -"Use :attr:`Guild.roles` instead. Note that while sorted, it is in the " -"opposite order of what the old ``Guild.role_hierarchy`` used to be." -msgstr "" -"代わりに :attr:`Guild.roles` を使用してください。ソート順が以前の ``Guild.role_hierarchy`` " -"とは逆になっていることに注意してください。" - -#: ../../migrating.rst:382 -msgid "**Changed**" -msgstr "**変更**" - -#: ../../migrating.rst:384 -msgid "" -":attr:`Member.avatar_url` and :attr:`User.avatar_url` now return the " -"default avatar if a custom one is not set." -msgstr "" -":attr:`Member.avatar_url` と :attr:`User.avatar_url` " -"はアバターが設定されていなければ、デフォルトアバターが返るようになりました。" - -#: ../../migrating.rst:385 -msgid "" -":attr:`Message.embeds` is now a list of :class:`Embed` instead of " -":class:`dict` objects." -msgstr "" -":attr:`Message.embeds` は :class:`dict` オブジェクトから :class:`Embed` " -"のリストに変更されました。" - -#: ../../migrating.rst:386 -msgid "" -":attr:`Message.attachments` is now a list of :class:`Attachment` instead " -"of :class:`dict` object." -msgstr "" -":attr:`Message.attachments` は :class:`dict` オブジェクトから :class:`Attachment` " -"のリストに変更されました。" - -#: ../../migrating.rst:387 -msgid "" -":attr:`Guild.roles` is now sorted through hierarchy. The first element is" -" always the ``@everyone`` role." -msgstr ":attr:`Guild.roles` はヒエラルキー順にソートされるようになりました。先頭には必ず ``@everyone`` が格納されます。" - -#: ../../migrating.rst:389 -msgid "**Added**" -msgstr "**追加**" - -#: ../../migrating.rst:391 -msgid ":class:`Attachment` to represent a discord attachment." -msgstr "Discordのアタッチメントを表す :class:`Attachment` 。" - -#: ../../migrating.rst:392 -msgid ":class:`CategoryChannel` to represent a channel category." -msgstr "チャンネルのカテゴリを表す :class:`CategoryChannel` 。" - -#: ../../migrating.rst:393 -msgid "" -":attr:`VoiceChannel.members` for fetching members connected to a voice " -"channel." -msgstr "ボイスチャンネルに接続しているメンバーを取得する :attr:`VoiceChannel.members` 。" - -#: ../../migrating.rst:394 -msgid ":attr:`TextChannel.members` for fetching members that can see the channel." -msgstr "テキストチャンネルを閲覧可能なメンバーを取得する :attr:`TextChannel.members` 。" - -#: ../../migrating.rst:395 -msgid ":attr:`Role.members` for fetching members that have the role." -msgstr "役割を持っているメンバーを取得する :attr:`Role.members` 。" - -#: ../../migrating.rst:396 -msgid ":attr:`Guild.text_channels` for fetching text channels only." -msgstr "テキストチャンネルのみを取得する :attr:`Guild.text_channels` 。" - -#: ../../migrating.rst:397 -msgid ":attr:`Guild.voice_channels` for fetching voice channels only." -msgstr "ボイスチャンネルのみを取得する :attr:`Guild.voice_channels` 。" - -#: ../../migrating.rst:398 -msgid ":attr:`Guild.categories` for fetching channel categories only." -msgstr "チャンネルのカテゴリのみを取得する :attr:`Guild.categories` 。" - -#: ../../migrating.rst:399 -msgid "" -":attr:`TextChannel.category` and :attr:`VoiceChannel.category` to get the" -" category a channel belongs to." -msgstr "" -"チャンネルが属するカテゴリを取得する :attr:`TextChannel.category` と " -":attr:`VoiceChannel.category` 。" - -#: ../../migrating.rst:400 -msgid ":meth:`Guild.by_category` to get channels grouped by their category." -msgstr "カテゴリによってグループ化されたチャンネルを取得する :meth:`Guild.by_category` 。" - -#: ../../migrating.rst:401 -msgid ":attr:`Guild.chunked` to check member chunking status." -msgstr "メンバーのチャンク状態を確認する :attr:`Guild.chunked` 。" - -#: ../../migrating.rst:402 -msgid ":attr:`Guild.explicit_content_filter` to fetch the content filter." -msgstr "不適切な表現のフィルターを取得する :attr:`Guild.explicit_content_filter` 。" - -#: ../../migrating.rst:403 -msgid ":attr:`Guild.shard_id` to get a guild's Shard ID if you're sharding." -msgstr "Shardingを使用している場合のみ、ギルドのShard IDを取得する :attr:`Guild.shard_id` 。" - -#: ../../migrating.rst:404 -msgid ":attr:`Client.users` to get all visible :class:`User` instances." -msgstr "Botによってみることができる :class:`User` インスタンスをすべて返す :attr:`Client.users` 。" - -#: ../../migrating.rst:405 -msgid ":meth:`Client.get_user` to get a :class:`User` by ID." -msgstr "IDから :class:`User` を取得する :meth:`Client.get_user` 。" - -#: ../../migrating.rst:406 -msgid ":meth:`User.avatar_url_as` to get an avatar in a specific size or format." -msgstr "特定のサイズ、あるいはフォーマットのアバターを取得する :meth:`User.avatar_url_as` 。" - -#: ../../migrating.rst:407 -msgid ":meth:`Guild.vanity_invite` to fetch the guild's vanity invite." -msgstr "ギルドのカスタム招待URLを取得する :meth:`Guild.vanity_invite` 。" - -#: ../../migrating.rst:408 -msgid ":meth:`Guild.audit_logs` to fetch the guild's audit logs." -msgstr "ギルドのサーバーログを取得する :meth:`Guild.audit_logs` 。" - -#: ../../migrating.rst:409 -msgid ":attr:`Message.webhook_id` to fetch the message's webhook ID." -msgstr "メッセージのWebhook IDを取得する :attr:`Message.webhook_id` 。" - -#: ../../migrating.rst:410 -msgid "" -":attr:`Message.activity` and :attr:`Message.application` for Rich " -"Presence related information." -msgstr "" -"リッチプレゼンスに関する情報を取得する :attr:`Message.activity` および " -":attr:`Message.application` 。" - -#: ../../migrating.rst:411 -msgid ":meth:`TextChannel.is_nsfw` to check if a text channel is NSFW." -msgstr "テキストチャンネルがNSFWであるかを確認する :meth:`TextChannel.is_nsfw` 。" - -#: ../../migrating.rst:412 -msgid ":meth:`Colour.from_rgb` to construct a :class:`Colour` from RGB tuple." -msgstr "RGBのタプルから :class:`Colour` を作成する :meth:`Colour.from_rgb` 。" - -#: ../../migrating.rst:413 -msgid ":meth:`Guild.get_role` to get a role by its ID." -msgstr "IDから役職を取得する :meth:`Guild.get_role` 。" - -#: ../../migrating.rst:418 -msgid "Sending Messages" -msgstr "メッセージの送信" - -#: ../../migrating.rst:420 -msgid "" -"One of the changes that were done was the merger of the previous " -"``Client.send_message`` and ``Client.send_file`` functionality into a " -"single method, :meth:`~abc.Messageable.send`." -msgstr "" -"変更点の一つは、以前の ``Client.send_message`` と ``Client.send_file`` の機能を単一のメソッド " -":meth:`~abc.Messageable.send` に統合したことです。" - -#: ../../migrating.rst:423 ../../migrating.rst:1077 -msgid "Basically: ::" -msgstr "基本形" - -#: ../../migrating.rst:431 -msgid "" -"This supports everything that the old ``send_message`` supported such as " -"embeds: ::" -msgstr "これは埋め込みメッセージなどといった、従来の ``send_message`` が持っていた機能を全てサポートしています。" - -#: ../../migrating.rst:436 -msgid "" -"There is a caveat with sending files however, as this functionality was " -"expanded to support multiple file attachments, you must now use a " -":class:`File` pseudo-namedtuple to upload a single file. ::" -msgstr "" -"これはファイルの送信に対応できるように拡張されましたが、複数のファイルを送信する際には、 :class:`File` " -"の擬似的な名前付きタプルでファイルを渡す必要があります。" - -#: ../../migrating.rst:445 -msgid "This change was to facilitate multiple file uploads: ::" -msgstr "この変更は、複数の添付ファイルの送信を容易にするために行われました。" - -#: ../../migrating.rst:457 -msgid "Asynchronous Iterators" -msgstr "非同期のイテレータ" - -#: ../../migrating.rst:459 -msgid "" -"Prior to v1.0, certain functions like ``Client.logs_from`` would return a" -" different type if done in Python 3.4 or 3.5+." -msgstr "" -"v1.0以前のバージョンは、Python 3.4 または 3.5以上の環境において ``Client.logs_from`` " -"のような特定の関数で、処理終了時に異なった型を返していました。" - -#: ../../migrating.rst:461 -msgid "" -"In v1.0, this change has been reverted and will now return a singular " -"type meeting an abstract concept called :class:`AsyncIterator`." -msgstr "これはv1.0で元に戻り、 :class:`AsyncIterator` という抽象概念を満たす特異な型を返します。" - -#: ../../migrating.rst:464 -msgid "This allows you to iterate over it like normal: ::" -msgstr "これは通常のイテレータと同様の処理が行なえます。" - -#: ../../migrating.rst:469 -msgid "Or turn it into a list: ::" -msgstr "またはリストにできます。" - -#: ../../migrating.rst:475 -msgid "" -"A handy aspect of returning :class:`AsyncIterator` is that it allows you " -"to chain functions together such as :meth:`AsyncIterator.map` or " -":meth:`AsyncIterator.filter`: ::" -msgstr "" -":class:`AsyncIterator` を返すことで便利な点は :meth:`AsyncIterator.map` や " -":meth:`AsyncIterator.filter` といった関数をチェーンできることです: ::" - -#: ../../migrating.rst:481 -msgid "" -"The functions passed to :meth:`AsyncIterator.map` or " -":meth:`AsyncIterator.filter` can be either coroutines or regular " -"functions." -msgstr "" -":meth:`AsyncIterator.map` または :meth:`AsyncIterator.filter` " -"に渡される関数はコルーチンか通常の関数です。" - -#: ../../migrating.rst:484 -msgid "" -"You can also get single elements a la :func:`discord.utils.find` or " -":func:`discord.utils.get` via :meth:`AsyncIterator.get` or " -":meth:`AsyncIterator.find`: ::" -msgstr "" -":meth:`AsyncIterator.get` または :meth:`AsyncIterator.find` を介して " -":func:`discord.utils.get` または :func:`discord.utils.find` " -"で単一の要素を取得することもできます。" - -#: ../../migrating.rst:489 -msgid "The following return :class:`AsyncIterator`:" -msgstr ":class:`AsyncIterator` を返すのは以下のとおりです:" - -#: ../../migrating.rst:491 -msgid ":meth:`abc.Messageable.history`" -msgstr ":meth:`abc.Messageable.history`" - -#: ../../migrating.rst:492 -msgid ":meth:`Guild.audit_logs`" -msgstr ":meth:`Guild.audit_logs`" - -#: ../../migrating.rst:498 ../../migrating.rst:924 -msgid "Event Changes" -msgstr "イベントの変更" - -#: ../../migrating.rst:500 -msgid "A lot of events have gone through some changes." -msgstr "多くのイベントに変更がありました。" - -#: ../../migrating.rst:502 -msgid "" -"Many events with ``server`` in the name were changed to use ``guild`` " -"instead." -msgstr "名前に ``server`` が含まれていたイベントのほとんどが、 ``guild`` を使った名前に変更されました。" - -#: ../../migrating.rst:504 ../../migrating.rst:568 -msgid "Before:" -msgstr "変更前" - -#: ../../migrating.rst:506 -msgid "``on_server_join``" -msgstr "``on_server_join``" - -#: ../../migrating.rst:507 -msgid "``on_server_remove``" -msgstr "``on_server_remove``" - -#: ../../migrating.rst:508 -msgid "``on_server_update``" -msgstr "``on_server_update``" - -#: ../../migrating.rst:509 -msgid "``on_server_role_create``" -msgstr "``on_server_role_create``" - -#: ../../migrating.rst:510 -msgid "``on_server_role_delete``" -msgstr "``on_server_role_delete``" - -#: ../../migrating.rst:511 -msgid "``on_server_role_update``" -msgstr "``on_server_role_update``" - -#: ../../migrating.rst:512 -msgid "``on_server_emojis_update``" -msgstr "``on_server_emojis_update``" - -#: ../../migrating.rst:513 -msgid "``on_server_available``" -msgstr "``on_server_available``" - -#: ../../migrating.rst:514 -msgid "``on_server_unavailable``" -msgstr "``on_server_unavailable``" - -#: ../../migrating.rst:516 ../../migrating.rst:574 -msgid "After:" -msgstr "変更後" - -#: ../../migrating.rst:518 -msgid ":func:`on_guild_join`" -msgstr ":func:`on_guild_join`" - -#: ../../migrating.rst:519 -msgid ":func:`on_guild_remove`" -msgstr ":func:`on_guild_remove`" - -#: ../../migrating.rst:520 -msgid ":func:`on_guild_update`" -msgstr ":func:`on_guild_update`" - -#: ../../migrating.rst:521 -msgid ":func:`on_guild_role_create`" -msgstr ":func:`on_guild_role_create`" - -#: ../../migrating.rst:522 -msgid ":func:`on_guild_role_delete`" -msgstr ":func:`on_guild_role_delete`" - -#: ../../migrating.rst:523 -msgid ":func:`on_guild_role_update`" -msgstr ":func:`on_guild_role_update`" - -#: ../../migrating.rst:524 -msgid ":func:`on_guild_emojis_update`" -msgstr ":func:`on_guild_emojis_update`" - -#: ../../migrating.rst:525 -msgid ":func:`on_guild_available`" -msgstr ":func:`on_guild_available`" - -#: ../../migrating.rst:526 -msgid ":func:`on_guild_unavailable`" -msgstr ":func:`on_guild_unavailable`" - -#: ../../migrating.rst:529 -msgid "The :func:`on_voice_state_update` event has received an argument change." -msgstr ":func:`on_voice_state_update` イベントの引数が変更されました。" - -#: ../../migrating.rst:531 ../../migrating.rst:543 ../../migrating.rst:555 -#: ../../migrating.rst:615 ../../migrating.rst:928 -msgid "Before: ::" -msgstr "更新前" - -#: ../../migrating.rst:535 ../../migrating.rst:547 ../../migrating.rst:559 -#: ../../migrating.rst:627 ../../migrating.rst:934 ../../migrating.rst:1159 -msgid "After: ::" -msgstr "更新後" - -#: ../../migrating.rst:539 -msgid "" -"Instead of two :class:`Member` objects, the new event takes one " -":class:`Member` object and two :class:`VoiceState` objects." -msgstr "" -"新しくなったイベントは、二つの :class:`Member` の代わりに、 一つの :class:`Member` と二つの " -":class:`VoiceState` を受け取るようになりました。" - -#: ../../migrating.rst:541 -msgid "The :func:`on_guild_emojis_update` event has received an argument change." -msgstr ":func:`on_guild_emojis_update` イベントの引数が変更されました。" - -#: ../../migrating.rst:551 -msgid "" -"The first argument is now the :class:`Guild` that the emojis were updated" -" from." -msgstr "最初の引数は絵文字の更新が行われた :class:`Guild` です。" - -#: ../../migrating.rst:553 -msgid "The :func:`on_member_ban` event has received an argument change as well:" -msgstr ":func:`on_member_ban` も引数が変更されました。" - -#: ../../migrating.rst:563 -msgid "" -"As part of the change, the event can either receive a :class:`User` or " -":class:`Member`. To help in the cases that have :class:`User`, the " -":class:`Guild` is provided as the first parameter." -msgstr "" -"変更の一つは、イベントが :class:`Member` または :class:`User` のどちらかを受け取れるようになったことです。 " -":class:`User` で受け取る場合には第一引数として :class:`Guild` が渡されます。" - -#: ../../migrating.rst:566 -msgid "" -"The ``on_channel_`` events have received a type level split (see " -":ref:`migrating_1_0_channel_split`)." -msgstr "" -"``on_channel_`` のようなイベントは、チャンネルタイプにより分割されました ( " -":ref:`migrating_1_0_channel_split` を参照)。" - -#: ../../migrating.rst:570 -msgid "``on_channel_delete``" -msgstr "``on_channel_delete``" - -#: ../../migrating.rst:571 -msgid "``on_channel_create``" -msgstr "``on_channel_create``" - -#: ../../migrating.rst:572 -msgid "``on_channel_update``" -msgstr "``on_channel_update``" - -#: ../../migrating.rst:576 -msgid ":func:`on_guild_channel_delete`" -msgstr ":func:`on_guild_channel_delete`" - -#: ../../migrating.rst:577 -msgid ":func:`on_guild_channel_create`" -msgstr ":func:`on_guild_channel_create`" - -#: ../../migrating.rst:578 -msgid ":func:`on_guild_channel_update`" -msgstr ":func:`on_guild_channel_update`" - -#: ../../migrating.rst:579 -msgid ":func:`on_private_channel_delete`" -msgstr ":func:`on_private_channel_delete`" - -#: ../../migrating.rst:580 -msgid ":func:`on_private_channel_create`" -msgstr ":func:`on_private_channel_create`" - -#: ../../migrating.rst:581 -msgid ":func:`on_private_channel_update`" -msgstr ":func:`on_private_channel_update`" - -#: ../../migrating.rst:583 -msgid "" -"The ``on_guild_channel_`` events correspond to :class:`abc.GuildChannel` " -"being updated (i.e. :class:`TextChannel` and :class:`VoiceChannel`) and " -"the ``on_private_channel_`` events correspond to " -":class:`abc.PrivateChannel` being updated (i.e. :class:`DMChannel` and " -":class:`GroupChannel`)." -msgstr "" -"``on_guild_channel_`` イベントは更新される :class:`abc.GuildChannel` " -"(:class:`TextChannel` および :class:`VoiceChannel`)に対応しており、 " -"``on_private_channel_`` イベントは更新される :class:`abc.PrivateChannel` " -"(:class:`DMChannel` および :class:`GroupChannel`)に対応しています。" - -#: ../../migrating.rst:590 -msgid "Voice Changes" -msgstr "ボイスの変更" - -#: ../../migrating.rst:592 -msgid "Voice sending has gone through a complete redesign." -msgstr "ボイスの送信が完全に再構成されました。" - -#: ../../migrating.rst:594 -msgid "In particular:" -msgstr "主な変更点は以下のとおりです。" - -#: ../../migrating.rst:596 -msgid "" -"Connection is done through :meth:`VoiceChannel.connect` instead of " -"``Client.join_voice_channel``." -msgstr "" -"ボイスチャンネルへの接続は ``Client.join_voice_channel`` に代わって " -":meth:`VoiceChannel.connect` になりました。" - -#: ../../migrating.rst:597 -msgid "" -"You no longer create players and operate on them (you no longer store " -"them)." -msgstr "プレイヤーを作成せずに操作が可能になりました。(プレイヤーの保存の必要もありません)" - -#: ../../migrating.rst:598 -msgid "" -"You instead request :class:`VoiceClient` to play an :class:`AudioSource` " -"via :meth:`VoiceClient.play`." -msgstr "" -"代わりに :class:`VoiceClient` の :meth:`VoiceClient.play` を介して " -":class:`AudioSource` の再生を要求します。" - -#: ../../migrating.rst:599 -msgid "There are different built-in :class:`AudioSource`\\s." -msgstr "様々な組み込み :class:`AudioSource` があります。" - -#: ../../migrating.rst:601 -msgid ":class:`FFmpegPCMAudio` is the equivalent of ``create_ffmpeg_player``" -msgstr ":class:`FFmpegPCMAudio` は ``create_ffmpeg_player`` と同等です。" - -#: ../../migrating.rst:603 -msgid "" -"create_ffmpeg_player/create_stream_player/create_ytdl_player have all " -"been removed." -msgstr "create_ffmpeg_player/create_stream_player/create_ytdl_player はすべて削除されました。" - -#: ../../migrating.rst:605 -msgid "The goal is to create :class:`AudioSource` instead." -msgstr "代わりに:class:`AudioSource`を作成してください。" - -#: ../../migrating.rst:607 -msgid "Using :meth:`VoiceClient.play` will not return an ``AudioPlayer``." -msgstr ":meth:`VoiceClient.play` を呼び出しても ``AudioPlayer`` は返ってきません。" - -#: ../../migrating.rst:609 -msgid "Instead, it's \"flattened\" like :class:`User` -> :class:`Member` is." -msgstr "代わりに、:class:`User`と:class:`Member`のように、「フラット化」されています。" - -#: ../../migrating.rst:611 -msgid "The ``after`` parameter now takes a single parameter (the error)." -msgstr "``after``パラメータの関数は、ひとつ引数 (エラー) を取ります。" - -#: ../../migrating.rst:613 -msgid "Basically:" -msgstr "基本的には以下のとおりです:" - -#: ../../migrating.rst:637 -msgid "" -"With the changed :class:`AudioSource` design, you can now change the " -"source that the :class:`VoiceClient` is playing at runtime via " -":attr:`VoiceClient.source`." -msgstr "" -":class:`AudioSource` の再設計により、 :attr:`VoiceClient.source` を介して実行中の " -":class:`VoiceClient` のソースを変更できるようになりました。" - -#: ../../migrating.rst:640 -msgid "" -"For example, you can add a :class:`PCMVolumeTransformer` to allow " -"changing the volume: ::" -msgstr "例えば、 :class:`PCMVolumeTransformer` を追加すると、ボリュームの変更ができるようになります。" - -#: ../../migrating.rst:645 -msgid "" -"An added benefit of the redesign is that it will be much more resilient " -"towards reconnections:" -msgstr "再設計によるさらなる利点は、再接続において遥かに柔軟性を持ったことです。" - -#: ../../migrating.rst:647 -msgid "" -"The voice websocket will now automatically re-connect and re-do the " -"handshake when disconnected." -msgstr "音声ウェブソケットは、切断された際に自動的に再接続し、ハンドシェイクを再実行します。" - -#: ../../migrating.rst:648 -msgid "" -"The initial connect handshake will now retry up to 5 times so you no " -"longer get as many ``asyncio.TimeoutError``." -msgstr "" -"初期接続のハンドシェイクは、最大5回までの再試行となったので、大量の ``asyncio.TimeoutError`` " -"に悩まされることはなくなりました。" - -#: ../../migrating.rst:649 -msgid "Audio will now stop and resume when a disconnect is found." -msgstr "VCの切断を検知すると、オーディオは停止し、再開しようとします。" - -#: ../../migrating.rst:651 -msgid "This includes changing voice regions etc." -msgstr "これはサーバーリージョンの変更も含まれます。" - -#: ../../migrating.rst:657 -msgid "Waiting For Events" -msgstr "イベントの待機" - -#: ../../migrating.rst:659 -msgid "" -"Prior to v1.0, the machinery for waiting for an event outside of the " -"event itself was done through two different functions, " -"``Client.wait_for_message`` and ``Client.wait_for_reaction``. One problem" -" with one such approach is that it did not allow you to wait for events " -"outside of the ones provided by the library." -msgstr "" -"v1.0以前のバージョンでは、イベントの発生を待つ方法として ``Client.wait_for_message`` と " -"``Client.wait_for_reaction`` " -"の二つの関数が用意されていました。このアプローチの欠点はライブラリが提供するイベント以外の発生を待つことが出来ない点です。" - -#: ../../migrating.rst:663 -msgid "" -"In v1.0 the concept of waiting for another event has been generalised to " -"work with any event as :meth:`Client.wait_for`." -msgstr "v1.0では別のイベント待機の概念が :meth:`Client.wait_for` イベントのように一般化されました。" - -#: ../../migrating.rst:665 -msgid "For example, to wait for a message: ::" -msgstr "例えば、メッセージを待つ処理は以下のようになります。" - -#: ../../migrating.rst:676 -msgid "" -"To facilitate multiple returns, :meth:`Client.wait_for` returns either a " -"single argument, no arguments, or a tuple of arguments." -msgstr "複数の返り値に対応するため、 :meth:`Client.wait_for` は単一の引数、引数なし、あるいは引数のタプルを返すようになっています。" - -#: ../../migrating.rst:679 -msgid "For example, to wait for a reaction: ::" -msgstr "例えば、リアクションを待つ処理は以下のようになります。" - -#: ../../migrating.rst:685 -msgid "" -"Since this function now can return multiple arguments, the ``timeout`` " -"parameter will now raise a :exc:`asyncio.TimeoutError` when reached " -"instead of setting the return to ``None``. For example:" -msgstr "" -"この関数は複数の引数を返すため、 ``timeout`` に設定した時間経過すると、 ``None`` を返すのではなく、 " -":exc:`asyncio.TimeoutError` を発生させるようになりました。以下はその例になります。" - -#: ../../migrating.rst:702 -msgid "Upgraded Dependencies" -msgstr "依存関係のアップグレード" - -#: ../../migrating.rst:704 -msgid "" -"Following v1.0 of the library, we've updated our requirements to " -":doc:`aiohttp ` v2.0 or higher." -msgstr "ライブラリのv1.0への更新に伴い、要件が :doc:`aiohttp ` v2.0以上へと変更されました。" - -#: ../../migrating.rst:706 -msgid "" -"Since this is a backwards incompatible change, it is recommended that you" -" see the `changes " -"`_ " -"and the :doc:`aio:migration_to_2xx` pages for details on the breaking " -"changes in :doc:`aiohttp `." -msgstr "" -"これは後方互換性のない変更となるため、 :doc:`aiohttp ` の変更点の詳細については `changes " -"`_ と" -" :doc:`aio:migration_to_2xx` ページを参照してください。" - -#: ../../migrating.rst:711 -msgid "" -"Of the most significant for common users is the removal of helper " -"functions such as:" -msgstr "ユーザーにとって最も重要な変更点は、以下のヘルパー関数の削除です。" - -#: ../../migrating.rst:713 -msgid "``aiohttp.get``" -msgstr "``aiohttp.get``" - -#: ../../migrating.rst:714 -msgid "``aiohttp.post``" -msgstr "``aiohttp.post``" - -#: ../../migrating.rst:715 -msgid "``aiohttp.delete``" -msgstr "``aiohttp.delete``" - -#: ../../migrating.rst:716 -msgid "``aiohttp.patch``" -msgstr "``aiohttp.patch``" - -#: ../../migrating.rst:717 -msgid "``aiohttp.head``" -msgstr "``aiohttp.head``" - -#: ../../migrating.rst:718 -msgid "``aiohttp.put``" -msgstr "``aiohttp.put``" - -#: ../../migrating.rst:719 -msgid "``aiohttp.request``" -msgstr "``aiohttp.request``" - -#: ../../migrating.rst:721 -msgid "It is recommended that you create a session instead: ::" -msgstr "代わりにセッションを作成することをお勧めします。" - -#: ../../migrating.rst:727 -msgid "" -"Since it is better to not create a session for every request, you should " -"store it in a variable and then call ``session.close`` on it when it " -"needs to be disposed." -msgstr "" -"リクエストごとにセッションを作成するのは良いとは言えないため、変数に格納しておき、破棄しなければならない時に ``session.close`` " -"を呼び出すのが良いでしょう。" - -#: ../../migrating.rst:731 -msgid "Sharding" -msgstr "シャーディング" - -#: ../../migrating.rst:733 -msgid "" -"The library has received significant changes on how it handles sharding " -"and now has sharding as a first-class citizen." -msgstr "シャーディングの扱いに対して大きな変更があり、現在、シャーディングは第一級オブジェクトとして扱われています。" - -#: ../../migrating.rst:735 -msgid "" -"If using a Bot account and you want to shard your bot in a single process" -" then you can use the :class:`AutoShardedClient`." -msgstr "" -"Botアカウントを使用していて、かつ一つのプロセスでBotをシャーディングしたい場合は、 :class:`AutoShardedClient` " -"を使用してください。" - -#: ../../migrating.rst:737 -msgid "" -"This class allows you to use sharding without having to launch multiple " -"processes or deal with complicated IPC." -msgstr "このクラスは複数のプロセスを起動したり、IPCを処理することなくシャーディングが行えます。" - -#: ../../migrating.rst:739 -msgid "" -"It should be noted that **the sharded client does not support user " -"accounts**. This is due to the changes in connection logic and state " -"handling." -msgstr "シャーディングしたクライアントはユーザーアカウントをサポートしないことを覚えておきましょう。これは、接続の形態と状態処理の変更によるものです。" - -#: ../../migrating.rst:742 -msgid "Usage is as simple as doing: ::" -msgstr "使い方は簡単です。" - -#: ../../migrating.rst:746 -msgid "instead of using :class:`Client`." -msgstr ":class:`Client` の代わりに上記のようにしてください。" - -#: ../../migrating.rst:748 -msgid "" -"This will launch as many shards as your bot needs using the " -"``/gateway/bot`` endpoint, which allocates about 1000 guilds per shard." -msgstr "" -"これは ``/gateway/bot`` " -"エンドポイントを使って、あなたのBotに必要な数のシャードを起動します。このエンドポイントはシャードごとに1000ギルドを割り当てます。" - -#: ../../migrating.rst:751 -msgid "" -"If you want more control over the sharding you can specify " -"``shard_count`` and ``shard_ids``. ::" -msgstr "シャードをより詳細に制御したい場合は、 ``shard_count`` と ``shard_ids`` を利用してください。" - -#: ../../migrating.rst:759 -msgid "" -"For users of the command extension, there is also " -":class:`~ext.commands.AutoShardedBot` which behaves similarly." -msgstr "" -"コマンド拡張を利用しているユーザーのために、同様に動作する :class:`~ext.commands.AutoShardedBot` " -"が用意されています。" - -#: ../../migrating.rst:762 -msgid "Connection Improvements" -msgstr "接続の改善" - -#: ../../migrating.rst:764 -msgid "In v1.0, the auto reconnection logic has been powered up significantly." -msgstr "v1.0では、自動再接続機能が大幅に強化されました。" - -#: ../../migrating.rst:766 -msgid "" -":meth:`Client.connect` has gained a new keyword argument, ``reconnect`` " -"that defaults to ``True`` which controls the reconnect logic. When " -"enabled, the client will automatically reconnect in all instances of your" -" internet going offline or Discord going offline with exponential back-" -"off." -msgstr "" -":meth:`Client.connect` には新しいキーワード引数が追加されました。再接続機能の設定を行う ``reconnect`` " -"はデフォルトで ``True`` " -"に設定されています。有効にすると、クライアントは全インターネットのインスタンスがオフラインになった際や、Discordが指数関数的後退によってオフラインになった際に自動で再接続を試みます。" - -#: ../../migrating.rst:770 -msgid "" -":meth:`Client.run` and :meth:`Client.start` gains this keyword argument " -"as well, but for most cases you will not need to specify it unless " -"turning it off." -msgstr "" -":meth:`Client.run` や :meth:`Client.start` " -"にも同様のキーワード引数が追加されていますが、このさい接続機能をオフにする場合以外は指定する必要はありません。" - -#: ../../migrating.rst:776 -msgid "Command Extension Changes" -msgstr "コマンド拡張の変更" - -#: ../../migrating.rst:778 -msgid "" -"Due to the :ref:`migrating_1_0_model_state` changes, some of the design " -"of the extension module had to undergo some design changes as well." -msgstr ":ref:`migrating_1_0_model_state` により、拡張モジュールの設計にもいくつかの変更があります。" - -#: ../../migrating.rst:782 -msgid "Context Changes" -msgstr "コンテキストの変更" - -#: ../../migrating.rst:784 -msgid "" -"In v1.0, the :class:`.Context` has received a lot of changes with how " -"it's retrieved and used." -msgstr "v1.0において、 :class:`.Context` は取得と利用の面において、多くの変更があります。" - -#: ../../migrating.rst:786 -msgid "" -"The biggest change is that ``pass_context=True`` no longer exists, " -":class:`.Context` is always passed. Ergo:" -msgstr "" -"最も大きな変更点は ``pass_context=True`` が廃止され、常に :class:`.Context` " -"が渡されるようになったことです。そのため以下のようになります。" - -#: ../../migrating.rst:800 -msgid "" -"The reason for this is because :class:`~ext.commands.Context` now meets " -"the requirements of :class:`abc.Messageable`. This makes it have similar " -"functionality to :class:`TextChannel` or :class:`DMChannel`. Using " -":meth:`~.Context.send` will either DM the user in a DM context or send a " -"message in the channel it was in, similar to the old ``bot.say`` " -"functionality. The old helpers have been removed in favour of the new " -":class:`abc.Messageable` interface. See " -":ref:`migrating_1_0_removed_helpers` for more information." -msgstr "" -"その理由として、 :class:`~ext.commands.Context` が :class:`abc.Messageable` " -"の要件を満たしていることが挙げられます。 これは :class:`TextChannel` や :class:`DMChannel` " -"と同等の機能を持っており、 :meth:`~.Context.send` を用いることで、従来の ``bot.say`` " -"のようにDMまたはテキストチャンネルにメッセージを送信することが出来ます。古いヘルパー関数は新しい " -":class:`abc.Messageable` インタフェースの実装に伴い削除されました。詳細は " -":ref:`migrating_1_0_removed_helpers` を参照してください。" - -#: ../../migrating.rst:806 -msgid "" -"Since the :class:`~ext.commands.Context` is now passed by default, " -"several shortcuts have been added:" -msgstr ":class:`~ext.commands.Context`がデフォルトで渡されるので、ショートカットが追加されました:" - -#: ../../migrating.rst:808 -msgid "**New Shortcuts**" -msgstr "**新しいショートカット**" - -#: ../../migrating.rst:810 -msgid "" -":attr:`ctx.author ` is a shortcut for " -"``ctx.message.author``." -msgstr "" -":attr:`ctx.author ` は " -"``ctx.message.author``のショートカットです。" - -#: ../../migrating.rst:811 -msgid "" -":attr:`ctx.guild ` is a shortcut for " -"``ctx.message.guild``." -msgstr "" -":attr:`ctx.guild ` は " -"``ctx.message.guild``のショートカットです。" - -#: ../../migrating.rst:812 -msgid "" -":attr:`ctx.channel ` is a shortcut for " -"``ctx.message.channel``." -msgstr "" -":attr:`ctx.channel ` は " -"``ctx.message.channel``のショートカットです。" - -#: ../../migrating.rst:813 -msgid "" -":attr:`ctx.me ` is a shortcut for " -"``ctx.message.guild.me`` or ``ctx.bot.user``." -msgstr "" -":attr:`ctx.me ` は " -"``ctx.message.guild.me``のショートカットです。" - -#: ../../migrating.rst:814 -msgid "" -":attr:`ctx.voice_client ` is a " -"shortcut for ``ctx.message.guild.voice_client``." -msgstr "" -":attr:`ctx.voice_client ` は " -"``ctx.message.guild.voice_client``のショートカットです。" - -#: ../../migrating.rst:816 -msgid "**New Functionality**" -msgstr "**新しい機能**" - -#: ../../migrating.rst:818 -msgid ":meth:`.Context.reinvoke` to invoke a command again." -msgstr ":meth:`.Context.reinvoke` はコマンドを再度呼び出します。" - -#: ../../migrating.rst:820 -msgid "This is useful for bypassing cooldowns." -msgstr "クールダウンの回避に利用できます。" - -#: ../../migrating.rst:821 -msgid "" -":attr:`.Context.valid` to check if a context can be invoked with " -":meth:`.Bot.invoke`." -msgstr ":attr:`.Context.valid`で、:meth:`.Bot.invoke`で呼びだせるか確認します。" - -#: ../../migrating.rst:822 -msgid "" -":meth:`.Context.send_help` to show the help command for an entity using " -"the new :class:`~.ext.commands.HelpCommand` system." -msgstr ":meth:`.Context.send_help`を使うと、新しい:class:`~.ext.commands.HelpCommand`システムである項目のヘルプを出力できます。" - -#: ../../migrating.rst:824 -msgid "" -"This is useful if you want to show the user help if they misused a " -"command." -msgstr "コマンドの使用法を誤ったときにヘルプを表示させたい場合に便利です。" - -#: ../../migrating.rst:827 -msgid "Subclassing Context" -msgstr "コンテキストのサブクラス" - -#: ../../migrating.rst:829 -msgid "" -"In v1.0, there is now the ability to subclass " -":class:`~ext.commands.Context` and use it instead of the default provided" -" one." -msgstr "" -"v1.0では、 :class:`~ext.commands.Context` " -"を継承したサブクラスを作成し、デフォルトで実装されているものの代わりに使うことが出来ます。" - -#: ../../migrating.rst:832 -msgid "For example, if you want to add some functionality to the context:" -msgstr "例えば、コンテキストに機能の追加を行いたい場合は以下のように実装が出来ます。" - -#: ../../migrating.rst:841 -msgid "" -"Then you can use :meth:`~ext.commands.Bot.get_context` inside " -":func:`on_message` with combination with :meth:`~ext.commands.Bot.invoke`" -" to use your custom context:" -msgstr "" -"また、 :func:`on_message` 内で :meth:`~ext.commands.Bot.get_context` と " -":meth:`~ext.commands.Bot.invoke` を組み合わせることであなたのカスタムコンテキストを使用できます。" - -#: ../../migrating.rst:851 -msgid "Now inside your commands you will have access to your custom context:" -msgstr "これにより、コマンドからあなたのカスタムコンテキストにアクセスすることが可能です。" - -#: ../../migrating.rst:862 -msgid "Removed Helpers" -msgstr "ヘルパー関数の削除" - -#: ../../migrating.rst:864 -msgid "" -"With the new :class:`.Context` changes, a lot of message sending helpers " -"have been removed." -msgstr "新しい :class:`.Context` の変更によって、たくさんのメッセージ送信用のヘルパー関数が削除されました。" - -#: ../../migrating.rst:866 -msgid "For a full list of changes, see below:" -msgstr "以下が削除された関数のリストです。" - -#: ../../migrating.rst:871 -msgid "``Bot.say``" -msgstr "``Bot.say``" - -#: ../../migrating.rst:871 ../../migrating.rst:873 -msgid ":meth:`.Context.send`" -msgstr ":meth:`.Context.send`" - -#: ../../migrating.rst:873 -msgid "``Bot.upload``" -msgstr "``Bot.upload``" - -#: ../../migrating.rst:875 -msgid "``Bot.whisper``" -msgstr "``Bot.whisper``" - -#: ../../migrating.rst:875 -msgid "``ctx.author.send``" -msgstr "``ctx.author.send``" - -#: ../../migrating.rst:877 -msgid "``Bot.type``" -msgstr "``Bot.type``" - -#: ../../migrating.rst:877 -msgid ":meth:`.Context.typing` or :meth:`.Context.trigger_typing`" -msgstr ":meth:`.Context.typing` または :meth:`.Context.trigger_typing`" - -#: ../../migrating.rst:879 -msgid "``Bot.reply``" -msgstr "``Bot.reply``" - -#: ../../migrating.rst:879 -msgid "No replacement." -msgstr "代替となるものはありません。" - -#: ../../migrating.rst:883 -msgid "Command Changes" -msgstr "コマンドの変更" - -#: ../../migrating.rst:885 -msgid "" -"As mentioned earlier, the first command change is that " -"``pass_context=True`` no longer exists, so there is no need to pass this " -"as a parameter." -msgstr "前述の通り、 ``pass_context=True`` は削除されたため、これをパラメータとして渡す必要はありません。" - -#: ../../migrating.rst:888 -msgid "" -"Another change is the removal of ``no_pm=True``. Instead, use the new " -":func:`~ext.commands.guild_only` built-in check." -msgstr "" -"他に ``no_pm=True`` も削除されました。代わりに新しい組み込みチェックである " -":func:`~ext.commands.guild_only` を使用してください。" - -#: ../../migrating.rst:891 -msgid "" -"The ``commands`` attribute of :class:`~ext.commands.Bot` and " -":class:`~ext.commands.Group` have been changed from a dictionary to a set" -" that does not have aliases. To retrieve the previous dictionary " -"behaviour, use ``all_commands`` instead." -msgstr "" -":class:`~ext.commands.Bot` と :class:`~ext.commands.Group` の ``commands`` " -"属性は辞書からエイリアスを持たないsetに変更されました。以前のような辞書を取得するには ``all_commands`` を使用してください。" - -#: ../../migrating.rst:894 -msgid "Command instances have gained new attributes and properties:" -msgstr "コマンドインスタンスには新たな属性とプロパティが追加されました。" - -#: ../../migrating.rst:896 -msgid "" -":attr:`~ext.commands.Command.signature` to get the signature of the " -"command." -msgstr "コマンドのシグネチャを取得する :attr:`~ext.commands.Command.signature` 。" - -#: ../../migrating.rst:897 -msgid ":attr:`~.Command.usage`, an attribute to override the default signature." -msgstr "デフォルトのシグネチャをオーバーライドする属性 :attr:`~.Command.usage` 。" - -#: ../../migrating.rst:898 -msgid "" -":attr:`~.Command.root_parent` to get the root parent group of a " -"subcommand." -msgstr "サブコマンドのルートである親グループを取得する :attr:`~.Command.root_parent` 。" - -#: ../../migrating.rst:900 -msgid "" -"For :class:`~ext.commands.Group` and :class:`~ext.commands.Bot` the " -"following changed:" -msgstr ":class:`~ext.commands.Group` と :class:`~ext.commands.Bot` は次のように変更されました。" - -#: ../../migrating.rst:902 -msgid "" -"Changed :attr:`~.GroupMixin.commands` to be a :class:`set` without " -"aliases." -msgstr ":attr:`~.GroupMixin.commands` は エイリアスなしの :class:`set` に変更されました。" - -#: ../../migrating.rst:904 -msgid "" -"Use :attr:`~.GroupMixin.all_commands` to get the old :class:`dict` with " -"all commands." -msgstr "" -"すべてのコマンドを従来の :class:`dict` で取得するには :attr:`~.GroupMixin.all_commands` " -"を使用してください。" - -#: ../../migrating.rst:907 -msgid "Check Changes" -msgstr "チェックの変更" - -#: ../../migrating.rst:909 -msgid "" -"Prior to v1.0, :func:`~ext.commands.check`\\s could only be synchronous. " -"As of v1.0 checks can now be coroutines." -msgstr "" -"v1.0以前のバージョンでは :func:`~ext.commands.check` は同期関数でしたが、 " -"v1.0のチェックはコルーチンになりました。" - -#: ../../migrating.rst:911 -msgid "Along with this change, a couple new checks were added." -msgstr "この変更に加え、新たなチェックが二つ追加されました。" - -#: ../../migrating.rst:913 -msgid "" -":func:`~ext.commands.guild_only` replaces the old ``no_pm=True`` " -"functionality." -msgstr "``no_pm=True`` の代わりとなる :func:`~ext.commands.guild_only` 。" - -#: ../../migrating.rst:914 -msgid "" -":func:`~ext.commands.is_owner` uses the :meth:`Client.application_info` " -"endpoint by default to fetch owner ID." -msgstr "" -":func:`~ext.commands.is_owner` は :meth:`Client.application_info` " -"のエンドポイントを使用してオーナーIDを取得します。" - -#: ../../migrating.rst:916 -msgid "" -"This is actually powered by a different function, " -":meth:`~ext.commands.Bot.is_owner`." -msgstr "実際には :meth:`~ext.commands.Bot.is_owner` という別の関数を使用して実行されます。" - -#: ../../migrating.rst:917 -msgid "You can set the owner ID yourself by setting :attr:`.Bot.owner_id`." -msgstr ":attr:`.Bot.owner_id` に値を指定することで自分でオーナーIDの設定ができます。" - -#: ../../migrating.rst:919 -msgid "" -":func:`~ext.commands.is_nsfw` checks if the channel the command is in is " -"a NSFW channel." -msgstr ":func:`~ext.commands.is_nsfw` はコマンドが実行されたチャンネルがNSFWチャンネルかどうかをチェックします。" - -#: ../../migrating.rst:921 -msgid "This is powered by the new :meth:`TextChannel.is_nsfw` method." -msgstr "これは新しく追加された :meth:`TextChannel.is_nsfw` メソッドにより実行されています。" - -#: ../../migrating.rst:926 -msgid "All command extension events have changed." -msgstr "すべてのコマンド拡張のイベントが変更されました。" - -#: ../../migrating.rst:940 -msgid "" -"The extraneous ``command`` parameter in :func:`.on_command` and " -":func:`.on_command_completion` have been removed. The " -":class:`~ext.commands.Command` instance was not kept up-to date so it was" -" incorrect. In order to get the up to date :class:`~ext.commands.Command`" -" instance, use the :attr:`.Context.command` attribute." -msgstr "" -":func:`.on_command` と :func:`.on_command_completion` の ``command`` " -"パラメータが削除されました。 :class:`~ext.commands.Command` " -"インスタンスは更新されておらず、正しいものではありませんでした。最新の :class:`~ext.commands.Command` " -"インスタンスを取得するには :attr:`.Context.command` 属性を使用してください。" - -#: ../../migrating.rst:945 -msgid "" -"The error handlers, either :meth:`.Command.error` or " -":func:`.on_command_error`, have been re-ordered to use the " -":class:`~ext.commands.Context` as its first parameter to be consistent " -"with other events and commands." -msgstr "" -":meth:`.Command.error` や :func:`.on_command_error` " -"のようなエラーハンドラは他のイベント及びコマンドとの一貫性を保つため、最初のパラメータとして " -":class:`~ext.commands.Context` を使用するよう変更されました。" - -#: ../../migrating.rst:950 -msgid "HelpFormatter and Help Command Changes" -msgstr "HelpFormatter および Help Command の変更" - -#: ../../migrating.rst:952 -msgid "" -"The ``HelpFormatter`` class has been removed. It has been replaced with a" -" :class:`~.commands.HelpCommand` class. This class now stores all the " -"command handling and processing of the help command." -msgstr "" -"``HelpFormatter`` クラスは削除され、 :class:`~.commands.HelpCommand` " -"に置き換えられました。このクラスはヘルプコマンドのコマンドハンドリングや処理などといったすべてが格納されています。" - -#: ../../migrating.rst:954 -msgid "" -"The help command is now stored in the :attr:`.Bot.help_command` " -"attribute. As an added extension, you can disable the help command " -"completely by assigning the attribute to ``None`` or passing it at " -"``__init__`` as ``help_command=None``." -msgstr "" -"ヘルプコマンドは属性である :attr:`.Bot.help_command` に格納されています。追加の機能として、この属性に ``None``" -" を代入するか、 ``help_command=None`` のようにして ``__init__`` " -"にわたすことでヘルプコマンドを完全に無効化できます。" - -#: ../../migrating.rst:956 -msgid "" -"The new interface allows the help command to be customised through " -"special methods that can be overridden." -msgstr "新しいインタフェースでは特殊なメソッドをオーバーライドすることでヘルプコマンドをカスタマイズすることができます。" - -#: ../../migrating.rst:958 -msgid ":meth:`.HelpCommand.send_bot_help`" -msgstr ":meth:`.HelpCommand.send_bot_help`" - -#: ../../migrating.rst:959 -msgid "Called when the user requested for help with the entire bot." -msgstr "ユーザーがBot全体のヘルプを要求した際に呼び出されます。" - -#: ../../migrating.rst:960 -msgid ":meth:`.HelpCommand.send_cog_help`" -msgstr ":meth:`.HelpCommand.send_cog_help`" - -#: ../../migrating.rst:961 -msgid "Called when the user requested for help with a specific cog." -msgstr "ユーザーが特定のコグについてのヘルプを要求した際に呼び出されます。" - -#: ../../migrating.rst:962 -msgid ":meth:`.HelpCommand.send_group_help`" -msgstr ":meth:`.HelpCommand.send_group_help`" - -#: ../../migrating.rst:963 -msgid "Called when the user requested for help with a :class:`~.commands.Group`" -msgstr "ユーザーが :class:`~.commands.Group` についてのヘルプを要求した際に呼び出されます。" - -#: ../../migrating.rst:964 -msgid ":meth:`.HelpCommand.send_command_help`" -msgstr ":meth:`.HelpCommand.send_command_help`" - -#: ../../migrating.rst:965 -msgid "Called when the user requested for help with a :class:`~.commands.Command`" -msgstr "ユーザーが :class:`~.commands.Command` についてのヘルプを要求した際に呼び出されます。" - -#: ../../migrating.rst:966 -msgid ":meth:`.HelpCommand.get_destination`" -msgstr ":meth:`.HelpCommand.get_destination`" - -#: ../../migrating.rst:967 -msgid "" -"Called to know where to send the help messages. Useful for deciding " -"whether to DM or not." -msgstr "ヘルプメッセージの送信先を知るために呼び出されます。DMとして送るかどうかを決める際に役立ちます。" - -#: ../../migrating.rst:968 -msgid ":meth:`.HelpCommand.command_not_found`" -msgstr ":meth:`.HelpCommand.command_not_found`" - -#: ../../migrating.rst:969 -msgid "" -"A function (or coroutine) that returns a presentable no command found " -"string." -msgstr "表示可能なコマンドが見つからなかった旨の文字列を返す関数(またはコルーチン)。" - -#: ../../migrating.rst:970 -msgid ":meth:`.HelpCommand.subcommand_not_found`" -msgstr ":meth:`.HelpCommand.subcommand_not_found`" - -#: ../../migrating.rst:971 -msgid "" -"A function (or coroutine) that returns a string when a subcommand is not " -"found." -msgstr "表示可能なサブコマンドが見つからなかった旨の文字列を返す関数(またはコルーチン)。" - -#: ../../migrating.rst:973 -msgid ":meth:`.HelpCommand.send_error_message`" -msgstr ":meth:`.HelpCommand.send_error_message`" - -#: ../../migrating.rst:973 -msgid "" -"A coroutine that gets passed the result of " -":meth:`.HelpCommand.command_not_found` and " -":meth:`.HelpCommand.subcommand_not_found`." -msgstr "" -":meth:`.HelpCommand.command_not_found` および " -":meth:`.HelpCommand.subcommand_not_found` の結果が渡されるコルーチン。" - -#: ../../migrating.rst:974 -msgid "" -"By default it just sends the message. But you can, for example, override " -"it to put it in an embed." -msgstr "デフォルトではメッセージの送信のみを行いますが、たとえば、そのメッセージを埋め込み化したい場合などにオーバーライドして使うことができます。" - -#: ../../migrating.rst:975 -msgid ":meth:`.HelpCommand.on_help_command_error`" -msgstr ":meth:`.HelpCommand.on_help_command_error`" - -#: ../../migrating.rst:976 -msgid "" -"The :ref:`error handler ` for the help " -"command if you want to add one." -msgstr "ヘルプコマンドの :ref:`エラーハンドラ ` 。追加したい場合のみ使用してください。" - -#: ../../migrating.rst:978 -msgid ":meth:`.HelpCommand.prepare_help_command`" -msgstr ":meth:`.HelpCommand.prepare_help_command`" - -#: ../../migrating.rst:978 -msgid "" -"A coroutine that is called right before the help command processing is " -"done." -msgstr "ヘルプコマンドの処理が行われる前に呼び出されるコルーチン。" - -#: ../../migrating.rst:980 -msgid "Certain subclasses can implement more customisable methods." -msgstr "特定のサブクラスはさらにカスタマイズ可能なメソッドを実装できます。" - -#: ../../migrating.rst:982 -msgid "" -"The old ``HelpFormatter`` was replaced with " -":class:`~.commands.DefaultHelpCommand`\\, which implements all of the " -"logic of the old help command. The customisable methods can be found in " -"the accompanying documentation." -msgstr "" -"以前の ``HelpFormatter`` はその機能を全て実装した :class:`~.commands.DefaultHelpCommand`" -" に置き換えられました。カスタマイズメソッドは添付のドキュメントで確認することができます。" - -#: ../../migrating.rst:984 -msgid "" -"The library now provides a new more minimalistic " -":class:`~.commands.HelpCommand` implementation that doesn't take as much " -"space, :class:`~.commands.MinimalHelpCommand`. The customisable methods " -"can also be found in the accompanying documentation." -msgstr "" -"このライブラリは多くのスペースをとらない、より小規模化した :class:`~.commands.HelpCommand` の実装である " -":class:`~.commands.MinimalHelpCommand` " -"を提供します。カスタマイズ可能なメソッドは付随のドキュメントから確認することが可能です。" - -#: ../../migrating.rst:986 -msgid "" -"A frequent request was if you could associate a help command with a cog. " -"The new design allows for dynamically changing of cog through binding it " -"to the :attr:`.HelpCommand.cog` attribute. After this assignment the help" -" command will pretend to be part of the cog and everything should work as" -" expected. When the cog is unloaded then the help command will be " -"\"unbound\" from the cog." -msgstr "" -"ヘルプコマンドをコグに関連付けることはできないのかという要望が多くありました。この新しい設計では :attr:`.HelpCommand.cog`" -" " -"にバインドすることでコグを動的に変更することが可能です。この割当をおこなった後、ヘルプコマンドはコグの一部として、期待通りの動きをするでしょう。コグがアンロードされると、ヘルプコマンドはコグから「バインド解除」されます。" - -#: ../../migrating.rst:988 -msgid "" -"For example, to implement a :class:`~.commands.HelpCommand` in a cog, the" -" following snippet can be used." -msgstr "例えば、 :class:`~.commands.HelpCommand` をコグに実装するには、次のコードが役立つでしょう。" - -#: ../../migrating.rst:1005 -msgid "" -"For more information, check out the relevant :ref:`documentation " -"`." -msgstr "詳しくは、:ref:`こちらの説明 `をご覧ください。" - -#: ../../migrating.rst:1008 -msgid "Cog Changes" -msgstr "コグの変更" - -#: ../../migrating.rst:1010 -msgid "" -"Cogs have completely been revamped. They are documented in " -":ref:`ext_commands_cogs` as well." -msgstr "コグは完全に刷新されました。これは :ref:`ext_commands_cogs` としてドキュメント化されています。" - -#: ../../migrating.rst:1012 -msgid "" -"Cogs are now required to have a base class, :class:`~.commands.Cog` for " -"future proofing purposes. This comes with special methods to customise " -"some behaviour." -msgstr "" -"コグは将来的な校正のためのクラスである :class:`~.commands.Cog` " -"を基底クラスとして持つ必要があります。このクラスには動作のカスタマイズのために、特別なメソッドが用意されています。" - -#: ../../migrating.rst:1014 -msgid ":meth:`.Cog.cog_unload`" -msgstr ":meth:`.Cog.cog_unload`" - -#: ../../migrating.rst:1015 -msgid "" -"This is called when a cog needs to do some cleanup, such as cancelling a " -"task." -msgstr "これはタスクのキャンセルのような、コグに何らかのクリーンアップが必要なときに呼び出されます。" - -#: ../../migrating.rst:1016 -msgid ":meth:`.Cog.bot_check_once`" -msgstr ":meth:`.Cog.bot_check_once`" - -#: ../../migrating.rst:1017 -msgid "This registers a :meth:`.Bot.check_once` check." -msgstr "これは :meth:`.Bot.check_once` チェックを登録します。" - -#: ../../migrating.rst:1018 -msgid ":meth:`.Cog.bot_check`" -msgstr ":meth:`.Cog.bot_check`" - -#: ../../migrating.rst:1019 -msgid "This registers a regular :meth:`.Bot.check` check." -msgstr "これは普通の :meth:`.Bot.check` チェックを登録します。" - -#: ../../migrating.rst:1020 -msgid ":meth:`.Cog.cog_check`" -msgstr ":meth:`.Cog.cog_check`" - -#: ../../migrating.rst:1021 -msgid "This registers a check that applies to every command in the cog." -msgstr "これはコグのすべてのコマンドに適用されるチェックを登録します。" - -#: ../../migrating.rst:1022 -msgid ":meth:`.Cog.cog_command_error`" -msgstr ":meth:`.Cog.cog_command_error`" - -#: ../../migrating.rst:1023 -msgid "" -"This is a special error handler that is called whenever an error happens " -"inside the cog." -msgstr "これは特別なエラーハンドラで、コグ内でエラーが発生するたびに呼び出されます。" - -#: ../../migrating.rst:1025 -msgid ":meth:`.Cog.cog_before_invoke` and :meth:`.Cog.cog_after_invoke`" -msgstr ":meth:`.Cog.cog_before_invoke` と :meth:`.Cog.cog_after_invoke`" - -#: ../../migrating.rst:1025 -msgid "" -"A special method that registers a cog before and after invoke hook. More " -"information can be found in :ref:`migrating_1_0_before_after_hook`." -msgstr "" -"コグの前後に呼び出されるフックを登録する特別なメソッド。詳細は :ref:`migrating_1_0_before_after_hook` " -"に記載されています。" - -#: ../../migrating.rst:1027 -msgid "" -"Those that were using listeners, such as ``on_message`` inside a cog will" -" now have to explicitly mark them as such using the " -":meth:`.commands.Cog.listener` decorator." -msgstr "" -"コグ内で ``on_message`` のようなリスナーを使用していた人は、 :meth:`.commands.Cog.listener` " -"デコレータを用いて、リスナーを明示する必要があります。" - -#: ../../migrating.rst:1029 -msgid "" -"Along with that, cogs have gained the ability to have custom names " -"through specifying it in the class definition line. More options can be " -"found in the metaclass that facilitates all this, " -":class:`.commands.CogMeta`." -msgstr "それによって、コグはクラス定義の行で指定することによって、独自の名前を持てるようになりました。オプションはこれらを容易にするメタクラス、:class:`.commands.CogMeta`で見つかります。" - -#: ../../migrating.rst:1031 -msgid "" -"An example cog with every special method registered and a custom name is " -"as follows:" -msgstr "すべての特別なメソッドを使用し、そして名前を指定したコグの例が以下のようになります:" - -#: ../../migrating.rst:1068 -msgid "Before and After Invocation Hooks" -msgstr "前後処理のフック" - -#: ../../migrating.rst:1070 -msgid "" -"Commands have gained new before and after invocation hooks that allow you" -" to do an action before and after a command is run." -msgstr "コマンドに、コマンドの実行前および実行後に処理が行えるようにするフックが新たに追加されました。" - -#: ../../migrating.rst:1073 -msgid "" -"They take a single parameter, :class:`~ext.commands.Context` and they " -"must be a coroutine." -msgstr "これは単一のパラメータとして :class:`~ext.commands.Context` を受け取り、かつコルーチンである必要があります。" - -#: ../../migrating.rst:1075 -msgid "They are on a global, per-cog, or per-command basis." -msgstr "また、このフックは全体、コグごと、あるいはコマンドごとに設定することが可能です。" - -#: ../../migrating.rst:1092 -msgid "" -"The after invocation is hook always called, **regardless of an error in " -"the command**. This makes it ideal for some error handling or clean up of" -" certain resources such a database connection." -msgstr "" -"後処理のフックは **コマンドのエラー発生に関わらず** " -"必ず呼び出されます。そのため、データベース接続のようなリソースのクリーンアップやエラー処理に最適です。" - -#: ../../migrating.rst:1095 -msgid "The per-command registration is as follows: ::" -msgstr "コマンドごとに設定する方法は以下のとおりです。" - -#: ../../migrating.rst:1111 -msgid "" -"The special cog method for these is :meth:`.Cog.cog_before_invoke` and " -":meth:`.Cog.cog_after_invoke`, e.g.:" -msgstr "" -"これらのコグ用の特別なメソッドは:meth:`.Cog.cog_before_invoke` と " -":meth:`.Cog.cog_after_invoke`です。例:" - -#: ../../migrating.rst:1126 -msgid "" -"To check if a command failed in the after invocation hook, you can use " -":attr:`.Context.command_failed`." -msgstr ":attr:`.Context.command_failed` を使うことで、後処理でコマンドがエラーになったかを確認する事ができます。" - -#: ../../migrating.rst:1129 -msgid "The invocation order is as follows:" -msgstr "呼び出される順序は以下のとおりです。" - -#: ../../migrating.rst:1131 -msgid "Command local before invocation hook" -msgstr "コマンドごとの前処理。" - -#: ../../migrating.rst:1132 -msgid "Cog local before invocation hook" -msgstr "コグごとの前処理。" - -#: ../../migrating.rst:1133 -msgid "Global before invocation hook" -msgstr "全体での前処理。" - -#: ../../migrating.rst:1134 -msgid "The actual command" -msgstr "実行されたコマンド。" - -#: ../../migrating.rst:1135 -msgid "Command local after invocation hook" -msgstr "コマンドごとの後処理。" - -#: ../../migrating.rst:1136 -msgid "Cog local after invocation hook" -msgstr "コグごとの後処理。" - -#: ../../migrating.rst:1137 -msgid "Global after invocation hook" -msgstr "全体での後処理。" - -#: ../../migrating.rst:1140 -msgid "Converter Changes" -msgstr "コンバーターの変更" - -#: ../../migrating.rst:1142 -msgid "" -"Prior to v1.0, a converter was a type hint that could be a callable that " -"could be invoked with a singular argument denoting the argument passed by" -" the user as a string." -msgstr "v1.0以前では、コンバーターはユーザーにより渡された引数を、文字列の単独引数として呼び出す型ヒントでした。" - -#: ../../migrating.rst:1145 -msgid "" -"This system was eventually expanded to support a " -":class:`~ext.commands.Converter` system to allow plugging in the " -":class:`~ext.commands.Context` and do more complicated conversions such " -"as the built-in \"discord\" converters." -msgstr "" - -#: ../../migrating.rst:1149 -msgid "" -"In v1.0 this converter system was revamped to allow instances of " -":class:`~ext.commands.Converter` derived classes to be passed. For " -"consistency, the :meth:`~ext.commands.Converter.convert` method was " -"changed to always be a coroutine and will now take the two arguments as " -"parameters." -msgstr "" -"v1.0ではこのコンバーターシステムは :class:`~ext.commands.Converter` " -"派生のクラスを用いることができるよう変更されました。一貫性を保つため、 " -":meth:`~ext.commands.Converter.convert` は常にコルーチンとるよう変更され、二つのパラメータを受け取ります。" - -#: ../../migrating.rst:1153 -msgid "Essentially, before: ::" -msgstr "更新前: ::" - -#: ../../migrating.rst:1165 -msgid "The command framework also got a couple new converters:" -msgstr "コマンドフレームワークにも二つのコンバーターが追加されました。" - -#: ../../migrating.rst:1167 -msgid "" -":class:`~ext.commands.clean_content` this is akin to " -":attr:`Message.clean_content` which scrubs mentions." -msgstr "" - -#: ../../migrating.rst:1168 -msgid "" -":class:`~ext.commands.UserConverter` will now appropriately convert " -":class:`User` only." -msgstr ":class:`~ext.commands.UserConverter` は :class:`User` だけを適切に変換します。" - -#: ../../migrating.rst:1169 -msgid "``ChannelConverter`` is now split into two different converters." -msgstr "``ChannelConverter`` は二つのコンバーターに分離されました。" - -#: ../../migrating.rst:1171 -msgid ":class:`~ext.commands.TextChannelConverter` for :class:`TextChannel`." -msgstr ":class:`TextChannel` 用の :class:`~ext.commands.TextChannelConverter` 。" - -#: ../../migrating.rst:1172 -msgid ":class:`~ext.commands.VoiceChannelConverter` for :class:`VoiceChannel`." -msgstr ":class:`VoiceChannel` 用の :class:`~ext.commands.VoiceChannelConverter` 。" - diff --git a/docs/locale/ja/LC_MESSAGES/migrating_to_async.po b/docs/locale/ja/LC_MESSAGES/migrating_to_async.po deleted file mode 100644 index 3321f50741..0000000000 --- a/docs/locale/ja/LC_MESSAGES/migrating_to_async.po +++ /dev/null @@ -1,363 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: discordpy\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-22 09:35-0400\n" -"PO-Revision-Date: 2020-10-24 02:41\n" -"Last-Translator: \n" -"Language-Team: Japanese\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Crowdin-Project: discordpy\n" -"X-Crowdin-Project-ID: 362783\n" -"X-Crowdin-Language: ja\n" -"X-Crowdin-File: migrating_to_async.pot\n" -"X-Crowdin-File-ID: 48\n" -"Language: ja_JP\n" - -#: ../../migrating_to_async.rst:8 -msgid "Migrating to v0.10.0" -msgstr "v0.10.0への移行" - -#: ../../migrating_to_async.rst:10 -msgid "v0.10.0 is one of the biggest breaking changes in the library due to massive fundamental changes in how the library operates." -msgstr "v0.10.0は、ライブラリの根本的動作が大幅に変更された、ライブラリの中でも大きな更新の一つです。" - -#: ../../migrating_to_async.rst:13 -msgid "The biggest major change is that the library has dropped support to all versions prior to Python 3.4.2. This was made to support :mod:`asyncio`, in which more detail can be seen :issue:`in the corresponding issue <50>`. To reiterate this, the implication is that **python version 2.7 and 3.3 are no longer supported**." -msgstr "最大の大きな変更点はPython 3.4.2以前のすべてのバージョンのサポートが打ち切られたことです。これは :mod:`asyncio` をサポートするためで、対応する :issue:`in the corresponding issue <50>` で詳細が見られます。繰り返しになりますが、 **Python 2.7及びPython3.3は、既にサポートされていません** 。" - -#: ../../migrating_to_async.rst:18 -msgid "Below are all the other major changes from v0.9.0 to v0.10.0." -msgstr "以下は、v0.9.0からv0.10.0までのその他の主要な変更点です。" - -#: ../../migrating_to_async.rst:21 -msgid "Event Registration" -msgstr "イベント登録" - -#: ../../migrating_to_async.rst:23 -msgid "All events before were registered using :meth:`Client.event`. While this is still possible, the events must be decorated with ``@asyncio.coroutine``." -msgstr "以前まではすべてのイベントが :meth:`Client.event` を使用して登録されていました。このやり方はまだ可能ですが、 ``@asyncio.coroutine`` で修飾が必要です。" - -#: ../../migrating_to_async.rst:26 -#: ../../migrating_to_async.rst:71 -#: ../../migrating_to_async.rst:105 -#: ../../migrating_to_async.rst:166 -msgid "Before:" -msgstr "更新前:" - -#: ../../migrating_to_async.rst:34 -#: ../../migrating_to_async.rst:83 -#: ../../migrating_to_async.rst:111 -#: ../../migrating_to_async.rst:174 -#: ../../migrating_to_async.rst:284 -msgid "After:" -msgstr "更新後:" - -#: ../../migrating_to_async.rst:43 -msgid "Or in Python 3.5+:" -msgstr "Python 3.5以降の場合:" - -#: ../../migrating_to_async.rst:51 -msgid "Because there is a lot of typing, a utility decorator (:meth:`Client.async_event`) is provided for easier registration. For example:" -msgstr "多くの型付けがあるため、登録を簡単にするためにユーティリティデコレータ (:meth:`Client.async_event`) が用意されています。例:" - -#: ../../migrating_to_async.rst:61 -msgid "Be aware however, that this is still a coroutine and your other functions that are coroutines must be decorated with ``@asyncio.coroutine`` or be ``async def``." -msgstr "しかし、これはまだコルーチンであり、コルーチンである関数には ``@asyncio.coroutine`` あるいは ``async def`` での修飾が必要であることに注意してください。" - -#: ../../migrating_to_async.rst:65 -msgid "Event Changes" -msgstr "イベントの変更" - -#: ../../migrating_to_async.rst:67 -msgid "Some events in v0.9.0 were considered pretty useless due to having no separate states. The main events that were changed were the ``_update`` events since previously they had no context on what was changed." -msgstr "v0.9.0でいくつかのイベントは、別の状態を持たないために、役に立たないと考えられていました。変更された主なイベントは、更新前と更新後の二つの状態を持つ ``_update`` イベントです。" - -#: ../../migrating_to_async.rst:93 -msgid "Note that ``on_status`` was removed. If you want its functionality, use :func:`on_member_update`. See :ref:`discord-api-events` for more information. Other removed events include ``on_socket_closed``, ``on_socket_receive``, and ``on_socket_opened``." -msgstr "``on_status`` が削除されていることに注意してください。似たような機能が使いたい場合は、 :func:`on_member_update` を使用します。詳細は :ref:`discord-api-events` を参照してください。他に、 ``on_socket_closed`` 、 ``on_socket_receive`` や ``on_socket_opened`` も削除されています。" - -#: ../../migrating_to_async.rst:98 -msgid "Coroutines" -msgstr "コルーチン" - -#: ../../migrating_to_async.rst:100 -msgid "The biggest change that the library went through is that almost every function in :class:`Client` was changed to be a `coroutine `_. Functions that are marked as a coroutine in the documentation must be awaited from or yielded from in order for the computation to be done. For example..." -msgstr "ライブラリの最大の変更点は :class:`Client` を使用していたほとんどの関数が `コルーチン `_ へと変更されたことです。ドキュメントのコルーチンとして定義された関数は、処理の終了を待機します。例えば、" - -#: ../../migrating_to_async.rst:120 -msgid "In order for you to ``yield from`` or ``await`` a coroutine then your function must be decorated with ``@asyncio.coroutine`` or ``async def``." -msgstr "``yield from`` あるいは ``await`` を使用するには、関数が ``@asyncio.coroutine`` または ``async def`` で修飾されている必要があります。" - -#: ../../migrating_to_async.rst:124 -msgid "Iterables" -msgstr "イテラブル" - -#: ../../migrating_to_async.rst:126 -msgid "For performance reasons, many of the internal data structures were changed into a dictionary to support faster lookup. As a consequence, this meant that some lists that were exposed via the API have changed into iterables and not sequences. In short, this means that certain attributes now only support iteration and not any of the sequence functions." -msgstr "パフォーマンス上の理由から、より高速な情報の取得を可能とするため、多くの内部データ構造が辞書に変更されました。結果として、これはAPIを介して公開された一部リストが、シーケンスではなくイテラブルに変更されたことを意味します。つまるところ、現在、特定の属性はイテラブルのみをサポートしており、シーケンスを扱うことができないことを意味しています。" - -#: ../../migrating_to_async.rst:131 -msgid "The affected attributes are as follows:" -msgstr "影響を受ける属性は以下のとおりです。" - -#: ../../migrating_to_async.rst:133 -msgid ":attr:`Client.servers`" -msgstr ":attr:`Client.servers`" - -#: ../../migrating_to_async.rst:134 -msgid ":attr:`Client.private_channels`" -msgstr ":attr:`Client.private_channels`" - -#: ../../migrating_to_async.rst:135 -msgid ":attr:`Server.channels`" -msgstr ":attr:`Server.channels`" - -#: ../../migrating_to_async.rst:136 -msgid ":attr:`Server.members`" -msgstr ":attr:`Server.members`" - -#: ../../migrating_to_async.rst:138 -msgid "Some examples of previously valid behaviour that is now invalid" -msgstr "以前は有効であったが、現在は無効である操作の例。" - -#: ../../migrating_to_async.rst:145 -msgid "Since they are no longer :obj:`list`\\s, they no longer support indexing or any operation other than iterating. In order to get the old behaviour you should explicitly cast it to a list." -msgstr "これらは、既に :obj:`list` ではないため、インデックスや反復処理以外の操作はサポートされなくなりました。以前の動作で処理を行うには、listに明示的にキャストする必要があります。" - -#: ../../migrating_to_async.rst:155 -msgid "Due to internal changes of the structure, the order you receive the data in is not in a guaranteed order." -msgstr "構造の内部的な変更のため、データを受け取った順序は保証されません。" - -#: ../../migrating_to_async.rst:159 -msgid "Enumerations" -msgstr "列挙型" - -#: ../../migrating_to_async.rst:161 -msgid "Due to dropping support for versions lower than Python 3.4.2, the library can now use :doc:`py:library/enum` in places where it makes sense." -msgstr "Python 3.4.2以前のバージョンのサポートを打ち切ったため、ライブラリは理にかなった場所での :doc:`py:library/enum` の使用が可能になりました。" - -#: ../../migrating_to_async.rst:164 -msgid "The common places where this was changed was in the server region, member status, and channel type." -msgstr "変更された主な場所は、サーバーリージョン、メンバーのステータス、およびチャンネルタイプです。" - -#: ../../migrating_to_async.rst:182 -msgid "The main reason for this change was to reduce the use of finicky strings in the API as this could give users a false sense of power. More information can be found in the :ref:`discord-api-enums` page." -msgstr "この変更の主な理由は、APIでの厄介な文字列の使用を削減することでした。ユーザーに誤った感覚を与える可能性があったためです。詳細は :ref:`discord-api-enums` を参照してください。" - -#: ../../migrating_to_async.rst:186 -msgid "Properties" -msgstr "プロパティ" - -#: ../../migrating_to_async.rst:188 -msgid "A lot of function calls that returned constant values were changed into Python properties for ease of use in format strings." -msgstr "定数値を返す関数呼び出しの多くは、書式化した文字列での使いやすさ向上を図るため、Pythonのプロパティに変更されました。" - -#: ../../migrating_to_async.rst:191 -msgid "The following functions were changed into properties:" -msgstr "以下はプロパティに変更された関数です。" - -#: ../../migrating_to_async.rst:194 -#: ../../migrating_to_async.rst:223 -#: ../../migrating_to_async.rst:238 -msgid "Before" -msgstr "変更前" - -#: ../../migrating_to_async.rst:194 -#: ../../migrating_to_async.rst:223 -#: ../../migrating_to_async.rst:238 -msgid "After" -msgstr "変更後" - -#: ../../migrating_to_async.rst:196 -msgid "``User.avatar_url()``" -msgstr "``User.avatar_url()``" - -#: ../../migrating_to_async.rst:196 -msgid ":attr:`User.avatar_url`" -msgstr ":attr:`User.avatar_url`" - -#: ../../migrating_to_async.rst:198 -msgid "``User.mention()``" -msgstr "``User.mention()``" - -#: ../../migrating_to_async.rst:198 -msgid ":attr:`User.mention`" -msgstr ":attr:`User.mention`" - -#: ../../migrating_to_async.rst:200 -msgid "``Channel.mention()``" -msgstr "``Channel.mention()``" - -#: ../../migrating_to_async.rst:200 -msgid ":attr:`Channel.mention`" -msgstr ":attr:`Channel.mention`" - -#: ../../migrating_to_async.rst:202 -msgid "``Channel.is_default_channel()``" -msgstr "``Channel.is_default_channel()``" - -#: ../../migrating_to_async.rst:202 -msgid ":attr:`Channel.is_default`" -msgstr ":attr:`Channel.is_default`" - -#: ../../migrating_to_async.rst:204 -msgid "``Role.is_everyone()``" -msgstr "``Role.is_everyone()``" - -#: ../../migrating_to_async.rst:204 -msgid ":attr:`Role.is_everyone`" -msgstr ":attr:`Role.is_everyone`" - -#: ../../migrating_to_async.rst:206 -msgid "``Server.get_default_role()``" -msgstr "``Server.get_default_role()``" - -#: ../../migrating_to_async.rst:206 -msgid ":attr:`Server.default_role`" -msgstr ":attr:`Server.default_role`" - -#: ../../migrating_to_async.rst:208 -msgid "``Server.icon_url()``" -msgstr "``Server.icon_url()``" - -#: ../../migrating_to_async.rst:208 -msgid ":attr:`Server.icon_url`" -msgstr ":attr:`Server.icon_url`" - -#: ../../migrating_to_async.rst:210 -msgid "``Server.get_default_channel()``" -msgstr "``Server.get_default_channel()``" - -#: ../../migrating_to_async.rst:210 -msgid ":attr:`Server.default_channel`" -msgstr ":attr:`Server.default_channel`" - -#: ../../migrating_to_async.rst:212 -msgid "``Message.get_raw_mentions()``" -msgstr "``Message.get_raw_mentions()``" - -#: ../../migrating_to_async.rst:212 -msgid ":attr:`Message.raw_mentions`" -msgstr ":attr:`Message.raw_mentions`" - -#: ../../migrating_to_async.rst:214 -msgid "``Message.get_raw_channel_mentions()``" -msgstr "``Message.get_raw_channel_mentions()``" - -#: ../../migrating_to_async.rst:214 -msgid ":attr:`Message.raw_channel_mentions`" -msgstr ":attr:`Message.raw_channel_mentions`" - -#: ../../migrating_to_async.rst:218 -msgid "Member Management" -msgstr "メンバー管理" - -#: ../../migrating_to_async.rst:220 -msgid "Functions that involved banning and kicking were changed." -msgstr "BANやキックを含む関数が追加されました。" - -#: ../../migrating_to_async.rst:225 -msgid "``Client.ban(server, user)``" -msgstr "``Client.ban(server, user)``" - -#: ../../migrating_to_async.rst:225 -msgid "``Client.ban(member)``" -msgstr "``Client.ban(member)``" - -#: ../../migrating_to_async.rst:227 -msgid "``Client.kick(server, user)``" -msgstr "``Client.kick(server, user)``" - -#: ../../migrating_to_async.rst:227 -msgid "``Client.kick(member)``" -msgstr "``Client.kick(member)``" - -#: ../../migrating_to_async.rst:233 -msgid "Renamed Functions" -msgstr "関数の改名" - -#: ../../migrating_to_async.rst:235 -msgid "Functions have been renamed." -msgstr "いくつかの関数名が変更されました。" - -#: ../../migrating_to_async.rst:240 -msgid "``Client.set_channel_permissions``" -msgstr "``Client.set_channel_permissions``" - -#: ../../migrating_to_async.rst:240 -#: ../../migrating_to_async.rst:263 -msgid ":meth:`Client.edit_channel_permissions`" -msgstr ":meth:`Client.edit_channel_permissions`" - -#: ../../migrating_to_async.rst:243 -msgid "All the :class:`Permissions` related attributes have been renamed and the `can_` prefix has been dropped. So for example, ``can_manage_messages`` has become ``manage_messages``." -msgstr "すべての :class:`Permissions` 関連の属性の名称が変更され、 接頭詞であった `can_` が削除されました。例を挙げると ``can_manage_messages`` が ``manage_messages`` になりました。" - -#: ../../migrating_to_async.rst:247 -msgid "Forced Keyword Arguments" -msgstr "強制キーワード引数" - -#: ../../migrating_to_async.rst:249 -msgid "Since 3.0+ of Python, we can now force questions to take in forced keyword arguments. A keyword argument is when you explicitly specify the name of the variable and assign to it, for example: ``foo(name='test')``. Due to this support, some functions in the library were changed to force things to take said keyword arguments. This is to reduce errors of knowing the argument order and the issues that could arise from them." -msgstr "Python 3.0以降では、強制的にキーワード引数をとるようにすることができるようになりました。キーワード引数は、変数の名前を明示的に指定してそれに割り当てることで、例えば ``foo(name='test')`` などです。このサポートにより、ライブラリ内のいくつかの関数が変更され、キーワード引数を取るようになりました。これは引数の順序が誤っていることが原因で発生するエラーを減らすためです。" - -#: ../../migrating_to_async.rst:254 -msgid "The following parameters are now exclusively keyword arguments:" -msgstr "次のパラメータは、現在、排他的なキーワード引数です。" - -#: ../../migrating_to_async.rst:256 -msgid ":meth:`Client.send_message`" -msgstr ":meth:`Client.send_message`" - -#: ../../migrating_to_async.rst:257 -msgid "``tts``" -msgstr "``tts``" - -#: ../../migrating_to_async.rst:259 -msgid ":meth:`Client.logs_from`" -msgstr ":meth:`Client.logs_from`" - -#: ../../migrating_to_async.rst:259 -msgid "``before``" -msgstr "``before``" - -#: ../../migrating_to_async.rst:260 -msgid "``after``" -msgstr "``after``" - -#: ../../migrating_to_async.rst:262 -msgid "``allow``" -msgstr "``allow``" - -#: ../../migrating_to_async.rst:263 -msgid "``deny``" -msgstr "``deny``" - -#: ../../migrating_to_async.rst:265 -msgid "In the documentation you can tell if a function parameter is a forced keyword argument if it is after ``\\*,`` in the function signature." -msgstr "ドキュメントでは、関数シグネチャ内の ``\\*,`` の後に引数があるかどうかで、関数の引数が強制的なキーワード引数であるかを知ることができます。" - -#: ../../migrating_to_async.rst:271 -msgid "Running the Client" -msgstr "クライアントの実行" - -#: ../../migrating_to_async.rst:273 -msgid "In earlier versions of discord.py, ``client.run()`` was a blocking call to the main thread that called it. In v0.10.0 it is still a blocking call but it handles the event loop for you. However, in order to do that you must pass in your credentials to :meth:`Client.run`." -msgstr "以前のバージョンのdiscord.pyでは ``client.run()`` は呼び出したメインスレッドをブロッキングするブロック付き呼び出しでした。v0.10.0でも未だブロック付き呼び出しですが、イベントループで処理を行います。ただし、それを行うためには認証情報を :meth:`Client.run` に渡す必要があります。" - -#: ../../migrating_to_async.rst:277 -msgid "Basically, before:" -msgstr "以前:" - -#: ../../migrating_to_async.rst:292 -msgid "Like in the older ``Client.run`` function, the newer one must be the one of the last functions to call. This is because the function is **blocking**. Registering events or doing anything after :meth:`Client.run` will not execute until the function returns." -msgstr "以前の ``Client.run`` 同様、新しくなった関数も最後に呼び出す必要があります。これは関数がブロッキングを行うためです。 :meth:`Client.run` の後に何かを定義しても、この関数が終了するまで、それらの処理は行われません。" - -#: ../../migrating_to_async.rst:297 -msgid "This is a utility function that abstracts the event loop for you. There's no need for the run call to be blocking and out of your control. Indeed, if you want control of the event loop then doing so is quite straightforward:" -msgstr "これはイベントループを抽象化するユーティリティ関数です。 実行呼び出しがブロックされ、コントロールから外れる必要はありません。実際に、イベントループを制御したい場合、この方法では非常に簡単です。" - diff --git a/docs/locale/ja/LC_MESSAGES/quickstart.po b/docs/locale/ja/LC_MESSAGES/quickstart.po deleted file mode 100644 index e6b93758bb..0000000000 --- a/docs/locale/ja/LC_MESSAGES/quickstart.po +++ /dev/null @@ -1,91 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: discordpy\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-22 09:35-0400\n" -"PO-Revision-Date: 2020-10-24 02:41\n" -"Last-Translator: \n" -"Language-Team: Japanese\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Crowdin-Project: discordpy\n" -"X-Crowdin-Project-ID: 362783\n" -"X-Crowdin-Language: ja\n" -"X-Crowdin-File: quickstart.pot\n" -"X-Crowdin-File-ID: 50\n" -"Language: ja_JP\n" - -#: ../../quickstart.rst:6 -msgid "Quickstart" -msgstr "クイックスタート" - -#: ../../quickstart.rst:8 -msgid "This page gives a brief introduction to the library. It assumes you have the library installed, if you don't check the :ref:`installing` portion." -msgstr "ここでは、ライブラリの概要を説明します。ライブラリがインストールされていることを前提としているので、インストールを終えていない人は :ref:`installing` を参照してください。" - -#: ../../quickstart.rst:12 -msgid "A Minimal Bot" -msgstr "最小限のBot" - -#: ../../quickstart.rst:14 -msgid "Let's make a bot that replies to a specific message and walk you through it." -msgstr "では早速、特定のメッセージに対して、返事をするBotを作ってみましょう。" - -#: ../../quickstart.rst:16 -msgid "It looks something like this:" -msgstr "結論から書くと、このように書くことができます。" - -#: ../../quickstart.rst:38 -msgid "Let's name this file ``example_bot.py``. Make sure not to name it ``discord.py`` as that'll conflict with the library." -msgstr "ファイルの名前を ``example_bot.py`` としましょう。ライブラリと競合してしまうので、 ``discord.py`` というファイル名にはしないでください。" - -#: ../../quickstart.rst:41 -msgid "There's a lot going on here, so let's walk you through it step by step." -msgstr "さて、では順を追って一つづつ説明していきます。" - -#: ../../quickstart.rst:43 -msgid "The first line just imports the library, if this raises a `ModuleNotFoundError` or `ImportError` then head on over to :ref:`installing` section to properly install." -msgstr "最初の行は、ただライブラリをインポートしただけです。 `ModuleNotFoundError` や `ImportError` が発生した場合は :ref:`installing` を見て、ライブラリをきちんとインストールしましょう。" - -#: ../../quickstart.rst:45 -msgid "Next, we create an instance of a :class:`Client`. This client is our connection to Discord." -msgstr "次に、 :class:`Client` のインスタンスを作成します。クライアントはDiscordへの接続を行います。" - -#: ../../quickstart.rst:46 -msgid "We then use the :meth:`Client.event` decorator to register an event. This library has many events. Since this library is asynchronous, we do things in a \"callback\" style manner." -msgstr "続いて、 :meth:`Client.event` デコレータを使用してイベントを登録します。ライブラリにはたくさんのイベントが用意されています。このライブラリは非同期のため、「コールバック」のスタイルで処理を行います。" - -#: ../../quickstart.rst:49 -msgid "A callback is essentially a function that is called when something happens. In our case, the :func:`on_ready` event is called when the bot has finished logging in and setting things up and the :func:`on_message` event is called when the bot has received a message." -msgstr "コールバックは基本的に、何かが発生した場合に呼び出される関数です。今回の場合だと、Botがログインして、設定などを終えたときに :func:`on_ready` が、メッセージを受信したときに :func:`on_message` が呼び出されます。" - -#: ../../quickstart.rst:52 -msgid "Since the :func:`on_message` event triggers for *every* message received, we have to make sure that we ignore messages from ourselves. We do this by checking if the :attr:`Message.author` is the same as the :attr:`Client.user`." -msgstr ":func:`on_message` イベントは受信したメッセージすべてに対して呼び出されるため、Bot自身からのメッセージは無視するように設定する必要があります。これは、メッセージの送信者である :attr:`Message.author` と、Bot自身を表す :attr:`Client.user` が等しいか比較することで実装できます。" - -#: ../../quickstart.rst:55 -msgid "Afterwards, we check if the :class:`Message.content` starts with ``'$hello'``. If it is, then we reply in the channel it was used in with ``'Hello!'``." -msgstr "その後、 :class:`Message.content` が ``'$hello'`` から始まるかどうかを確認し、当てはまればそのチャンネルに ``'Hello!'`` という返事を送信します。" - -#: ../../quickstart.rst:57 -msgid "Finally, we run the bot with our login token. If you need help getting your token or creating a bot, look in the :ref:`discord-intro` section." -msgstr "最後に、ログイン用トークンを用いてBotを起動します。トークンの取得やBotの作成について分からないことがあれば、 :ref:`discord-intro` を参照してください。" - -#: ../../quickstart.rst:61 -msgid "Now that we've made a bot, we have to *run* the bot. Luckily, this is simple since this is just a Python script, we can run it directly." -msgstr "さて、これでBotは完成なので、Botを *実行* してみましょう。幸いにも、これはただのPythonスクリプトなので実行は簡単です。直接実行が可能です。" - -#: ../../quickstart.rst:64 -msgid "On Windows:" -msgstr "Windowsの場合:" - -#: ../../quickstart.rst:70 -msgid "On other systems:" -msgstr "その他のシステムの場合:" - -#: ../../quickstart.rst:76 -msgid "Now you can try playing around with your basic bot." -msgstr "これで、あなたが作ったBotと遊ぶことができます。" - diff --git a/docs/locale/ja/LC_MESSAGES/sphinx.po b/docs/locale/ja/LC_MESSAGES/sphinx.po deleted file mode 100644 index cdf43dd4be..0000000000 --- a/docs/locale/ja/LC_MESSAGES/sphinx.po +++ /dev/null @@ -1,23 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: discordpy\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-22 09:35-0400\n" -"PO-Revision-Date: 2020-10-24 02:41\n" -"Last-Translator: \n" -"Language-Team: Japanese\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Crowdin-Project: discordpy\n" -"X-Crowdin-Project-ID: 362783\n" -"X-Crowdin-Language: ja\n" -"X-Crowdin-File: sphinx.pot\n" -"X-Crowdin-File-ID: 70\n" -"Language: ja_JP\n" - -#: ../../_templates/layout.html:24 -msgid "Created using Sphinx %(sphinx_version)s." -msgstr "Sphinx %(sphinx_version)s で作成されました。" - diff --git a/docs/locale/ja/LC_MESSAGES/version_guarantees.po b/docs/locale/ja/LC_MESSAGES/version_guarantees.po deleted file mode 100644 index d66cd38be5..0000000000 --- a/docs/locale/ja/LC_MESSAGES/version_guarantees.po +++ /dev/null @@ -1,79 +0,0 @@ -msgid "" -msgstr "" -"Project-Id-Version: discordpy\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2019-06-22 09:35-0400\n" -"PO-Revision-Date: 2020-10-24 02:41\n" -"Last-Translator: \n" -"Language-Team: Japanese\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=UTF-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Plural-Forms: nplurals=1; plural=0;\n" -"X-Crowdin-Project: discordpy\n" -"X-Crowdin-Project-ID: 362783\n" -"X-Crowdin-Language: ja\n" -"X-Crowdin-File: version_guarantees.pot\n" -"X-Crowdin-File-ID: 46\n" -"Language: ja_JP\n" - -#: ../../version_guarantees.rst:4 -msgid "Version Guarantees" -msgstr "バージョン保証" - -#: ../../version_guarantees.rst:6 -msgid "The library follows a `semantic versioning principle `_ which means that the major version is updated every time there is an incompatible API change. However due to the lack of guarantees on the Discord side when it comes to breaking changes along with the fairly dynamic nature of Python it can be hard to discern what can be considered a breaking change and what isn't." -msgstr "このライブラリは `セマンティック バージョニングの原則 `_ に従います。それが意味するのは、互換性のないAPIの変更が行われるたびにメジャーバージョンが更新されるということです。しかしながら、Discord側にはPythonの非常に動的な性質とともに破壊的変更を行う際の保証がないため、破壊的変更とみなされるもの、そうでないものを区別するのは困難です。" - -#: ../../version_guarantees.rst:8 -msgid "The first thing to keep in mind is that breaking changes only apply to **publicly documented functions and classes**. If it's not listed in the documentation here then it is not part of the public API and is thus bound to change. This includes attributes that start with an underscore or functions without an underscore that are not documented." -msgstr "最初に覚えておくべきことは、破壊的変更は **公開ドキュメント化してある関数とクラス** のみに適用されるということです。ドキュメントにないものはパブリックAPIの一部ではないため、変更される可能性があります。これにはドキュメントに載っていないアンダースコアから始まる関数や、通常の関数が含まれます。" - -#: ../../version_guarantees.rst:12 -msgid "The examples below are non-exhaustive." -msgstr "以下の例は網羅的なものではありません。" - -#: ../../version_guarantees.rst:15 -msgid "Examples of Breaking Changes" -msgstr "破壊的変更の例" - -#: ../../version_guarantees.rst:17 -msgid "Changing the default parameter value to something else." -msgstr "デフォルトのパラメータ値を別のものに変更。" - -#: ../../version_guarantees.rst:18 -msgid "Renaming a function without an alias to an old function." -msgstr "古い関数へのエイリアスのない関数の名称を変更。" - -#: ../../version_guarantees.rst:19 -msgid "Adding or removing parameters to an event." -msgstr "イベントへのパラメータの追加、あるいは削除。" - -#: ../../version_guarantees.rst:22 -msgid "Examples of Non-Breaking Changes" -msgstr "破壊的変更ではないものの例" - -#: ../../version_guarantees.rst:24 -msgid "Adding or removing private underscored attributes." -msgstr "アンダースコア付きのプライベート関数の追加、あるいは削除。" - -#: ../../version_guarantees.rst:25 -msgid "Adding an element into the ``__slots__`` of a data class." -msgstr "データクラスの ``__slots__`` への要素の追加。" - -#: ../../version_guarantees.rst:26 -msgid "Changing the behaviour of a function to fix a bug." -msgstr "バグ修正のための関数の動作の変更。" - -#: ../../version_guarantees.rst:27 -msgid "Changes in the documentation." -msgstr "ドキュメントの変更。" - -#: ../../version_guarantees.rst:28 -msgid "Modifying the internal HTTP handling." -msgstr "内部HTTP処理の変更。" - -#: ../../version_guarantees.rst:29 -msgid "Upgrading the dependencies to a new version, major or otherwise." -msgstr "依存関係をメジャー、またはそれ以外の新しいバージョンへアップグレード。" - diff --git a/docs/locale/ja/LC_MESSAGES/whats_new.po b/docs/locale/ja/LC_MESSAGES/whats_new.po deleted file mode 100644 index ebcc0cd475..0000000000 --- a/docs/locale/ja/LC_MESSAGES/whats_new.po +++ /dev/null @@ -1,2937 +0,0 @@ - -msgid "" -msgstr "" -"Project-Id-Version: discordpy\n" -"Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2020-10-23 22:41-0400\n" -"PO-Revision-Date: 2020-10-24 02:41+0000\n" -"Last-Translator: \n" -"Language: ja_JP\n" -"Language-Team: Japanese\n" -"Plural-Forms: nplurals=1; plural=0\n" -"MIME-Version: 1.0\n" -"Content-Type: text/plain; charset=utf-8\n" -"Content-Transfer-Encoding: 8bit\n" -"Generated-By: Babel 2.5.3\n" - -#: ../../whats_new.rst:9 -msgid "Changelog" -msgstr "変更履歴" - -#: ../../whats_new.rst:11 -msgid "" -"This page keeps a detailed human friendly rendering of what's new and " -"changed in specific versions." -msgstr "このページでは、特定のバージョンの新機能や変更された機能を人にやさしい形で詳細に記載しています。" - -#: ../../whats_new.rst:17 -#, fuzzy -msgid "v1.5.1" -msgstr "v1.2.1" - -#: ../../whats_new.rst:20 ../../whats_new.rst:73 ../../whats_new.rst:107 -#: ../../whats_new.rst:133 ../../whats_new.rst:204 ../../whats_new.rst:255 -#: ../../whats_new.rst:265 ../../whats_new.rst:280 ../../whats_new.rst:298 -#: ../../whats_new.rst:383 ../../whats_new.rst:434 ../../whats_new.rst:444 -#: ../../whats_new.rst:459 ../../whats_new.rst:473 ../../whats_new.rst:483 -#: ../../whats_new.rst:519 ../../whats_new.rst:549 ../../whats_new.rst:591 -#: ../../whats_new.rst:631 ../../whats_new.rst:652 ../../whats_new.rst:668 -#: ../../whats_new.rst:688 ../../whats_new.rst:736 ../../whats_new.rst:753 -#: ../../whats_new.rst:790 ../../whats_new.rst:826 ../../whats_new.rst:878 -#: ../../whats_new.rst:922 ../../whats_new.rst:988 -msgid "Bug Fixes" -msgstr "バグ修正" - -#: ../../whats_new.rst:22 -msgid "" -"Fix :func:`utils.escape_markdown` not escaping quotes properly " -"(:issue:`5897`)" -msgstr "" - -#: ../../whats_new.rst:23 -msgid "Fix :class:`Message` not being hashable (:issue:`5901`, :issue:`5866`)" -msgstr "" - -#: ../../whats_new.rst:24 -msgid "Fix moving channels to the end of the channel list (:issue:`5923`)" -msgstr "" - -#: ../../whats_new.rst:25 -msgid "" -"Fix seemingly strange behaviour in ``__eq__`` for " -":class:`PermissionOverwrite` (:issue:`5929`)" -msgstr "" - -#: ../../whats_new.rst:26 -msgid "" -"Fix aliases showing up in ``__iter__`` for :class:`Intents` " -"(:issue:`5945`)" -msgstr "" - -#: ../../whats_new.rst:27 -msgid "" -"Fix the bot disconnecting from voice when moving them to another channel " -"(:issue:`5904`)" -msgstr "" - -#: ../../whats_new.rst:28 -msgid "" -"Fix attribute errors when chunking times out sometimes during delayed " -"on_ready dispatching." -msgstr "" - -#: ../../whats_new.rst:29 -msgid "" -"Ensure that the bot's own member is not evicted from the cache " -"(:issue:`5949`)" -msgstr "" - -#: ../../whats_new.rst:32 ../../whats_new.rst:88 ../../whats_new.rst:122 -#: ../../whats_new.rst:232 ../../whats_new.rst:304 ../../whats_new.rst:407 -#: ../../whats_new.rst:527 ../../whats_new.rst:554 ../../whats_new.rst:612 -msgid "Miscellaneous" -msgstr "" - -#: ../../whats_new.rst:34 -msgid "" -"Members are now loaded during ``GUILD_MEMBER_UPDATE`` events if " -":attr:`MemberCacheFlags.joined` is set. (:issue:`5930`)" -msgstr "" - -#: ../../whats_new.rst:35 -msgid "" -"|commands| :class:`MemberConverter ` now " -"properly lazily fetches members if not available from cache." -msgstr "" - -#: ../../whats_new.rst:36 -msgid "This is the same as having ``discord.Member`` as the type-hint." -msgstr "" - -#: ../../whats_new.rst:37 -msgid "" -":meth:`Guild.chunk` now allows concurrent calls without spamming the " -"gateway with requests." -msgstr "" - -#: ../../whats_new.rst:42 -#, fuzzy -msgid "v1.5.0" -msgstr "v1.2.0" - -#: ../../whats_new.rst:44 -msgid "" -"This version came with forced breaking changes that Discord is requiring " -"all bots to go through on October 7th. It is highly recommended to read " -"the documentation on intents, :ref:`intents_primer`." -msgstr "" - -#: ../../whats_new.rst:47 -#, fuzzy -msgid "API Changes" -msgstr "破壊的変更" - -#: ../../whats_new.rst:49 -msgid "" -"Members and presences will no longer be retrieved due to an API change. " -"See :ref:`privileged_intents` for more info." -msgstr "" - -#: ../../whats_new.rst:50 -msgid "" -"As a consequence, fetching offline members is disabled if the members " -"intent is not enabled." -msgstr "" - -#: ../../whats_new.rst:53 ../../whats_new.rst:147 ../../whats_new.rst:317 -#: ../../whats_new.rst:496 ../../whats_new.rst:564 ../../whats_new.rst:682 -#: ../../whats_new.rst:714 ../../whats_new.rst:747 ../../whats_new.rst:776 -#: ../../whats_new.rst:803 ../../whats_new.rst:839 ../../whats_new.rst:899 -#: ../../whats_new.rst:945 -msgid "New Features" -msgstr "新機能" - -#: ../../whats_new.rst:55 -msgid "" -"Support for gateway intents, passed via ``intents`` in :class:`Client` " -"using :class:`Intents`." -msgstr "" - -#: ../../whats_new.rst:56 -msgid "Add :attr:`VoiceRegion.south_korea` (:issue:`5233`)" -msgstr "" - -#: ../../whats_new.rst:57 -msgid "Add support for ``__eq__`` for :class:`Message` (:issue:`5789`)" -msgstr "" - -#: ../../whats_new.rst:58 -msgid "Add :meth:`Colour.dark_theme` factory method (:issue:`1584`)" -msgstr "" - -#: ../../whats_new.rst:59 -msgid "" -"Add :meth:`AllowedMentions.none` and :meth:`AllowedMentions.all` " -"(:issue:`5785`)" -msgstr "" - -#: ../../whats_new.rst:60 -msgid "" -"Add more concrete exceptions for 500 class errors under " -":class:`DiscordServerError` (:issue:`5797`)" -msgstr "" - -#: ../../whats_new.rst:61 -msgid "Implement :class:`VoiceProtocol` to better intersect the voice flow." -msgstr "" - -#: ../../whats_new.rst:62 -msgid "Add :meth:`Guild.chunk` to fully chunk a guild." -msgstr "" - -#: ../../whats_new.rst:63 -msgid "" -"Add :class:`MemberCacheFlags` to better control member cache. See " -":ref:`intents_member_cache` for more info." -msgstr "" - -#: ../../whats_new.rst:65 -msgid "Add support for :attr:`ActivityType.competing` (:issue:`5823`)" -msgstr "" - -#: ../../whats_new.rst:65 -msgid "This seems currently unused API wise." -msgstr "" - -#: ../../whats_new.rst:67 -msgid "" -"Add support for message references, :attr:`Message.reference` " -"(:issue:`5754`, :issue:`5832`)" -msgstr "" - -#: ../../whats_new.rst:68 -msgid "" -"Add alias for :class:`ColourConverter` under ``ColorConverter`` " -"(:issue:`5773`)" -msgstr "" - -#: ../../whats_new.rst:69 -msgid "" -"Add alias for :attr:`PublicUserFlags.verified_bot_developer` under " -":attr:`PublicUserFlags.early_verified_bot_developer` (:issue:`5849`)" -msgstr "" - -#: ../../whats_new.rst:70 -msgid "" -"|commands| Add support for ``require_var_positional`` for " -":class:`Command` (:issue:`5793`)" -msgstr "" - -#: ../../whats_new.rst:75 ../../whats_new.rst:109 -msgid "Fix issue with :meth:`Guild.by_category` not showing certain channels." -msgstr "" - -#: ../../whats_new.rst:76 ../../whats_new.rst:110 -msgid "" -"Fix :attr:`abc.GuildChannel.permissions_synced` always being ``False`` " -"(:issue:`5772`)" -msgstr "" - -#: ../../whats_new.rst:77 ../../whats_new.rst:111 -msgid "" -"Fix handling of cloudflare bans on webhook related requests " -"(:issue:`5221`)" -msgstr "" - -#: ../../whats_new.rst:78 ../../whats_new.rst:112 -msgid "" -"Fix cases where a keep-alive thread would ack despite already dying " -"(:issue:`5800`)" -msgstr "" - -#: ../../whats_new.rst:79 ../../whats_new.rst:113 -msgid "" -"Fix cases where a :class:`Member` reference would be stale when cache is " -"disabled in message events (:issue:`5819`)" -msgstr "" - -#: ../../whats_new.rst:80 ../../whats_new.rst:114 -msgid "" -"Fix ``allowed_mentions`` not being sent when sending a single file " -"(:issue:`5835`)" -msgstr "" - -#: ../../whats_new.rst:81 ../../whats_new.rst:115 -msgid "" -"Fix ``overwrites`` being ignored in :meth:`abc.GuildChannel.edit` if " -"``{}`` is passed (:issue:`5756`, :issue:`5757`)" -msgstr "" - -#: ../../whats_new.rst:82 ../../whats_new.rst:116 -msgid "" -"|commands| Fix exceptions being raised improperly in command invoke hooks" -" (:issue:`5799`)" -msgstr "" - -#: ../../whats_new.rst:83 ../../whats_new.rst:117 -msgid "" -"|commands| Fix commands not being properly ejected during errors in a cog" -" injection (:issue:`5804`)" -msgstr "" - -#: ../../whats_new.rst:84 ../../whats_new.rst:118 -msgid "|commands| Fix cooldown timing ignoring edited timestamps." -msgstr "" - -#: ../../whats_new.rst:85 ../../whats_new.rst:119 -msgid "" -"|tasks| Fix tasks extending the next iteration on handled exceptions " -"(:issue:`5762`, :issue:`5763`)" -msgstr "" - -#: ../../whats_new.rst:90 -msgid "Webhook requests are now logged (:issue:`5798`)" -msgstr "" - -#: ../../whats_new.rst:91 ../../whats_new.rst:124 -msgid "" -"Remove caching layer from :attr:`AutoShardedClient.shards`. This was " -"causing issues if queried before launching shards." -msgstr "" - -#: ../../whats_new.rst:92 -msgid "Gateway rate limits are now handled." -msgstr "" - -#: ../../whats_new.rst:93 -msgid "Warnings logged due to missed caches are now changed to DEBUG log level." -msgstr "" - -#: ../../whats_new.rst:94 -msgid "Some strings are now explicitly interned to reduce memory usage." -msgstr "" - -#: ../../whats_new.rst:95 -msgid "" -"Usage of namedtuples has been reduced to avoid potential breaking changes" -" in the future (:issue:`5834`)" -msgstr "" - -#: ../../whats_new.rst:96 -msgid "" -"|commands| All :class:`BadArgument` exceptions from the built-in " -"converters now raise concrete exceptions to better tell them apart " -"(:issue:`5748`)" -msgstr "" - -#: ../../whats_new.rst:97 ../../whats_new.rst:125 -msgid "" -"|tasks| Lazily fetch the event loop to prevent surprises when changing " -"event loop policy (:issue:`5808`)" -msgstr "" - -#: ../../whats_new.rst:102 -#, fuzzy -msgid "v1.4.2" -msgstr "v1.2.2" - -#: ../../whats_new.rst:104 -msgid "This is a maintenance release with backports from :ref:`vp1p5p0`." -msgstr "" - -#: ../../whats_new.rst:130 -#, fuzzy -msgid "v1.4.1" -msgstr "v1.2.1" - -#: ../../whats_new.rst:135 -msgid "" -"Properly terminate the connection when :meth:`Client.close` is called " -"(:issue:`5207`)" -msgstr "" - -#: ../../whats_new.rst:136 -msgid "" -"Fix error being raised when clearing embed author or image when it was " -"already cleared (:issue:`5210`, :issue:`5212`)" -msgstr "" - -#: ../../whats_new.rst:137 -msgid "Fix ``__path__`` to allow editable extensions (:issue:`5213`)" -msgstr "" - -#: ../../whats_new.rst:142 -#, fuzzy -msgid "v1.4.0" -msgstr "v1.2.0" - -#: ../../whats_new.rst:144 -msgid "" -"Another version with a long development time. Features like Intents are " -"slated to be released in a v1.5 release. Thank you for your patience!" -msgstr "" - -#: ../../whats_new.rst:151 -msgid "" -"Add support for :class:`AllowedMentions` to have more control over what " -"gets mentioned." -msgstr "" - -#: ../../whats_new.rst:150 -msgid "This can be set globally through :attr:`Client.allowed_mentions`" -msgstr "" - -#: ../../whats_new.rst:151 -msgid "" -"This can also be set on a per message basis via " -":meth:`abc.Messageable.send`" -msgstr "" - -#: ../../whats_new.rst:159 -msgid "" -":class:`AutoShardedClient` has been completely redesigned from the ground" -" up to better suit multi-process clusters (:issue:`2654`)" -msgstr "" - -#: ../../whats_new.rst:154 -msgid "" -"Add :class:`ShardInfo` which allows fetching specific information about a" -" shard." -msgstr "" - -#: ../../whats_new.rst:155 -msgid "" -"The :class:`ShardInfo` allows for reconnecting and disconnecting of a " -"specific shard as well." -msgstr "" - -#: ../../whats_new.rst:156 -msgid "" -"Add :meth:`AutoShardedClient.get_shard` and " -":attr:`AutoShardedClient.shards` to get information about shards." -msgstr "" - -#: ../../whats_new.rst:157 -msgid "" -"Rework the entire connection flow to better facilitate the ``IDENTIFY`` " -"rate limits." -msgstr "" - -#: ../../whats_new.rst:158 -msgid "" -"Add a hook :meth:`Client.before_identify_hook` to have better control " -"over what happens before an ``IDENTIFY`` is done." -msgstr "" - -#: ../../whats_new.rst:159 -msgid "" -"Add more shard related events such as :func:`on_shard_connect`, " -":func:`on_shard_disconnect` and :func:`on_shard_resumed`." -msgstr "" - -#: ../../whats_new.rst:165 -msgid "Add support for guild templates (:issue:`2652`)" -msgstr "" - -#: ../../whats_new.rst:162 -msgid "This adds :class:`Template` to read a template's information." -msgstr "" - -#: ../../whats_new.rst:163 -msgid "" -":meth:`Client.fetch_template` can be used to fetch a template's " -"information from the API." -msgstr "" - -#: ../../whats_new.rst:164 -msgid "" -":meth:`Client.create_guild` can now take an optional template to base the" -" creation from." -msgstr "" - -#: ../../whats_new.rst:165 -msgid "" -"Note that fetching a guild's template is currently restricted for bot " -"accounts." -msgstr "" - -#: ../../whats_new.rst:175 -msgid "Add support for guild integrations (:issue:`2051`, :issue:`1083`)" -msgstr "" - -#: ../../whats_new.rst:168 -msgid ":class:`Integration` is used to read integration information." -msgstr "" - -#: ../../whats_new.rst:169 -msgid "" -":class:`IntegrationAccount` is used to read integration account " -"information." -msgstr "" - -#: ../../whats_new.rst:170 -msgid ":meth:`Guild.integrations` will fetch all integrations in a guild." -msgstr "" - -#: ../../whats_new.rst:171 -msgid ":meth:`Guild.create_integration` will create an integration." -msgstr "" - -#: ../../whats_new.rst:172 -msgid ":meth:`Integration.edit` will edit an existing integration." -msgstr "" - -#: ../../whats_new.rst:173 -msgid ":meth:`Integration.delete` will delete an integration." -msgstr "" - -#: ../../whats_new.rst:174 -msgid ":meth:`Integration.sync` will sync an integration." -msgstr "" - -#: ../../whats_new.rst:175 -msgid "There is currently no support in the audit log for this." -msgstr "" - -#: ../../whats_new.rst:177 -msgid "" -"Add an alias for :attr:`VerificationLevel.extreme` under " -":attr:`VerificationLevel.very_high` (:issue:`2650`)" -msgstr "" - -#: ../../whats_new.rst:178 -msgid "Add various grey to gray aliases for :class:`Colour` (:issue:`5130`)" -msgstr "" - -#: ../../whats_new.rst:179 -msgid "" -"Added :attr:`VoiceClient.latency` and :attr:`VoiceClient.average_latency`" -" (:issue:`2535`)" -msgstr "" - -#: ../../whats_new.rst:180 -msgid "" -"Add ``use_cached`` and ``spoiler`` parameters to " -":meth:`Attachment.to_file` (:issue:`2577`, :issue:`4095`)" -msgstr "" - -#: ../../whats_new.rst:181 -msgid "" -"Add ``position`` parameter support to :meth:`Guild.create_category` " -"(:issue:`2623`)" -msgstr "" - -#: ../../whats_new.rst:182 -msgid "Allow passing ``int`` for the colour in :meth:`Role.edit` (:issue:`4057`)" -msgstr "" - -#: ../../whats_new.rst:183 -msgid "" -"Add :meth:`Embed.remove_author` to clear author information from an embed" -" (:issue:`4068`)" -msgstr "" - -#: ../../whats_new.rst:184 -msgid "" -"Add the ability to clear images and thumbnails in embeds using " -":attr:`Embed.Empty` (:issue:`4053`)" -msgstr "" - -#: ../../whats_new.rst:185 -msgid "Add :attr:`Guild.max_video_channel_users` (:issue:`4120`)" -msgstr "" - -#: ../../whats_new.rst:186 -msgid "Add :attr:`Guild.public_updates_channel` (:issue:`4120`)" -msgstr "" - -#: ../../whats_new.rst:187 -msgid "" -"Add ``guild_ready_timeout`` parameter to :class:`Client` and subclasses " -"to control timeouts when the ``GUILD_CREATE`` stream takes too long " -"(:issue:`4112`)" -msgstr "" - -#: ../../whats_new.rst:188 -msgid "" -"Add support for public user flags via :attr:`User.public_flags` and " -":class:`PublicUserFlags` (:issue:`3999`)" -msgstr "" - -#: ../../whats_new.rst:189 -msgid "" -"Allow changing of channel types via :meth:`TextChannel.edit` to and from " -"a news channel (:issue:`4121`)" -msgstr "" - -#: ../../whats_new.rst:190 -msgid "" -"Add :meth:`Guild.edit_role_positions` to bulk edit role positions in a " -"single API call (:issue:`2501`, :issue:`2143`)" -msgstr "" - -#: ../../whats_new.rst:191 -msgid "" -"Add :meth:`Guild.change_voice_state` to change your voice state in a " -"guild (:issue:`5088`)" -msgstr "" - -#: ../../whats_new.rst:192 -msgid "" -"Add :meth:`PartialInviteGuild.is_icon_animated` for checking if the " -"invite guild has animated icon (:issue:`4180`, :issue:`4181`)" -msgstr "" - -#: ../../whats_new.rst:193 -msgid "" -"Add :meth:`PartialInviteGuild.icon_url_as` now supports ``static_format``" -" for consistency (:issue:`4180`, :issue:`4181`)" -msgstr "" - -#: ../../whats_new.rst:194 -msgid "Add support for ``user_ids`` in :meth:`Guild.query_members`" -msgstr "" - -#: ../../whats_new.rst:195 -msgid "" -"Add support for pruning members by roles in :meth:`Guild.prune_members` " -"(:issue:`4043`)" -msgstr "" - -#: ../../whats_new.rst:196 -msgid "" -"|commands| Implement :func:`~ext.commands.before_invoke` and " -":func:`~ext.commands.after_invoke` decorators (:issue:`1986`, " -":issue:`2502`)" -msgstr "" - -#: ../../whats_new.rst:197 -msgid "" -"|commands| Add a way to retrieve ``retry_after`` from a cooldown in a " -"command via :meth:`Command.get_cooldown_retry_after " -"<.ext.commands.Command.get_cooldown_retry_after>` (:issue:`5195`)" -msgstr "" - -#: ../../whats_new.rst:198 -msgid "" -"|commands| Add a way to dynamically add and remove checks from a " -":class:`HelpCommand <.ext.commands.HelpCommand>` (:issue:`5197`)" -msgstr "" - -#: ../../whats_new.rst:199 -msgid "" -"|tasks| Add :meth:`Loop.is_running <.ext.tasks.Loop.is_running>` method " -"to the task objects (:issue:`2540`)" -msgstr "" - -#: ../../whats_new.rst:200 -msgid "" -"|tasks| Allow usage of custom error handlers similar to the command " -"extensions to tasks using :meth:`Loop.error <.ext.tasks.Loop.error>` " -"decorator (:issue:`2621`)" -msgstr "" - -#: ../../whats_new.rst:206 -msgid "" -"Fix issue with :attr:`PartialEmoji.url` reads leading to a failure " -"(:issue:`4015`, :issue:`4016`)" -msgstr "" - -#: ../../whats_new.rst:207 -msgid "" -"Allow :meth:`abc.Messageable.history` to take a limit of ``1`` even if " -"``around`` is passed (:issue:`4019`)" -msgstr "" - -#: ../../whats_new.rst:208 -msgid "" -"Fix :attr:`Guild.member_count` not updating in certain cases when a " -"member has left the guild (:issue:`4021`)" -msgstr "" - -#: ../../whats_new.rst:209 -msgid "" -"Fix the type of :attr:`Object.id` not being validated. For backwards " -"compatibility ``str`` is still allowed but is converted to ``int`` " -"(:issue:`4002`)" -msgstr "" - -#: ../../whats_new.rst:210 -msgid "" -"Fix :meth:`Guild.edit` not allowing editing of notification settings " -"(:issue:`4074`, :issue:`4047`)" -msgstr "" - -#: ../../whats_new.rst:211 -msgid "" -"Fix crash when the guild widget contains channels that aren't in the " -"payload (:issue:`4114`, :issue:`4115`)" -msgstr "" - -#: ../../whats_new.rst:212 -msgid "" -"Close ffmpeg stdin handling from spawned processes with " -":class:`FFmpegOpusAudio` and :class:`FFmpegPCMAudio` (:issue:`4036`)" -msgstr "" - -#: ../../whats_new.rst:213 -msgid "" -"Fix :func:`utils.escape_markdown` not escaping masked links " -"(:issue:`4206`, :issue:`4207`)" -msgstr "" - -#: ../../whats_new.rst:214 -msgid "" -"Fix reconnect loop due to failed handshake on region change " -"(:issue:`4210`, :issue:`3996`)" -msgstr "" - -#: ../../whats_new.rst:215 -msgid "" -"Fix :meth:`Guild.by_category` not returning empty categories " -"(:issue:`4186`)" -msgstr "" - -#: ../../whats_new.rst:216 -msgid "Fix certain JPEG images not being identified as JPEG (:issue:`5143`)" -msgstr "" - -#: ../../whats_new.rst:217 -msgid "" -"Fix a crash when an incomplete guild object is used when fetching " -"reaction information (:issue:`5181`)" -msgstr "" - -#: ../../whats_new.rst:218 -msgid "" -"Fix a timeout issue when fetching members using " -":meth:`Guild.query_members`" -msgstr "" - -#: ../../whats_new.rst:219 -msgid "" -"Fix an issue with domain resolution in voice (:issue:`5188`, " -":issue:`5191`)" -msgstr "" - -#: ../../whats_new.rst:220 -msgid "" -"Fix an issue where :attr:`PartialEmoji.id` could be a string " -"(:issue:`4153`, :issue:`4152`)" -msgstr "" - -#: ../../whats_new.rst:221 -msgid "Fix regression where :attr:`Member.activities` would not clear." -msgstr "" - -#: ../../whats_new.rst:222 -msgid "" -"|commands| A :exc:`TypeError` is now raised when :obj:`typing.Optional` " -"is used within :data:`commands.Greedy <.ext.commands.Greedy>` " -"(:issue:`2253`, :issue:`5068`)" -msgstr "" - -#: ../../whats_new.rst:223 -msgid "" -"|commands| :meth:`Bot.walk_commands <.ext.commands.Bot.walk_commands>` no" -" longer yields duplicate commands due to aliases (:issue:`2591`)" -msgstr "" - -#: ../../whats_new.rst:224 -msgid "" -"|commands| Fix regex characters not being escaped in " -":attr:`HelpCommand.clean_prefix <.ext.commands.HelpCommand.clean_prefix>`" -" (:issue:`4058`, :issue:`4071`)" -msgstr "" - -#: ../../whats_new.rst:225 -msgid "" -"|commands| Fix :meth:`Bot.get_command <.ext.commands.Bot.get_command>` " -"from raising errors when a name only has whitespace (:issue:`5124`)" -msgstr "" - -#: ../../whats_new.rst:226 -msgid "" -"|commands| Fix issue with :attr:`Context.subcommand_passed " -"<.ext.commands.Context.subcommand_passed>` not functioning as expected " -"(:issue:`5198`)" -msgstr "" - -#: ../../whats_new.rst:227 -msgid "" -"|tasks| Task objects are no longer stored globally so two class instances" -" can now start two separate tasks (:issue:`2294`)" -msgstr "" - -#: ../../whats_new.rst:228 -msgid "" -"|tasks| Allow cancelling the loop within :meth:`before_loop " -"<.ext.tasks.Loop.before_loop>` (:issue:`4082`)" -msgstr "" - -#: ../../whats_new.rst:234 -msgid "" -"The :attr:`Member.roles` cache introduced in v1.3 was reverted due to " -"issues caused (:issue:`4087`, :issue:`4157`)" -msgstr "" - -#: ../../whats_new.rst:235 -msgid ":class:`Webhook` objects are now comparable and hashable (:issue:`4182`)" -msgstr "" - -#: ../../whats_new.rst:239 -msgid "" -"Some more API requests got a ``reason`` parameter for audit logs " -"(:issue:`5086`)" -msgstr "" - -#: ../../whats_new.rst:237 -msgid ":meth:`TextChannel.follow`" -msgstr "" - -#: ../../whats_new.rst:238 -msgid ":meth:`Message.pin` and :meth:`Message.unpin`" -msgstr "" - -#: ../../whats_new.rst:239 -msgid ":meth:`Webhook.delete` and :meth:`Webhook.edit`" -msgstr "" - -#: ../../whats_new.rst:241 -msgid "" -"For performance reasons ``websockets`` has been dropped in favour of " -"``aiohttp.ws``." -msgstr "" - -#: ../../whats_new.rst:242 -msgid "" -"The blocking logging message now shows the stack trace of where the main " -"thread was blocking" -msgstr "" - -#: ../../whats_new.rst:243 -msgid "" -"The domain name was changed from ``discordapp.com`` to ``discord.com`` to" -" prepare for the required domain migration" -msgstr "" - -#: ../../whats_new.rst:244 -msgid "" -"Reduce memory usage when reconnecting due to stale references being held " -"by the message cache (:issue:`5133`)" -msgstr "" - -#: ../../whats_new.rst:245 -#, python-format -msgid "" -"Optimize :meth:`abc.GuildChannel.permissions_for` by not creating as many" -" temporary objects (20-32% savings)." -msgstr "" - -#: ../../whats_new.rst:246 -msgid "" -"|commands| Raise :exc:`~ext.commands.CommandRegistrationError` instead of" -" :exc:`ClientException` when a duplicate error is registered " -"(:issue:`4217`)" -msgstr "" - -#: ../../whats_new.rst:247 -msgid "" -"|tasks| No longer handle :exc:`HTTPException` by default in the task " -"reconnect loop (:issue:`5193`)" -msgstr "" - -#: ../../whats_new.rst:252 -#, fuzzy -msgid "v1.3.4" -msgstr "v1.2.2" - -#: ../../whats_new.rst:257 -msgid "" -"Fix an issue with channel overwrites causing multiple issues including " -"crashes (:issue:`5109`)" -msgstr "" - -#: ../../whats_new.rst:262 -#, fuzzy -msgid "v1.3.3" -msgstr "v1.2.2" - -#: ../../whats_new.rst:268 -msgid "Change default WS close to 4000 instead of 1000." -msgstr "" - -#: ../../whats_new.rst:268 -msgid "" -"The previous close code caused sessions to be invalidated at a higher " -"frequency than desired." -msgstr "" - -#: ../../whats_new.rst:270 -msgid "Fix ``None`` appearing in ``Member.activities``. (:issue:`2619`)" -msgstr "" - -#: ../../whats_new.rst:275 -#, fuzzy -msgid "v1.3.2" -msgstr "v1.2.2" - -#: ../../whats_new.rst:277 -msgid "Another minor bug fix release." -msgstr "" - -#: ../../whats_new.rst:282 -msgid "" -"Higher the wait time during the ``GUILD_CREATE`` stream before " -"``on_ready`` is fired for :class:`AutoShardedClient`." -msgstr "" - -#: ../../whats_new.rst:283 -msgid "" -":func:`on_voice_state_update` now uses the inner ``member`` payload which" -" should make it more reliable." -msgstr "" - -#: ../../whats_new.rst:284 -msgid "Fix various Cloudflare handling errors (:issue:`2572`, :issue:`2544`)" -msgstr "" - -#: ../../whats_new.rst:285 -msgid "" -"Fix crashes if :attr:`Message.guild` is :class:`Object` instead of " -":class:`Guild`." -msgstr "" - -#: ../../whats_new.rst:286 -msgid "" -"Fix :meth:`Webhook.send` returning an empty string instead of ``None`` " -"when ``wait=False``." -msgstr "" - -#: ../../whats_new.rst:287 -msgid "Fix invalid format specifier in webhook state (:issue:`2570`)" -msgstr "" - -#: ../../whats_new.rst:288 -msgid "" -"|commands| Passing invalid permissions to permission related checks now " -"raises ``TypeError``." -msgstr "" - -#: ../../whats_new.rst:293 -#, fuzzy -msgid "v1.3.1" -msgstr "v1.2.1" - -#: ../../whats_new.rst:295 -msgid "Minor bug fix release." -msgstr "" - -#: ../../whats_new.rst:300 -msgid "Fix fetching invites in guilds that the user is not in." -msgstr "" - -#: ../../whats_new.rst:301 -msgid "" -"Fix the channel returned from :meth:`Client.fetch_channel` raising when " -"sending messages. (:issue:`2531`)" -msgstr "" - -#: ../../whats_new.rst:306 -msgid "Fix compatibility warnings when using the Python 3.9 alpha." -msgstr "" - -#: ../../whats_new.rst:307 -msgid "Change the unknown event logging from WARNING to DEBUG to reduce noise." -msgstr "" - -#: ../../whats_new.rst:312 -#, fuzzy -msgid "v1.3.0" -msgstr "v1.2.0" - -#: ../../whats_new.rst:314 -msgid "" -"This version comes with a lot of bug fixes and new features. It's been in" -" development for a lot longer than was anticipated!" -msgstr "" - -#: ../../whats_new.rst:319 -msgid "" -"Add :meth:`Guild.fetch_members` to fetch members from the HTTP API. " -"(:issue:`2204`)" -msgstr "" - -#: ../../whats_new.rst:320 -msgid "" -"Add :meth:`Guild.fetch_roles` to fetch roles from the HTTP API. " -"(:issue:`2208`)" -msgstr "" - -#: ../../whats_new.rst:321 -msgid "" -"Add support for teams via :class:`Team` when fetching with " -":meth:`Client.application_info`. (:issue:`2239`)" -msgstr "" - -#: ../../whats_new.rst:322 -msgid "Add support for suppressing embeds via :meth:`Message.edit`" -msgstr "" - -#: ../../whats_new.rst:323 -msgid "" -"Add support for guild subscriptions. See the :class:`Client` " -"documentation for more details." -msgstr "" - -#: ../../whats_new.rst:324 -msgid "" -"Add :attr:`VoiceChannel.voice_states` to get voice states without relying" -" on member cache." -msgstr "" - -#: ../../whats_new.rst:325 -msgid "Add :meth:`Guild.query_members` to request members from the gateway." -msgstr "" - -#: ../../whats_new.rst:326 -msgid "Add :class:`FFmpegOpusAudio` and other voice improvements. (:issue:`2258`)" -msgstr "" - -#: ../../whats_new.rst:327 -msgid "" -"Add :attr:`RawMessageUpdateEvent.channel_id` for retrieving channel IDs " -"during raw message updates. (:issue:`2301`)" -msgstr "" - -#: ../../whats_new.rst:328 -msgid "" -"Add :attr:`RawReactionActionEvent.event_type` to disambiguate between " -"reaction addition and removal in reaction events." -msgstr "" - -#: ../../whats_new.rst:329 -msgid "" -"Add :attr:`abc.GuildChannel.permissions_synced` to query whether " -"permissions are synced with the category. (:issue:`2300`, :issue:`2324`)" -msgstr "" - -#: ../../whats_new.rst:330 -msgid "" -"Add :attr:`MessageType.channel_follow_add` message type for announcement " -"channels being followed. (:issue:`2314`)" -msgstr "" - -#: ../../whats_new.rst:331 -msgid "" -"Add :meth:`Message.is_system` to allow for quickly filtering through " -"system messages." -msgstr "" - -#: ../../whats_new.rst:332 -msgid "" -"Add :attr:`VoiceState.self_stream` to indicate whether someone is " -"streaming via Go Live. (:issue:`2343`)" -msgstr "" - -#: ../../whats_new.rst:333 -msgid "" -"Add :meth:`Emoji.is_usable` to check if the client user can use an emoji." -" (:issue:`2349`)" -msgstr "" - -#: ../../whats_new.rst:334 -msgid "" -"Add :attr:`VoiceRegion.europe` and :attr:`VoiceRegion.dubai`. " -"(:issue:`2358`, :issue:`2490`)" -msgstr "" - -#: ../../whats_new.rst:335 -msgid "Add :meth:`TextChannel.follow` to follow a news channel. (:issue:`2367`)" -msgstr "" - -#: ../../whats_new.rst:336 -msgid "Add :attr:`Permissions.view_guild_insights` permission. (:issue:`2415`)" -msgstr "" - -#: ../../whats_new.rst:338 -msgid "" -"Add support for new audit log types. See :ref:`discord-api-audit-logs` " -"for more information. (:issue:`2427`)" -msgstr "" - -#: ../../whats_new.rst:338 -msgid "Note that integration support is not finalized." -msgstr "" - -#: ../../whats_new.rst:340 -msgid "" -"Add :attr:`Webhook.type` to query the type of webhook " -"(:class:`WebhookType`). (:issue:`2441`)" -msgstr "" - -#: ../../whats_new.rst:341 -msgid "" -"Allow bulk editing of channel overwrites through " -":meth:`abc.GuildChannel.edit`. (:issue:`2198`)" -msgstr "" - -#: ../../whats_new.rst:342 -msgid "" -"Add :class:`Activity.created_at` to see when an activity was started. " -"(:issue:`2446`)" -msgstr "" - -#: ../../whats_new.rst:343 -msgid "" -"Add support for ``xsalsa20_poly1305_lite`` encryption mode for voice. " -"(:issue:`2463`)" -msgstr "" - -#: ../../whats_new.rst:344 -msgid "" -"Add :attr:`RawReactionActionEvent.member` to get the member who did the " -"reaction. (:issue:`2443`)" -msgstr "" - -#: ../../whats_new.rst:345 -msgid "" -"Add support for new YouTube streaming via :attr:`Streaming.platform` and " -":attr:`Streaming.game`. (:issue:`2445`)" -msgstr "" - -#: ../../whats_new.rst:346 -msgid "" -"Add :attr:`Guild.discovery_splash_url` to get the discovery splash image " -"asset. (:issue:`2482`)" -msgstr "" - -#: ../../whats_new.rst:348 -msgid "" -"Add :attr:`Guild.rules_channel` to get the rules channel of public " -"guilds. (:issue:`2482`)" -msgstr "" - -#: ../../whats_new.rst:348 -msgid "" -"It should be noted that this feature is restricted to those who are " -"either in Server Discovery or planning to be there." -msgstr "" - -#: ../../whats_new.rst:350 -msgid "" -"Add support for message flags via :attr:`Message.flags` and " -":class:`MessageFlags`. (:issue:`2433`)" -msgstr "" - -#: ../../whats_new.rst:351 -msgid "" -"Add :attr:`User.system` and :attr:`Profile.system` to know whether a user" -" is an official Discord Trust and Safety account." -msgstr "" - -#: ../../whats_new.rst:352 -msgid "" -"Add :attr:`Profile.team_user` to check whether a user is a member of a " -"team." -msgstr "" - -#: ../../whats_new.rst:353 -msgid "" -"Add :meth:`Attachment.to_file` to easily convert attachments to " -":class:`File` for sending." -msgstr "" - -#: ../../whats_new.rst:357 -msgid "" -"Add certain aliases to :class:`Permissions` to match the UI better. " -"(:issue:`2496`)" -msgstr "" - -#: ../../whats_new.rst:355 -msgid ":attr:`Permissions.manage_permissions`" -msgstr "" - -#: ../../whats_new.rst:356 -msgid ":attr:`Permissions.view_channel`" -msgstr "" - -#: ../../whats_new.rst:357 -msgid ":attr:`Permissions.use_external_emojis`" -msgstr "" - -#: ../../whats_new.rst:359 -msgid "" -"Add support for passing keyword arguments when creating " -":class:`Permissions`." -msgstr "" - -#: ../../whats_new.rst:361 -msgid "" -"Add support for custom activities via :class:`CustomActivity`. " -"(:issue:`2400`)" -msgstr "" - -#: ../../whats_new.rst:361 -msgid "Note that as of now, bots cannot send custom activities yet." -msgstr "" - -#: ../../whats_new.rst:363 -msgid "" -"Add support for :func:`on_invite_create` and :func:`on_invite_delete` " -"events." -msgstr "" - -#: ../../whats_new.rst:366 -msgid "Add support for clearing a specific reaction emoji from a message." -msgstr "" - -#: ../../whats_new.rst:365 -msgid ":meth:`Message.clear_reaction` and :meth:`Reaction.clear` methods." -msgstr "" - -#: ../../whats_new.rst:366 -msgid "" -":func:`on_raw_reaction_clear_emoji` and :func:`on_reaction_clear_emoji` " -"events." -msgstr "" - -#: ../../whats_new.rst:368 -msgid "" -"Add :func:`utils.sleep_until` helper to sleep until a specific datetime. " -"(:issue:`2517`, :issue:`2519`)" -msgstr "" - -#: ../../whats_new.rst:369 -msgid "" -"|commands| Add support for teams and :attr:`Bot.owner_ids " -"<.ext.commands.Bot.owner_ids>` to have multiple bot owners. " -"(:issue:`2239`)" -msgstr "" - -#: ../../whats_new.rst:370 -msgid "" -"|commands| Add new :attr:`BucketType.role " -"<.ext.commands.BucketType.role>` bucket type. (:issue:`2201`)" -msgstr "" - -#: ../../whats_new.rst:371 -msgid "" -"|commands| Expose :attr:`Command.cog <.ext.commands.Command.cog>` " -"property publicly. (:issue:`2360`)" -msgstr "" - -#: ../../whats_new.rst:372 -msgid "" -"|commands| Add non-decorator interface for adding checks to commands via " -":meth:`Command.add_check <.ext.commands.Command.add_check>` and " -":meth:`Command.remove_check <.ext.commands.Command.remove_check>`. " -"(:issue:`2411`)" -msgstr "" - -#: ../../whats_new.rst:373 -msgid "" -"|commands| Add :func:`has_guild_permissions " -"<.ext.commands.has_guild_permissions>` check. (:issue:`2460`)" -msgstr "" - -#: ../../whats_new.rst:374 -msgid "" -"|commands| Add :func:`bot_has_guild_permissions " -"<.ext.commands.bot_has_guild_permissions>` check. (:issue:`2460`)" -msgstr "" - -#: ../../whats_new.rst:375 -msgid "" -"|commands| Add ``predicate`` attribute to checks decorated with " -":func:`~.ext.commands.check`." -msgstr "" - -#: ../../whats_new.rst:376 -msgid "" -"|commands| Add :func:`~.ext.commands.check_any` check to logical OR " -"multiple checks." -msgstr "" - -#: ../../whats_new.rst:377 -msgid "" -"|commands| Add :func:`~.ext.commands.max_concurrency` to allow only a " -"certain amount of users to use a command concurrently before waiting or " -"erroring." -msgstr "" - -#: ../../whats_new.rst:378 -msgid "" -"|commands| Add support for calling a :class:`~.ext.commands.Command` as a" -" regular function." -msgstr "" - -#: ../../whats_new.rst:379 -msgid "" -"|tasks| :meth:`Loop.add_exception_type " -"<.ext.tasks.Loop.add_exception_type>` now allows multiple exceptions to " -"be set. (:issue:`2333`)" -msgstr "" - -#: ../../whats_new.rst:380 -msgid "" -"|tasks| Add :attr:`Loop.next_iteration <.ext.tasks.Loop.next_iteration>` " -"property. (:issue:`2305`)" -msgstr "" - -#: ../../whats_new.rst:385 -msgid "" -"Fix issue with permission resolution sometimes failing for guilds with no" -" owner." -msgstr "" - -#: ../../whats_new.rst:386 -msgid "Tokens are now stripped upon use. (:issue:`2135`)" -msgstr "" - -#: ../../whats_new.rst:387 -msgid "" -"Passing in a ``name`` is no longer required for :meth:`Emoji.edit`. " -"(:issue:`2368`)" -msgstr "" - -#: ../../whats_new.rst:388 -msgid "" -"Fix issue with webhooks not re-raising after retries have run out. " -"(:issue:`2272`, :issue:`2380`)" -msgstr "" - -#: ../../whats_new.rst:389 -msgid "" -"Fix mismatch in URL handling in :func:`utils.escape_markdown`. " -"(:issue:`2420`)" -msgstr "" - -#: ../../whats_new.rst:390 -msgid "" -"Fix issue with ports being read in little endian when they should be big " -"endian in voice connections. (:issue:`2470`)" -msgstr "" - -#: ../../whats_new.rst:391 -msgid "" -"Fix :meth:`Member.mentioned_in` not taking into consideration the " -"message's guild." -msgstr "" - -#: ../../whats_new.rst:392 -msgid "" -"Fix bug with moving channels when there are gaps in positions due to " -"channel deletion and creation." -msgstr "" - -#: ../../whats_new.rst:393 -msgid "" -"Fix :func:`on_shard_ready` not triggering when ``fetch_offline_members`` " -"is disabled. (:issue:`2504`)" -msgstr "" - -#: ../../whats_new.rst:394 -msgid "" -"Fix issue with large sharded bots taking too long to actually dispatch " -":func:`on_ready`." -msgstr "" - -#: ../../whats_new.rst:395 -msgid "" -"Fix issue with fetching group DM based invites in " -":meth:`Client.fetch_invite`." -msgstr "" - -#: ../../whats_new.rst:396 -msgid "Fix out of order files being sent in webhooks when there are 10 files." -msgstr "" - -#: ../../whats_new.rst:397 -msgid "" -"|commands| Extensions that fail internally due to ImportError will no " -"longer raise :exc:`~.ext.commands.ExtensionNotFound`. (:issue:`2244`, " -":issue:`2275`, :issue:`2291`)" -msgstr "" - -#: ../../whats_new.rst:398 -msgid "" -"|commands| Updating the :attr:`Paginator.suffix " -"<.ext.commands.Paginator.suffix>` will not cause out of date " -"calculations. (:issue:`2251`)" -msgstr "" - -#: ../../whats_new.rst:399 -msgid "" -"|commands| Allow converters from custom extension packages. " -"(:issue:`2369`, :issue:`2374`)" -msgstr "" - -#: ../../whats_new.rst:400 -msgid "" -"|commands| Fix issue with paginator prefix being ``None`` causing empty " -"pages. (:issue:`2471`)" -msgstr "" - -#: ../../whats_new.rst:401 -msgid "" -"|commands| :class:`~.commands.Greedy` now ignores parsing errors rather " -"than propagating them." -msgstr "" - -#: ../../whats_new.rst:402 -msgid "" -"|commands| :meth:`Command.can_run <.ext.commands.Command.can_run>` now " -"checks whether a command is disabled." -msgstr "" - -#: ../../whats_new.rst:403 -msgid "" -"|commands| :attr:`HelpCommand.clean_prefix " -"<.ext.commands.HelpCommand.clean_prefix>` now takes into consideration " -"nickname mentions. (:issue:`2489`)" -msgstr "" - -#: ../../whats_new.rst:404 -msgid "" -"|commands| :meth:`Context.send_help <.ext.commands.Context.send_help>` " -"now properly propagates to the :meth:`HelpCommand.on_help_command_error " -"<.ext.commands.HelpCommand.on_help_command_error>` handler." -msgstr "" - -#: ../../whats_new.rst:409 -msgid "The library now fully supports Python 3.8 without warnings." -msgstr "" - -#: ../../whats_new.rst:410 -msgid "" -"Bump the dependency of ``websockets`` to 8.0 for those who can use it. " -"(:issue:`2453`)" -msgstr "" - -#: ../../whats_new.rst:411 -msgid "" -"Due to Discord providing :class:`Member` data in mentions, users will now" -" be upgraded to :class:`Member` more often if mentioned." -msgstr "" - -#: ../../whats_new.rst:412 -msgid ":func:`utils.escape_markdown` now properly escapes new quote markdown." -msgstr "" - -#: ../../whats_new.rst:413 -msgid "" -"The message cache can now be disabled by passing ``None`` to " -"``max_messages`` in :class:`Client`." -msgstr "" - -#: ../../whats_new.rst:414 -msgid "" -"The default message cache size has changed from 5000 to 1000 to " -"accommodate small bots." -msgstr "" - -#: ../../whats_new.rst:415 -msgid "" -"Lower memory usage by only creating certain objects as needed in " -":class:`Role`." -msgstr "" - -#: ../../whats_new.rst:416 -msgid "" -"There is now a sleep of 5 seconds before re-IDENTIFYing during a " -"reconnect to prevent long loops of session invalidation." -msgstr "" - -#: ../../whats_new.rst:418 -msgid "" -"The rate limiting code now uses millisecond precision to have more " -"granular rate limit handling." -msgstr "" - -#: ../../whats_new.rst:418 -msgid "" -"Along with that, the rate limiting code now uses Discord's response to " -"wait. If you need to use the system clock again for whatever reason, " -"consider passing ``assume_synced_clock`` in :class:`Client`." -msgstr "" - -#: ../../whats_new.rst:420 -msgid "" -"The performance of :attr:`Guild.default_role` has been improved from O(N)" -" to O(1). (:issue:`2375`)" -msgstr "" - -#: ../../whats_new.rst:421 -msgid "" -"The performance of :attr:`Member.roles` has improved due to usage of " -"caching to avoid surprising performance traps." -msgstr "" - -#: ../../whats_new.rst:422 -msgid "" -"The GC is manually triggered during things that cause large deallocations" -" (such as guild removal) to prevent memory fragmentation." -msgstr "" - -#: ../../whats_new.rst:423 -msgid "" -"There have been many changes to the documentation for fixes both for " -"usability, correctness, and to fix some linter errors. Thanks to everyone" -" who contributed to those." -msgstr "" - -#: ../../whats_new.rst:424 -msgid "" -"The loading of the opus module has been delayed which would make the " -"result of :func:`opus.is_loaded` somewhat surprising." -msgstr "" - -#: ../../whats_new.rst:425 -msgid "" -"|commands| Usernames prefixed with @ inside DMs will properly convert " -"using the :class:`User` converter. (:issue:`2498`)" -msgstr "" - -#: ../../whats_new.rst:426 -msgid "" -"|tasks| The task sleeping time will now take into consideration the " -"amount of time the task body has taken before sleeping. (:issue:`2516`)" -msgstr "" - -#: ../../whats_new.rst:431 -#, fuzzy -msgid "v1.2.5" -msgstr "v1.2.2" - -#: ../../whats_new.rst:436 -msgid "" -"Fix a bug that caused crashes due to missing ``animated`` field in Emoji " -"structures in reactions." -msgstr "" - -#: ../../whats_new.rst:441 -#, fuzzy -msgid "v1.2.4" -msgstr "v1.2.2" - -#: ../../whats_new.rst:446 -msgid "Fix a regression when :attr:`Message.channel` would be ``None``." -msgstr "" - -#: ../../whats_new.rst:447 -msgid "" -"Fix a regression where :attr:`Message.edited_at` would not update during " -"edits." -msgstr "" - -#: ../../whats_new.rst:448 -msgid "" -"Fix a crash that would trigger during message updates (:issue:`2265`, " -":issue:`2287`)." -msgstr "" - -#: ../../whats_new.rst:449 -msgid "" -"Fix a bug when :meth:`VoiceChannel.connect` would not return " -"(:issue:`2274`, :issue:`2372`, :issue:`2373`, :issue:`2377`)." -msgstr "" - -#: ../../whats_new.rst:450 -msgid "Fix a crash relating to token-less webhooks (:issue:`2364`)." -msgstr "" - -#: ../../whats_new.rst:451 -msgid "" -"Fix issue where :attr:`Guild.premium_subscription_count` would be " -"``None`` due to a Discord bug. (:issue:`2331`, :issue:`2376`)." -msgstr "" - -#: ../../whats_new.rst:456 -#, fuzzy -msgid "v1.2.3" -msgstr "v1.2.2" - -#: ../../whats_new.rst:461 -msgid "" -"Fix an AttributeError when accessing :attr:`Member.premium_since` in " -":func:`on_member_update`. (:issue:`2213`)" -msgstr "" - -#: ../../whats_new.rst:462 -msgid "" -"Handle :exc:`asyncio.CancelledError` in :meth:`abc.Messageable.typing` " -"context manager. (:issue:`2218`)" -msgstr "" - -#: ../../whats_new.rst:463 -msgid "" -"Raise the max encoder bitrate to 512kbps to account for nitro boosting. " -"(:issue:`2232`)" -msgstr "" - -#: ../../whats_new.rst:464 -msgid "Properly propagate exceptions in :meth:`Client.run`. (:issue:`2237`)" -msgstr "" - -#: ../../whats_new.rst:465 -msgid "" -"|commands| Ensure cooldowns are properly copied when used in cog level " -"``command_attrs``." -msgstr "" - -#: ../../whats_new.rst:470 -msgid "v1.2.2" -msgstr "v1.2.2" - -#: ../../whats_new.rst:475 -msgid "" -"Audit log related attribute access have been fixed to not error out when " -"they shouldn't have." -msgstr "" - -#: ../../whats_new.rst:480 -msgid "v1.2.1" -msgstr "v1.2.1" - -#: ../../whats_new.rst:485 -msgid ":attr:`User.avatar_url` and related attributes no longer raise an error." -msgstr "" - -#: ../../whats_new.rst:486 -msgid "More compatibility shims with the ``enum.Enum`` code." -msgstr "" - -#: ../../whats_new.rst:491 -msgid "v1.2.0" -msgstr "v1.2.0" - -#: ../../whats_new.rst:493 -msgid "" -"This update mainly brings performance improvements and various nitro " -"boosting attributes (referred to in the API as \"premium guilds\")." -msgstr "" - -#: ../../whats_new.rst:498 -msgid "" -"Add :attr:`Guild.premium_tier` to query the guild's current nitro boost " -"level." -msgstr "" - -#: ../../whats_new.rst:499 -msgid "" -"Add :attr:`Guild.emoji_limit`, :attr:`Guild.bitrate_limit`, " -":attr:`Guild.filesize_limit` to query the new limits of a guild when " -"taking into consideration boosting." -msgstr "" - -#: ../../whats_new.rst:500 -msgid "" -"Add :attr:`Guild.premium_subscription_count` to query how many members " -"are boosting a guild." -msgstr "" - -#: ../../whats_new.rst:501 -msgid "" -"Add :attr:`Member.premium_since` to query since when a member has boosted" -" a guild." -msgstr "" - -#: ../../whats_new.rst:502 -msgid "" -"Add :attr:`Guild.premium_subscribers` to query all the members currently " -"boosting the guild." -msgstr "" - -#: ../../whats_new.rst:503 -msgid "" -"Add :attr:`Guild.system_channel_flags` to query the settings for a " -"guild's :attr:`Guild.system_channel`." -msgstr "" - -#: ../../whats_new.rst:504 -msgid "This includes a new type named :class:`SystemChannelFlags`" -msgstr "" - -#: ../../whats_new.rst:505 -msgid "" -"Add :attr:`Emoji.available` to query if an emoji can be used (within the " -"guild or otherwise)." -msgstr "" - -#: ../../whats_new.rst:506 -msgid "" -"Add support for animated icons in :meth:`Guild.icon_url_as` and " -":attr:`Guild.icon_url`." -msgstr "" - -#: ../../whats_new.rst:507 -msgid "Add :meth:`Guild.is_icon_animated`." -msgstr "" - -#: ../../whats_new.rst:508 -msgid "" -"Add support for the various new :class:`MessageType` involving nitro " -"boosting." -msgstr "" - -#: ../../whats_new.rst:509 -msgid "Add :attr:`VoiceRegion.india`. (:issue:`2145`)" -msgstr "" - -#: ../../whats_new.rst:510 -msgid "Add :meth:`Embed.insert_field_at`. (:issue:`2178`)" -msgstr "" - -#: ../../whats_new.rst:511 -msgid "" -"Add a ``type`` attribute for all channels to their appropriate " -":class:`ChannelType`. (:issue:`2185`)" -msgstr "" - -#: ../../whats_new.rst:512 -msgid "" -"Add :meth:`Client.fetch_channel` to fetch a channel by ID via HTTP. " -"(:issue:`2169`)" -msgstr "" - -#: ../../whats_new.rst:513 -msgid "" -"Add :meth:`Guild.fetch_channels` to fetch all channels via HTTP. " -"(:issue:`2169`)" -msgstr "" - -#: ../../whats_new.rst:514 -msgid "" -"|tasks| Add :meth:`Loop.stop <.ext.tasks.Loop.stop>` to gracefully stop a" -" task rather than cancelling." -msgstr "" - -#: ../../whats_new.rst:515 -msgid "" -"|tasks| Add :meth:`Loop.failed <.ext.tasks.Loop.failed>` to query if a " -"task had failed somehow." -msgstr "" - -#: ../../whats_new.rst:516 -msgid "" -"|tasks| Add :meth:`Loop.change_interval " -"<.ext.tasks.Loop.change_interval>` to change the sleep interval at " -"runtime (:issue:`2158`, :issue:`2162`)" -msgstr "" - -#: ../../whats_new.rst:521 -msgid "Fix internal error when using :meth:`Guild.prune_members`." -msgstr "" - -#: ../../whats_new.rst:522 -msgid "" -"|commands| Fix :attr:`.Command.invoked_subcommand` being invalid in many " -"cases." -msgstr "" - -#: ../../whats_new.rst:523 -msgid "|tasks| Reset iteration count when the loop terminates and is restarted." -msgstr "" - -#: ../../whats_new.rst:524 -msgid "" -"|tasks| The decorator interface now works as expected when stacking " -"(:issue:`2154`)" -msgstr "" - -#: ../../whats_new.rst:530 -msgid "Improve performance of all Enum related code significantly." -msgstr "" - -#: ../../whats_new.rst:530 -msgid "" -"This was done by replacing the ``enum.Enum`` code with an API compatible " -"one." -msgstr "" - -#: ../../whats_new.rst:531 -msgid "This should not be a breaking change for most users due to duck-typing." -msgstr "" - -#: ../../whats_new.rst:532 -msgid "Improve performance of message creation by about 1.5x." -msgstr "" - -#: ../../whats_new.rst:533 -msgid "" -"Improve performance of message editing by about 1.5-4x depending on " -"payload size." -msgstr "" - -#: ../../whats_new.rst:534 -msgid "Improve performance of attribute access on :class:`Member` about by 2x." -msgstr "" - -#: ../../whats_new.rst:535 -msgid "" -"Improve performance of :func:`utils.get` by around 4-6x depending on " -"usage." -msgstr "" - -#: ../../whats_new.rst:536 -msgid "Improve performance of event parsing lookup by around 2.5x." -msgstr "" - -#: ../../whats_new.rst:537 -msgid "" -"Keyword arguments in :meth:`Client.start` and :meth:`Client.run` are now " -"validated (:issue:`953`, :issue:`2170`)" -msgstr "" - -#: ../../whats_new.rst:538 -msgid "" -"The Discord error code is now shown in the exception message for " -":exc:`HTTPException`." -msgstr "" - -#: ../../whats_new.rst:539 -msgid "" -"Internal tasks launched by the library will now have their own custom " -"``__repr__``." -msgstr "" - -#: ../../whats_new.rst:540 -msgid "" -"All public facing types should now have a proper and more detailed " -"``__repr__``." -msgstr "" - -#: ../../whats_new.rst:541 -msgid "|tasks| Errors are now logged via the standard :mod:`py:logging` module." -msgstr "" - -#: ../../whats_new.rst:546 -msgid "v1.1.1" -msgstr "v1.1.1" - -#: ../../whats_new.rst:551 -msgid "" -"Webhooks do not overwrite data on retrying their HTTP requests " -"(:issue:`2140`)" -msgstr "" - -#: ../../whats_new.rst:556 -msgid "" -"Add back signal handling to :meth:`Client.run` due to issues some users " -"had with proper cleanup." -msgstr "" - -#: ../../whats_new.rst:561 -msgid "v1.1.0" -msgstr "v1.1.0" - -#: ../../whats_new.rst:566 -msgid "**There is a new extension dedicated to making background tasks easier.**" -msgstr "" - -#: ../../whats_new.rst:567 -msgid "You can check the documentation here: :ref:`ext_tasks_api`." -msgstr "" - -#: ../../whats_new.rst:568 -msgid "Add :attr:`Permissions.stream` permission. (:issue:`2077`)" -msgstr "" - -#: ../../whats_new.rst:569 -msgid "Add equality comparison and hash support to :class:`Asset`" -msgstr "" - -#: ../../whats_new.rst:570 -msgid "" -"Add ``compute_prune_members`` parameter to :meth:`Guild.prune_members` " -"(:issue:`2085`)" -msgstr "" - -#: ../../whats_new.rst:571 -msgid "" -"Add :attr:`Client.cached_messages` attribute to fetch the message cache " -"(:issue:`2086`)" -msgstr "" - -#: ../../whats_new.rst:572 -msgid "" -"Add :meth:`abc.GuildChannel.clone` to clone a guild channel. " -"(:issue:`2093`)" -msgstr "" - -#: ../../whats_new.rst:573 -msgid "" -"Add ``delay`` keyword-only argument to :meth:`Message.delete` " -"(:issue:`2094`)" -msgstr "" - -#: ../../whats_new.rst:574 -msgid "Add support for ``<:name:id>`` when adding reactions (:issue:`2095`)" -msgstr "" - -#: ../../whats_new.rst:575 -msgid "" -"Add :meth:`Asset.read` to fetch the bytes content of an asset " -"(:issue:`2107`)" -msgstr "" - -#: ../../whats_new.rst:576 -msgid "" -"Add :meth:`Attachment.read` to fetch the bytes content of an attachment " -"(:issue:`2118`)" -msgstr "" - -#: ../../whats_new.rst:577 -msgid "" -"Add support for voice kicking by passing ``None`` to " -":meth:`Member.move_to`." -msgstr "" - -#: ../../whats_new.rst:580 ../../whats_new.rst:601 ../../whats_new.rst:620 -msgid "``discord.ext.commands``" -msgstr "" - -#: ../../whats_new.rst:582 -msgid "Add new :func:`~.commands.dm_only` check." -msgstr "" - -#: ../../whats_new.rst:583 -msgid "Support callable converters in :data:`~.commands.Greedy`" -msgstr "" - -#: ../../whats_new.rst:584 -msgid "Add new :class:`~.commands.MessageConverter`." -msgstr "" - -#: ../../whats_new.rst:585 -msgid "This allows you to use :class:`Message` as a type hint in functions." -msgstr "" - -#: ../../whats_new.rst:586 -msgid "" -"Allow passing ``cls`` in the :func:`~.commands.group` decorator " -"(:issue:`2061`)" -msgstr "" - -#: ../../whats_new.rst:587 -msgid "" -"Add :attr:`.Command.parents` to fetch the parents of a command " -"(:issue:`2104`)" -msgstr "" - -#: ../../whats_new.rst:593 -msgid "Fix :exc:`AttributeError` when using ``__repr__`` on :class:`Widget`." -msgstr "" - -#: ../../whats_new.rst:594 -msgid "" -"Fix issue with :attr:`abc.GuildChannel.overwrites` returning ``None`` for" -" keys." -msgstr "" - -#: ../../whats_new.rst:595 -msgid "Remove incorrect legacy NSFW checks in e.g. :meth:`TextChannel.is_nsfw`." -msgstr "" - -#: ../../whats_new.rst:596 -msgid "" -"Fix :exc:`UnboundLocalError` when :class:`RequestsWebhookAdapter` raises " -"an error." -msgstr "" - -#: ../../whats_new.rst:597 -msgid "Fix bug where updating your own user did not update your member instances." -msgstr "" - -#: ../../whats_new.rst:598 -msgid "" -"Tighten constraints of ``__eq__`` in :class:`Spotify` objects " -"(:issue:`2113`, :issue:`2117`)" -msgstr "" - -#: ../../whats_new.rst:603 -msgid "Fix lambda converters in a non-module context (e.g. ``eval``)." -msgstr "" - -#: ../../whats_new.rst:604 -msgid "Use message creation time for reference time when computing cooldowns." -msgstr "" - -#: ../../whats_new.rst:605 -msgid "This prevents cooldowns from triggering during e.g. a RESUME session." -msgstr "" - -#: ../../whats_new.rst:606 -msgid "" -"Fix the default :func:`on_command_error` to work with new-style cogs " -"(:issue:`2094`)" -msgstr "" - -#: ../../whats_new.rst:607 -msgid "" -"DM channels are now recognised as NSFW in :func:`~.commands.is_nsfw` " -"check." -msgstr "" - -#: ../../whats_new.rst:608 -msgid "Fix race condition with help commands (:issue:`2123`)" -msgstr "" - -#: ../../whats_new.rst:609 -msgid "" -"Fix cog descriptions not showing in " -":class:`~.commands.MinimalHelpCommand` (:issue:`2139`)" -msgstr "" - -#: ../../whats_new.rst:614 -msgid "" -"Improve the performance of internal enum creation in the library by about" -" 5x." -msgstr "" - -#: ../../whats_new.rst:615 -msgid "Make the output of ``python -m discord --version`` a bit more useful." -msgstr "" - -#: ../../whats_new.rst:616 -msgid "The loop cleanup facility has been rewritten again." -msgstr "" - -#: ../../whats_new.rst:617 -msgid "The signal handling in :meth:`Client.run` has been removed." -msgstr "" - -#: ../../whats_new.rst:622 -msgid "" -"Custom exception classes are now used for all default checks in the " -"library (:issue:`2101`)" -msgstr "" - -#: ../../whats_new.rst:628 -msgid "v1.0.1" -msgstr "v1.0.1" - -#: ../../whats_new.rst:633 -msgid "Fix issue with speaking state being cast to ``int`` when it was invalid." -msgstr "" - -#: ../../whats_new.rst:634 -msgid "" -"Fix some issues with loop cleanup that some users experienced on Linux " -"machines." -msgstr "" - -#: ../../whats_new.rst:635 -msgid "Fix voice handshake race condition (:issue:`2056`, :issue:`2063`)" -msgstr "" - -#: ../../whats_new.rst:640 -msgid "v1.0.0" -msgstr "v1.0.0" - -#: ../../whats_new.rst:642 -msgid "" -"The changeset for this version are too big to be listed here, for more " -"information please see :ref:`the migrating page `." -msgstr "" -"このバージョンの変更は大きすぎるため、この場所に収まりきりません。詳細については :ref:`移行についてのページ " -"` を参照してください。" - -#: ../../whats_new.rst:649 -msgid "v0.16.6" -msgstr "v0.16.6" - -#: ../../whats_new.rst:654 -msgid "Fix issue with :meth:`Client.create_server` that made it stop working." -msgstr ":meth:`Client.create_server` によって動作が停止する問題を修正しました。" - -#: ../../whats_new.rst:655 -msgid "Fix main thread being blocked upon calling ``StreamPlayer.stop``." -msgstr "``StreamPlayer.stop`` の呼び出し時にメインスレッドがブロックされるのを修正しました。" - -#: ../../whats_new.rst:656 -msgid "Handle HEARTBEAT_ACK and resume gracefully when it occurs." -msgstr "HEARTBEAT_ACKを処理し、正常に再開します。" - -#: ../../whats_new.rst:657 -msgid "" -"Fix race condition when pre-emptively rate limiting that caused releasing" -" an already released lock." -msgstr "既に開放されているロックを解放しようとする原因になっていた先制的なレート制限を行っている時の競合状態を修正しました。" - -#: ../../whats_new.rst:658 -msgid "Fix invalid state errors when immediately cancelling a coroutine." -msgstr "コルーチンを直ちにキャンセルするときに無効な状態になるエラーを修正しました。" - -#: ../../whats_new.rst:663 -msgid "v0.16.1" -msgstr "v0.16.1" - -#: ../../whats_new.rst:665 -msgid "" -"This release is just a bug fix release with some better rate limit " -"implementation." -msgstr "このリリースはバグ修正であり、いくつかのレート制限の実装が改善されています。" - -#: ../../whats_new.rst:670 -msgid "Servers are now properly chunked for user bots." -msgstr "" - -#: ../../whats_new.rst:671 -msgid "The CDN URL is now used instead of the API URL for assets." -msgstr "アセットのAPI URLの代わりにCDN URLが使用されるようになりました。" - -#: ../../whats_new.rst:672 -msgid "Rate limit implementation now tries to use header information if possible." -msgstr "" - -#: ../../whats_new.rst:673 -msgid "Event loop is now properly propagated (:issue:`420`)" -msgstr "" - -#: ../../whats_new.rst:674 -msgid "" -"Allow falsey values in :meth:`Client.send_message` and " -":meth:`Client.send_file`." -msgstr "" - -#: ../../whats_new.rst:679 -msgid "v0.16.0" -msgstr "v0.16.0" - -#: ../../whats_new.rst:684 -msgid "" -"Add :attr:`Channel.overwrites` to get all the permission overwrites of a " -"channel." -msgstr "" - -#: ../../whats_new.rst:685 -msgid "Add :attr:`Server.features` to get information about partnered servers." -msgstr "" - -#: ../../whats_new.rst:690 -msgid "" -"Timeout when waiting for offline members while triggering " -":func:`on_ready`." -msgstr "" - -#: ../../whats_new.rst:692 -msgid "" -"The fact that we did not timeout caused a gigantic memory leak in the " -"library that caused thousands of duplicate :class:`Member` instances " -"causing big memory spikes." -msgstr "" - -#: ../../whats_new.rst:695 -msgid "Discard null sequences in the gateway." -msgstr "" - -#: ../../whats_new.rst:697 -msgid "" -"The fact these were not discarded meant that :func:`on_ready` kept being " -"called instead of :func:`on_resumed`. Since this has been corrected, in " -"most cases :func:`on_ready` will be called once or twice with " -":func:`on_resumed` being called much more often." -msgstr "" - -#: ../../whats_new.rst:704 -msgid "v0.15.1" -msgstr "v0.15.1" - -#: ../../whats_new.rst:706 -msgid "Fix crash on duplicate or out of order reactions." -msgstr "" - -#: ../../whats_new.rst:711 -msgid "v0.15.0" -msgstr "v0.15.0" - -#: ../../whats_new.rst:716 -msgid "Rich Embeds for messages are now supported." -msgstr "" - -#: ../../whats_new.rst:718 -msgid "" -"To do so, create your own :class:`Embed` and pass the instance to the " -"``embed`` keyword argument to :meth:`Client.send_message` or " -":meth:`Client.edit_message`." -msgstr "" - -#: ../../whats_new.rst:719 -msgid "Add :meth:`Client.clear_reactions` to remove all reactions from a message." -msgstr "" - -#: ../../whats_new.rst:720 -msgid "" -"Add support for MESSAGE_REACTION_REMOVE_ALL event, under " -":func:`on_reaction_clear`." -msgstr "" - -#: ../../whats_new.rst:721 -msgid "" -"Add :meth:`Permissions.update` and :meth:`PermissionOverwrite.update` for" -" bulk permission updates." -msgstr "" - -#: ../../whats_new.rst:723 -msgid "" -"This allows you to use e.g. ``p.update(read_messages=True, " -"send_messages=False)`` in a single line." -msgstr "" - -#: ../../whats_new.rst:724 -msgid "" -"Add :meth:`PermissionOverwrite.is_empty` to check if the overwrite is " -"empty (i.e. has no overwrites set explicitly as true or false)." -msgstr "" - -#: ../../whats_new.rst:726 -msgid "For the command extension, the following changed:" -msgstr "コマンド拡張の場合、以下のことが変更されます。" - -#: ../../whats_new.rst:728 -msgid "``Context`` is no longer slotted to facilitate setting dynamic attributes." -msgstr "" - -#: ../../whats_new.rst:733 -msgid "v0.14.3" -msgstr "v0.14.3" - -#: ../../whats_new.rst:738 -msgid "Fix crash when dealing with MESSAGE_REACTION_REMOVE" -msgstr "MESSAGE_REACTION_REMOVEを扱う際のクラッシュを修正しました" - -#: ../../whats_new.rst:739 -msgid "Fix incorrect buckets for reactions." -msgstr "" - -#: ../../whats_new.rst:744 -msgid "v0.14.2" -msgstr "v0.14.2" - -#: ../../whats_new.rst:750 -msgid "" -":meth:`Client.wait_for_reaction` now returns a namedtuple with " -"``reaction`` and ``user`` attributes." -msgstr "" - -#: ../../whats_new.rst:750 -msgid "" -"This is for better support in the case that ``None`` is returned since " -"tuple unpacking can lead to issues." -msgstr "" - -#: ../../whats_new.rst:755 -msgid "" -"Fix bug that disallowed ``None`` to be passed for ``emoji`` parameter in " -":meth:`Client.wait_for_reaction`." -msgstr "" - -#: ../../whats_new.rst:760 -msgid "v0.14.1" -msgstr "v0.14.1" - -#: ../../whats_new.rst:763 -msgid "Bug fixes" -msgstr "バグ修正" - -#: ../../whats_new.rst:766 -msgid "Fix bug with `Reaction` not being visible at import." -msgstr "" - -#: ../../whats_new.rst:766 -msgid "This was also breaking the documentation." -msgstr "" - -#: ../../whats_new.rst:771 -msgid "v0.14.0" -msgstr "v0.14.0" - -#: ../../whats_new.rst:773 -msgid "This update adds new API features and a couple of bug fixes." -msgstr "このアップデートには、新しいAPI機能といくつかのバグ修正が含まれています。" - -#: ../../whats_new.rst:778 -msgid "" -"Add support for Manage Webhooks permission under " -":attr:`Permissions.manage_webhooks`" -msgstr "" - -#: ../../whats_new.rst:779 -msgid "Add support for ``around`` argument in 3.5+ :meth:`Client.logs_from`." -msgstr "" - -#: ../../whats_new.rst:787 -msgid "Add support for reactions." -msgstr "リアクションのサポートを追加します。" - -#: ../../whats_new.rst:781 -msgid ":meth:`Client.add_reaction` to add a reactions" -msgstr "" - -#: ../../whats_new.rst:782 -msgid ":meth:`Client.remove_reaction` to remove a reaction." -msgstr "" - -#: ../../whats_new.rst:783 -msgid "" -":meth:`Client.get_reaction_users` to get the users that reacted to a " -"message." -msgstr "" - -#: ../../whats_new.rst:784 -msgid ":attr:`Permissions.add_reactions` permission bit support." -msgstr "" - -#: ../../whats_new.rst:785 -msgid "Two new events, :func:`on_reaction_add` and :func:`on_reaction_remove`." -msgstr "" - -#: ../../whats_new.rst:786 -msgid ":attr:`Message.reactions` to get reactions from a message." -msgstr "" - -#: ../../whats_new.rst:787 -msgid ":meth:`Client.wait_for_reaction` to wait for a reaction from a user." -msgstr "" - -#: ../../whats_new.rst:792 -msgid "Fix bug with Paginator still allowing lines that are too long." -msgstr "" - -#: ../../whats_new.rst:793 -msgid "Fix the :attr:`Permissions.manage_emojis` bit being incorrect." -msgstr "" - -#: ../../whats_new.rst:798 -msgid "v0.13.0" -msgstr "v0.13.0" - -#: ../../whats_new.rst:800 -msgid "This is a backwards compatible update with new features." -msgstr "" - -#: ../../whats_new.rst:805 -msgid "Add the ability to manage emojis." -msgstr "" - -#: ../../whats_new.rst:807 -msgid ":meth:`Client.create_custom_emoji` to create new emoji." -msgstr "新しい絵文字を作成する :meth:`Client.create_custom_emoji` 。" - -#: ../../whats_new.rst:808 -msgid ":meth:`Client.edit_custom_emoji` to edit an old emoji." -msgstr "" - -#: ../../whats_new.rst:809 -msgid ":meth:`Client.delete_custom_emoji` to delete a custom emoji." -msgstr "" - -#: ../../whats_new.rst:810 -msgid "Add new :attr:`Permissions.manage_emojis` toggle." -msgstr "" - -#: ../../whats_new.rst:812 -msgid "This applies for :class:`PermissionOverwrite` as well." -msgstr "" - -#: ../../whats_new.rst:813 -msgid "Add new statuses for :class:`Status`." -msgstr "" - -#: ../../whats_new.rst:815 -msgid "" -":attr:`Status.dnd` (aliased with :attr:`Status.do_not_disturb`\\) for Do " -"Not Disturb." -msgstr "" - -#: ../../whats_new.rst:816 -msgid "" -":attr:`Status.invisible` for setting your status to invisible (please see" -" the docs for a caveat)." -msgstr "" - -#: ../../whats_new.rst:817 -msgid "Deprecate :meth:`Client.change_status`" -msgstr "" - -#: ../../whats_new.rst:819 -msgid "" -"Use :meth:`Client.change_presence` instead for better more up to date " -"functionality." -msgstr "" - -#: ../../whats_new.rst:820 -msgid "This method is subject for removal in a future API version." -msgstr "" - -#: ../../whats_new.rst:821 -msgid "" -"Add :meth:`Client.change_presence` for changing your status with the new " -"Discord API change." -msgstr "" - -#: ../../whats_new.rst:823 -msgid "" -"This is the only method that allows changing your status to invisible or " -"do not disturb." -msgstr "" - -#: ../../whats_new.rst:828 -msgid "Paginator pages do not exceed their max_size anymore (:issue:`340`)" -msgstr "" - -#: ../../whats_new.rst:829 -msgid "" -"Do Not Disturb users no longer show up offline due to the new " -":class:`Status` changes." -msgstr "" - -#: ../../whats_new.rst:834 -msgid "v0.12.0" -msgstr "v0.12.0" - -#: ../../whats_new.rst:836 -msgid "This is a bug fix update that also comes with new features." -msgstr "" - -#: ../../whats_new.rst:841 -msgid "Add custom emoji support." -msgstr "" - -#: ../../whats_new.rst:843 -msgid "Adds a new class to represent a custom Emoji named :class:`Emoji`" -msgstr "" - -#: ../../whats_new.rst:844 -msgid "Adds a utility generator function, :meth:`Client.get_all_emojis`." -msgstr "" - -#: ../../whats_new.rst:845 -msgid "Adds a list of emojis on a server, :attr:`Server.emojis`." -msgstr "" - -#: ../../whats_new.rst:846 -msgid "Adds a new event, :func:`on_server_emojis_update`." -msgstr "" - -#: ../../whats_new.rst:847 -msgid "Add new server regions to :class:`ServerRegion`" -msgstr "" - -#: ../../whats_new.rst:849 -msgid ":attr:`ServerRegion.eu_central` and :attr:`ServerRegion.eu_west`." -msgstr "" - -#: ../../whats_new.rst:850 -msgid "" -"Add support for new pinned system message under " -":attr:`MessageType.pins_add`." -msgstr "" - -#: ../../whats_new.rst:851 -msgid "" -"Add order comparisons for :class:`Role` to allow it to be compared with " -"regards to hierarchy." -msgstr "" - -#: ../../whats_new.rst:853 -msgid "" -"This means that you can now do ``role_a > role_b`` etc to check if " -"``role_b`` is lower in the hierarchy." -msgstr "" - -#: ../../whats_new.rst:855 -msgid "Add :attr:`Server.role_hierarchy` to get the server's role hierarchy." -msgstr "" - -#: ../../whats_new.rst:856 -msgid "" -"Add :attr:`Member.server_permissions` to get a member's server " -"permissions without their channel specific overwrites." -msgstr "" - -#: ../../whats_new.rst:857 -msgid "Add :meth:`Client.get_user_info` to retrieve a user's info from their ID." -msgstr "" - -#: ../../whats_new.rst:858 -msgid "" -"Add a new ``Player`` property, ``Player.error`` to fetch the error that " -"stopped the player." -msgstr "" - -#: ../../whats_new.rst:860 -msgid "" -"To help with this change, a player's ``after`` function can now take a " -"single parameter denoting the current player." -msgstr "" - -#: ../../whats_new.rst:861 -msgid "Add support for server verification levels." -msgstr "" - -#: ../../whats_new.rst:863 -msgid "Adds a new enum called :class:`VerificationLevel`." -msgstr "" - -#: ../../whats_new.rst:864 -msgid "" -"This enum can be used in :meth:`Client.edit_server` under the " -"``verification_level`` keyword argument." -msgstr "" - -#: ../../whats_new.rst:865 -msgid "Adds a new attribute in the server, :attr:`Server.verification_level`." -msgstr "" - -#: ../../whats_new.rst:866 -msgid "" -"Add :attr:`Server.voice_client` shortcut property for " -":meth:`Client.voice_client_in`." -msgstr "" - -#: ../../whats_new.rst:868 -msgid "" -"This is technically old (was added in v0.10.0) but was undocumented until" -" v0.12.0." -msgstr "" - -#: ../../whats_new.rst:870 ../../whats_new.rst:916 -msgid "For the command extension, the following are new:" -msgstr "" - -#: ../../whats_new.rst:872 -msgid "Add custom emoji converter." -msgstr "" - -#: ../../whats_new.rst:873 -msgid "All default converters that can take IDs can now convert via ID." -msgstr "" - -#: ../../whats_new.rst:874 -msgid "Add coroutine support for ``Bot.command_prefix``." -msgstr "" - -#: ../../whats_new.rst:875 -msgid "Add a method to reset command cooldown." -msgstr "" - -#: ../../whats_new.rst:880 -msgid "" -"Fix bug that caused the library to not work with the latest " -"``websockets`` library." -msgstr "" - -#: ../../whats_new.rst:881 -msgid "Fix bug that leaked keep alive threads (:issue:`309`)" -msgstr "" - -#: ../../whats_new.rst:882 -msgid "" -"Fix bug that disallowed :class:`ServerRegion` from being used in " -":meth:`Client.edit_server`." -msgstr "" - -#: ../../whats_new.rst:883 -msgid "" -"Fix bug in :meth:`Channel.permissions_for` that caused permission " -"resolution to happen out of order." -msgstr "" - -#: ../../whats_new.rst:884 -msgid "" -"Fix bug in :attr:`Member.top_role` that did not account for same-position" -" roles." -msgstr "" - -#: ../../whats_new.rst:889 -msgid "v0.11.0" -msgstr "v0.11.0" - -#: ../../whats_new.rst:891 -msgid "" -"This is a minor bug fix update that comes with a gateway update (v5 -> " -"v6)." -msgstr "" - -#: ../../whats_new.rst:894 -msgid "Breaking Changes" -msgstr "破壊的変更" - -#: ../../whats_new.rst:896 -msgid "" -"``Permissions.change_nicknames`` has been renamed to " -":attr:`Permissions.change_nickname` to match the UI." -msgstr "" - -#: ../../whats_new.rst:901 -msgid "Add the ability to prune members via :meth:`Client.prune_members`." -msgstr "" - -#: ../../whats_new.rst:902 -msgid "" -"Switch the websocket gateway version to v6 from v5. This allows the " -"library to work with group DMs and 1-on-1 calls." -msgstr "" - -#: ../../whats_new.rst:903 -msgid "Add :attr:`AppInfo.owner` attribute." -msgstr "" - -#: ../../whats_new.rst:904 -msgid "Add :class:`CallMessage` for group voice call messages." -msgstr "" - -#: ../../whats_new.rst:905 -msgid "Add :class:`GroupCall` for group voice call information." -msgstr "" - -#: ../../whats_new.rst:906 -msgid "Add :attr:`Message.system_content` to get the system message." -msgstr "" - -#: ../../whats_new.rst:907 -msgid "" -"Add the remaining VIP servers and the Brazil servers into " -":class:`ServerRegion` enum." -msgstr "" - -#: ../../whats_new.rst:908 -msgid "" -"Add ``stderr`` argument to :meth:`VoiceClient.create_ffmpeg_player` to " -"redirect stderr." -msgstr "" - -#: ../../whats_new.rst:909 -msgid "" -"The library now handles implicit permission resolution in " -":meth:`Channel.permissions_for`." -msgstr "" - -#: ../../whats_new.rst:910 -msgid "Add :attr:`Server.mfa_level` to query a server's 2FA requirement." -msgstr "" - -#: ../../whats_new.rst:911 -msgid "Add :attr:`Permissions.external_emojis` permission." -msgstr "" - -#: ../../whats_new.rst:912 -msgid "Add :attr:`Member.voice` attribute that refers to a :class:`VoiceState`." -msgstr "" - -#: ../../whats_new.rst:914 -msgid "" -"For backwards compatibility, the member object will have properties " -"mirroring the old behaviour." -msgstr "" - -#: ../../whats_new.rst:918 -msgid "Command cooldown system with the ``cooldown`` decorator." -msgstr "" - -#: ../../whats_new.rst:919 -msgid "" -"``UserInputError`` exception for the hierarchy for user input related " -"errors." -msgstr "" - -#: ../../whats_new.rst:924 -msgid ":attr:`Client.email` is now saved when using a token for user accounts." -msgstr "" - -#: ../../whats_new.rst:925 -msgid "Fix issue when removing roles out of order." -msgstr "" - -#: ../../whats_new.rst:926 -msgid "Fix bug where discriminators would not update." -msgstr "" - -#: ../../whats_new.rst:927 -msgid "" -"Handle cases where ``HEARTBEAT`` opcode is received. This caused bots to " -"disconnect seemingly randomly." -msgstr "" - -#: ../../whats_new.rst:929 -msgid "For the command extension, the following bug fixes apply:" -msgstr "" - -#: ../../whats_new.rst:931 -msgid "``Bot.check`` decorator is actually a decorator not requiring parentheses." -msgstr "" - -#: ../../whats_new.rst:932 -msgid "" -"``Bot.remove_command`` and ``Group.remove_command`` no longer throw if " -"the command doesn't exist." -msgstr "" - -#: ../../whats_new.rst:933 -msgid "Command names are no longer forced to be ``lower()``." -msgstr "" - -#: ../../whats_new.rst:934 -msgid "" -"Fix a bug where Member and User converters failed to work in private " -"message contexts." -msgstr "" - -#: ../../whats_new.rst:935 -msgid "" -"``HelpFormatter`` now ignores hidden commands when deciding the maximum " -"width." -msgstr "" - -#: ../../whats_new.rst:940 -msgid "v0.10.0" -msgstr "v0.10.0" - -#: ../../whats_new.rst:942 -msgid "" -"For breaking changes, see :ref:`migrating-to-async`. The breaking changes" -" listed there will not be enumerated below. Since this version is rather " -"a big departure from v0.9.2, this change log will be non-exhaustive." -msgstr "" - -#: ../../whats_new.rst:947 -msgid "" -"The library is now fully ``asyncio`` compatible, allowing you to write " -"non-blocking code a lot more easily." -msgstr "" - -#: ../../whats_new.rst:948 -msgid "The library now fully handles 429s and unconditionally retries on 502s." -msgstr "" - -#: ../../whats_new.rst:949 -msgid "" -"A new command extension module was added but is currently undocumented. " -"Figuring it out is left as an exercise to the reader." -msgstr "" - -#: ../../whats_new.rst:950 -msgid "" -"Two new exception types, :exc:`Forbidden` and :exc:`NotFound` to denote " -"permission errors or 404 errors." -msgstr "" - -#: ../../whats_new.rst:951 -msgid "Added :meth:`Client.delete_invite` to revoke invites." -msgstr "" - -#: ../../whats_new.rst:952 -msgid "" -"Added support for sending voice. Check :class:`VoiceClient` for more " -"details." -msgstr "" - -#: ../../whats_new.rst:953 -msgid "" -"Added :meth:`Client.wait_for_message` coroutine to aid with follow up " -"commands." -msgstr "" - -#: ../../whats_new.rst:954 -msgid "" -"Added :data:`version_info` named tuple to check version info of the " -"library." -msgstr "" - -#: ../../whats_new.rst:955 -msgid "" -"Login credentials are now cached to have a faster login experience. You " -"can disable this by passing in ``cache_auth=False`` when constructing a " -":class:`Client`." -msgstr "" - -#: ../../whats_new.rst:957 -msgid "" -"New utility function, :func:`discord.utils.get` to simplify retrieval of " -"items based on attributes." -msgstr "" - -#: ../../whats_new.rst:958 -msgid "" -"All data classes now support ``!=``, ``==``, ``hash(obj)`` and " -"``str(obj)``." -msgstr "" - -#: ../../whats_new.rst:959 -msgid "Added :meth:`Client.get_bans` to get banned members from a server." -msgstr "" - -#: ../../whats_new.rst:960 -msgid "" -"Added :meth:`Client.invites_from` to get currently active invites in a " -"server." -msgstr "" - -#: ../../whats_new.rst:961 -msgid "" -"Added :attr:`Server.me` attribute to get the :class:`Member` version of " -":attr:`Client.user`." -msgstr "" - -#: ../../whats_new.rst:962 -msgid "" -"Most data classes now support a ``hash(obj)`` function to allow you to " -"use them in ``set`` or ``dict`` classes or subclasses." -msgstr "" - -#: ../../whats_new.rst:963 -msgid "" -"Add :meth:`Message.clean_content` to get a text version of the content " -"with the user and channel mentioned changed into their names." -msgstr "" - -#: ../../whats_new.rst:964 -msgid "" -"Added a way to remove the messages of the user that just got banned in " -":meth:`Client.ban`." -msgstr "" - -#: ../../whats_new.rst:965 -msgid "" -"Added :meth:`Client.wait_until_ready` to facilitate easy creation of " -"tasks that require the client cache to be ready." -msgstr "" - -#: ../../whats_new.rst:966 -msgid "" -"Added :meth:`Client.wait_until_login` to facilitate easy creation of " -"tasks that require the client to be logged in." -msgstr "" - -#: ../../whats_new.rst:967 -msgid "" -"Add :class:`discord.Game` to represent any game with custom text to send " -"to :meth:`Client.change_status`." -msgstr "" - -#: ../../whats_new.rst:968 -msgid "Add :attr:`Message.nonce` attribute." -msgstr "" - -#: ../../whats_new.rst:969 -msgid "" -"Add :meth:`Member.permissions_in` as another way of doing " -":meth:`Channel.permissions_for`." -msgstr "" - -#: ../../whats_new.rst:970 -msgid "Add :meth:`Client.move_member` to move a member to another voice channel." -msgstr "" - -#: ../../whats_new.rst:971 -msgid "You can now create a server via :meth:`Client.create_server`." -msgstr "" - -#: ../../whats_new.rst:972 -msgid "Added :meth:`Client.edit_server` to edit existing servers." -msgstr "" - -#: ../../whats_new.rst:973 -msgid "" -"Added :meth:`Client.server_voice_state` to server mute or server deafen a" -" member." -msgstr "" - -#: ../../whats_new.rst:974 -msgid "If you are being rate limited, the library will now handle it for you." -msgstr "" - -#: ../../whats_new.rst:975 -msgid "" -"Add :func:`on_member_ban` and :func:`on_member_unban` events that trigger" -" when a member is banned/unbanned." -msgstr "" - -#: ../../whats_new.rst:978 -msgid "Performance Improvements" -msgstr "" - -#: ../../whats_new.rst:980 -msgid "" -"All data classes now use ``__slots__`` which greatly reduce the memory " -"usage of things kept in cache." -msgstr "" - -#: ../../whats_new.rst:981 -msgid "" -"Due to the usage of ``asyncio``, the CPU usage of the library has gone " -"down significantly." -msgstr "" - -#: ../../whats_new.rst:982 -msgid "" -"A lot of the internal cache lists were changed into dictionaries to " -"change the ``O(n)`` lookup into ``O(1)``." -msgstr "" - -#: ../../whats_new.rst:983 -msgid "" -"Compressed READY is now on by default. This means if you're on a lot of " -"servers (or maybe even a few) you would receive performance improvements " -"by having to download and process less data." -msgstr "" - -#: ../../whats_new.rst:985 -msgid "" -"While minor, change regex from ``\\d+`` to ``[0-9]+`` to avoid " -"unnecessary unicode character lookups." -msgstr "" - -#: ../../whats_new.rst:990 -msgid "Fix bug where guilds being updated did not edit the items in cache." -msgstr "" - -#: ../../whats_new.rst:991 -msgid "" -"Fix bug where ``member.roles`` were empty upon joining instead of having " -"the ``@everyone`` role." -msgstr "" - -#: ../../whats_new.rst:992 -msgid "" -"Fix bug where :meth:`Role.is_everyone` was not being set properly when " -"the role was being edited." -msgstr "" - -#: ../../whats_new.rst:993 -msgid "" -":meth:`Client.logs_from` now handles cases where limit > 100 to sidestep " -"the discord API limitation." -msgstr "" - -#: ../../whats_new.rst:994 -msgid "Fix bug where a role being deleted would trigger a ``ValueError``." -msgstr "" - -#: ../../whats_new.rst:995 -msgid "" -"Fix bug where :meth:`Permissions.kick_members` and " -":meth:`Permissions.ban_members` were flipped." -msgstr "" - -#: ../../whats_new.rst:996 -msgid "" -"Mentions are now triggered normally. This was changed due to the way " -"discord handles it internally." -msgstr "" - -#: ../../whats_new.rst:997 -msgid "" -"Fix issue when a :class:`Message` would attempt to upgrade a " -":attr:`Message.server` when the channel is a :class:`Object`." -msgstr "" - -#: ../../whats_new.rst:999 -msgid "" -"Unavailable servers were not being added into cache, this has been " -"corrected." -msgstr "" - diff --git a/docs/migrating.rst b/docs/migrating.rst index baf97160f0..e7af8cb92a 100644 --- a/docs/migrating.rst +++ b/docs/migrating.rst @@ -1,1172 +1,8 @@ .. currentmodule:: discord -.. _migrating_1_0: +.. _migrating_pycord: -Migrating to v1.0 -====================== +Migrating to 2.0 +================= -v1.0 is one of the biggest breaking changes in the library due to a complete -redesign. - -The amount of changes are so massive and long that for all intents and purposes, it is a completely -new library. - -Part of the redesign involves making things more easy to use and natural. Things are done on the -:ref:`models ` instead of requiring a :class:`Client` instance to do any work. - -Python Version Change ------------------------ - -In order to make development easier and also to allow for our dependencies to upgrade to allow usage of 3.7 or higher, -the library had to remove support for Python versions lower than 3.5.3, which essentially means that **support for Python 3.4 -is dropped**. - -Major Model Changes ---------------------- - -Below are major model changes that have happened in v1.0 - -Snowflakes are int -~~~~~~~~~~~~~~~~~~~~ - -Before v1.0, all snowflakes (the ``id`` attribute) were strings. This has been changed to :class:`int`. - -Quick example: :: - - # before - ch = client.get_channel('84319995256905728') - if message.author.id == '80528701850124288': - ... - - # after - ch = client.get_channel(84319995256905728) - if message.author.id == 80528701850124288: - ... - -This change allows for fewer errors when using the Copy ID feature in the official client since you no longer have -to wrap it in quotes and allows for optimisation opportunities by allowing ETF to be used instead of JSON internally. - -Server is now Guild -~~~~~~~~~~~~~~~~~~~~~ - -The official API documentation calls the "Server" concept a "Guild" instead. In order to be more consistent with the -API documentation when necessary, the model has been renamed to :class:`Guild` and all instances referring to it has -been changed as well. - -A list of changes is as follows: - -+-------------------------------+----------------------------------+ -| Before | After | -+-------------------------------+----------------------------------+ -| ``Message.server`` | :attr:`Message.guild` | -+-------------------------------+----------------------------------+ -| ``Channel.server`` | :attr:`.GuildChannel.guild` | -+-------------------------------+----------------------------------+ -| ``Client.servers`` | :attr:`Client.guilds` | -+-------------------------------+----------------------------------+ -| ``Client.get_server`` | :meth:`Client.get_guild` | -+-------------------------------+----------------------------------+ -| ``Emoji.server`` | :attr:`Emoji.guild` | -+-------------------------------+----------------------------------+ -| ``Role.server`` | :attr:`Role.guild` | -+-------------------------------+----------------------------------+ -| ``Invite.server`` | :attr:`Invite.guild` | -+-------------------------------+----------------------------------+ -| ``Member.server`` | :attr:`Member.guild` | -+-------------------------------+----------------------------------+ -| ``Permissions.manage_server`` | :attr:`Permissions.manage_guild` | -+-------------------------------+----------------------------------+ -| ``VoiceClient.server`` | :attr:`VoiceClient.guild` | -+-------------------------------+----------------------------------+ -| ``Client.create_server`` | :meth:`Client.create_guild` | -+-------------------------------+----------------------------------+ - -.. _migrating_1_0_model_state: - -Models are Stateful -~~~~~~~~~~~~~~~~~~~~~ - -As mentioned earlier, a lot of functionality was moved out of :class:`Client` and -put into their respective :ref:`model `. - -A list of these changes is enumerated below. - -+---------------------------------------+------------------------------------------------------------------------------+ -| Before | After | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.add_reaction`` | :meth:`Message.add_reaction` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.add_roles`` | :meth:`Member.add_roles` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.ban`` | :meth:`Member.ban` or :meth:`Guild.ban` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.change_nickname`` | :meth:`Member.edit` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.clear_reactions`` | :meth:`Message.clear_reactions` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.create_channel`` | :meth:`Guild.create_text_channel` and :meth:`Guild.create_voice_channel` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.create_custom_emoji`` | :meth:`Guild.create_custom_emoji` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.create_invite`` | :meth:`abc.GuildChannel.create_invite` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.create_role`` | :meth:`Guild.create_role` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.delete_channel`` | :meth:`abc.GuildChannel.delete` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.delete_channel_permissions`` | :meth:`abc.GuildChannel.set_permissions` with ``overwrite`` set to ``None`` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.delete_custom_emoji`` | :meth:`Emoji.delete` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.delete_invite`` | :meth:`Invite.delete` or :meth:`Client.delete_invite` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.delete_message`` | :meth:`Message.delete` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.delete_messages`` | :meth:`TextChannel.delete_messages` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.delete_role`` | :meth:`Role.delete` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.delete_server`` | :meth:`Guild.delete` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.edit_channel`` | :meth:`TextChannel.edit` or :meth:`VoiceChannel.edit` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.edit_channel_permissions`` | :meth:`abc.GuildChannel.set_permissions` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.edit_custom_emoji`` | :meth:`Emoji.edit` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.edit_message`` | :meth:`Message.edit` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.edit_profile`` | :meth:`ClientUser.edit` (you get this from :attr:`Client.user`) | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.edit_role`` | :meth:`Role.edit` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.edit_server`` | :meth:`Guild.edit` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.estimate_pruned_members`` | :meth:`Guild.estimate_pruned_members` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.get_all_emojis`` | :attr:`Client.emojis` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.get_bans`` | :meth:`Guild.bans` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.get_invite`` | :meth:`Client.fetch_invite` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.get_message`` | :meth:`abc.Messageable.fetch_message` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.get_reaction_users`` | :meth:`Reaction.users` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.get_user_info`` | :meth:`Client.fetch_user` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.invites_from`` | :meth:`abc.GuildChannel.invites` or :meth:`Guild.invites` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.join_voice_channel`` | :meth:`VoiceChannel.connect` (see :ref:`migrating_1_0_voice`) | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.kick`` | :meth:`Guild.kick` or :meth:`Member.kick` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.leave_server`` | :meth:`Guild.leave` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.logs_from`` | :meth:`abc.Messageable.history` (see :ref:`migrating_1_0_async_iter`) | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.move_channel`` | :meth:`TextChannel.edit` or :meth:`VoiceChannel.edit` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.move_member`` | :meth:`Member.edit` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.move_role`` | :meth:`Role.edit` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.pin_message`` | :meth:`Message.pin` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.pins_from`` | :meth:`abc.Messageable.pins` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.prune_members`` | :meth:`Guild.prune_members` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.purge_from`` | :meth:`TextChannel.purge` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.remove_reaction`` | :meth:`Message.remove_reaction` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.remove_roles`` | :meth:`Member.remove_roles` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.replace_roles`` | :meth:`Member.edit` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.send_file`` | :meth:`abc.Messageable.send` (see :ref:`migrating_1_0_sending_messages`) | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.send_message`` | :meth:`abc.Messageable.send` (see :ref:`migrating_1_0_sending_messages`) | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.send_typing`` | :meth:`abc.Messageable.trigger_typing` (use :meth:`abc.Messageable.typing`) | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.server_voice_state`` | :meth:`Member.edit` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.start_private_message`` | :meth:`User.create_dm` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.unban`` | :meth:`Guild.unban` or :meth:`Member.unban` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.unpin_message`` | :meth:`Message.unpin` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.wait_for_message`` | :meth:`Client.wait_for` (see :ref:`migrating_1_0_wait_for`) | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.wait_for_reaction`` | :meth:`Client.wait_for` (see :ref:`migrating_1_0_wait_for`) | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.wait_until_login`` | Removed | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.wait_until_ready`` | No change | -+---------------------------------------+------------------------------------------------------------------------------+ - -Property Changes -~~~~~~~~~~~~~~~~~~ - -In order to be a bit more consistent, certain things that were properties were changed to methods instead. - -The following are now methods instead of properties (requires parentheses): - -- :meth:`Role.is_default` -- :meth:`Client.is_ready` -- :meth:`Client.is_closed` - -Dict Value Change -~~~~~~~~~~~~~~~~~~~~~ - -Prior to v1.0 some aggregating properties that retrieved models would return "dict view" objects. - -As a consequence, when the dict would change size while you would iterate over it, a RuntimeError would -be raised and crash the task. To alleviate this, the "dict view" objects were changed into lists. - -The following views were changed to a list: - -- :attr:`Client.guilds` -- :attr:`Client.users` (new in v1.0) -- :attr:`Client.emojis` (new in v1.0) -- :attr:`Guild.channels` -- :attr:`Guild.text_channels` (new in v1.0) -- :attr:`Guild.voice_channels` (new in v1.0) -- :attr:`Guild.emojis` -- :attr:`Guild.members` - -Voice State Changes -~~~~~~~~~~~~~~~~~~~~~ - -Earlier, in v0.11.0 a :class:`VoiceState` class was added to refer to voice states along with a -:attr:`Member.voice` attribute to refer to it. - -However, it was transparent to the user. In an effort to make the library save more memory, the -voice state change is now more visible. - -The only way to access voice attributes is via the :attr:`Member.voice` attribute. Note that if -the member does not have a voice state this attribute can be ``None``. - -Quick example: :: - - # before - member.deaf - member.voice.voice_channel - - # after - if member.voice: # can be None - member.voice.deaf - member.voice.channel - - -User and Member Type Split -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -In v1.0 to save memory, :class:`User` and :class:`Member` are no longer inherited. Instead, they are "flattened" -by having equivalent properties that map out to the functional underlying :class:`User`. Thus, there is no functional -change in how they are used. However this breaks :func:`isinstance` checks and thus is something to keep in mind. - -These memory savings were accomplished by having a global :class:`User` cache, and as a positive consequence you -can now easily fetch a :class:`User` by their ID by using the new :meth:`Client.get_user`. You can also get a list -of all :class:`User` your client can see with :attr:`Client.users`. - -.. _migrating_1_0_channel_split: - -Channel Type Split -~~~~~~~~~~~~~~~~~~~~~ - -Prior to v1.0, channels were two different types, ``Channel`` and ``PrivateChannel`` with a ``is_private`` -property to help differentiate between them. - -In order to save memory the channels have been split into 4 different types: - -- :class:`TextChannel` for guild text channels. -- :class:`VoiceChannel` for guild voice channels. -- :class:`DMChannel` for DM channels with members. -- :class:`GroupChannel` for Group DM channels with members. - -With this split came the removal of the ``is_private`` attribute. You should now use :func:`isinstance`. - -The types are split into two different :ref:`discord_api_abcs`: - -- :class:`abc.GuildChannel` for guild channels. -- :class:`abc.PrivateChannel` for private channels (DMs and group DMs). - -So to check if something is a guild channel you would do: :: - - isinstance(channel, discord.abc.GuildChannel) - -And to check if it's a private channel you would do: :: - - isinstance(channel, discord.abc.PrivateChannel) - -Of course, if you're looking for only a specific type you can pass that too, e.g. :: - - isinstance(channel, discord.TextChannel) - -With this type split also came event changes, which are enumerated in :ref:`migrating_1_0_event_changes`. - - -Miscellaneous Model Changes -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -There were lots of other things added or removed in the models in general. - -They will be enumerated here. - -**Removed** - -- :meth:`Client.login` no longer accepts email and password logins. - - - Use a token and ``bot=False``. - -- ``Client.get_all_emojis`` - - - Use :attr:`Client.emojis` instead. - -- ``Client.messages`` - - - Use read-only :attr:`Client.cached_messages` instead. - -- ``Client.wait_for_message`` and ``Client.wait_for_reaction`` are gone. - - - Use :meth:`Client.wait_for` instead. - -- ``Channel.voice_members`` - - - Use :attr:`VoiceChannel.members` instead. - -- ``Channel.is_private`` - - - Use ``isinstance`` instead with one of the :ref:`discord_api_abcs` instead. - - e.g. ``isinstance(channel, discord.abc.GuildChannel)`` will check if it isn't a private channel. - -- ``Client.accept_invite`` - - - There is no replacement for this one. This functionality is deprecated API wise. - -- ``Guild.default_channel`` / ``Server.default_channel`` and ``Channel.is_default`` - - - The concept of a default channel was removed from Discord. - See `#329 `_. - -- ``Message.edited_timestamp`` - - - Use :attr:`Message.edited_at` instead. - -- ``Message.timestamp`` - - - Use :attr:`Message.created_at` instead. - -- ``Colour.to_tuple()`` - - - Use :meth:`Colour.to_rgb` instead. - -- ``Permissions.view_audit_logs`` - - - Use :attr:`Permissions.view_audit_log` instead. - -- ``Member.game`` - - - Use :attr:`Member.activities` instead. - -- ``Guild.role_hierarchy`` / ``Server.role_hierarchy`` - - - Use :attr:`Guild.roles` instead. Note that while sorted, it is in the opposite order - of what the old ``Guild.role_hierarchy`` used to be. - -**Changed** - -- :attr:`Member.avatar_url` and :attr:`User.avatar_url` now return the default avatar if a custom one is not set. -- :attr:`Message.embeds` is now a list of :class:`Embed` instead of :class:`dict` objects. -- :attr:`Message.attachments` is now a list of :class:`Attachment` instead of :class:`dict` object. -- :attr:`Guild.roles` is now sorted through hierarchy. The first element is always the ``@everyone`` role. - -**Added** - -- :class:`Attachment` to represent a discord attachment. -- :class:`CategoryChannel` to represent a channel category. -- :attr:`VoiceChannel.members` for fetching members connected to a voice channel. -- :attr:`TextChannel.members` for fetching members that can see the channel. -- :attr:`Role.members` for fetching members that have the role. -- :attr:`Guild.text_channels` for fetching text channels only. -- :attr:`Guild.voice_channels` for fetching voice channels only. -- :attr:`Guild.categories` for fetching channel categories only. -- :attr:`TextChannel.category` and :attr:`VoiceChannel.category` to get the category a channel belongs to. -- :meth:`Guild.by_category` to get channels grouped by their category. -- :attr:`Guild.chunked` to check member chunking status. -- :attr:`Guild.explicit_content_filter` to fetch the content filter. -- :attr:`Guild.shard_id` to get a guild's Shard ID if you're sharding. -- :attr:`Client.users` to get all visible :class:`User` instances. -- :meth:`Client.get_user` to get a :class:`User` by ID. -- :meth:`User.avatar_url_as` to get an avatar in a specific size or format. -- :meth:`Guild.vanity_invite` to fetch the guild's vanity invite. -- :meth:`Guild.audit_logs` to fetch the guild's audit logs. -- :attr:`Message.webhook_id` to fetch the message's webhook ID. -- :attr:`Message.activity` and :attr:`Message.application` for Rich Presence related information. -- :meth:`TextChannel.is_nsfw` to check if a text channel is NSFW. -- :meth:`Colour.from_rgb` to construct a :class:`Colour` from RGB tuple. -- :meth:`Guild.get_role` to get a role by its ID. - -.. _migrating_1_0_sending_messages: - -Sending Messages ------------------- - -One of the changes that were done was the merger of the previous ``Client.send_message`` and ``Client.send_file`` -functionality into a single method, :meth:`~abc.Messageable.send`. - -Basically: :: - - # before - await client.send_message(channel, 'Hello') - - # after - await channel.send('Hello') - -This supports everything that the old ``send_message`` supported such as embeds: :: - - e = discord.Embed(title='foo') - await channel.send('Hello', embed=e) - -There is a caveat with sending files however, as this functionality was expanded to support multiple -file attachments, you must now use a :class:`File` pseudo-namedtuple to upload a single file. :: - - # before - await client.send_file(channel, 'cool.png', filename='testing.png', content='Hello') - - # after - await channel.send('Hello', file=discord.File('cool.png', 'testing.png')) - -This change was to facilitate multiple file uploads: :: - - my_files = [ - discord.File('cool.png', 'testing.png'), - discord.File(some_fp, 'cool_filename.png'), - ] - - await channel.send('Your images:', files=my_files) - -.. _migrating_1_0_async_iter: - -Asynchronous Iterators ------------------------- - -Prior to v1.0, certain functions like ``Client.logs_from`` would return a different type if done in Python 3.4 or 3.5+. - -In v1.0, this change has been reverted and will now return a singular type meeting an abstract concept called -:class:`AsyncIterator`. - -This allows you to iterate over it like normal: :: - - async for message in channel.history(): - print(message) - -Or turn it into a list: :: - - messages = await channel.history().flatten() - for message in messages: - print(message) - -A handy aspect of returning :class:`AsyncIterator` is that it allows you to chain functions together such as -:meth:`AsyncIterator.map` or :meth:`AsyncIterator.filter`: :: - - async for m_id in channel.history().filter(lambda m: m.author == client.user).map(lambda m: m.id): - print(m_id) - -The functions passed to :meth:`AsyncIterator.map` or :meth:`AsyncIterator.filter` can be either coroutines or regular -functions. - -You can also get single elements a la :func:`discord.utils.find` or :func:`discord.utils.get` via -:meth:`AsyncIterator.get` or :meth:`AsyncIterator.find`: :: - - my_last_message = await channel.history().get(author=client.user) - -The following return :class:`AsyncIterator`: - -- :meth:`abc.Messageable.history` -- :meth:`Guild.audit_logs` -- :meth:`Reaction.users` - -.. _migrating_1_0_event_changes: - -Event Changes --------------- - -A lot of events have gone through some changes. - -Many events with ``server`` in the name were changed to use ``guild`` instead. - -Before: - -- ``on_server_join`` -- ``on_server_remove`` -- ``on_server_update`` -- ``on_server_role_create`` -- ``on_server_role_delete`` -- ``on_server_role_update`` -- ``on_server_emojis_update`` -- ``on_server_available`` -- ``on_server_unavailable`` - -After: - -- :func:`on_guild_join` -- :func:`on_guild_remove` -- :func:`on_guild_update` -- :func:`on_guild_role_create` -- :func:`on_guild_role_delete` -- :func:`on_guild_role_update` -- :func:`on_guild_emojis_update` -- :func:`on_guild_available` -- :func:`on_guild_unavailable` - - -The :func:`on_voice_state_update` event has received an argument change. - -Before: :: - - async def on_voice_state_update(before, after) - -After: :: - - async def on_voice_state_update(member, before, after) - -Instead of two :class:`Member` objects, the new event takes one :class:`Member` object and two :class:`VoiceState` objects. - -The :func:`on_guild_emojis_update` event has received an argument change. - -Before: :: - - async def on_guild_emojis_update(before, after) - -After: :: - - async def on_guild_emojis_update(guild, before, after) - -The first argument is now the :class:`Guild` that the emojis were updated from. - -The :func:`on_member_ban` event has received an argument change as well: - -Before: :: - - async def on_member_ban(member) - -After: :: - - async def on_member_ban(guild, user) - -As part of the change, the event can either receive a :class:`User` or :class:`Member`. To help in the cases that have -:class:`User`, the :class:`Guild` is provided as the first parameter. - -The ``on_channel_`` events have received a type level split (see :ref:`migrating_1_0_channel_split`). - -Before: - -- ``on_channel_delete`` -- ``on_channel_create`` -- ``on_channel_update`` - -After: - -- :func:`on_guild_channel_delete` -- :func:`on_guild_channel_create` -- :func:`on_guild_channel_update` -- :func:`on_private_channel_delete` -- :func:`on_private_channel_create` -- :func:`on_private_channel_update` - -The ``on_guild_channel_`` events correspond to :class:`abc.GuildChannel` being updated (i.e. :class:`TextChannel` -and :class:`VoiceChannel`) and the ``on_private_channel_`` events correspond to :class:`abc.PrivateChannel` being -updated (i.e. :class:`DMChannel` and :class:`GroupChannel`). - -.. _migrating_1_0_voice: - -Voice Changes ---------------- - -Voice sending has gone through a complete redesign. - -In particular: - -- Connection is done through :meth:`VoiceChannel.connect` instead of ``Client.join_voice_channel``. -- You no longer create players and operate on them (you no longer store them). -- You instead request :class:`VoiceClient` to play an :class:`AudioSource` via :meth:`VoiceClient.play`. -- There are different built-in :class:`AudioSource`\s. - - - :class:`FFmpegPCMAudio` is the equivalent of ``create_ffmpeg_player`` - -- create_ffmpeg_player/create_stream_player/create_ytdl_player have all been removed. - - - The goal is to create :class:`AudioSource` instead. - -- Using :meth:`VoiceClient.play` will not return an ``AudioPlayer``. - - - Instead, it's "flattened" like :class:`User` -> :class:`Member` is. - -- The ``after`` parameter now takes a single parameter (the error). - -Basically: - -Before: :: - - vc = await client.join_voice_channel(channel) - player = vc.create_ffmpeg_player('testing.mp3', after=lambda: print('done')) - player.start() - - player.is_playing() - player.pause() - player.resume() - player.stop() - # ... - -After: :: - - vc = await channel.connect() - vc.play(discord.FFmpegPCMAudio('testing.mp3'), after=lambda e: print('done', e)) - vc.is_playing() - vc.pause() - vc.resume() - vc.stop() - # ... - -With the changed :class:`AudioSource` design, you can now change the source that the :class:`VoiceClient` is -playing at runtime via :attr:`VoiceClient.source`. - -For example, you can add a :class:`PCMVolumeTransformer` to allow changing the volume: :: - - vc.source = discord.PCMVolumeTransformer(vc.source) - vc.source.volume = 0.6 - -An added benefit of the redesign is that it will be much more resilient towards reconnections: - -- The voice websocket will now automatically re-connect and re-do the handshake when disconnected. -- The initial connect handshake will now retry up to 5 times so you no longer get as many ``asyncio.TimeoutError``. -- Audio will now stop and resume when a disconnect is found. - - - This includes changing voice regions etc. - - -.. _migrating_1_0_wait_for: - -Waiting For Events --------------------- - -Prior to v1.0, the machinery for waiting for an event outside of the event itself was done through two different -functions, ``Client.wait_for_message`` and ``Client.wait_for_reaction``. One problem with one such approach is that it did -not allow you to wait for events outside of the ones provided by the library. - -In v1.0 the concept of waiting for another event has been generalised to work with any event as :meth:`Client.wait_for`. - -For example, to wait for a message: :: - - # before - msg = await client.wait_for_message(author=message.author, channel=message.channel) - - # after - def pred(m): - return m.author == message.author and m.channel == message.channel - - msg = await client.wait_for('message', check=pred) - -To facilitate multiple returns, :meth:`Client.wait_for` returns either a single argument, no arguments, or a tuple of -arguments. - -For example, to wait for a reaction: :: - - reaction, user = await client.wait_for('reaction_add', check=lambda r, u: u.id == 176995180300206080) - - # use user and reaction - -Since this function now can return multiple arguments, the ``timeout`` parameter will now raise a :exc:`asyncio.TimeoutError` -when reached instead of setting the return to ``None``. For example: - -.. code-block:: python3 - - def pred(m): - return m.author == message.author and m.channel == message.channel - - try: - - msg = await client.wait_for('message', check=pred, timeout=60.0) - except asyncio.TimeoutError: - await channel.send('You took too long...') - else: - await channel.send('You said {0.content}, {0.author}.'.format(msg)) - -Upgraded Dependencies ------------------------ - -Following v1.0 of the library, we've updated our requirements to :doc:`aiohttp ` v2.0 or higher. - -Since this is a backwards incompatible change, it is recommended that you see the -`changes `_ -and the :doc:`aio:migration_to_2xx` pages for details on the breaking changes in -:doc:`aiohttp `. - -Of the most significant for common users is the removal of helper functions such as: - -- ``aiohttp.get`` -- ``aiohttp.post`` -- ``aiohttp.delete`` -- ``aiohttp.patch`` -- ``aiohttp.head`` -- ``aiohttp.put`` -- ``aiohttp.request`` - -It is recommended that you create a session instead: :: - - async with aiohttp.ClientSession() as sess: - async with sess.get('url') as resp: - # work with resp - -Since it is better to not create a session for every request, you should store it in a variable and then call -``session.close`` on it when it needs to be disposed. - -Sharding ----------- - -The library has received significant changes on how it handles sharding and now has sharding as a first-class citizen. - -If using a Bot account and you want to shard your bot in a single process then you can use the :class:`AutoShardedClient`. - -This class allows you to use sharding without having to launch multiple processes or deal with complicated IPC. - -It should be noted that **the sharded client does not support user accounts**. This is due to the changes in connection -logic and state handling. - -Usage is as simple as doing: :: - - client = discord.AutoShardedClient() - -instead of using :class:`Client`. - -This will launch as many shards as your bot needs using the ``/gateway/bot`` endpoint, which allocates about 1000 guilds -per shard. - -If you want more control over the sharding you can specify ``shard_count`` and ``shard_ids``. :: - - # launch 10 shards regardless - client = discord.AutoShardedClient(shard_count=10) - - # launch specific shard IDs in this process - client = discord.AutoShardedClient(shard_count=10, shard_ids=(1, 2, 5, 6)) - -For users of the command extension, there is also :class:`~ext.commands.AutoShardedBot` which behaves similarly. - -Connection Improvements -------------------------- - -In v1.0, the auto reconnection logic has been powered up significantly. - -:meth:`Client.connect` has gained a new keyword argument, ``reconnect`` that defaults to ``True`` which controls -the reconnect logic. When enabled, the client will automatically reconnect in all instances of your internet going -offline or Discord going offline with exponential back-off. - -:meth:`Client.run` and :meth:`Client.start` gains this keyword argument as well, but for most cases you will not -need to specify it unless turning it off. - -.. _migrating_1_0_commands: - -Command Extension Changes --------------------------- - -Due to the :ref:`migrating_1_0_model_state` changes, some of the design of the extension module had to -undergo some design changes as well. - -Context Changes -~~~~~~~~~~~~~~~~~ - -In v1.0, the :class:`.Context` has received a lot of changes with how it's retrieved and used. - -The biggest change is that ``pass_context=True`` no longer exists, :class:`.Context` is always passed. Ergo: - -.. code-block:: python3 - - # before - @bot.command() - async def foo(): - await bot.say('Hello') - - # after - @bot.command() - async def foo(ctx): - await ctx.send('Hello') - -The reason for this is because :class:`~ext.commands.Context` now meets the requirements of :class:`abc.Messageable`. This -makes it have similar functionality to :class:`TextChannel` or :class:`DMChannel`. Using :meth:`~.Context.send` -will either DM the user in a DM context or send a message in the channel it was in, similar to the old ``bot.say`` -functionality. The old helpers have been removed in favour of the new :class:`abc.Messageable` interface. See -:ref:`migrating_1_0_removed_helpers` for more information. - -Since the :class:`~ext.commands.Context` is now passed by default, several shortcuts have been added: - -**New Shortcuts** - -- :attr:`ctx.author ` is a shortcut for ``ctx.message.author``. -- :attr:`ctx.guild ` is a shortcut for ``ctx.message.guild``. -- :attr:`ctx.channel ` is a shortcut for ``ctx.message.channel``. -- :attr:`ctx.me ` is a shortcut for ``ctx.message.guild.me`` or ``ctx.bot.user``. -- :attr:`ctx.voice_client ` is a shortcut for ``ctx.message.guild.voice_client``. - -**New Functionality** - -- :meth:`.Context.reinvoke` to invoke a command again. - - - This is useful for bypassing cooldowns. -- :attr:`.Context.valid` to check if a context can be invoked with :meth:`.Bot.invoke`. -- :meth:`.Context.send_help` to show the help command for an entity using the new :class:`~.ext.commands.HelpCommand` system. - - - This is useful if you want to show the user help if they misused a command. - -Subclassing Context -++++++++++++++++++++ - -In v1.0, there is now the ability to subclass :class:`~ext.commands.Context` and use it instead of the default -provided one. - -For example, if you want to add some functionality to the context: - -.. code-block:: python3 - - class MyContext(commands.Context): - @property - def secret(self): - return 'my secret here' - -Then you can use :meth:`~ext.commands.Bot.get_context` inside :func:`on_message` with combination with -:meth:`~ext.commands.Bot.invoke` to use your custom context: - -.. code-block:: python3 - - class MyBot(commands.Bot): - async def on_message(self, message): - ctx = await self.get_context(message, cls=MyContext) - await self.invoke(ctx) - -Now inside your commands you will have access to your custom context: - -.. code-block:: python3 - - @bot.command() - async def secret(ctx): - await ctx.send(ctx.secret) - -.. _migrating_1_0_removed_helpers: - -Removed Helpers -+++++++++++++++++ - -With the new :class:`.Context` changes, a lot of message sending helpers have been removed. - -For a full list of changes, see below: - -+-----------------+------------------------------------------------------------+ -| Before | After | -+-----------------+------------------------------------------------------------+ -| ``Bot.say`` | :meth:`.Context.send` | -+-----------------+------------------------------------------------------------+ -| ``Bot.upload`` | :meth:`.Context.send` | -+-----------------+------------------------------------------------------------+ -| ``Bot.whisper`` | ``ctx.author.send`` | -+-----------------+------------------------------------------------------------+ -| ``Bot.type`` | :meth:`.Context.typing` or :meth:`.Context.trigger_typing` | -+-----------------+------------------------------------------------------------+ -| ``Bot.reply`` | No replacement. | -+-----------------+------------------------------------------------------------+ - -Command Changes -~~~~~~~~~~~~~~~~~ - -As mentioned earlier, the first command change is that ``pass_context=True`` no longer -exists, so there is no need to pass this as a parameter. - -Another change is the removal of ``no_pm=True``. Instead, use the new :func:`~ext.commands.guild_only` built-in -check. - -The ``commands`` attribute of :class:`~ext.commands.Bot` and :class:`~ext.commands.Group` have been changed from a -dictionary to a set that does not have aliases. To retrieve the previous dictionary behaviour, use ``all_commands`` instead. - -Command instances have gained new attributes and properties: - -1. :attr:`~ext.commands.Command.signature` to get the signature of the command. -2. :attr:`~.Command.usage`, an attribute to override the default signature. -3. :attr:`~.Command.root_parent` to get the root parent group of a subcommand. - -For :class:`~ext.commands.Group` and :class:`~ext.commands.Bot` the following changed: - -- Changed :attr:`~.GroupMixin.commands` to be a :class:`set` without aliases. - - - Use :attr:`~.GroupMixin.all_commands` to get the old :class:`dict` with all commands. - -Check Changes -~~~~~~~~~~~~~~~ - -Prior to v1.0, :func:`~ext.commands.check`\s could only be synchronous. As of v1.0 checks can now be coroutines. - -Along with this change, a couple new checks were added. - -- :func:`~ext.commands.guild_only` replaces the old ``no_pm=True`` functionality. -- :func:`~ext.commands.is_owner` uses the :meth:`Client.application_info` endpoint by default to fetch owner ID. - - - This is actually powered by a different function, :meth:`~ext.commands.Bot.is_owner`. - - You can set the owner ID yourself by setting :attr:`.Bot.owner_id`. - -- :func:`~ext.commands.is_nsfw` checks if the channel the command is in is a NSFW channel. - - - This is powered by the new :meth:`TextChannel.is_nsfw` method. - -Event Changes -~~~~~~~~~~~~~~~ - -All command extension events have changed. - -Before: :: - - on_command(command, ctx) - on_command_completion(command, ctx) - on_command_error(error, ctx) - -After: :: - - on_command(ctx) - on_command_completion(ctx) - on_command_error(ctx, error) - -The extraneous ``command`` parameter in :func:`.on_command` and :func:`.on_command_completion` -have been removed. The :class:`~ext.commands.Command` instance was not kept up-to date so it was incorrect. In order to get -the up to date :class:`~ext.commands.Command` instance, use the :attr:`.Context.command` -attribute. - -The error handlers, either :meth:`.Command.error` or :func:`.on_command_error`, -have been re-ordered to use the :class:`~ext.commands.Context` as its first parameter to be consistent with other events -and commands. - -HelpFormatter and Help Command Changes -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The ``HelpFormatter`` class has been removed. It has been replaced with a :class:`~.commands.HelpCommand` class. This class now stores all the command handling and processing of the help command. - -The help command is now stored in the :attr:`.Bot.help_command` attribute. As an added extension, you can disable the help command completely by assigning the attribute to ``None`` or passing it at ``__init__`` as ``help_command=None``. - -The new interface allows the help command to be customised through special methods that can be overridden. - -- :meth:`.HelpCommand.send_bot_help` - - Called when the user requested for help with the entire bot. -- :meth:`.HelpCommand.send_cog_help` - - Called when the user requested for help with a specific cog. -- :meth:`.HelpCommand.send_group_help` - - Called when the user requested for help with a :class:`~.commands.Group` -- :meth:`.HelpCommand.send_command_help` - - Called when the user requested for help with a :class:`~.commands.Command` -- :meth:`.HelpCommand.get_destination` - - Called to know where to send the help messages. Useful for deciding whether to DM or not. -- :meth:`.HelpCommand.command_not_found` - - A function (or coroutine) that returns a presentable no command found string. -- :meth:`.HelpCommand.subcommand_not_found` - - A function (or coroutine) that returns a string when a subcommand is not found. -- :meth:`.HelpCommand.send_error_message` - - A coroutine that gets passed the result of :meth:`.HelpCommand.command_not_found` and :meth:`.HelpCommand.subcommand_not_found`. - - By default it just sends the message. But you can, for example, override it to put it in an embed. -- :meth:`.HelpCommand.on_help_command_error` - - The :ref:`error handler ` for the help command if you want to add one. -- :meth:`.HelpCommand.prepare_help_command` - - A coroutine that is called right before the help command processing is done. - -Certain subclasses can implement more customisable methods. - -The old ``HelpFormatter`` was replaced with :class:`~.commands.DefaultHelpCommand`\, which implements all of the logic of the old help command. The customisable methods can be found in the accompanying documentation. - -The library now provides a new more minimalistic :class:`~.commands.HelpCommand` implementation that doesn't take as much space, :class:`~.commands.MinimalHelpCommand`. The customisable methods can also be found in the accompanying documentation. - -A frequent request was if you could associate a help command with a cog. The new design allows for dynamically changing of cog through binding it to the :attr:`.HelpCommand.cog` attribute. After this assignment the help command will pretend to be part of the cog and everything should work as expected. When the cog is unloaded then the help command will be "unbound" from the cog. - -For example, to implement a :class:`~.commands.HelpCommand` in a cog, the following snippet can be used. - -.. code-block:: python3 - - class MyHelpCommand(commands.MinimalHelpCommand): - def get_command_signature(self, command): - return '{0.clean_prefix}{1.qualified_name} {1.signature}'.format(self, command) - - class MyCog(commands.Cog): - def __init__(self, bot): - self._original_help_command = bot.help_command - bot.help_command = MyHelpCommand() - bot.help_command.cog = self - - def cog_unload(self): - self.bot.help_command = self._original_help_command - -For more information, check out the relevant :ref:`documentation `. - -Cog Changes -~~~~~~~~~~~~~ - -Cogs have completely been revamped. They are documented in :ref:`ext_commands_cogs` as well. - -Cogs are now required to have a base class, :class:`~.commands.Cog` for future proofing purposes. This comes with special methods to customise some behaviour. - -* :meth:`.Cog.cog_unload` - - This is called when a cog needs to do some cleanup, such as cancelling a task. -* :meth:`.Cog.bot_check_once` - - This registers a :meth:`.Bot.check_once` check. -* :meth:`.Cog.bot_check` - - This registers a regular :meth:`.Bot.check` check. -* :meth:`.Cog.cog_check` - - This registers a check that applies to every command in the cog. -* :meth:`.Cog.cog_command_error` - - This is a special error handler that is called whenever an error happens inside the cog. -* :meth:`.Cog.cog_before_invoke` and :meth:`.Cog.cog_after_invoke` - - A special method that registers a cog before and after invoke hook. More information can be found in :ref:`migrating_1_0_before_after_hook`. - -Those that were using listeners, such as ``on_message`` inside a cog will now have to explicitly mark them as such using the :meth:`.commands.Cog.listener` decorator. - -Along with that, cogs have gained the ability to have custom names through specifying it in the class definition line. More options can be found in the metaclass that facilitates all this, :class:`.commands.CogMeta`. - -An example cog with every special method registered and a custom name is as follows: - -.. code-block:: python3 - - class MyCog(commands.Cog, name='Example Cog'): - def cog_unload(self): - print('cleanup goes here') - - def bot_check(self, ctx): - print('bot check') - return True - - def bot_check_once(self, ctx): - print('bot check once') - return True - - async def cog_check(self, ctx): - print('cog local check') - return await ctx.bot.is_owner(ctx.author) - - async def cog_command_error(self, ctx, error): - print('Error in {0.command.qualified_name}: {1}'.format(ctx, error)) - - async def cog_before_invoke(self, ctx): - print('cog local before: {0.command.qualified_name}'.format(ctx)) - - async def cog_after_invoke(self, ctx): - print('cog local after: {0.command.qualified_name}'.format(ctx)) - - @commands.Cog.listener() - async def on_message(self, message): - pass - - -.. _migrating_1_0_before_after_hook: - -Before and After Invocation Hooks -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Commands have gained new before and after invocation hooks that allow you to do an action before and after a command is -run. - -They take a single parameter, :class:`~ext.commands.Context` and they must be a coroutine. - -They are on a global, per-cog, or per-command basis. - -Basically: :: - - - # global hooks: - - @bot.before_invoke - async def before_any_command(ctx): - # do something before a command is called - pass - - @bot.after_invoke - async def after_any_command(ctx): - # do something after a command is called - pass - -The after invocation is hook always called, **regardless of an error in the command**. This makes it ideal for some error -handling or clean up of certain resources such a database connection. - -The per-command registration is as follows: :: - - @bot.command() - async def foo(ctx): - await ctx.send('foo') - - @foo.before_invoke - async def before_foo_command(ctx): - # do something before the foo command is called - pass - - @foo.after_invoke - async def after_foo_command(ctx): - # do something after the foo command is called - pass - -The special cog method for these is :meth:`.Cog.cog_before_invoke` and :meth:`.Cog.cog_after_invoke`, e.g.: - -.. code-block:: python3 - - class MyCog(commands.Cog): - async def cog_before_invoke(self, ctx): - ctx.secret_cog_data = 'foo' - - async def cog_after_invoke(self, ctx): - print('{0.command} is done...'.format(ctx)) - - @commands.command() - async def foo(self, ctx): - await ctx.send(ctx.secret_cog_data) - -To check if a command failed in the after invocation hook, you can use -:attr:`.Context.command_failed`. - -The invocation order is as follows: - -1. Command local before invocation hook -2. Cog local before invocation hook -3. Global before invocation hook -4. The actual command -5. Command local after invocation hook -6. Cog local after invocation hook -7. Global after invocation hook - -Converter Changes -~~~~~~~~~~~~~~~~~~~ - -Prior to v1.0, a converter was a type hint that could be a callable that could be invoked -with a singular argument denoting the argument passed by the user as a string. - -This system was eventually expanded to support a :class:`~ext.commands.Converter` system to -allow plugging in the :class:`~ext.commands.Context` and do more complicated conversions such -as the built-in "discord" converters. - -In v1.0 this converter system was revamped to allow instances of :class:`~ext.commands.Converter` derived -classes to be passed. For consistency, the :meth:`~ext.commands.Converter.convert` method was changed to -always be a coroutine and will now take the two arguments as parameters. - -Essentially, before: :: - - class MyConverter(commands.Converter): - def convert(self): - return self.ctx.message.server.me - -After: :: - - class MyConverter(commands.Converter): - async def convert(self, ctx, argument): - return ctx.me - -The command framework also got a couple new converters: - -- :class:`~ext.commands.clean_content` this is akin to :attr:`Message.clean_content` which scrubs mentions. -- :class:`~ext.commands.UserConverter` will now appropriately convert :class:`User` only. -- ``ChannelConverter`` is now split into two different converters. - - - :class:`~ext.commands.TextChannelConverter` for :class:`TextChannel`. - - :class:`~ext.commands.VoiceChannelConverter` for :class:`VoiceChannel`. +The full change list of 2.0 \ No newline at end of file diff --git a/docs/migrating_to_async.rst b/docs/migrating_to_async.rst deleted file mode 100644 index a705f72395..0000000000 --- a/docs/migrating_to_async.rst +++ /dev/null @@ -1,322 +0,0 @@ -:orphan: - -.. currentmodule:: discord - -.. _migrating-to-async: - -Migrating to v0.10.0 -====================== - -v0.10.0 is one of the biggest breaking changes in the library due to massive -fundamental changes in how the library operates. - -The biggest major change is that the library has dropped support to all versions prior to -Python 3.4.2. This was made to support :mod:`asyncio`, in which more detail can be seen -:issue:`in the corresponding issue <50>`. To reiterate this, the implication is that -**python version 2.7 and 3.3 are no longer supported**. - -Below are all the other major changes from v0.9.0 to v0.10.0. - -Event Registration --------------------- - -All events before were registered using :meth:`Client.event`. While this is still -possible, the events must be decorated with ``@asyncio.coroutine``. - -Before: - -.. code-block:: python3 - - @client.event - def on_message(message): - pass - -After: - -.. code-block:: python3 - - @client.event - @asyncio.coroutine - def on_message(message): - pass - -Or in Python 3.5+: - -.. code-block:: python3 - - @client.event - async def on_message(message): - pass - -Because there is a lot of typing, a utility decorator (:meth:`Client.async_event`) is provided -for easier registration. For example: - -.. code-block:: python3 - - @client.async_event - def on_message(message): - pass - - -Be aware however, that this is still a coroutine and your other functions that are coroutines must -be decorated with ``@asyncio.coroutine`` or be ``async def``. - -Event Changes --------------- - -Some events in v0.9.0 were considered pretty useless due to having no separate states. The main -events that were changed were the ``_update`` events since previously they had no context on what -was changed. - -Before: - -.. code-block:: python3 - - def on_channel_update(channel): pass - def on_member_update(member): pass - def on_status(member): pass - def on_server_role_update(role): pass - def on_voice_state_update(member): pass - def on_socket_raw_send(payload, is_binary): pass - - -After: - -.. code-block:: python3 - - def on_channel_update(before, after): pass - def on_member_update(before, after): pass - def on_server_role_update(before, after): pass - def on_voice_state_update(before, after): pass - def on_socket_raw_send(payload): pass - -Note that ``on_status`` was removed. If you want its functionality, use :func:`on_member_update`. -See :ref:`discord-api-events` for more information. Other removed events include ``on_socket_closed``, ``on_socket_receive``, and ``on_socket_opened``. - - -Coroutines ------------ - -The biggest change that the library went through is that almost every function in :class:`Client` -was changed to be a `coroutine `_. Functions -that are marked as a coroutine in the documentation must be awaited from or yielded from in order -for the computation to be done. For example... - -Before: - -.. code-block:: python3 - - client.send_message(message.channel, 'Hello') - -After: - -.. code-block:: python3 - - yield from client.send_message(message.channel, 'Hello') - - # or in python 3.5+ - await client.send_message(message.channel, 'Hello') - -In order for you to ``yield from`` or ``await`` a coroutine then your function must be decorated -with ``@asyncio.coroutine`` or ``async def``. - -Iterables ----------- - -For performance reasons, many of the internal data structures were changed into a dictionary to support faster -lookup. As a consequence, this meant that some lists that were exposed via the API have changed into iterables -and not sequences. In short, this means that certain attributes now only support iteration and not any of the -sequence functions. - -The affected attributes are as follows: - -- :attr:`Client.servers` -- :attr:`Client.private_channels` -- :attr:`Server.channels` -- :attr:`Server.members` - -Some examples of previously valid behaviour that is now invalid - -.. code-block:: python3 - - if client.servers[0].name == "test": - # do something - -Since they are no longer :obj:`list`\s, they no longer support indexing or any operation other than iterating. -In order to get the old behaviour you should explicitly cast it to a list. - -.. code-block:: python3 - - servers = list(client.servers) - # work with servers - -.. warning:: - - Due to internal changes of the structure, the order you receive the data in - is not in a guaranteed order. - -Enumerations ------------- - -Due to dropping support for versions lower than Python 3.4.2, the library can now use -:doc:`py:library/enum` in places where it makes sense. - -The common places where this was changed was in the server region, member status, and channel type. - -Before: - -.. code-block:: python3 - - server.region == 'us-west' - member.status == 'online' - channel.type == 'text' - -After: - -.. code-block:: python3 - - server.region == discord.ServerRegion.us_west - member.status = discord.Status.online - channel.type == discord.ChannelType.text - -The main reason for this change was to reduce the use of finicky strings in the API as this -could give users a false sense of power. More information can be found in the :ref:`discord-api-enums` page. - -Properties ------------ - -A lot of function calls that returned constant values were changed into Python properties for ease of use -in format strings. - -The following functions were changed into properties: - -+----------------------------------------+--------------------------------------+ -| Before | After | -+----------------------------------------+--------------------------------------+ -| ``User.avatar_url()`` | :attr:`User.avatar_url` | -+----------------------------------------+--------------------------------------+ -| ``User.mention()`` | :attr:`User.mention` | -+----------------------------------------+--------------------------------------+ -| ``Channel.mention()`` | :attr:`Channel.mention` | -+----------------------------------------+--------------------------------------+ -| ``Channel.is_default_channel()`` | :attr:`Channel.is_default` | -+----------------------------------------+--------------------------------------+ -| ``Role.is_everyone()`` | :attr:`Role.is_everyone` | -+----------------------------------------+--------------------------------------+ -| ``Server.get_default_role()`` | :attr:`Server.default_role` | -+----------------------------------------+--------------------------------------+ -| ``Server.icon_url()`` | :attr:`Server.icon_url` | -+----------------------------------------+--------------------------------------+ -| ``Server.get_default_channel()`` | :attr:`Server.default_channel` | -+----------------------------------------+--------------------------------------+ -| ``Message.get_raw_mentions()`` | :attr:`Message.raw_mentions` | -+----------------------------------------+--------------------------------------+ -| ``Message.get_raw_channel_mentions()`` | :attr:`Message.raw_channel_mentions` | -+----------------------------------------+--------------------------------------+ - -Member Management -------------------- - -Functions that involved banning and kicking were changed. - -+--------------------------------+--------------------------+ -| Before | After | -+--------------------------------+--------------------------+ -| ``Client.ban(server, user)`` | ``Client.ban(member)`` | -+--------------------------------+--------------------------+ -| ``Client.kick(server, user)`` | ``Client.kick(member)`` | -+--------------------------------+--------------------------+ - -.. migrating-renames: - -Renamed Functions -------------------- - -Functions have been renamed. - -+------------------------------------+-------------------------------------------+ -| Before | After | -+------------------------------------+-------------------------------------------+ -| ``Client.set_channel_permissions`` | :meth:`Client.edit_channel_permissions` | -+------------------------------------+-------------------------------------------+ - -All the :class:`Permissions` related attributes have been renamed and the `can_` prefix has been -dropped. So for example, ``can_manage_messages`` has become ``manage_messages``. - -Forced Keyword Arguments -------------------------- - -Since 3.0+ of Python, we can now force questions to take in forced keyword arguments. A keyword argument is when you -explicitly specify the name of the variable and assign to it, for example: ``foo(name='test')``. Due to this support, -some functions in the library were changed to force things to take said keyword arguments. This is to reduce errors of -knowing the argument order and the issues that could arise from them. - -The following parameters are now exclusively keyword arguments: - -- :meth:`Client.send_message` - - ``tts`` -- :meth:`Client.logs_from` - - ``before`` - - ``after`` -- :meth:`Client.edit_channel_permissions` - - ``allow`` - - ``deny`` - -In the documentation you can tell if a function parameter is a forced keyword argument if it is after ``\*,`` -in the function signature. - -.. _migrating-running: - -Running the Client --------------------- - -In earlier versions of discord.py, ``client.run()`` was a blocking call to the main thread -that called it. In v0.10.0 it is still a blocking call but it handles the event loop for you. -However, in order to do that you must pass in your credentials to :meth:`Client.run`. - -Basically, before: - -.. code-block:: python3 - - client.login('token') - client.run() - -After: - -.. code-block:: python3 - - client.run('token') - -.. warning:: - - Like in the older ``Client.run`` function, the newer one must be the one of - the last functions to call. This is because the function is **blocking**. Registering - events or doing anything after :meth:`Client.run` will not execute until the function - returns. - -This is a utility function that abstracts the event loop for you. There's no need for -the run call to be blocking and out of your control. Indeed, if you want control of the -event loop then doing so is quite straightforward: - -.. code-block:: python3 - - import discord - import asyncio - - client = discord.Client() - - @asyncio.coroutine - def main_task(): - yield from client.login('token') - yield from client.connect() - - loop = asyncio.get_event_loop() - try: - loop.run_until_complete(main_task()) - except: - loop.run_until_complete(client.logout()) - finally: - loop.close() - - - diff --git a/docs/quickstart.rst b/docs/quickstart.rst index 8b3daeb2ce..cc6e926e63 100644 --- a/docs/quickstart.rst +++ b/docs/quickstart.rst @@ -5,13 +5,13 @@ .. currentmodule:: discord Quickstart -============ +========== This page gives a brief introduction to the library. It assumes you have the library installed, if you don't check the :ref:`installing` portion. A Minimal Bot ---------------- +-------------- Let's make a bot that responds to a specific message and walk you through it. @@ -37,7 +37,7 @@ It looks something like this: client.run('your token here') -Let's name this file ``example_bot.py``. Make sure not to name it ``discord.py`` as that'll conflict +Let's name this file ``bot.py``. Make sure not to name it ``discord.py`` as that'll conflict with the library. There's a lot going on here, so let's walk you through it step by step. diff --git a/docs/whats_new.rst b/docs/whats_new.rst index d9b3e836fc..2af71dd119 100644 --- a/docs/whats_new.rst +++ b/docs/whats_new.rst @@ -11,6 +11,19 @@ Changelog This page keeps a detailed human friendly rendering of what's new and changed in specific versions. +.. _vp2p0p0: + +v2.0.0 +------ + +This does not Show Changes with discord.py 2.0, for a list go to :doc:`migrating` + +Bug Fixes +~~~~~~~~~ + +New Features +~~~~~~~~~~~~ + .. _vp1p7p3: v1.7.3 @@ -28,7 +41,7 @@ v1.7.2 ------- Bug Fixes -~~~~~~~~~~~ +~~~~~~~~~ - Fix ``fail_if_not_exists`` causing certain message references to not be usable within :meth:`abc.Messageable.send` and :meth:`Message.reply` (:issue:`6726`) - Fix :meth:`Guild.chunk` hanging when the user left the guild. (:issue:`6730`) @@ -820,368 +833,4 @@ Bug Fixes - Fix issue with speaking state being cast to ``int`` when it was invalid. - Fix some issues with loop cleanup that some users experienced on Linux machines. -- Fix voice handshake race condition (:issue:`2056`, :issue:`2063`) - -.. _vp1p0p0: - -v1.0.0 --------- - -The changeset for this version are too big to be listed here, for more information please -see :ref:`the migrating page `. - - -.. _vp0p16p6: - -v0.16.6 --------- - -Bug Fixes -~~~~~~~~~~ - -- Fix issue with :meth:`Client.create_server` that made it stop working. -- Fix main thread being blocked upon calling ``StreamPlayer.stop``. -- Handle HEARTBEAT_ACK and resume gracefully when it occurs. -- Fix race condition when pre-emptively rate limiting that caused releasing an already released lock. -- Fix invalid state errors when immediately cancelling a coroutine. - -.. _vp0p16p1: - -v0.16.1 --------- - -This release is just a bug fix release with some better rate limit implementation. - -Bug Fixes -~~~~~~~~~~~ - -- Servers are now properly chunked for user bots. -- The CDN URL is now used instead of the API URL for assets. -- Rate limit implementation now tries to use header information if possible. -- Event loop is now properly propagated (:issue:`420`) -- Allow falsey values in :meth:`Client.send_message` and :meth:`Client.send_file`. - -.. _vp0p16p0: - -v0.16.0 ---------- - -New Features -~~~~~~~~~~~~~~ - -- Add :attr:`Channel.overwrites` to get all the permission overwrites of a channel. -- Add :attr:`Server.features` to get information about partnered servers. - -Bug Fixes -~~~~~~~~~~ - -- Timeout when waiting for offline members while triggering :func:`on_ready`. - - - The fact that we did not timeout caused a gigantic memory leak in the library that caused - thousands of duplicate :class:`Member` instances causing big memory spikes. - -- Discard null sequences in the gateway. - - - The fact these were not discarded meant that :func:`on_ready` kept being called instead of - :func:`on_resumed`. Since this has been corrected, in most cases :func:`on_ready` will be - called once or twice with :func:`on_resumed` being called much more often. - -.. _vp0p15p1: - -v0.15.1 ---------- - -- Fix crash on duplicate or out of order reactions. - -.. _vp0p15p0: - -v0.15.0 --------- - -New Features -~~~~~~~~~~~~~~ - -- Rich Embeds for messages are now supported. - - - To do so, create your own :class:`Embed` and pass the instance to the ``embed`` keyword argument to :meth:`Client.send_message` or :meth:`Client.edit_message`. -- Add :meth:`Client.clear_reactions` to remove all reactions from a message. -- Add support for MESSAGE_REACTION_REMOVE_ALL event, under :func:`on_reaction_clear`. -- Add :meth:`Permissions.update` and :meth:`PermissionOverwrite.update` for bulk permission updates. - - - This allows you to use e.g. ``p.update(read_messages=True, send_messages=False)`` in a single line. -- Add :meth:`PermissionOverwrite.is_empty` to check if the overwrite is empty (i.e. has no overwrites set explicitly as true or false). - -For the command extension, the following changed: - -- ``Context`` is no longer slotted to facilitate setting dynamic attributes. - -.. _vp0p14p3: - -v0.14.3 ---------- - -Bug Fixes -~~~~~~~~~~~ - -- Fix crash when dealing with MESSAGE_REACTION_REMOVE -- Fix incorrect buckets for reactions. - -.. _v0p14p2: - -v0.14.2 ---------- - -New Features -~~~~~~~~~~~~~~ - -- :meth:`Client.wait_for_reaction` now returns a namedtuple with ``reaction`` and ``user`` attributes. - - This is for better support in the case that ``None`` is returned since tuple unpacking can lead to issues. - -Bug Fixes -~~~~~~~~~~ - -- Fix bug that disallowed ``None`` to be passed for ``emoji`` parameter in :meth:`Client.wait_for_reaction`. - -.. _v0p14p1: - -v0.14.1 ---------- - -Bug fixes -~~~~~~~~~~ - -- Fix bug with `Reaction` not being visible at import. - - This was also breaking the documentation. - -.. _v0p14p0: - -v0.14.0 --------- - -This update adds new API features and a couple of bug fixes. - -New Features -~~~~~~~~~~~~~ - -- Add support for Manage Webhooks permission under :attr:`Permissions.manage_webhooks` -- Add support for ``around`` argument in 3.5+ :meth:`Client.logs_from`. -- Add support for reactions. - - :meth:`Client.add_reaction` to add a reactions - - :meth:`Client.remove_reaction` to remove a reaction. - - :meth:`Client.get_reaction_users` to get the users that reacted to a message. - - :attr:`Permissions.add_reactions` permission bit support. - - Two new events, :func:`on_reaction_add` and :func:`on_reaction_remove`. - - :attr:`Message.reactions` to get reactions from a message. - - :meth:`Client.wait_for_reaction` to wait for a reaction from a user. - -Bug Fixes -~~~~~~~~~~ - -- Fix bug with Paginator still allowing lines that are too long. -- Fix the :attr:`Permissions.manage_emojis` bit being incorrect. - -.. _v0p13p0: - -v0.13.0 ---------- - -This is a backwards compatible update with new features. - -New Features -~~~~~~~~~~~~~ - -- Add the ability to manage emojis. - - - :meth:`Client.create_custom_emoji` to create new emoji. - - :meth:`Client.edit_custom_emoji` to edit an old emoji. - - :meth:`Client.delete_custom_emoji` to delete a custom emoji. -- Add new :attr:`Permissions.manage_emojis` toggle. - - - This applies for :class:`PermissionOverwrite` as well. -- Add new statuses for :class:`Status`. - - - :attr:`Status.dnd` (aliased with :attr:`Status.do_not_disturb`\) for Do Not Disturb. - - :attr:`Status.invisible` for setting your status to invisible (please see the docs for a caveat). -- Deprecate :meth:`Client.change_status` - - - Use :meth:`Client.change_presence` instead for better more up to date functionality. - - This method is subject for removal in a future API version. -- Add :meth:`Client.change_presence` for changing your status with the new Discord API change. - - - This is the only method that allows changing your status to invisible or do not disturb. - -Bug Fixes -~~~~~~~~~~ - -- Paginator pages do not exceed their max_size anymore (:issue:`340`) -- Do Not Disturb users no longer show up offline due to the new :class:`Status` changes. - -.. _v0p12p0: - -v0.12.0 ---------- - -This is a bug fix update that also comes with new features. - -New Features -~~~~~~~~~~~~~ - -- Add custom emoji support. - - - Adds a new class to represent a custom Emoji named :class:`Emoji` - - Adds a utility generator function, :meth:`Client.get_all_emojis`. - - Adds a list of emojis on a server, :attr:`Server.emojis`. - - Adds a new event, :func:`on_server_emojis_update`. -- Add new server regions to :class:`ServerRegion` - - - :attr:`ServerRegion.eu_central` and :attr:`ServerRegion.eu_west`. -- Add support for new pinned system message under :attr:`MessageType.pins_add`. -- Add order comparisons for :class:`Role` to allow it to be compared with regards to hierarchy. - - - This means that you can now do ``role_a > role_b`` etc to check if ``role_b`` is lower in the hierarchy. - -- Add :attr:`Server.role_hierarchy` to get the server's role hierarchy. -- Add :attr:`Member.server_permissions` to get a member's server permissions without their channel specific overwrites. -- Add :meth:`Client.get_user_info` to retrieve a user's info from their ID. -- Add a new ``Player`` property, ``Player.error`` to fetch the error that stopped the player. - - - To help with this change, a player's ``after`` function can now take a single parameter denoting the current player. -- Add support for server verification levels. - - - Adds a new enum called :class:`VerificationLevel`. - - This enum can be used in :meth:`Client.edit_server` under the ``verification_level`` keyword argument. - - Adds a new attribute in the server, :attr:`Server.verification_level`. -- Add :attr:`Server.voice_client` shortcut property for :meth:`Client.voice_client_in`. - - - This is technically old (was added in v0.10.0) but was undocumented until v0.12.0. - -For the command extension, the following are new: - -- Add custom emoji converter. -- All default converters that can take IDs can now convert via ID. -- Add coroutine support for ``Bot.command_prefix``. -- Add a method to reset command cooldown. - -Bug Fixes -~~~~~~~~~~ - -- Fix bug that caused the library to not work with the latest ``websockets`` library. -- Fix bug that leaked keep alive threads (:issue:`309`) -- Fix bug that disallowed :class:`ServerRegion` from being used in :meth:`Client.edit_server`. -- Fix bug in :meth:`Channel.permissions_for` that caused permission resolution to happen out of order. -- Fix bug in :attr:`Member.top_role` that did not account for same-position roles. - -.. _v0p11p0: - -v0.11.0 --------- - -This is a minor bug fix update that comes with a gateway update (v5 -> v6). - -Breaking Changes -~~~~~~~~~~~~~~~~~ - -- ``Permissions.change_nicknames`` has been renamed to :attr:`Permissions.change_nickname` to match the UI. - -New Features -~~~~~~~~~~~~~ - -- Add the ability to prune members via :meth:`Client.prune_members`. -- Switch the websocket gateway version to v6 from v5. This allows the library to work with group DMs and 1-on-1 calls. -- Add :attr:`AppInfo.owner` attribute. -- Add :class:`CallMessage` for group voice call messages. -- Add :class:`GroupCall` for group voice call information. -- Add :attr:`Message.system_content` to get the system message. -- Add the remaining VIP servers and the Brazil servers into :class:`ServerRegion` enum. -- Add ``stderr`` argument to :meth:`VoiceClient.create_ffmpeg_player` to redirect stderr. -- The library now handles implicit permission resolution in :meth:`Channel.permissions_for`. -- Add :attr:`Server.mfa_level` to query a server's 2FA requirement. -- Add :attr:`Permissions.external_emojis` permission. -- Add :attr:`Member.voice` attribute that refers to a :class:`VoiceState`. - - - For backwards compatibility, the member object will have properties mirroring the old behaviour. - -For the command extension, the following are new: - -- Command cooldown system with the ``cooldown`` decorator. -- ``UserInputError`` exception for the hierarchy for user input related errors. - -Bug Fixes -~~~~~~~~~~ - -- :attr:`Client.email` is now saved when using a token for user accounts. -- Fix issue when removing roles out of order. -- Fix bug where discriminators would not update. -- Handle cases where ``HEARTBEAT`` opcode is received. This caused bots to disconnect seemingly randomly. - -For the command extension, the following bug fixes apply: - -- ``Bot.check`` decorator is actually a decorator not requiring parentheses. -- ``Bot.remove_command`` and ``Group.remove_command`` no longer throw if the command doesn't exist. -- Command names are no longer forced to be ``lower()``. -- Fix a bug where Member and User converters failed to work in private message contexts. -- ``HelpFormatter`` now ignores hidden commands when deciding the maximum width. - -.. _v0p10p0: - -v0.10.0 -------- - -For breaking changes, see :ref:`migrating-to-async`. The breaking changes listed there will not be enumerated below. Since this version is rather a big departure from v0.9.2, this change log will be non-exhaustive. - -New Features -~~~~~~~~~~~~~ - -- The library is now fully ``asyncio`` compatible, allowing you to write non-blocking code a lot more easily. -- The library now fully handles 429s and unconditionally retries on 502s. -- A new command extension module was added but is currently undocumented. Figuring it out is left as an exercise to the reader. -- Two new exception types, :exc:`Forbidden` and :exc:`NotFound` to denote permission errors or 404 errors. -- Added :meth:`Client.delete_invite` to revoke invites. -- Added support for sending voice. Check :class:`VoiceClient` for more details. -- Added :meth:`Client.wait_for_message` coroutine to aid with follow up commands. -- Added :data:`version_info` named tuple to check version info of the library. -- Login credentials are now cached to have a faster login experience. You can disable this by passing in ``cache_auth=False`` - when constructing a :class:`Client`. -- New utility function, :func:`discord.utils.get` to simplify retrieval of items based on attributes. -- All data classes now support ``!=``, ``==``, ``hash(obj)`` and ``str(obj)``. -- Added :meth:`Client.get_bans` to get banned members from a server. -- Added :meth:`Client.invites_from` to get currently active invites in a server. -- Added :attr:`Server.me` attribute to get the :class:`Member` version of :attr:`Client.user`. -- Most data classes now support a ``hash(obj)`` function to allow you to use them in ``set`` or ``dict`` classes or subclasses. -- Add :meth:`Message.clean_content` to get a text version of the content with the user and channel mentioned changed into their names. -- Added a way to remove the messages of the user that just got banned in :meth:`Client.ban`. -- Added :meth:`Client.wait_until_ready` to facilitate easy creation of tasks that require the client cache to be ready. -- Added :meth:`Client.wait_until_login` to facilitate easy creation of tasks that require the client to be logged in. -- Add :class:`discord.Game` to represent any game with custom text to send to :meth:`Client.change_status`. -- Add :attr:`Message.nonce` attribute. -- Add :meth:`Member.permissions_in` as another way of doing :meth:`Channel.permissions_for`. -- Add :meth:`Client.move_member` to move a member to another voice channel. -- You can now create a server via :meth:`Client.create_server`. -- Added :meth:`Client.edit_server` to edit existing servers. -- Added :meth:`Client.server_voice_state` to server mute or server deafen a member. -- If you are being rate limited, the library will now handle it for you. -- Add :func:`on_member_ban` and :func:`on_member_unban` events that trigger when a member is banned/unbanned. - -Performance Improvements -~~~~~~~~~~~~~~~~~~~~~~~~~ - -- All data classes now use ``__slots__`` which greatly reduce the memory usage of things kept in cache. -- Due to the usage of ``asyncio``, the CPU usage of the library has gone down significantly. -- A lot of the internal cache lists were changed into dictionaries to change the ``O(n)`` lookup into ``O(1)``. -- Compressed READY is now on by default. This means if you're on a lot of servers (or maybe even a few) you would - receive performance improvements by having to download and process less data. -- While minor, change regex from ``\d+`` to ``[0-9]+`` to avoid unnecessary unicode character lookups. - -Bug Fixes -~~~~~~~~~~ - -- Fix bug where guilds being updated did not edit the items in cache. -- Fix bug where ``member.roles`` were empty upon joining instead of having the ``@everyone`` role. -- Fix bug where :meth:`Role.is_everyone` was not being set properly when the role was being edited. -- :meth:`Client.logs_from` now handles cases where limit > 100 to sidestep the discord API limitation. -- Fix bug where a role being deleted would trigger a ``ValueError``. -- Fix bug where :meth:`Permissions.kick_members` and :meth:`Permissions.ban_members` were flipped. -- Mentions are now triggered normally. This was changed due to the way discord handles it internally. -- Fix issue when a :class:`Message` would attempt to upgrade a :attr:`Message.server` when the channel is - a :class:`Object`. -- Unavailable servers were not being added into cache, this has been corrected. \ No newline at end of file +- Fix voice handshake race condition (:issue:`2056`, :issue:`2063`) \ No newline at end of file From fa2b7d85b8d29988e65d44a52ad36835e6ade36e Mon Sep 17 00:00:00 2001 From: Vincent Date: Tue, 30 Nov 2021 16:41:55 +0800 Subject: [PATCH 045/180] Fixing Some Stuff --- discord/cog.py | 3 ++- docs/conf.py | 1 - 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/discord/cog.py b/discord/cog.py index 4a4301d05b..fe2e46fff3 100644 --- a/discord/cog.py +++ b/discord/cog.py @@ -1,7 +1,8 @@ """ The MIT License (MIT) -Copyright (c) 2015-present Rapptz +Copyright (c) 2015-2021 Rapptz +Copyright (c) 2021-present Pycord Development Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), diff --git a/docs/conf.py b/docs/conf.py index f5dd030042..61a3a29f6b 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -145,7 +145,6 @@ # Nitpicky mode options nitpick_ignore_files = [ - "migrating_to_async", "migrating", "whats_new", ] From 40c568ecd70e667b4027f5445ca697b5726016c7 Mon Sep 17 00:00:00 2001 From: Lala Sabathil Date: Tue, 30 Nov 2021 09:45:03 +0100 Subject: [PATCH 046/180] Update examples/views/button_roles.py Co-authored-by: RPS --- examples/views/button_roles.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/views/button_roles.py b/examples/views/button_roles.py index 55641de790..128cc1cfd0 100644 --- a/examples/views/button_roles.py +++ b/examples/views/button_roles.py @@ -29,7 +29,7 @@ async def callback(self, interaction: discord.Interaction): Parameters ---------- interaction : discord.Interaction - The interaction object that was created when the user clicked on the button. + The interaction object that was created when a user clicks on a button. """ # Figure out who clicked the button. From ebbbbe87c5acf0b881764b7e93d5d89bde437270 Mon Sep 17 00:00:00 2001 From: Vincent Date: Tue, 30 Nov 2021 17:03:33 +0800 Subject: [PATCH 047/180] Remove d.py logo --- docs/images/discord_py_logo.ico | Bin 270398 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 docs/images/discord_py_logo.ico diff --git a/docs/images/discord_py_logo.ico b/docs/images/discord_py_logo.ico deleted file mode 100644 index 209ba4ef2da01a08136894967c5bffaec58698cd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 270398 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 v>N8NEf%**8XP`a<^% Date: Tue, 30 Nov 2021 17:32:36 +0800 Subject: [PATCH 048/180] Changed Styling --- docs/_static/copy.js | 6 +++--- docs/_static/style.css | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/_static/copy.js b/docs/_static/copy.js index f70e3d67ad..e1317810a2 100644 --- a/docs/_static/copy.js +++ b/docs/_static/copy.js @@ -9,7 +9,7 @@ const copy = async (obj) => { icon.textContent = COPIED; setTimeout(() => (icon.textContent = COPY), 2500); }, - (r) => alert('Could not copy codeblock:\n' + r.toString()) + (r) => alert('Could not copy the codeblock:\n' + r.toString()) ); }; @@ -21,8 +21,8 @@ document.addEventListener("DOMContentLoaded", () => { let copyEl = document.createElement("span"); copyEl.addEventListener('click', () => copy(codeblock)); copyEl.className = "copy"; - copyEl.setAttribute("aria-label", "Copy Code"); - copyEl.setAttribute("title", "Copy Code"); + copyEl.setAttribute("aria-label", "Copy This Code"); + copyEl.setAttribute("title", "Copy This Code"); let copyIcon = document.createElement("span"); copyIcon.className = "material-icons"; diff --git a/docs/_static/style.css b/docs/_static/style.css index e1d218b308..e4301051a3 100644 --- a/docs/_static/style.css +++ b/docs/_static/style.css @@ -30,8 +30,8 @@ Historically however, thanks to: --grey-4: #b1b1b3; --grey-5: #737373; --grey-6: #4a4a4f; - --grey-7: #38383d; - --grey-8: #2a2a2e; + --grey-7: #2a2a2b; + --grey-8: #1e1e1f; --black: #0c0c0d; --blue-1: #3399ff; From bf2a19a2ac13f0f748fdc0fd17355e1daac288a4 Mon Sep 17 00:00:00 2001 From: Vincent Date: Tue, 30 Nov 2021 18:03:21 +0800 Subject: [PATCH 049/180] Having stuff on Migrating: 2.0 --- .readthedocs.yml | 2 +- docs/migrating.rst | 67 +++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 67 insertions(+), 2 deletions(-) diff --git a/.readthedocs.yml b/.readthedocs.yml index f67ef52689..b12d1ab002 100644 --- a/.readthedocs.yml +++ b/.readthedocs.yml @@ -10,7 +10,7 @@ sphinx: builder: html python: - version: 3.8 + version: "3.8" install: - method: pip path: . diff --git a/docs/migrating.rst b/docs/migrating.rst index e7af8cb92a..db463508fb 100644 --- a/docs/migrating.rst +++ b/docs/migrating.rst @@ -5,4 +5,69 @@ Migrating to 2.0 ================= -The full change list of 2.0 \ No newline at end of file +The full change list of 2.0 + + +Significant Changes +------------------- + +- `on_socket_response` Was Removed + + +Webhook +------- +Webhooks in discord.py V2 have been overhauled + +`webhook_update` now uses guild info from the gateway + + + +User API +-------- + +Anything allowing you to Use user Account's have been removed + +The following Classes Were Deleted in addendum + +`Profile`, `Relationship`, `CallMessage`, `GroupCall`, + +`RelationshipType`, `HypeSquadHouse`, `PremiumType`, `UserContentFilter`, `FriendFlags`, `Theme`, + +`GroupChannel.add_recipients`, `remove_recipients` + +`Guild.ack` + +`Client.fetch_user_profile`` + +`Message.call` & `ack` + +`ClientUser.email`, `premium`, `premium_type`, `get_relationship`, `relationships`, `friends`, `blocked`, `create_group`, `edit_settings`` + +Every `ClientUser.edit()` `password`, `new_password`, `email`, `house arguments` + +`User.relationship`, `mutual_friends`, `is_friend`, `is_blocked`, `block`, `unblock`, `remove_friend`, `send_friend_request`, `profile`` + + +SpeedUps +-------- +The library has significantly improved in speed since v1.7.x +Some Speed results are shown below: + ++-------------------------------+----------------------------------+----------------------------------+ +| Testsetup | boot up before | boot up now | ++-------------------------------+----------------------------------+----------------------------------+ +| 735 guilds (with chunking) | 57s/1.7 GiB RAM | 42s/1.4 GiB RAM | ++-------------------------------+----------------------------------+----------------------------------+ +| 27k guilds (with chunking) | 477s/8 GiB RAM | 303s/7.2 GiB | ++-------------------------------+----------------------------------+----------------------------------+ +| 48k guilds (without chunking) | 109s | 67s | ++-------------------------------+----------------------------------+----------------------------------+ +| 106k guilds (without chunking)| 3300s | 3090s | ++-------------------------------+----------------------------------+----------------------------------+ + +.. note:: + + Performance May Differ with Computer/Server specs and location + +- The public API should be completely type-hinted +- Almost all ``edit`` methods now return their updated counterpart rather than doing an in-place edit \ No newline at end of file From 471471cab016a5ceb5bcff49493669a5796deb73 Mon Sep 17 00:00:00 2001 From: Vincent Date: Tue, 30 Nov 2021 18:12:56 +0800 Subject: [PATCH 050/180] Fix --- docs/_static/style.css | 2 +- docs/migrating.rst | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/_static/style.css b/docs/_static/style.css index e4301051a3..b083fecdb2 100644 --- a/docs/_static/style.css +++ b/docs/_static/style.css @@ -28,7 +28,7 @@ Historically however, thanks to: --grey-2: #ededf0; --grey-3: #d7d7db; --grey-4: #b1b1b3; - --grey-5: #737373; + --grey-5: #2a2a2b; --grey-6: #4a4a4f; --grey-7: #2a2a2b; --grey-8: #1e1e1f; diff --git a/docs/migrating.rst b/docs/migrating.rst index db463508fb..0bb900bb4c 100644 --- a/docs/migrating.rst +++ b/docs/migrating.rst @@ -69,5 +69,5 @@ Some Speed results are shown below: Performance May Differ with Computer/Server specs and location -- The public API should be completely type-hinted -- Almost all ``edit`` methods now return their updated counterpart rather than doing an in-place edit \ No newline at end of file +- The public API is completely type-hinted +- Most ``edit`` methods now return their updated counterpart rather than doing an in-place edit \ No newline at end of file From e6a2d83d71b896de97917e00cfaad61d38254b46 Mon Sep 17 00:00:00 2001 From: Vincent Date: Tue, 30 Nov 2021 18:17:59 +0800 Subject: [PATCH 051/180] Fixing --- docs/migrating.rst | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/docs/migrating.rst b/docs/migrating.rst index 0bb900bb4c..933cb5d916 100644 --- a/docs/migrating.rst +++ b/docs/migrating.rst @@ -29,23 +29,23 @@ Anything allowing you to Use user Account's have been removed The following Classes Were Deleted in addendum -`Profile`, `Relationship`, `CallMessage`, `GroupCall`, +``Profile``, ``Relationship``, ``CallMessage``, ``GroupCall``, -`RelationshipType`, `HypeSquadHouse`, `PremiumType`, `UserContentFilter`, `FriendFlags`, `Theme`, +``RelationshipType``, ``HypeSquadHouse```, ``PremiumType``, ``UserContentFilter``, ``FriendFlags``, ``Theme``, -`GroupChannel.add_recipients`, `remove_recipients` +``GroupChannel.add_recipients``, ``remove_recipients`` -`Guild.ack` +``Guild.ack`` -`Client.fetch_user_profile`` +``Client.fetch_user_profile`` -`Message.call` & `ack` +``Message.call`` & ``ack`` -`ClientUser.email`, `premium`, `premium_type`, `get_relationship`, `relationships`, `friends`, `blocked`, `create_group`, `edit_settings`` +``ClientUser.email``, ``premium``, ``premium_type``, ``get_relationship``, ``relationships```, ``friends``, ``blocked``, ``create_group``, ``edit_settings`` -Every `ClientUser.edit()` `password`, `new_password`, `email`, `house arguments` +Every ``ClientUser.edit()`` ``password``, ``new_password``, ``email``, ``house arguments`` -`User.relationship`, `mutual_friends`, `is_friend`, `is_blocked`, `block`, `unblock`, `remove_friend`, `send_friend_request`, `profile`` +``User.relationship``, ``mutual_friends``, ``is_friend``, ``is_blocked``, ``block``, ``unblock``, ``remove_friend``, ``send_friend_request``, ``profile`` SpeedUps From 0d4eabd98dcb838a7289d4c4319a33eba37761f7 Mon Sep 17 00:00:00 2001 From: Vincent Date: Tue, 30 Nov 2021 18:38:42 +0800 Subject: [PATCH 052/180] Adding Some Stuff To Changelog --- docs/whats_new.rst | 18 ++++++++++++++++-- 1 file changed, 16 insertions(+), 2 deletions(-) diff --git a/docs/whats_new.rst b/docs/whats_new.rst index 2af71dd119..c1faec293c 100644 --- a/docs/whats_new.rst +++ b/docs/whats_new.rst @@ -18,12 +18,26 @@ v2.0.0 This does not Show Changes with discord.py 2.0, for a list go to :doc:`migrating` -Bug Fixes -~~~~~~~~~ +Fixes/Removals +~~~~~~~~~~~~~~ + +- Pycord doesn't check for duplicate files anymore (:issue:`333`) +- + New Features ~~~~~~~~~~~~ +- Application Command Support Added :class:`slash_command` :class:`message_command` & :class:`user_command` + +.. note:: + + These Classes Are Aliased Versions Of :class:`ApplicationCommand` :class:`UserCommand` & :class:`MessageCommand` + +- Application Has it's own Context :class:`ApplicationContext` +- Autocomplete Has it's own Context :class:`AutocompleteContext` + + .. _vp1p7p3: v1.7.3 From 1c27d183cc34633455546c64e9b5ce0291310293 Mon Sep 17 00:00:00 2001 From: Vincent Date: Tue, 30 Nov 2021 18:50:02 +0800 Subject: [PATCH 053/180] Make some fixes --- docs/migrating.rst | 5 ++++- docs/whats_new.rst | 11 +++++++++-- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/docs/migrating.rst b/docs/migrating.rst index 933cb5d916..a9f42ef040 100644 --- a/docs/migrating.rst +++ b/docs/migrating.rst @@ -70,4 +70,7 @@ Some Speed results are shown below: Performance May Differ with Computer/Server specs and location - The public API is completely type-hinted -- Most ``edit`` methods now return their updated counterpart rather than doing an in-place edit \ No newline at end of file +- Most ``edit`` methods now return their updated counterpart rather than doing an in-place edit + +Miscellaneous +------------- \ No newline at end of file diff --git a/docs/whats_new.rst b/docs/whats_new.rst index c1faec293c..5db834775a 100644 --- a/docs/whats_new.rst +++ b/docs/whats_new.rst @@ -28,16 +28,23 @@ Fixes/Removals New Features ~~~~~~~~~~~~ -- Application Command Support Added :class:`slash_command` :class:`message_command` & :class:`user_command` +- Application Command Support Added :meth:`slash_command` :func:`message_command` & :func:`user_command` .. note:: - These Classes Are Aliased Versions Of :class:`ApplicationCommand` :class:`UserCommand` & :class:`MessageCommand` + These Classes Are Aliased Versions Of :func:`ApplicationCommand` :func:`UserCommand` & :func:`MessageCommand` - Application Has it's own Context :class:`ApplicationContext` - Autocomplete Has it's own Context :class:`AutocompleteContext` +Miscellaneous +~~~~~~~~~~~~~ + +- Userbots Were Removed +- ``on_socket_response`` Was Removed for performance reasons + + .. _vp1p7p3: v1.7.3 From 5f96343f9f180b701b926d12d53693c0c7549ed0 Mon Sep 17 00:00:00 2001 From: RPS Date: Tue, 30 Nov 2021 02:52:30 -0800 Subject: [PATCH 054/180] Adding Docs workflow --- .github/workflows/docs.yml | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) create mode 100644 .github/workflows/docs.yml diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 0000000000..fd9fc9498a --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,24 @@ +name: Docs + +on: [push, pull_request] + +jobs: + docs: + runs-on: ubuntu-latest + strategy: + matrix: + python-version: [ 3.8 ] + steps: + - uses: actions/checkout@v2 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v2 + with: + python-version: ${{ matrix.python-version }} + - name: Install dependencies + run: | + python -m pip install --upgrade pip + pip install sphinx sphinxcontrib-trio aiohttp sphinxcontrib-websupport + - name: Compile to html + run: | + cd docs + make html From 1b731ec4f09634afbfefadfe8f73a316d727ed34 Mon Sep 17 00:00:00 2001 From: Vincent Date: Tue, 30 Nov 2021 19:48:14 +0800 Subject: [PATCH 055/180] Replacing Images With Updated Ones --- docs/images/discord_bot_tab.png | Bin 9430 -> 7364 bytes docs/images/discord_bot_user_options.png | Bin 48479 -> 58865 bytes docs/images/discord_create_app_button.png | Bin 1580 -> 1649 bytes docs/images/discord_create_app_form.png | Bin 12216 -> 26195 bytes docs/images/discord_create_bot_user.png | Bin 16587 -> 14150 bytes docs/images/discord_oauth2.png | Bin 29649 -> 36438 bytes docs/images/discord_oauth2_perms.png | Bin 52706 -> 67310 bytes docs/images/discord_oauth2_scope.png | Bin 31714 -> 35400 bytes docs/images/discord_privileged_intents.png | Bin 51849 -> 66435 bytes 9 files changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/images/discord_bot_tab.png b/docs/images/discord_bot_tab.png index 835682448e3fc42afb5a6480b12e9c559e04acdc..73cad56d463fc1b4f1802cee6243fe611fbf6629 100644 GIT binary patch literal 7364 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 literal 9430 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 diff --git a/docs/images/discord_bot_user_options.png b/docs/images/discord_bot_user_options.png index 4091bd88e0043121f99b8afbaee51f8b02ca0e62..03b248d65acb6182b8a5522c2227616a15e8f872 100644 GIT binary patch literal 58865 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

ii#qTfPUtWjxN zjP+-`joB%END)ez%AxqBd!P!`gP~H^zV*bQI|Ox6<<8)PcHjsQkxS{4va5n~hq1&5 znc;Zw!ei!>a?)kwF$U;*XJF!IBFlcX`%S@^u`&xTn>6+fFrUR|9WD z$O<@ET5D=dCbK0hBl-?q(8&es+S)`uaDCuqW##1jT~dM-k2VAAhV0aZP|@6sBGhsd zsaXEZ{)ws|3oCArj5szueR^t2`M$e1pNrTvC&wToW2l75(a~{{DNlB7ZA}&vS~Yoo zKIzW`|7i5!AR{h0o@3K0JUqN^1uHdmZb1PN7h)cT1{ps4{L^m2Y)HtHKP-wW4a9GC z1%A~kTRH7-Rg#m7ijIl`#01g#Q+FLmJr$Gv)m2hb0%_qlU@>CQdn!0<7}|?YOW<*G za>f$ywthYRinWC$H#8(z!OFn_9TnmRnzx3lGbtA3W?^Y9D1hISaF>!9fLfH}nBs7C zt!K0~e1ob3NtxsR`qJ6y&s;xz>SU%6f%^^LACj!>Y;V(0(-_#_cS6Iu3RbLJ+u2zY zLb5#;VN!&kA-jO6#LUb%%&f(wCFnTG4^(X5sWr-BLf2PU;rNm&cJp^t+n_(5+-2XL zm7mxF!k}SM>xj_+GiPV4E_}ND^t`-u9}TK7&|*TZiy3Z}6y?K_Fa~Uc6w#hkY3*xL zoSm*FiLGlE7d@mT@Cl)+hpI1fa;t*TTL1<2b>Zhy~4ax(ZvXfn1 zUy&(~;yrgtNGh%sCd|$b4kB?budGxbj>>2p*ID-@71EcVSbqhGnFmqlb_Rk0bKs+? zSwf)Bfd<#~P`14MZ{0CQ=dSE7LS{mzQ?k5=x}4*9KER>St1-UKXG4kb8av2{k2jQ8Y}`XVO0O0ASn%Z zK0#tLKvt~P$qENS_V){!7)l|R^q6ZZ;iG`@?p*)i;>rem8o!Ipt^<~sg$hkZM||fj zWyyZL3FHz9qdR^{F9xFqp?P#vYZ9{=$&8ALL-7x=4oJ%p_>;K9bM=jN6hW9P?<3q zvzw2rXv~t4lM{j|3b!5JEv`BeLtau@Zg*@gd0D;FFSXY0a~wxw5esjpT$6OVR{Le* z%wSN>nzd^}uz4j6UcPK=> z>O3|?XMsfvJ)&pauBIY=p9$O3czr&+_zoh=z^EVdrn#T4`rgQX{=-3f%-;-Hv26lQ zO)maWmT(D@K$$F(M3m3oCXPb4hz<{zLj4i))O-|bvAxYZ z+lrC(X>ZdXcBR3-FC;{Z^gZ5fN0M@7&2r{#+s8UxT;P>D0h(^=05}yw=)EW=!QW`V z6iE(-US8B;i&K!ieQJny1DNRmw94>EuntsxBqfuVf=+Rth&dZvuPwbAs|p(s0uj*x z;#6O3K7VHF*U{GIBO@fVw6U>KPOi<#fkxo!Z)Mkgu|~=z+D&ZAuRu>ou-j-~+i^78 zNy&&u<*>K62cfv6t~XoY{K_x=jeYDe zi@UbAjKS9oWfEdMoWOu==*b1c7^{)LVuZ($e6t5tp74c^Ig4F<+slx|x!~e^WMjolobPbv_A+ zKNVlW=oG#9rA?41SkT%k{P82%M~v$D&V2Sv!EajHg+{;lSqn{VWdd%2r`uj zFDj9?D1$y6hpmEw0tP8#h;+c?VGq=$7dufvAnXptaeE3&7qy~CIj%sHCvTecq=FM2 znls@S3VN=FT-mYXOCY$~+}NaBFnB65A?O3$Loy4rDsg#@Iq}7=3?^zsNXaK=LOy=@ zSjurz*eEDj3X@nN(IG+VACHk5gJe`DU7O{xxN_+T2gqoVSTVi)nJ?;}d<@V~K-zlE zl|$z03B;+qjoc=W=%`%0JbcvDD1q#-s0ehl^gmIk&W`dXP+!E0I zgIA%#0`|}o3*aU3WAD;eSE(dXO+-zH#Gy>OlqSX|1`5ez#bLf>)5>n_IUyyx@PlWN z=>jY06XQPU4kjlF|Clr#1Z3(|3krsHX{xd#?YXq1vv*8J>imtRjHJ~iH;*FpKM;en z3T}>#tVS#nT?CLZeGI-8Htj{C4TX}0{-Wyp1_i)NUMZQeH948I2YRT>ZsAPDVXfLX zA{MciR?BIlER0#hVk;rRIR2EEuNnI(8y+6g!zs@01@oTgNr_x%5lhcYg9{zF*rEv%4(_EQ=uR~M z@c78?UTt675P(FiKxr*drS*&w6)I4P?fzZ2V*#IzKm;4I*p+ewJF~%xyQH zb8C)8FD#OhSI&8jgU_Xm)GcWE%u)<5A24lN6eie#4CpejwX$;-TFiAQlx~s9wZAS zhpw$}N(JD}YUZeVh}hqt4C6Cm?}QgR2+(rL5MnN#b@_XSV=*cEj>5et{0JodnZtI* zn|cuCKP?FkhLc4Rr2rG9#faD_@$}=&^F(O{dTe1~oqqkA0;L08eF;f!2)_+V4~G8u zo|l_vf};89lbHcdUDzsZ4?sm;*-u>Hev2@_ddyMab(i zX*6j>75d#?2@Nk9z)0Io8Qhys%O4;Bxd;wMi+@R7M9v# zNI_gE^j_(*`MLS-6c7$_ zSgfMSk|dV9-3rQ5o)GFU%7HG?OFD-54=XOx4LQ(w!$(KVk%CRsleHBU6$obhA#l?& zl(SeC01VWDb$BP3nbziJVs8oVWO-?OeCi)vnD}^j@bP4N)SPdydjvUjVQV0Sl<)8D zZ7KYOuH?x=LHA~{lNuDGm%--|AW-A7QgcqT z+R@QbCrrweuFln)t?=R^6s;G7$K{v?Og4BUP z_f8f`7J#o^gQ{nWH6sSf51VLpYOKiV#YKKx*vDZyb+Z(#un&nS+{DWanpHhiUPO9C ziX2`f{76nxqSZ&axkGuGOiU$<+u3!p_%NjSeBRziAWv{RrZ+g!w7WVs6#= znQO4EKqvi_*Oer){~$#tRKm(iM$&*xi%-WAD^86!tv)BmUs;V)K$=QmN#NthkCTy* zGPN`N0~3=(YA}=(nHu~kd;-pKuqJb@?nfOuweFL2;R5yb^>yV1VzCJmqVTAw^P>}M zTiXDPB)jsiYWAQC5sn@9Q$#dk013`?luOn%3`O3qDwc)ZqE`6d7C;i4 z4+>T?i1@*?b#)<62<3e`RS+ys6=;_}HBKMT#4L!QMIQ;Q!+@jtAjBXbfb2iyqcxtK zC6kE;nwxZ7G!^&4ifH(VBECYAWlf=phMq1x(;W+3n@Vv5lX>RU9TKH32`u5)!q3Uz z{?HnutJlgoslKg|8>V2Vq@u!ljd;q%>FJ@F+${Fh`w}s8Myjg%BWffk5OMNkQage4 z5EcJNuokI3H%wCPNjm9CF7t2<$_mVH{2i7fR8Owd=3pHZO?)&uecU-?oDh{zQsta4 zs=Da~J8r67lsEjnP;$`e!1*PCCY!^(YsbG3$EFF?>VPzrtBMzP{Hz1b3CLyg^ zi4hwh1X%6?D@^gr;?%n&OfCrI4-+xsp~!hhmyN;yj;V?DaO ztgEp(9za+_DO@asj|fnR^oNE;l*l>MP|%9Na~?1T2)V?LYW>cs)7caU>6o)$)-Z{A z$8juk~qeTn_ghlBZhoX~n;>M$fSE`o)ZxM6}dQJ7aZeFiD z2#It)vx^)|2Re%XZLQV=FynW}24knu$5~sOn0!@2>(`feLJ8q)!wE59n1?BkylKGi z=gUQ^jb04k57Mi)84QRpw|T0AGUudBk40TgnIO!QO)6D0HO02Ph15*^fPSDXZ9qb> z`Ox_Tjo@mRgkoh>s2slFg^F4!9VgLPG|};xVaLnS|AL{hYBcD8hsn ztqZ!yfybOio<;4Hpg~ysMhO7I{K1MV1Wl;>{X!ZyRW$WbtQ7(gLo+x zUsDvm_*Ff+%GWGTcKp}PbD+4e}>jv_F9tSVEf0Y z6sdU8`SOCT07{5A@!oou( zhTvH;;gdd_3^e)`E}!8`QHdwvxerW7{rhq-fucP(M8VV7vzJ}UXEVnv=-wf4T~G(@ z)feAL)%A$bf2^P2Wjb0oqwiuG9~cX(xql;(7MU1|&HbXpPWEfzQenaqW+@}431T>b zT4<_%5dLZ_rwk=6Oq**Tq{jXuJ0Ri50>^|iXM>j<7P`dd=1XAf_$O&EU_AV{^y^+C zK);Q|JT5Ozl|5^E@qcWW<52f*>_0LOKo9Qih-<8Vh{D1?K!~?~3ndCCS#7>% z+^6rN{J1Fa3@^IP1CqX&M)WUNJfGo%H@+S=%}?VJ62LFRcU#hJb`~uhOW#lVN?ECG z7J~UBG>|}kM0jDHS@d++zKo>cZ?MD>g8Z3q5Zm1nKK6nPjOWb2#JlMn`P$gp!aaxc4N{a*72VY}$9$&*#bFq>OH=P{Pp*xwxJJ{K+8tGph z7`-LL#hqRLsn9wWxnFgiSabJ6I+I4-FDfdUou8L0n1)3}r=zDwBjQ{#Om$x0p~*!TU1n(|HSjT&&B1kt7#1(41MB|OYt{pqPtk`jy;Gs)d>eGhCxnEQ(GQZzey;Y?b`gOrqsiJuB&qC=#E_-6Tnz+i=5(|TPVtGn{&vo;}KLEPcjgPZmYAm*m4_aQcr*m`%svKmM|>iVj}R$B zvXIZn|1CPy#v9Fq%B@WF8qMmj?!CXIk#RP_tgnUX(@E8;#UNtPGk zM|`fBnmpHqgSZQ5wa_g0W&`Xvojf!VUcqMsUF$|YNnkH$YUC|(U>840b*5|qC%=an z!FGo}?$o)HASIZyNqEyy@W$~RvtrXlASd{y%o5tDzppFiO|@*6^s#@x#3*p!nLpAv z)2gi>;?htu8P4hYn_)$8dAF1Mj6yY887xF;o_rHRcD~;ztVSw8+sOy9O~sF&A^N(V zLqb)$h>oX+SPYrx=ELtFEb&%4n>eDMhex{=qI_?WaDWicAN_-rI12P+TRIZPWq`0m z@R5}yWelPuWM$W$d*%Fp$GQI__t;8|>Df9sIl}f${Q#FmA0PH~kC?gN($b_>g)OoQZQV8R%JIn zJ4r<^(in__tN~YJy0GwYQZ4S;vu}!7f_qo5-GcEwTyU>sw41Iarj0AFr0*A1e)hFX z-$lpGdGiKi`xjGEW@pV03be{TmCeP1GL(x{8HEk2rmShJ8YIj+HZ0v)J~w!6ZSU<2 z#Kg%Jur>;Wn6#UfG&Wg}yIi$GU5yN)dDX^CdC(D|rs)~J95EBwis6W)`+ zbmgKYyR(xMTL%Y+FJI0N4i1ivLZ<($Wh!W3?>aroWPSgcp1|*QBbz(|Pf;||Ui5T^N2 z!+KAC7P#y9xy?Q;#@Q>~vZa2=zSMPjIXiCt%vLr}hovt|mIbSH{XY2_ZfNfmU8q59 zGH}WaWMyI5DKeDEA44K4wq(r&({e=&c|P(-*##kAfYqMYrE#t!umzG z^Sgel%Wa3DXM1bw)vaI0;||4It?AsYS6k-JW3rJ)VeW5EO@eT=%@^qrF@xtWHs9B@ zQz5tZ%c^Aevt(U>E^e;DbDb|qobn_ zmCg+xW==dpESn65!$%#?S7nABC<>$%<)GUXM$r0{Ji-*8G4w%oLde=%Y{Jn#PBwR1 zTAD6ec_<^xz(Z2~?&MEhm|9p5ut)vVuWu##AF0@~ZkRQKTiOnujLAU$9D)|2zafs=4@~5+au**A0l8fK)gkD=mVUr?HNnzE=Q3-?iLBvWxhW zmp2QAq*dSjw)58eH%KyM;pFLN`S(lJJ4vaS%b;;+UC)-Hq9TO!;B!OZmVx+P#ZSA6e5P3Ib5PgzY25 zq;QjYEe?8(Vp8uXBzDMU2UE%+g86=r@tx~MD!W}~#)&x8oDIE3DXA@Fji34&!B>yj z->C}(g++aUU5n5Cqu#mShTr=ORIVfP?Hg0CJ%bLQ?Re9)%6#_r_RpGq&=4S0Lff|) zu+q1rlww1+NcIN+Gb2P`X;sx``N`W`=rmCQIuekohyv|>)|aeW3jOG5jZ`4-d9j&e zmFdmFvPxJw)7|`f%jVbacG~RojIjz)fLavD&|#YhheSKYdH^u9YgKjQql{Cmx=#<%`*Wq!UPq9E96$ikQm zo9d=X@}*Ujlg+*NRFeKpMR8cRfPQu2*?3~h9AinyKz4aj?ImwsdY~Y3jI@=RTX;q8 zjK87Vh&D+a6%_&9<1{gO)|SUkqE|xYUVK&qAv;tx8hK}+zrWx9<*$&AHWC)UyIXpV zYv{I39dZ1S{^!pXGe>SGt4#O`;Sm^i4_9SIFB21IO~-eC|IUj*64&)wK6+jRi?frX z-odw{<0$!p06XMY-we?8X3SZd=+|Kia?iTorAM{5Myo#eWbW&}$6yMdmp8=sK9Kq0 zHav0E-^rYw{Z)F1l93=eUJpD=5dpB1Dkrh6FKufJWQibfAmb-FzWCYh9;y{m0*2=k zZf9q5w)D{Vm!uSLiAXNlFXL92LJ+E50)8^O#!Ll;e`mvXip ze0{9EfTo;5n@KC@jXLGK>$w;0E&!+s(2h$J{#aI<(-L)UpS+p+WJqi{qVG-oYabnE zTJ1tuZCnqI1XzfFZF?%TOQ#Len9+|X{=SDvc|rFZCOwMOFkIUshg&qppb&|S{i(|l zH4`~voX-83A7dO2nC?K?Y8cZuU2m+VCNH16a+(y{$6KaUg)s--RsoAufJjJit`BHB z)-LAw9NMpQ^w*!U=}cd*2*j?vf~uVLe;Pli!wkF@YL^>A%H|#0onaklRsjKA`@fD` zmp%Pse#}&6*Z?UBBsRu3OsolK^|(fM?Y~a&zJYHKuUII=MC5O?W`0X`7SH_-y!T#p z*l7t54-XJq{Oz6sX%y%$m?)qH`-%;C@{gw(R+m~2_n4NP1n34y4AQ|Q1kDt`a$sRs zf^EP!hAC0Kn>1o77~YqO3lIfy21afk^~&;!i3CD7S0*4gFt z?eFJLTiTy2XSROR>>^w__Vgd$?(OeG4Xl((;@x4DgT;n6bF{ zS=B2Hp#Myk|%U2b$2B zCNSbU6+pzN;F9csoMzQvc~27uig2$Ien?4>4jn65Bg>-C-twK&a)=23VS9wCZt}P$ zqz}MK_?!(QkTjxp#`3q3-A&!U)peXOfl>)HtWsy*bMo{^!9v-0X&Tf}WI#}ZwBD#! zQi=f_B|;K(n78;3Za%sA{5wBJ^;)vLg=rWq?FIj<#RUU)@Pn}7lw3!a4>s!+!ADAL z(JC5xi|$QijNl8=OtI8veZp*K;r-(y-nC|aY60al9M&abv?q%)2Q_BAnIh$%vb08a zi`Ml^T2=bL9p3$$pAZ^XxSXHzKYd8z&uFXH&zoBHnECY-;+3lC$jdyJ#ik2&lhI?c zKezw~D+)>W9qD8DvgA80YJX+_kvFYj93Or8lj0PL?JVkU-hJV3cAhMcM{sJng@Lsj zd(7*~mS)c~sP65Pk3|U{(cZ|NFD64r^i)Y3;b9lM-!ghJe0H|Ffq+8E99GU`XVmTaV-ucaPoetO zIlz)@BN(?Wj>*i{h2t>vC_sdR| zpKNGEqFh1C{h7O9x|dI}6t?vzLT4~KnZ1Jp!McH0lSoD%vaL2LI%sZ=DT;QFtWzz%r1QFwy_mxv13$PUHuw?%9Sd>73#ch5|T9ZWHJG#I_d}a zKR2>I8rOqZ(x`vOHA@nDB0@&fgd~e*u3C+l6M1=feXmd5hq=7G$^Qx1S!oGY1!;}S zs_Fi+5VBvnNua6-p-S9I?T)y94+X#c&binVR|}PAio1E9Qlj0yyb6sbtiCYk#M-7d z@p4UQ&0L%C)W1ub9|xb0Bh4tZiHe;7!|LuUg!0WAS8Qy~-iO$#IxPDR)Ot?c5S4AX zkG#)3js1q8`3D=_Q(XUbxOp(0i`bErB~ z+u=C)AFw(8fj|>I2ZwZ@oc*Z1ceF&bifeNP0~1Tv+Wm@^fPkbVg?lwNtx_oxO+SdG z3?giC5LDgzvG~(W4QWDRA~cSm9BNclme#XhdQvX>eu5B3)Iu`_h>uyyT3b}Q{^Y?@Ep?)PZfrz7F|wUZlRis)cpQfL)Xol>^7vmV_12lwYcC+FJ^Jrt{Hk=} zX@2`+wHzcvq+5sOFHbjV(RcPS>iw7LBc?UQyY0^oqbM^9YxYtoLC5g8D)cm^&%JCXJ(PV3c7eW6in;hb+VuJh1)po`pKj=7wLr8brlag1@HviDz+EF| z>24nxQj}@j8@g}l9R)pYRkO{WRVAfeJU$7RzdUQ0>C7YH0uNq~JEBP38%lOtC(LSB zzUtQVe~{LQB}v6BoZB$ zW{oB7=DzXFz`^e*pAEX*hv$yvZcH=c=W$v-_;#eBYvcX*G~`>G-FQ%FF0|JXGA8!q zv)e0QueI^jH|7$1%A}Q%s+Gldn=DV+X#3lA!V>PyjY(6#t0=+RJ~=~-W5;Iyk;7ZB zAqx#L3>;PF#6djVME#sQ&ow=uq{;zV5Hi5272Zb6+pV(+IK1Bu1sK@^FNQ<$x%qZp6Sv94czjFb!E`^thOv zh!Hz)4848~uI?vXyJ5_t8Ta?BVO&nQ9gpz=N71WvbWfK76<;W6srDkIR~!X%Rhi)7 z>ie{gy1B3T3gbs21tNzTrL?J4b=_!KNtyugpUSjmE5Li_T@gAt3 zDE}ZsGW`_yB%pe4Q;)rdZTIu_9?Df{#D?Dlk6fsA{j+@ZGQ!?LKLJs_ZArHHu5MBF zEDmO-ZzeQQiYn0<#kWI>Iy^!h|L^gy6_GVdBl8r%6Lq|tppw2ptsZN#0xf5lCTr5L zxq6dkh#1`)tvdWAuB4l>W_ZG{(7(TwWY3-xCZgY3YjHUX)tNupI>l+_X-QURuwJ2( z^n~C+)Lpep0SC5;!#kIqbv(p9kla%~c#~PPcQ0U-dDR{RrCgKoFk*1x(-x$?cxQSa zIGB@lZ-XY6Dp`5D@76@yVPFjQ?6f6EQ^SVZH#vD3*5J_}uD;z10 z^e@iKMKX5PlYI;_{0}18a*5pUlMJTlC?KlK0;5J5mje3ITAPlU^^jWb*V=qBC!{zM z9>It`-+u0A`FR~Td=>NB6!k;eSX{gr zol#*-96m@n=nv_)%6hf(_I_^nd8T-rIfo$N)hlGh8k9EwQ1fYl^JB6)|9xS#usk|- zqG*_QhLHVN<^qo!W07=CgP>zS+T83<1n9rm#&FOji|ve)#t*UV`MM+YY4BXIgL|s0J=AYb_?$eHIMdqb3Fn_|g8|jY8lxD_HoPOKPvQp2NTDFa!6= zWB9}oD}cJ%udFyWowOrMqqL`c2LZX`+|Q&>TFOv78m8yr1CwaA z`4DxmzNp6qWyI3*>@0PhtchslXJ==S?ys26E;kl7HW}l3-L|ut+k?V`6vi$5kN?(> zv_6smAclw~Nmiuf+2FV0}Xp+Yn9%?MP8%xE_LAT0J%)hwAhQ~sv)1do#1Gp1 z8RO&Q$|X`y{eJ7V4(F6A|J5dQy`Jy6!7Ecdw(A=Gp)Q$Xw`taj_~%Cg92%ft34&lf zr(|N^#sR?r(zHpsEys=JZ3^@YYCBhU2k-aj0?`m~WfB-B1)~Rq*3>kn zSI>FDyYe=nelP5>>B;%{As3`ou@TN(b%s~sV@wyYW;7)+X-3boC zg9LX8?ry=|-Q5Z9?hqhoaM!8)_ukpfZdNR4=zwzMhRV>zj{3Q6qIOw;9AY$06LK9cEjp+7YQV_of+#FD?8vRm_6rx)O zL@3O`J?{R|HnLkLUY=QB``mzW+|og{jYIMhA75Lie-noKz!!omw?jJe96V+EW1>cR zTfCyavF$Ej!gXo%h(UM^+gQnvkw?{Ttsa)7(m~8GzP23y&<(pF2NHuF6w5d%oDtq@ zFwHA!7un|yIr=PNUKNF|Ng6zlV#wa6Gj_pSv)5n5)I410?COiW?D1+=Nze#n6T5RF z?%Qzh3JC{E_vxGOc{bPj1DtlNbCv3{m|qh)`bv?uX=IS`tL*G$3u!hK$*6p#zV5?j zFMarc>XwD^>K?@XFN~i|y|yL}r^GDHpx+GhdwOVzeSi# zJG>31#W9x3Q3DC78NDxHsWb23to`uwCUaI44j*@@@Nby2EBy`!;3qBsb-WkMH|l1LVI> zJ-)sEJ}VfRH<2!kF$4Qh#;hzH`;VF|`;-{cpeO1Vp~oUYIhKT+hiQoqNh*vO5hU)p z!ITc`-h%P0mpAV_j|5;2 z>lk-FQKZ~^hW>=tMy%GJh8bxfCge{$b4DAb1EJrZAd@Q7E8S;y`*b4k$D8kj)TDS+Z z^ds~E8x>5D1dYk?a0}%tWs(Y+<}teEL-v@lVLCepnbtdoJ=omsWis-fT;);V)yv{m zTIaRHVxllMLxtvQ9`mM;@hZTgN%G~=^Aqv_nZUWK#cIenUmQrZT&DW*mX>$nJ;Kmdf;~;-qorth=c~FxKpSrcY!M51_N_u(0JyJVzI{_ z?J!TzYXEkxYKpr@n(Ft{$CQ{|MY<6`ERwviFr|y)c(Lf~r{_!mHb*G;x$?tlc|}TV z5ATb5ZWNEZqLSZJ!%(8ebS!a$HtwoxTER*+{RJ+|MjBUCGGS^1j^86XnHw+)W{9(< zlQ?B;PX@><3W{9TR@}Ng9yYz8tS?x&^ zf6Pc~v8GL5-pwPYvZaX^EoJ>YobKb5^?_w8;rgyxbRe%+QIC5&={a$O$+$Y*EULaF z(EudIOQjGI8xfP`-zkfD)bLxeBrfP<{J*Ek@0vaYlr{Y0c@MJR-X}@d1UV`Dik`|n zUKQK8&O>k$t7Bd*wx5~3wQP}r^QjR&VGx*{_zMMg@_aRms3x_Ng4|{26p?nm9O!AX zPuOzfOB&B6blWUP*~QMqfa|`Bk0|7`=_ePaD<`#D;&5qX2jPF*>EbuoxSex`vvbQx zpc@ck2|VtpROCi8fbXB7(Oi=68cgK9>tULrZA%|bc`-Xs6yChfcijkHKF5hWh|QTd z#S-!2t!5H(J@~o*28JPX{9MJu>TPlC0B;X+U0TG*7-r>cmJGE5o+l+T5hWr zxW{&dssLS_)p_}hqms6P##R_c!R)T+X7E{vJdy2jBzzSLlkt;;^jW)dOqXBd=;bET zT|Cz;t#R1$*Lx(p6KWlZE4k|Jz{3%BPwBY(E?ym`mk`A-jHYaj-()eYy7Z^>&hYVf$Os++0-eq+jo3ofKopDm#H0N~ZWOK2 zNev9Ex?mcs_ia|6FXLSqaxsb6zq1o^@_bOGJ9~FzqAbA@c`D(41{zi2!=t)Kr$&*6 z)KiBgobJ%5~1Is)N$4&5{u_J3#3puG?>^tXINR+@D6Tu zA9*x$$XGXcf;6Dh(IkC@Ps`46`p$>GG&A!xG~xY9uFKaScjpNj#YjrN*!boX7RmK< zV7Kqf&(1N7OiXQ8^xugW8z)UIL@~^ewt;bOM6K^{bTpcSr%$oCvfeULRPNvV0|{?& z)=an(x;$Lhrdy*+=7(QTE{~8EE7BcwENsHYjgDzkeM|<=+v|p8T1X0yktj(tnxv0e z>ExL#c=wLfPvnpKRhQlaR4s{Tj`a1wyNBw(^4Gkq0#fhG)~rlW>*sCGH%@@7Gh;Vd zOw`A9<-R_7mf*V|z58N6qlT*3nLMNJw9XnZw(%@Ub@)SunSh-Gn{8gx>SbA!0vX&A ztrPjmj4N!E`suq9eM!r4BW94CLtXW9!~jXk&+9e?cg34^vX5iddMYW6&cnK4bJX^0 z?G8iNh>ZpozTH}K`f29pY=tK8Z>#7h|#`iu9tA`$aB} z$4aGRo4^CyR4Qj=i-IAmhtge-;DV7H9->T^JHvk) z*tK`g_L@RfjzG+xno){LAYX^Pnaak-s7h%Q9DqQ~fbj7JCepua7bw(Rcof2l_&XP< z%i_vM9X7pOjJf!9ul1jZ6<$+I!t<>PzmRK3sWIbb%AtrGSFerQEAT++AK=8{C5`*; zXZ=wgi#T^{-D^6Kx9lGfYOZS!!yVgORDkwlYedVcKksU`D&G7Mp=5TV@bYJWdNtrS z!4AV-Un;Ze%#WRM=i<0~!0t6B^!{(_du7p%tjeNrZ=9zmxlbI}*7BaN@#)w*4vvc> zx}Ey#-)t+h_4;cX(gpdpqyz@BZ{bPA&NH4uR~G%`nl=GuXHO$TlF9F=#F+LMCwjs< zn(VK(HmY>-{wA<6kzPlGQ*>?VVKGw3sw_rxC(mb3OL6<%iU#-G*m7pvl7C;png;$r z@#)R+cKq2@@WJS@&){<|&YzFg?Me>V$b=Xex zHvuK85TI6ZE8S{&>|+HRFOIOrClJ%2wqbfFvNMo}-kjpv*79?=Pje~^XA>`)tW!0A zk@Drev+41=Qjb0eOinYUw|c5;lKRq{9{&|Iyelvyd5R^hNO`~GtD$AnQBXak`vY87 zL8qhBw#!>8w=rd+2!8iP5e_^s#BJ-t9Bziv(@?02Z^;A#p-Ub^sT~1p7IScXS$;CE zg2>u{P>KN~1vi1RR8~JTtQjd->bR~IxprC^;NDafAxi1GD3pqP3-44A#@yq*5-1ar zFtP&0(_vB=m>j2!j$E^l6f-dDFRb*?#isP*Czo(==KeJ#lj)#MiY}5y51%MCTuG?% zC-e`$%4Z!WILbi;WfMlhPf(-~-^7hh!e(p7#L_Y$lG5S<(P{?9fimic14p2>&y;cH zc#hD;0sDCA_K>}iCTI6>3rx@iNm_=sS+C4_myDh{Jnw=`v4Vp{7W~s_0{@~Y^S@AF zIy-rCot;|QUehP#y&zAdlHahEW_vM+JVb4&f&#H$Z}-#MsL^UMo<*sbKH7Oy)LtQ# zR&+P=V-%BzKtz$P9|Z8gczIy*Fi?N+7utpkLH8tQo_ZxSQS`5kR%Df`R;7{t>oy!P zus3P6jeav4r}uBbgWtR)C!v`Ksb@Jf-cB2#nmhr~BA|9O;8{`IQ zn(r@pMCIA5N)sn`%%cqctay9#VTdNwKLY%_c*~kc%}AC0Nk3&@=GFDRbIi63hm^f? zGIj2M24gd*4{kTf)xgH=3p^E-G+t@HNI}U@IBb_;NlPp*tAX2?l;K1ON`MGi#NS-{ zunRs51x%)Vcwj$*$se!FBdBaFT7X_C>Xc_kk~hli8B$rUG7yRPFTdL3-ExrXa$Mfj zW&C)ieH*4lnLIXJO`Qp0pR%I5^;<&4_^JTjJqLR`Fh`v-AZwb3h6Y`2``HBAKP=&- z7G!T(xZ�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 RGzJ5fjD(_iwWwj>{|Aej^$q|4 diff --git a/docs/images/discord_create_app_button.png b/docs/images/discord_create_app_button.png index e6d06a7a2fb48c275386b16f3480acd1569b94f2..154ad875687642e1100b5152e7ff9e939866d1ca 100644 GIT binary patch literal 1649 zcmYLKZB!Ih7#>iMN*H}v`B4WoK~O^}F*PX^4q%0-ptC1GP#CnV%?x#GBFjZxlP_IV z7Fr}hY)=~+t|lQH=_XFXt{oQ>h_gy#>*TsC!`_|QyL0C@{pfVhbD#IQ@B6&(`|}>i z&PpE_F)@N5h;f-2sVkM(qTHopMkpLrbNVkOgnhI!eF@QQpUf$bk(*QAN+F2vD;|+H zjv|Qgd)aU1q~U*$j1h(iW2gW@g+&QM*@v+YBPe1h%1}fAVgO|Tkq;pZBu?oWmLQOQ z5OD~xSZ0;XPzVkq0I*NQKq-k5t4tn3U|5DjA?yvg5OyJ%g_u)HP!R}wLePsifH@$$ zpbR}B;6<2&E@h(!VK?-7WynEx825>o8w&M_a-WD?00Ry|Hv}BSgAlkC4nh_>0d@k} z2@o8Fa4-m1=yOBoFb0D`mXpD42@V8Vx9k`~uwMj{9+25ffbHN-{n*tGUG0H}Te7Q-H{C$43;tFHwRS?29a%b| z;fCzEz}MMBeP?+6b(yh9%^i~CjNfTiz&lN%)5JG)KwTHoGDv4bCX1-GA?+pPF!F}; zP~C|vjec9LUu{EHBX6tX)$Pbq>#u7RmAzKCCU=*y1?vT_LiEKl9Bh(v3y;0B` z1Lekm+AQg-fzBv2RPg21Kwssz(Y&r2kj;{n_FHLQTP=&7Ji5i}&}AW4fPEs!)IX}^}@ixsCbiW1a{fr2CzBq@=k1dneK}*# zf2Lr-m67YsO`WL||x#p;Gnr@tsZd)+=`pjaT;*%?aBgD^>cq!o%teBj!8;*@t<&SvG_s6?(;WN)IID0eq^WllQ z((4P~e^&Rj{^$$)dy>hPi+^tIZi`KtyLLy>*cfMJ@{i`(k%tP8sD68S`_iM=2o&M?BymdDZ?^@G3YUl4!LUd#IpAnZU zoZIspPknWI@;h@9lYgM<*KR4?nDj6%`bGSx>aC1*Gk!d@T;FTU__an=?Km=R{#M2l zU$?hcSDIa?zuT44@qAtG$n>n*E#882qxMDP=Q(!-8k_f8QvZo1%#}9%qPf#|H`Oj*)>N>piN*T05%`IOy`!T}KGf{53#~|;zUn_rDwe{F YH<|Y*47@O1`8J5mw5-(TC3$=P0fQk2hyVZp literal 1580 zcmbtU`!^c~6i#Q2S4dkKsaL8-8}Vv2B&XE-5wEsUQyU?r!8*^3Fi|DcYu=H{L3A4> z>M=#iq}nbtHH4z|ekBbjhH9+p6&7dv1J<)2zWbf;oO|y5&OP^hSyw!rl@!z!004jz z#>D|E-`5gNw}cxvihq88w#7BZJS|G+xTG9(5{rz-Y!;zK?@`vTw60W-!i z5)CD-?Zil{_3fk^Be`Ii)%y)`T~CvtYX@zwV+T&{nRlJ++KXTk_j%kAZ;i$|oana* zNIdVYDHd+Q+Ux}O#}8wTn^x01gUawp#JOCsy}?a?Grfe_y@WP|hncY8dd+FVWCw%V z#I`!gOB#|hd4ha}35vqxH}z?iZooV;7B_8U-8(9iHrAVOfy57#aUgcQL3Ku(5`Lsq zNN0@{4|CS?ca82|TJhezf4DgYUYL4wFP8+1bu|!fU2AbI`(|3cfn{S3C39swab&*F zXN2bn3)PEDa4)llsAO>{T9_DzuR(ZPsrtlmmUnR1XT}w8h1cf1eq0&v=bR^Cc??GS zgg;{WZda0#FcwL<&axvU@|`I;ajABuHEZln#SCXzyZdxSj8VXFd)`ig#Tc%$Z91!X z>B%O-rX_Z$xAHb?%k&>}=zURsZk>#gs#|Y=Pe-gJCAYhrqNO6Jhlo2-Oi>&1P5 zRhJF4r)wV5Su?-S?Oly0d4&v>zRy`FS4J=mp%JWsYP5&Y?w7jxem#l5%Wu8SXS!EK_am7opv1PEb#R__RpL%tB$iXje7dT> z`hY^-$SzX_b`b^~q-$muo zM5*@Me4hx|$*MW;JB3<9dYxz)JGL%9G>!Bk@M8`7ABP|=nMb`Wj7aO+zs*#UC0Net z87aY`Q~@o*9LXjnoEtWBV!RL3JqOM+dN1krqSrH8D-#73@0V7`z+Jr@^U$}w6xw33 zg4P&C7Tu+7E0{~q!u*le>IDMc;kBg55I|F5;@q_6D!Bq)c7H0@XvPnA?>NVJmTh m8CD_s>raZuf16*>*TKnF271TUCX}QJ55PEjIyBk^rv43t1nkEE diff --git a/docs/images/discord_create_app_form.png b/docs/images/discord_create_app_form.png index a8afd4fa638705ce402c7dddc077533838b25928..9f8611c87fd8631301e7957b821fed022fcb8c08 100644 GIT binary patch literal 26195 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 L2KSNop1t}nXzCM$ literal 12216 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 z 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 literal 16587 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.~O z6-H6^DcozJ6P?0uEn7RDZW$eVDLOG(u4SgvKwFCU2!{Y$?fc@v#*UKaG)Y>Nc)?_q zYBX+F6Zt3Z=-(_$}A-mKJw$8Ma*D0tmV&^gXKePAddfH#Sx9hdn|si7iaVhiKMzP)I4jidTLIUvddByRB3YnJ1--U3+ZSn3UT-`pNzb0DUV4b zvl;EC?Okp-B+TRCEQC48$S4ED#TlV=7hwkF4e2^XkS)F%er_mC?WGG%0u)LRW*#rL z{t#3BN%w?*$75;}Yi$3SPmLTu?*3--qhr*c-of{Cba9)7fkNK|gbl5|IV1W81P+k-N7X<;J(GbD?@uJbcsMai4`ippnhzDh6$ z)L>m|Hs!e_Pl4R3F~@bxvrku(-^p!K7MQTbHtJgafu{yh9q;8?avgQ%+GU~6Tw`>j z);_{Pr4TXsvc=S-F#D&+Cyg_~(%{N7a`ST-o43Z&zDvLZ`E1R^oK_BUQ}Ut=FT7-< zj(ucBI&{E~7W+^(*saeBOSrP|;6OrrNfMf5z0gH8!Si7;{NoE1aN}%OPy5@zb1%%3 zm(KM2lTX5nm$bDd0R4K*3V~qS5}<}ur>vs0Be3%Z9X*t)e?Ta=*#Mv;ov0}SzU;k$ z^@9ozcrt)1Lak^lPkpwNA77!QtVT_7dGF>w1-Ub+%P~-c#YI7l$i8;~M#ZLw+B$h_ za}T2p^p9Ymhwnv=(&DLH1}70Hfx~E3gN~TKi|qGOnqyEyAkZYQ%ey^d>b-{@SwOa8 zk*xXeyE$0bAyJv6XE7khjsM}wiG?!!yC9Qd)n)ED!eO@o1oe42QPKqq<&VIqA&)&Z zSCypzk$UtnMf;Jh3>u>C!m5yDlX#x|A6N}h-(;aI)$;eFLvN~(2vt++DT2T-wSlDX zrG+w8HB<=H)qn)r_qso;RIHXP z=GM*A8AY1!O5au6OK~Kw6~d|g_1QpVN5-3h>!GKZJRzwAu@!MA)R>sTtcs%IpicHo z#E7ZGw-$40nE@nR^L@X|g%PEvtNbG3#>4OSn=->(O|NHD*@+hk1ZgIfZ!LAA%#=oAh=%|E&H# zAvPKl^R4{_i!A2DIj8 zqXSPjiNDh3OS{F!&R2`5uoDJLNe@ZMj&3$?lfECz|Gl2~n{Y88m9I&LXvt9!=yTsE zSO;9rj%H7KETl85?(fNn%lMs3?kSrsZv9%cB2Gt%G&KG&Lqmf0XznSj)wb zYSVlIbYb9>j*$3iTATa

F5wL(s`aVo7Pz_cUQtxqhOfsPJeuLe4ssP&ZgcasD9Zi0^nd03t;5(M5JeIsI7cCr_-22 zzO^uSPB4X%oPJBLHb3uWt}4i<7o-{eyT;MLY}AGLiyHWIu}FMkV=dD->Q&L_VXxM@ zu3@g+YOCxc;j?5~|NJPMQ#89+=vy+M0L;^klC%z5M9UDYe7ruhDQf+?@HCTajwQeT`z&F&`|7 zh1l%aSEb^9e2@?7&CPmm!be9EDW>~e*p|bG!onb`6)Ee8%{FW12t0)&R!u9xh>%u+ zzcf2s6f5NjQ3UyzDZnP_s6wfXNUeO#IhXt}?m3TcK?AFX#v+#@Ir~}*xecwTH>1-$ zAU(z5YbTDVUFfetr9i$&B4E7>iDP+}9Zydk%MwSJ}J{$wO+!oq=D z)wu7IJ>Sbx1&|8APs&a|n2)0-9?fL*&iHO4+kFO5{W+ANEmfIIbBhcPGp;C3JJ`$< zz|JhG>PfWI&6d6~*HnY;W7R139prOM{C;>&6_u{u9Ap_|iBN+ICzF^pLQ50Lk+x(8 zQ^6pN2Xh-7B4@Iw%(c{4E^1kXlm|7`AJJeMC^a;=A6-2t)5p6Up;0sy%N}RoP)L9@ zfyrP1QiIJk@1sOQR2dKb+kZpGKI@l#v zRS`;xA#{eEE?#QLa-0fu`vI_Xfw(M9v$flC!Gkc8va@3dvd(zsVyAHIznoN&!%gZ~ z;x5}sEEnaXm1~kfayaMg>hKzw@149;NgRzTvc5VrKN@D)m8Z9Nh2xxm{vDUo{+dIV zX-T7m^wTEaC<;OAWB$S@4@~uX(Yr5(ckjm9KYt^g>cX#{q(NCQrS7wn%DWRmuExX& zkEtCegd$E&Q6G>%(R2sp9p2;>E*$cq?n_%Z1n;cpdMelv1GQY-0c12xSW=u2H*^+S2aHrq(h`fSX}PPVP5DFTz{ntV!fY67Lb?LbFua z(IO;lXws-ZT49EJ#;NgTp5$;kgWAZv_jL-ogy<&R*P1-25lh8n+-%5Gg0U)GfBZs* z>r^;;a^;pn+>Ri~d-MR3%Ruzy#?ljQH#;Yjz2c7Wc}`fNqLjT3~pv0c$-|d zvS^e0M5{}+Pp5+tfjF6Y2iPYm->SahqocDdyGL+hHew>l@4|&@0s1gSnkC(`%p4^n2R0w+l8`G;G{>1fF1hbB z)K`PVwcFEu%s?h(wR8y!4z~ASI!aoP;@YCIoAL%Oiq)k=@bK8oSOyP$>&oh_4SiOB z)#W~YygoTWKl$pyJYpBhQtro+h&!pIrB>@I3{*PbE+z%scj#hIM)M%9?i7sqR zomq{kZ@aZQVnowDaO25{o1@DJb8>hx_~Vm`kh|^7wvQuI+nudv$Q)zgRNX}r$VR3Q zDutnL%IH9Y6CgkVtqc1l`#=GRNdPpwk%0+A6i0M^Z#>6?tX7VkLVZ9qr^hk=o~Z0d zI4nI4tfMAQ$;R!@VmdRa*f-%WeN>dCN*hNjfM2n9(65GvtsnD2C6BA6#2|f@U)HeR z?D|lolRRuOA_CCz?!8D0J3jDHG*FaMF|Q=~z@|uCq~%!-fN?74aEidm9%+HMzG&0D zrTtpS8>mdr@l*P6xlIRJqt6|WJgNVdntad zP6EmSEppS0c$%uR^EWGEk2Zjf-u$y-W4fQ|Is+@2%_qs?S<9>hb+coeR2*y>+bGmt za~;y1B~9<*#QK~=(=`-w^o|G}EqL)*o3R4YC!eb=jOQy|KOb-wv)d~j7VUOe9xJ=rOqEl-=2oHV%nPQx2kZYl0nwJHXcZSGl1S7 zMR=6$7Y_`flsu}vYTxxy9yr8C;vw3HRvb~Fd|4G5*B%MwNT67{IIs8=>}#I3Hts*G zVeliH#9u7;0^wIu=gWrEnF~CCi|Jzw-~z%5k@+9$hD&A~bm33|ONJkqotE{7fl8nD zm7g1i7)IxnN}j{1DTMy|p-yNJ&lZWb*>2~$JngURb`Jt$>Y0uH_^-u*t!h)E)Ktc$ zSy;#^(Hp6emXePbMpCMXtSpXDUxKo#JlG+-qVGo*8i~F;L>L& z56n%iEi6n0PHb2R9zUZ9|Nl+B{WVN-OaHjU+?xK>L98=5t+9g(w}}x1;r=%Aca8G# zy7O{3EfZ>=rmf5hovSx!uXySRJiDAy<>jQfN{e8=_&^AjzlPyfnz|@rHM_jo`gKN~^{2vvj$LDsJ`=F2O$g?~w)wX52y%J`U8wZmV~ ztOe)Km8rRQS5GZI-b|n+eQSeBo2X8?=6rp5U0aza4sEb@^U3Z0KC}6c)RaxhJiGo^DZ05Gt5`iwmcy%sgQh@<89a0P?KdM&Pq{^kiY{AU>6?K02Z)R`qXw#onY+Rf@3+@_xO#z1*5dfLTt&xUc}+1! zM`6;z9>{_*{Cf)0ZZzal%0%FbyWCC3q9x$<%zCbT-3QavYmL04(*`1ds|#ds(tq>! zVdx|*FxhFZHD2tO(|US5?3R(#dfIDP*HP0@Hu#UKhEXB(ZWdHwoDClc)vd%jwbjs3 z=G8Md^IkD^uIf`{9rM+YnPwi79L$bKx1Z${MB3+kVoJTSmALqD6FT%2AS<39c~Fsp#8 z*|;xas&o8%e~;1O_6EE<{+URpwX_uN%0UG4H}~5UCpMr2w(|ef--+*Er{=~n*x24T z+4qk?){@k(TDZz!JDxft>G%|X>UtR&KIaLIEBr(g3CWM;;O)60J-Mh>B7~{uge{Mg zezeXb8tZd{#z5a}$DaH^({bDTD+!QBt>^%x)ti35ki2Q*$4x0Jw};j;;V}{QrbA#O zgHJri@qB}&hw+%ocIk)ld&_rk%^2RORQ}=^ASg|J8@q83t-0nhr-Pu~L(9*#D-ob$ z&)+qbw{~0tB)uz1tB`XxKga3Vd=7KvW>#(jjJsoG!vH}H!ANb3_7vh)%>|+I} zsoJe4sO9$ft(h;3R~Haj`+*g0yC=n91j%dhf35KTO)f_Z*r`OU8I`0G6k2D~+!Jso zr)6=RViwS61p8kSssl4UTRRU3F|nJB4=up=f}){^5+RT0D&ZD$b!|0pwZYEM(kQ9RKnl2t%$v>u!v zhYuBL-bGlsxkEUg-IZ_g50wZH)L96o7n_F=%&k{iXS*kLvA@sNuRe92Tpc0Rg{zno z7hHW;TIL5nwhacvGX*oJ&!MG!^uFS8r{)5q{nyI;4gj!lyFViQX4bhA_il}=G|^d> zkx7`JQ7E=Z{w`#Y>}R94+Pjb6IzdWVUuvn-ZIp%eLjrHcsb_5ehOf4FKf777Gn=;|i z?13A(o*Ls%i~IPg<5Ko;`zzy{?Ff=K?F#R+QTO<7wHrViYfs}Ps7%$0XH1&SE7M#W z;QIesV~79*VIQ$3k6?o!qL&UDTi}iY_8jXshQJL?9mYo$Kx4BBAn3s zwvH>cLh;Cc*fIwU`^7{6P+$=}(QL52tsuxZ*8k`3zx=@gxN)+_x7L5z)P&NKeyhdx zGnw0!=tG{A12~_V?q2HMp;u@)U=-}ys6HDahn|eMpM2@U>ShZS=%wfFz zwkY7f`mS+|7UZvGMGW3srXQ(8%oL(4K0ZY)|1WFQA>81gR%k=PFh5g#3us$KrnU|E zdj-B>^Q$&02DXIAJ>6PbJ`6uB*0t9cWIbsnyXBdi{>Cp?wBP-1{*8q9NkoW$Ae&eJc)bt3Y6?kC)cY@j0<#TJwl?6P6d4d5 zBw47RI6oEY>satPLsrR)wHm6BTJ$p$nd|i&#%QRKY2j~1ICk@R_HdR$P*x~m&s*XwC@7SGCkd++`lIi#Y= zs<)2@R+vQF9ULy`<$I0K)X(7O&*lm76FT86nRuqiu!x=_y)Xtv{m;CdU801YpjpOH zU2TB%3yOju_{2{vG$W&dg^qLRS&t6UkHz6FlEa2f&Mq&FJ?IWEF}FV-9aI?&M34r; z2BL2lt2dOg-RCz0DlgjceRxM-cax7Hh7F>($d}8w?EF%5-t2CoCg=H8_2ibqN}N|a z_eD`rT2?zd0FbG}Xt8{EvRpyrezR~HQy_1>+zt!Wf5{+tCqh8}Hf88{&WW+fb=I%Y z3oX_ihWq8KsjDq?{?XN-P;Zk={|{d~XXn>C={Je3NTdk#yt*=s4v^=_bG8`-O@&)F zYAiESxc>GIsX!`->d~3-z!ZqxnQzbw9zCa|A-wI{zvd&4-A&>dg~31sL>7)W<5=dh zWGpEZTsPBg`dd=oeilMs@iNT8b#o~5JNGNv#nKZ4*O~`CU~61m$9`9@ybqkgOwmA| zZ3sa+DO|st%G|6^3o^jsgcGpCdfvlJW13)@caVhs50`DQfbHQbC@UEF>~0DnPkkCo zJJPp2Q*>8^Kk$K=k(zH;7TZ}8kM&D-@*_MkA1wAJcKVAW%?B{6`AFkc@sVjpiu0>K z#y~IS%Xvom*948+U)Qw$aV7H}SBISTK%0w+&0EXUHLnk^$`CGimj9byabNg(`5HhX z;YDb3RN6s`Ee^TRAD~)l>*#`uDk1~HK;XRx|A=y9m z`cG1P=D#B)^|agA5LuPjVs1EJsIqgch=n#VJZrl5dS)L}cHril5Nt%B<_Et6CnIN$D;gDT`}5Hjy0YAV4M-##W5dFL&qfG@K70$@NTC6 zOu)U(<5>~I?J*QO0J0(3V!Z~wxP z2sk|-nx@x0C<7sq6ipY3*Q?ES@eN_u}g| zDJdU!bJ)SKkjaT}iujt-u%*$rhSI7Bs(>wsE6mp2dN=L4T{A#9M*}-a5ZEF07SlSj z1WhYFpTuzezDLLXR4V zPP*7+5gAwz*~f?P`I0J<YY9MyDQ5i&R)tqcrV8K3#_|4dNHHH)Lv4_?lvK?uqe{*Fy;e71YbM z4oT&Wmby(R)S8){jYXweu6ZlhakK6~n}@;4yoz>{;|=mxuK#8E!d3PT!yrb$t6f(B zt$&u(d0f|!N&!(yL1qlYqXY!@OS~zEhUCw{cj7hOs-xkGc3!s=Zis=xC^Q|}slzWj zpJeA14;9E~ygbAxK<>pMko&)SvO}uJY&33g6a@IJyRspBOb@FyzX0aeMiZTs0Is&w zSm-i$+o7rby|IEedwd4B$EK!Bsl%%>NRmqaPm($~3g@nLw5h6^ConxFAi-O1Hi-Gx zv#Wpfya2cxS!bsxmw$>be|Cig2~Yoei9i(;`bUO^Nm*HRjKqmJ=?15D&9-jhd6FY` zWByCG0Ek@144}@blx$Sw(BYT!kdksprnA|E#AkH$a0qDM*-02&M)+Twlaar%T@aLw zG3v%nPc2lD>CzaLrp4lVbmLfdif8$6M~V2h9D}I}giu>h8N96r^<=%FkesvW_ZBsc z-4x;fvr{Gb7t#nJjX$B%z8S@*w-oY=ECAB%KyRd@V4iWQ0naD~k~lPL%FBS3$H1Yz zGSW;`hW5GzM!Ys^h!Xj`g`C6v0+U0vwzM` z2Q%`265=D)EsuZUg98dPjl(Hbb z$Rh0;=V@|reF{XIHihSYx>%UuJNMFu?3w~X^&%98x_0jcr@FsmWTuLeW2;3bIcGv< z82L}vHjZa&(33saIq+CjMRAU!7W39VkbPgeo0G1Makkjb^nPS*=oeKho>V%i8{(HH4$!Gb07d)`od(w*HxHd+ihv%}?+y zgarBjk=9$un&#KnevE-gqOW}g)TTS*dN)%LSo^J9SLOR6CRWO0%AlHsbjcX8nL!x> zL_MpmFgv~w7ku}o@(zE%1x5%_KB;JL7j^!w+8pQp`)|JnatjBbu&T_0&6@VfRosJ4 zD3xpp9bzGKBtU-iA+LdhquoOsk_3Kj?{gYD!4IC8gb5~RC+?(+DAl4lwR%GD-*)WK zZ_9JOaS>)E*mEBm3Puya!Ng`Hg$zLUX2J)~GZJXsM#>EQ*_lByV|VC?IB&h+{`H~( zVv>BMjzk*^EGc+?%=(0i`)1j~K7b3fuplhp#0Mo?Gp4J{FCqkhe_jpMuz&VpVPJe0 z%*q1320s3aGFWeYpf>k#F=L|sL?shvkUK<2#p7dRou5!uLlOaU8mJR;^0B}1bAN*z zQS`O*5!`(A2mmn69A{(v=Xm%>f5smse-oYifU3buc*dJ!E}90K06FZ5 zhULh(94^OlJvz@A=bxuzMFeo_Zxf(&<^STQ3g>{Q)os)fvZ1y^n(Oa~?_o=J0c&$b z>wen<{(g8;U~|L(`4_8F`0uFt!?8;QW#0_Wtdu%p7P(Cl?L3o)8e&qqjak5+A9b_8 zF?h*(^T;y|5u4C^H&wXUs7*|YxSHZ{I0qO1D?O^lxS46%+8tYHnud4|np+426Nj>; zr{EF)6t@Kq*bdMkL>~mG`9nH=P6$jJCXgmoL_x&W&HZ1;9C5v*Y|$lz@vMHN7#DEn zn%ra{(_gVmrP3_bb-)xS9vFm4n@DsnW%t-6=AV};V!zy&ozk1Z0~Dk@0qo?E;Sy=s z5ciP7JIvLUqDvy)sk=ym-%iIl`rf|_=4bkXX)(PCaFA8_5t5G6hkAo5VmQ(C>-L|_CiDQ=o5Rx^adTn1#yYsx#QiyJ#r{rxl4AH zX_|d+sWKRtN`cn^Gl6OPnB{*4e_%Gl{uS6<)&y81X&{KK7bX@OWJZ&>^D6EENG)v* z1GRCrKQ~#u`J_I#qTY0Lvw5jtOO86L6u5dx_26=@Ufb1$w741@4P~MPxyR5O;RCQp zB<{6jAwp*8P18zBaDPv}#b$o=f5SMg`Q)jN!4o@fYGW?e-SxT&kt-7Ahw7nD$)NO5 zC7U?po)+hJYUsDsj&9rfcnYG)@hBcyEq)sa)-7nW)lu4(9r zlVR0_xfi|rMH*?ZWt+B(8w$bbI8466P_O=nJkGw;9ih^ROpGZhTkkbl#i!@=9)4Xd z=u+Jv+|rW!S6J`&ms}lep|#q~)!8Hq-$#>F?6jLdCdetL7ZTfr@bu^GfYuCrR_gp* zhZ#EMFOK>boV~WMSRJSOYDO&^vbY!)Lr!08wSg)?Qp+@O=8?&?*&~`r-qc}_69D@2 z_TRqlR_(!5%+$qn>h75_)H%k1cu1Tw%ybH zY>8(8_i+{v&zWoyfCnfMP@x&~*K8=^>99R^@6!zJI4l zOhF0-@otxt5?21wCe|~Q4*Ok>r3u%K9mph9ILh-NpD)b(R&#*iV7n8!?5yga z$ijH;aEnO;$`5LB1$NRJA1_jaX>n~AHm(R9F9Rl}@w{4Qe;GQLgC`fkQuBEbuD_5d zBC62+Fp{06R8D2+7<18}gKs*CrP?`hb_t2{+gI|3{FMtJS=2CDRXTqUQra^tX)He~ zhJ4Rqc#9V~u&N>rfyKfcjdLpdQQoxNHZ05`Epbrr1Ld&oHH)A81%rbXLAgi^#3hQ3 z;+tb8lq4n|W+#;L;+Qg-bh_hR*1Wsde>r1}m@>dtwj2np0NxgCP3YAZbO+ID_c}sg zBJ$;i%Qno-RZ6vv>9fVNM^ceqnZm{On2(W9`z`*C(eY{qFO${3M#-ogC0eb4ZJ zntwF$|5XoP!nh`SvvSq0aG{s;9+{iSIkoqvyJoTj7JJ9tN+a3~oh_`FImYU9`=PTv zF19$1_hq?m%M*GA&vGQ)UGxXy_|v)573{zs=NG2}z`MnK1cIKYC>}BwdgQ2@N$Pc~ zM}4r~4jlp6R;ntMD_74g$)*!1;(>ODLzVd$$$oo2PnLV7Z2*r0XTE8qbq;)h46=5X zRidl#))zap%-VwR`!hAHA?D%b0rj#EQ$d&}c!BNfo%+5@Xw?+g<^Uljv21-0vfrHs zLyLNE=*5Pybu!tnb>~!EO~wSGjB{Gl^ZiE{r5LRh*nJpn>N2hYyl4a0oE_hXhx*TY zN;jIH)YY^+;KEkk!ou#~#pB6Dfn6_lTRayxLyqz8L6r@XrU zbuM*8p4Z_0-0oOYi26NiF)4sMr0FE8w*R@`j%5-YRQ{~g0{rg|qv(8*5wTIo1o z?WtO&!=$S6I}HG~#$ZXDe&DKbf~8s}qtFOv8A&(?Rdp@x{icr(h%lPTXNt)rXbz&OFsV^F& zadBcQll|cuJ{1nV(EzOTn9CcjD!OR1dR24!R>L0OKT-=40v6@r6<(=^fp%IkWmSWu z{O$tS)QJwxA>Zj@nu$$d)sM~xHIpfW(} zo};hrcXKNzLAw!{t}1lbo&4q-+jBn*QL$5N_?qQZl@RyITCawPHyddePrz2u0-wxD zW@t@5<$CiRNz830d+lp)5Xe|>apr39T-qGrVo4l*%rCi*N=60{-5~6SCKly0MCX2aIhbL`wPxJ6B!np)f;*p!h@%hqMW9gXy@osG}wRnE%bO*+;@iw3wmiBt%d24tZ8{5r9 zdh)Q*IJnDW)b23|ltoXsi$I~5b3GMb-y;ChYHfXFtM3H&b&@V{)kAFf<_VP% z^u~k^t@Fk0?RdgCB%PFtRh1o}aE~46nA6I*c6SD)XJ9L>CO$oX%=k#A@xEUo!k(Ww z=AlvAYK!@IRo_u^McI6w)f&zEx<9uZO4~aKz0pHzp3$KG{0I<-~r`z!E(6^Yry!L=oj1(;lU^aJ_6{{|pNWBgq}=dNvM}nLV|; zH#=wPy$^ozZtY3~Vghp)UvpWc%i{TR%{OeR;naO<-jh`)lk!H|+I`}uF4v$jo3QIQ zJJ7F1C58ecq&z2Kr&573V(X%kuv#IbeAUuO{9uaCmABLs46wXn_Z3LReD%;8Znr8# zDZXxBzOhwFP`{}~hk&xLAJx~BzBgNp%ZpIwrH>9Lr$DX(h4@=VW#qYGF;C!Zf(xf@Fj0a$JbBr^nA` zW)w{B{Cp}Vztc}J&b^)L0FS+a-1i-Ig2m|3l7NOTWv0xO8ryc(4U|u|zz2&PsWk@S z_HbFD1z`3Kg^F z+NUFaGta|&`&zRve9VjMn}ufYgv3;A^%)+#BaZ3MPN;doUFHdhap%X{o=2TwW4K*c z?$eN?QQGOrT@646I|7XGqPe#(^3 zi>t#KEMMDu?qg8f9FMFA%SH56hSQo8WFDYK)~EgvdelF%oNBuK;r$4)SMSx(&K{SZzxtW$`5C!Fcn^Yfh;>^(ILj3 zqU(9G`WZsc15Q?a-7~>*mjYyp>h#u)65q-UFO>7|l}QtKy31!x_+{MmD$9DuWrO+D zip)Fhi)D7*UMI7e_u@U37Y)}pQsp9&LRQb$-nZ0NHfjkBh4U}Y7O7e(F0NdHzQ`_g z!jJWE^P0N1$h1!l53A$-pj(Z((wpES&sNqD&1`*_<8KZQHq_f{V)iC)u$wJcSfV%t zq3wcRE!*lR#WZ4I@NaUvF&ya`Z1xY!{R_yE#f@s_S2EBmuI_=|5~RdZ{YqjS*QJss z_X161Q9fCpXSZxK7%Cvv+tRVg9hzBouZj{1gReO!Q63I7lZ_m{gV%^7si&*pWC92?9Se1=V4XRlh$FsS#Aj2bD9v4~B zgf9-GO*sxPO4!c(H)@!{l`b~t6p?Hb^9reT^1FM5w>C6oO{xYwJ_^Ca#egbq^jEmm zIEr&Q`7?1Wx?ZiEzkN0Di%#L)Ju&MP2O;jDlJ0&tbD=%z?%vN`$Mi8692}v!3I-ujsRGc zltJP4Gmqd<%2GGCzCBN~MqNs9zIoAgobBX}@wO`HREIM}zV=P)5VIR7TfJyd8`bu? zEVU*38K-7aPK3*J^t7~6Gf+6yW%bTcyU+?$PWfkRg|%`ZxOn4-=D~+r%<@y4x}2&0 z^?TR-1$oX&*ZIC3^6bWB4$xRl-pV>ed1 zp#!j3h?* zQiqUN-^SVS#;-c>*@l1qOgeRkJoP}7BX)aWL5i@<8foq)Hmg+@eTqxFDp3J`j%=oO zW8#-XiU^mg@=Z_I{nAAPaYq?X^zDv``W)xFj-80>27H`PZ2|*MOE&V<(MDwTwPv2U zAO9vnFq~rf#!gxwR623*%ehm!Opq1Fv$z7|SEquQ)xdLs?Cj<*FeAKfVLgTU-w=l5 zi0bLJt&b8zivrdo2T+KrHR_UX_484Gtzz{q*88YaY~{PGNNx( z@_``fq9o;pEX4*)O81%w_h8bl%%BP?&;cxbALRc@jSw7t7~C8P_e6eJ41x(j)XoH| zY`D0fCwF@8pxJ8r+BC|?4<~3hJx(qhdChxa-qRYB#Xt6y#03s?m3dt<3#4=#w+_w2 z!GhMaGWpe!RN&Z)0>^ed&@iw&)^)K8RU(cp0P*3h%+$p{Nyy36(@5KOnU!34o1N`X za|fIpJAEg~m4f!_1YC579Is)%B~+WaLHUfaLyJ^AJ)ke&O`t{f@p{^~&sN`4jQILk zq~b^JIWp|?bHKW@m6`xpuotWKb)=naiO*+`6DZMmDP)Q0|Xx?yugk=3PyTFniq8vBR;%t&~P2S<7nXdZ7L z|7)MiyXzo$lWFvP>7zMM&N8P&`S!)pUt9e0aM*ioYxqTU?@1}!!>t0`hX=1AeWh#n zUocToL(W|{&<*^-o*)T_KA=YB+E(;9T-&u^WKGRyCC9^hL#OV=vy;UWx9Zs7ePemC zJs)?;E3!8vsMSL=X$`6YERxGyK0l$N0Hmb60Y#M^D}UB!}OHE%!osF7!&Tre8{v^ z>mYnx!EeqBGfj9=g7(!=LBru1+I60vQ^1kx6%b47h$eDkWdI`nfy$4od2#O$>db-h zRF-^+-8Bz%TY@;w{~J9R(qc_)NNOTTi)ppbK(`XE8*_54Cl5N4b%sB#;qNxn3#w7~AE$6VsyxjK2bx4Jzv?j;)4SD4QRU3hj+?)X8s zXK7T1q*2urQo9^aH^(%t_`*I$-WAuI4+;Zb#~MW`bn8zU26B}6<2Jh5xPOa<*=pVJ znyEm)u{HD;X4Z#&5tYc49a=9uM;CkiS~b!8*(<6Fe~%Limvow%vMietUz7ip>#{X$ zqRIWXJMCO!#F|{D#m+Uk&}^Wjn8QIL?=z3fbm;{LfP9w` z!-1dCPb}rv*}2|4mrT~H@fDKJ<&n_md)6%al$aY;u*j9BYu#Ad92kku>*ctg36mG~ zyzQSYsI+k!H|C?Vf!kda(nNQBnWNXWo32kOLmgMHxIdcJAiHVbIr415hW=ygx_ms(#C zWewzb0CBlq`jT`Dq54qINq1CT3lw(0-N{$D_i^%&&Q#FwF?-++NHKaE3s@DP2uu9|!d@%9D66Yg0;U<2zFYLh9Dh3RUJyYi~ z7zRuxDUNgY+x1vKfOSqUa?Vq&$vsNTYGtZpol_uajS=eZyRGOCOSY3_`$5Wb&Z#=P z2ZbfW07g1xM!k5R%skQdB6WgeCBZlF&T#g8Gj0FHp-3ASfEDiYMpj&Wb=F)r-6?(RSV4FiKA*&Dl&940FH+H%L&IoN|8w?=uzLNBFkx;qqA zpa*R}&zenm2lm)Lp8A&Y`js@UctZO6M^RsnEB^~yw_RqMz-7KAsLL zq_Y^}LGwrsGg8W;j~xY0ADGW@%j&mUELK%kVD;zrYNkAFW|F5@II!-&YafH=9WXjf z%KJ5E89vDtarCY%lkvNq6b1_}zSv0o=1C3-Ecty%XKojle>m3FRDy){XlkpKMUK!Zui!#2nDT%EQbC9871D5Kn}E>mdH$+x&h?2(l&U_wt#7AGKW&fGr3oo=2WMKNr9`C0ekWeR&z{B^$s%hTitE$_ zte;tT^Ceqh3j?k0dVhK|?T!{O>0ZGKEblj+TT$Z$wI-Z{RaQ(P<0ajL%4LZjX?x(h zLT6yU$2gNSYPTSL(EX_pJ1le8^YyA?`HCDbWUi}USTuaT@-8B~PGCKx^9@O2k!IMR z|4^yLSf2CcqJ7CR#w}go$xn`#WqKzcs8r}JS4;|@xOvfR3+eXkO!JkmZCkKDAuY*_ zLGg=k&PPomYps@F#ol>i(Df!XsNa$`y6m&aqS1GSOJQR|-XA5+t-2MMYrR$6U-17@ zVEzg_`9Q3(X|YD`*>C7T3kUVeDCW)yszJ_&dbn-MUSDE4&se-Gv1i@uJO{J5H! zQpmY_ob(uc(`iN&>t@dknJhblqLB(O# z9^zJvT1Ffwxi3g-3rK>TD2omC&)WFsqOtm`SE!f*S!l}RZc)3%!Je#lOnbi?9bQ`& zeaG1<{fSw9!#RWd9?w3s^am(7RDuF+HYc$ANoPU_C3T5c%4ez;9ycF4J))%#@~Anl zY4T0yL$q~}!@0CJ=*WNhlnQD%oIZZjrF=rId{y_r*?CrR=W)KU6t8tVNM!+Q=e^f{ zw`V~ITha!o2>w72xE!JdZtE-?6A0=Q81^jaX$vy5cUnjrB6V1rg(*J1XmqnFwemB( zP-d49@NxkyuR7hz^Gv$u;GIzn+W15ylLdRVn?hlsO3{nWBwKLtMdKeFb8CNGiS{?y z3q}3zTn3HBpuUP5_{U(LiWR3(K^3(*UXnW05wDBWFiWX=+vM5ZPwoz1w|0$??YdB> zhNi`NK6}-8m%k@Duk$%*A&2}kuj)Npc=$^Vy|W@=@!#!jtx;)B6erkBL2b`3`FkEt z2TDEVx53EA$%SVzst)kj3WXvt{lI=k&TFCG zA_KV&|`*3<8Aka{st9+&p|EYea z?=nj5gUzx^->u|YuQ42uIA zSKcKezvB7KYJ_fJ$z=hae{R3rjL*K6UG{OD0c!pgXkj7*MZ}{(&1M}m63b!^TMCOE&^?Kx-Zm!0>Bj>!!TaKlh#f_bL5!Q<-clYKhKPITH z&I+Gq^H@cn9EFGG^>6nmn)lcjLzGWL`D4Bd>3nzZl<;0vpr9Q4rH&+Fs`5)yFAZ*OkPb2q7%JB~2IdR+HQjH$#QvHAQ4*9=6P$ZNoKhdo;Q$o&`hhS|FT$ z2W~XW-9j0wPv@x3qkcZULI^p=l)y+TdX}FQktWsJzeRQW5RHiXJuxb_1%pb4#8A_* zuT!=g>(??1q{W=<7t?su22Rb#YK9{kO33+Rf=vm1j8hgbeF$~-9Y>)sX16>2@*fwYuT#z|1gAfnM5 zmy@w@EqlJ(=bSZ)k(T%nxsVl^JIOR4`it#qylS5r2Bgf^_~;>L^);;R&W>^Y+Q6Bp z0fw*tHSZ$8!#l)F=6_Zyq;IiqnU*)gB>~pT=P0GD=HAIM(3=Z-_#BK7Ci8F3YFevH zdccykap|)~v#z4}MN3?Gq-G1eUPVjg7}EU1L7TG|JM?kS1M9w${y%|0)^5XlgU6`vw~DW_RL|CfSDh!Eg26nsgz5`$ z@wD{3Zf(j}3q1dE3CP2X7v3LaE|}UAFYvy=nrT&4-o+9i7>+XqLUvDE(&%3mf|di+ zWgRBhj~CZX-Rw^(P1Fr7>VKJMSgXmiv3(_*)RC=d*3x_)*R9NR_gYF9O(32i9c% z=Xqem{NA~oQsnN%?h0@fEd8}ap?lqSgFhrgJ4hAJ(cMo?=_34age3KaR+h!)B>di5 ziB!0JTg_rey1f64$Zy-A@y6L|kY!X1`Nvz|@4PUJhLV1kf? z2~Fc8-4yxbcZ5g3fA7H+dk0vj>Ogb$vt$cxkQ=Iu?hk4_%}WHxwRvZlrOTgxS zKCI`d|ADZexEDLO1Z2DuymcSNHiRtn;7V7sujh_9PPgsnAyRuVq_noQgY`P#-)t z$kUzwj-z9*NR{-7s&9q2{BC7hUT7m#&d$*|Kvgqa^pH6$A6L39lP&ih6V81I{|MDx z^vqw|?`{vJDi2oP~PN8uj(VMvM(}RKRI!;myK{ zxjWw=eS#XZYuP-h>o$Q2qFxS-m0??BIe8WR{b*+!>q5{iSjrQJQ|Y9Jxa|b7I)xAn zNpXmKFQ?D!FyU!v->n$!=i{hrxWLY?QYR&6HEo6P{P2XHk%P5OSoS3Xo6i10x>7EJ z40TX(<&{o-Yi<%~OC{obOgZ42 z=|vW`RDJ9#u3w~%eKJY74mHT@*ssrhrUKn2NgncMNoBe4LPe6}sF>=d=Jk=^Q$~Fc za~qkp%iD7DQ1LON@D6CK7ZF0Jd$`<2h1G2nf@FykweZv}b-C0&C$%E)J+wr^h_cHS zkRZWlDA>@oXWep(QR2gUal(r=eU1(Q^jQ`PSJiEIA2U|s_Dt;@zq^Q9SqEn_w%0G2 ztDQ8tKxg?5Po7VnLeKCgjcJvxDe?2x@mvX2jMEc?DJ~pml&d=WLBdk&8RZ3PKz~|H z8_T^mC6v6rPH-o!d>V*X+hWTj-?UT2WFLufpN@J5$QtjBhwe@lofxChdY&<0*7zp(IID+Hrd& z5kH|(PVB5qVAL&u_gtLR{^9OEi4#y~uKu^?De3(GH2 zy%E?_yN;z;yx&m_l=g&6Js*0I8jkTfu#cTPcvL~cJ+EcC!$-cBqn@aMX zbF8#wqEuhwQK!83g@fnWVMoGKGq`l2xy!+gz!a$qRlS1Y!iw9GkywRrKZpC5ciNBq zfrraf;a>ZO9U6Z5M|hy1U#?Q+VamS2&|TUKC5bg6eW_|d41q*`*@=9hz7P!Duu<%L z;rO?EvrEj?n{kf;7VI((;?uZ`mB~ae#8rnm)oU8NAMPIL2$HfZg?o7>_I5BOge4Uu z{a!nKouzp(S4DzcH%#-<+mJ6VWOKB|qLHmPgXQZ(5dki!@FRLtSfLNFT}7nr-)iL> z4ESuuL^{O->i;DRa))neRx;{@k*K#n?LoMgYmw!J)(LN z%u8J|_y}P$xKLFZ^sv3*pF(1Bc42@l7&b5@+1qG4(H=>K&rMWcsozkgX?FS2x-A03 zY>i$m!%|u^&25Co)oveMUYHGgw6TS|F6ccSXGjB%Ib?-13V=2%C(woC$>XOw4j0*I zKwrpe(|}M(Mw-H4Sazg_99grl(7dqI?rFXk?VPRi$qYC|b**ghxNc$2NffjzZ7_N*y9Jot!UU)#$9%E{rIw9He;s?xY zOtUe1j!;Qenjafofc-czS&F4&psn1c0sBsx8*9y19rotIG?SrQw5nMu*XrSAhe$jN zZBlBV;*6qZO7#iaCjL;Xv+N76qc5TN%<1w+=5z}he0I5UGW(-S=mOMRA)uubS-;59 zjLRKDHCkL)qGQxIW+NW7??mozSy6m}ABK$t(}Ys^l^&NL97!Aq&dKvt;{ z-H1l^F6_J_9d)WVlMBftd#R???JshJm8gN9pYZqtwNWvu?4>l=ArPCaw?JiF!r=YO z2B*@@FeVZAswy8}v!9@52)^gPY}QxGQ=t!6`9MO+P*96nm#xx;}& zsKbX?;b(=T0uL+6qQ1wOMJ~H#!(KL)u0#=V1Hc;Ky&aVofaiJu_%3ny?k;Y8jpI^p zYZCiJ1iYM#GUod`lVr@xlO3y{mj%&=O0Y(HdyTz;j7IPFqD8aIci(1z@&g=dFIOSj z)9|zGIkP&}V-lLmxnnHyiog=jR^`g?i^GJM%=Mj?)AN8e1;PN0FHyk}K6Z+tGEkhA zcVS~X@cMQP= zDwf+n5Q&F+2B+B2UhaU&bNyqeCd9KvmTKJ|f$iJPt?Mkb`wY|$Mso(IcSLyh@Nsr% zaEXh_%DZC1 zTef2RP|bG3HcYSG>h%3tmg*lp?&8HtTCBWG)45*3>f0BEqd1B?PsQz&MADt|4okZD z2-}4C7KNG|xcx?ey5w@9&cIOuMn@5V_U*7$Pnb#$AP6sEgavwvM#H9vRmUKol${W- zhm76|iBkQ)*F2fOOqzm*;?1X`I5Q$7&qamXZpg=!lrsFjA56I?cxC%s*dNjo01%bO zNE{={^xK+ya{exd9?h`F$e@Vtd<*7@zI(6Mi z1yqoz>`Q|}sTg};3q%i}z|m23$va8qSSQZG1chImLVNGNpL_hsGB%7J%m{UD`@W5Z zq>0lTWu9S3yk~RQ!t1>wn1Uw{Igl<~p)QqciTjqmK!u0Vc~+aY*}L~ahlW`DTu7FK zZT2w4l3gd#|8e_gIORdM5SILECUIY=i92zHt0+~yJMc(mm46eC2eP2CD(HT) z`_kB?MicI?1c0zj;;>K7k%FP7wf;4;^CsU}9qZCXsTwUN8wyApBAv0VP1B#_Mv9iSDm|az83$x(8zjn}g{*@}pv-C? zps~BJsMxjJQhM>8>VL;{htu2{5Hxv1DYX4U2qJ_eVsrWbc+|q3eiHwSK{3 zqUch{6VrCYEyU+1(9doIuhsnazm<=UIOgUSQC@O(*f6JEyb)TZS||TQU(~R7L_$A$ z?5~H8@~t2-R~x`k*9G%iBeX-M6a4uF#!Ow%7SHvfxu@|oG(4gg;?XrvMfHDHZ{ zjc?f~%GebZ+|pVm`!lfPj8bhFx|}rGOvUEAr(qGMqR)u_f!$#sRJq?yc5-cS!=Cp% zdgmJ-nAk-ijl4>Jfk_vPG(#g-DB}m4(K7#hwS`QvHG-_#sRecYBNB)84YgE*hIoyj zvLpG?!dP3y8l6d=n4yiDHfmmLdE#Js;QlrkorA8|Nyzq#eZIRAt*7%m&Tc>#mL@EB z8;*M1Kpca4_~CRCW)>!O!80h~$ZY*IDO6!FFmd})4tn^O)Pc2NesUu`psB|fZ`1Ev zp?;aMiCSKYMJCAWaJTvVGtl}ot4<#`*t>$L}DUrMAO*Pz5@?fY06tiYOf=zyc3u zDWf+eOPv&$6TL!*exRhXZVFl6MI7GERa(TpO;0&RntXd|L)~k2%QpM18&h3u?Fa3K zFUg#dDz|zb_j5(gVeSc)`R{bo2mJ=ywa^mbjuP&`f0;!2_h8@Y~dH$4pul|QzbPX&@0EEvQ#s;Wvoi8 z)Nh`OSBXlR-Ht+5v6rn1pn;PbqKsWr!K7|%Ba9&0$kWpy!4^k>OA+pQgu8~#{l4pv zrZ2khRF#}#8gYi)(ni%mPT|ifg?47|SomJTG>nq_m|PD;^DWmZ)=AJYw7DSqYNQgn znKaE@eW*m=d>ODmmnrXF*%mfvFa?3_z95rG=l)s^uf#D&1SoWH<%IL_@Wi%DV=Q(C zfsvKs1s|9>Y_b61j)an9jtgn|FSz_?$Q|5K_J^Vh>m$GT+kWB(WJVVaZnHURoZg8G zEVx82)L_$yyQl^&$%wR()EOcaM!QOi0th)WAI4hm3qQ5pE)xi8-)>R(_7C{KAp&JU z#OveYpj9yxU?05=s6fu|BA*UTHhp&UVw(2xxdQJW^?|Z}}YFcjYWBzj-c-GBm>qR=RX2Vd?Sz*3Uco@w5fP7Q%A1 zlI%IkQXO%5BOFW^J`0}tUC7gRU~U4Cm;B_Ko>ss1hNb#F9Az63Mekx@C6}ugj+;!V zX7@1JlvRbbwH^DbIBk7K*mn;CpS2QHjo%Kd*XQbBa22y1f71Q>k5(hHPM+-GZp3rt z8ZSlmSI8c^-n$Z?%X$;tj zRY5pXXd)zir-_7mAA4a5>c$@FQIf6YyV$MNMjd zuIOYhCDk3W?|K8FRE&~Hj|12q6N-xtTQbrZv$Rv!XGpKxTdHr|&>^;MaHwsTUDCj@ zonKH{3SYT(otN)Z`v6_2&7$XTp*gcts9Cyc z*hhvE;Y6_U)WSFxp?ry;1~sFXMA*g-IRR_*8Coi{B4DV11jp;uvy_DhCqz*Ny+p7 z?$J8dO`4gk7AiumYeOr=gT+5I!$Ex%^7V}!{?#=y3hPNs(>4z2r_p3>dSp-g3)JT3 z`#}Rkz->#p{T=`EVSOOx5diMLI0JOw`mc5Re>vCs_p|@!gRlR;KakAe6#u!_B@2M? zwdS<}BVnbXz1iyPqKpa^?f6Hh#2v1i%Q)*(M8@Jlj}m`$nNIj|O(-7iG=i!KkI2h9 zV1mnBu7)5WYA&9zH);>-)^*4qR|D!9t+gLe#?{?;N}Wu4%r%Zqcw_!h34IAKajtHW zVv%JmV|vj&?0=@$W$DYrAaD(g)*Y3c7QDM=g;lMW3&2MP>uWh?V@FG&x9Z20kAl+f zt|xQ&Px$G#%tun?bjN^ z_MM=;$w5O*V}_+U()y%UCyhb1DhK~z`uXe)GdM}6}sQx|sze?Bdh&&w5e$m00(MQu|B^-N>2 z`SOM0^m9AKkTr1vlnIf0=v;cDf*sItv-IVjUkzqZ)7ADTr73&nvJqHwayr~nK{pXY z-3S7&j*NyvRLd5oQJHTv&yNY0AItUeK|vh3>>zR9Kcg!+VX zM1Ph|KBL&jWMyRF-#IhYt?aMHn78ir@iZX+si7(Tz~|4So5H6mD62yqnWF8RhpTgu z!4i%A@878b{|bJ0vSZL1IRu_2J7}Fo9p1Ax38@;i9|V6kLjylUh0Vx8jU}=5PgISa z!BLb@F4o3VjNgnXiQDsoi?6G%ctx&!4roYWuJNT;5yy`bPJIleqZe)ypp_rxYy*UL z5djErw|pyqj8iR|{2%A5UG;^z+G~i1GHmIdn|tu0_Oj<*%(dAtB1QM;g^5~)Md?vc zD7L;{FKsW9VLMTJCVZ4adHX+PFORiAmYSICcv5wSP$RKeB>;v7x*n%|3Z!XHc1efy z9vlr`PyBJgKZhqPP#r_5b0j)Ka{kP+qt|@$%(1}r!QE1pA*pSllIU6uV;iCBIQBka zbz=!i_TCjEDV15K=|2oO#Cmi^`je{vtl68rQCWNbmWkS!OzbTRu_;`mt!-+?Xs9ov zBOt9tBeG)pckI{Ev2&2NKi%B9pL#JW+!0=ZpW=ELTj*k%KR#HJ+5)N^Z7BRf`7r|LU4ioaF7+U^W!;NC=+5!m#yA=NsC?O0?aa$2Vhc zFtirs3-e?7uS<|SgJ=IcUCui5e|6LG3uKe8nK+V~K##nTp^$IdZrLcQC{d1FP~Q&} zeM4X6?4`O)A4FctE@V>)qT4^~K^TB=V}mp9AgiZ?;8@`-Fk_ ztlrs-qv(Z*%MSMQHnZB%!m{?VlLj(I8|8!~dIec*YF-NX!Fv+@SE>c$cM9+(h$j2c zAf5tuec1Mz(oMC@)xy4(3KM%Nfned(oYaX)8iSJjy*duGmKTj+(=NC$bzk`of=O%Qf1oPQ{v#|?8y&k+>_vEF+~z0A7G==zBs zZ}&eXVEl1jxLB_KG`Tz{|I)>oNVAg!_jph-s=vE3Z_y)VwRCyszI0LKy~0X=?0M<$ zR^4_%T?yePE9R&TW5P?ag#Y1fu8F=;3Fr3p_Z!qaTJ0d(VX7*|WX0`c`Y$KDQ3)-U zgAZZuwqDDYR`Id{!q68u9-C#R4l8=<+`(^l()R%^5=-3_A?7xgZV;IS5!yZ!Jl-(~ zg$Nv7T>$QukCIL>sz|t(GLahBgKcrH2LGTJv->mrH*~yn1Hnf1~omt}x+BU7AbXUb)4ZF@{8#efPBAKZm7jOEMo(yG zY9s()fi-fpxr)e+K7IOJ6zd)JIpmTj&2H%K|I^-kM>VxY|Gq&KY!JIrV+HA=6bXcg z9zj7sdQVUUqy(f(=%Qeui1aQZT?oA=peQXAAwYmor345?10e(mxf_q?{C@Y1_wE~a zjQhs>z47k;i!rjbm(dycBFTez_opH zIO(H=)x=sGdHr^9#O;dGa}J=&d>tsgV4KSRP0-;A)HMY+nT6zpzWJvytBbsWrr8-pNnLG6m)Y}!=bU;nOJO<;zAHUL>cG{e% zuXxd`A0t-eW;?~tdhyT4Y%3u>W z;)YmuT!`N4cu$KQXruE*v{ga-wsCK$G$7f7V|isU{@(R|%qs>t`o1l}t>(H*U|!!N z>arJ0uO6EZB&8W9>ZQ!?`!&mpe+<;muiUAUNg%|8p7!#Ad6#i&d4S5kAEO`i9ay>- zUrPonkT3%QXoh(f-)+pa>4D259$M?dKa$grc_7B^)*-J~NI8d=ywT z6;$vP*e|y#hqW#LeBkklTZram2NMt-!7;&=-sdtvj#u7aH(N&4UPf+=BBz%F z%th#(%P}jm4HDz#wY`ZDV5Y%@klyq4zP3(3L+`X)D0I~Z5_StKK;noOaC>QXCxtf{ zmN_H+TS2~sdD{Lz=hPXWpIK2WEFi7&>8}p(Q_4O0BBL-&h}2yE0Aplj=g1kK^|WxK>4E|*gY~}GqWZFz#Nb&vtX5^2VOvp% zYNj5F#1s2)%SC0~!oT0b&T0ZWHU-wVS9IphkEN2=xWfDuF3`GqKi32$4O zd(<}I2j^d^tBpJX3kq*I9(br2G!zl?qru}wB?eXVX=pl}Ib5o~;GTAdQoZ(MKRVe% z%M_pu&OlT}KwEQ=X@`aYGo0<(hRjL!V%F1pxLz*=&fyU5)a}r-)y_0;hFOJwiEzGa zgL?P)I)60e4B@rAX#guoJzZLLDcH|7hkLv0N?ZX<61f1Aq??kR<##g>cCyb(BDjSw z`x?DJT|D`joys+J{coj}J9;iwjmq`)Mj`0raPX~pFcKB}<$KSAy_UOWv#Q@c>?=CV z`$S>Ep;>M&H!*_?Li0o8Vj7)iv$=(qo#Uajakqh$=!^@sYDHtJ*Kf>o`1u%aP1V^P zvNSAQj1LkhIEKJ3x!c@$KsKPWy+NkNp2DG99gG1eBhEpPaF zuzpfmtvX~Y3pYVg&Gbskvcq%d&ekuf?J2J7S0KQil=-?B6pfC?(Va=&y9AE!nVmDm zQJ_!KQXK~x(YN;ax|Jx3t0)1vHr{&o;Fj@3fwZEp`z(DT@N|fU2z{SSJ9EdlXf*;a z(1osTp>R^eFZtuG)}t5b5%H4ksbZVcV`?7VqzRY5w}Nl8_ples zL5rUnL*oa7Kh1Dhj#?rbKE15xUBNmbwx8itz$%tJ6xl0#gCG}2CUFDH3$b4^GOrfv zvAo>Ytc=DeJ5din=SzX8nY0lKGcQ#dNn7xLzffE*q0fS)tnsD%dW1b&aZQu+3a30? zulZ_39zKim(pqWs`S^vi?Mm$pBvUyGwC@Z zLZEyf&1Jh-;X=ye13`LH8^e{?`$z=QTc82P*#wE=PjizXM>b=rzetfzK@drMk1StlH{iS{P7Q^lt8 zms(+E-#QzfPad6PJ7l@N@n_do*fPBZm)-LcZYoTd!Af{Z{M<=B5lBPyu+;S&Tz0?# zedp-n#lFueE1}bTezo#;=0^-UCC9lr)M>_rQdo)cRRVoNUAPl@kki@^h~YrHR+xra zE*5HbNyApuzC1?V`{}OG&}M94CVPwsGo8)GvOS*$_&HqlZ^VRozrWSjW^jzv37NPn~PF^aWe9u>x!pC2kV$j?`a3mv-cC(D{t!h zN~Dy}jxYSJ)_1n<^`SHphWkf* zs~XN)n4zt+&>u$d%^w!oP+$`K|0gGAV4BfL|irj;Rcb)@%$p`k+ zMk*ZowW;8Tv;wPT`*43HvBpyysgnJN%s%P`+}B7KPCe~2Qi2XvF)37^6({9WJNO7* zMk?rGBOZKgGz;BO*qhax*==jo0L55HP-A$Cjk1-7FZ1=w>JJWySzs4fUbznEui%_w z`^0tUi4=M*F;S~QIX=h|yAQ}iP4xzMKeb90;yU{FM?fyE;98i-)_aK!`wf@O5#%Cj zAz7GSuy#8q{w_*Uj~A7qbhSBLmN{p10k60lfQTO6%ftR}=n?W?EA$u*JnNlDvs#Hv zxKw)zi`MfoBhm;`B>@M4iZgKcvYUagc0)w9E=~^B+NYFKK%mn1xO*5W zVIRS8wenr@)hjv%`XJ9zx^7R4GyXIPbgwUdo;LHSJM-5|&t2$GC?5!F4f9f>!zGZw z*+UDFZOw5~LL_K4(~-Oji{!fRwG<2c|IUZe@*vV$$s&WOJ=0NFHN7~mZT*;T;N4s~ za^33p090;T4GKN>vop&P=YvOO5S?2c(qM|1HVg`%AztaW3n1v%-sK5I`On0eV=qxB zYqUo>b6C}vApYlFX=}m*GcCu>a3GLnX+NY%I*Ot}f?Cfvh#1|T=>+a)vBXY`jS{%16!r9cIcgg*9OKA6$X)uKBjXG}ff#mIDm^_P~x@`-Q_cYaIKITQzz{e5;;5|qHz&auxLmq z8jBH_Ew?tBQSe)o8l*Pk;|q6w?lYPuYBsyRqS&wd(#VC(({3c42LH*VPZoxo^lK8t zl+`n12uF~dtlvyo>TV$aeXnLIXpzg?NI5!S+&M{c-II zby%VXy_}tb6?LWcO4Q`;u$r^9twa4^4n4gkIaYfKgIcS~nhP!0c4`-#I%iw$$k+o4 zY%>gqvHd}euk>htc%ac~C(;r;XzMv119tWmI!!yWk5w4K9Odg>lwy715=JWPGu)`7 z-O~#*-6`93F3YM5wa~NZU#vVg_n}TBTbOJ>VZ)Mjdh6Yah&1{#vY)~DdWKgeJ(@tY zo@>xI?O)ek?jiJ3?akzi{0)^Nch*C?@>sY_AGi%rY8J3xy9$ z*12dg8G=XNfREve@I16Dt~QNZRp_TZ+7~d)ft6n_nq$=;1wZU)(ofWW5VY@OpX19S zUZVx;4j}%r`#=81AA2p~(bu}vs+B#S<;wS!#5D&p|C;$`>+0(DbFdrtW5=gk@v~qv z^r_DjoQcS8qb&Ho!^_VErep9CAc&oX_4~hItF_WgjhZ#T z#?#f4uXX#~VbI58;{*=;WA!tM8?-D`YAJwWMaO?t$hIjX7s>N~X0v_CM&us7wcb#q zxEhJ$>rfO%j?t)>tVbW;&`-y7Pk$sR(vB;58)Q*tdTUY4^!Csyr#3e1CuQMyWeHlG ztgJ=!j?qYDp@jjyg~L*>SN_<))A1A#PoL#4?p&<_OA331W+#KA;yBwUWTwu!-hi1m z!{!bL|Kp;l_qI2CE455I&h1B3XISNkHiTK0D{FZ;ZpQ8e2Dq^&cJtRVv1FUhr7|0MeuzwV^)a;+nE{fT$XH?Cmup02&sV=R5G9 zre7^)W^@BX$@(=f9*W=0y_2TY>48d*hTRgD8 zj96CswO*LkI*f%_(Q1b?2G56K1a(kc4aqAt+A|eK%2Ac4J8pPVYukX0@KeOS(9%UK zg`dvyBY}C!!Wp2&N)|nF_ zbO<`IIzupUI@-*Y+S)SK)FP|!#FYL>2mBl|7isS+WXqcC)>~_OgD@&27qJrSw`!%w zUHWVaNV4&8DkCzuo7ny_T`SRByxA8Wr;;_-2#!yp14UQSEi{w0g19C7Ky^ zGAo%n+%WbwfYoj0s#7Qo-M{4bRm^`B$jozB<9-=cXi1M7BxxbN*h}L;pCD%%GP))W zDz^LG(%TbRauJ<8w+x*%mYNQw31>N9{P&RnNoeovnWU{>FK=LuH1=0ZIa-yasVBv!hPENUAbM6}xDE(u&vPk*swz8g4?b<*Xu43(G( z(uIdP`pg(gPGt`Lxl^@7vkS1`*>+rSQUpd4!7xrr?rZP>k+zN)Ee;k&KmT)u2+-n_ z?O)mE_cnT0X62pQ>d4Bm>qSy1O4ucs&4NQt|1S#I#ljW-wL&=5 zH&^D*bcOCIJ_&3hK%fLiTFWC~)s038jQIb*_+jmC;%+DXbYVEH?Ixt*x2MoSW)tJ1 zVUf)jh82L(OUM-!1#LwqDi(6B{}0b8m~Uo0qEvi{j1N5qx}lIOMbK`|1OyUp3wiOWajtB|MMr@wdu#dBUj?bmTBvZf3EQ!KYy_3!Z>0$7UF%Y8G)XKlJDE|iYUx8-lwYim)`KJ5zKkCjKrV=r7U z%PAlEgtmjZt47eCvJ8KOoE_YXNZY~j%Qj~hGICDOWTnx9X8sIWSSs-CRCkn>gj>*I zf?4gm4F@{VD<>~pF6di?PTgb8ad{;KqJ&2$$nzFi69r9IIUFB?)|-y^E^unYU|mH; zcr(&7Lh{aH_R=DPxuUF47+j@#Lr%*Tv|gJcIT*UT#P1$g)}0HJ zd#~KTvXNh-()PT;%iXeKjB?aR1;Nb;#~*A#-XWY@@@B%G#`_Xee}u17zp4y*=@ z_|TZ#TDqXqWa@FMYlm^w-@P;;q&@fx6fU!JQA9?X1mb5)f;F!h2|I&pO@-m0K!^>A5ziM_!lku=NqZclM` zjV5Vk(A)X(i?36^DILI*#2+{s$ed)?s6U&ph}{@wYI%J!V%oE$-r#HP4cG2=A6ibp z>~I!KGTXK-4N~2oejb?QwA7gT&e1!w+b3h*1-%4NrSWUJ=ud;+ua^Us;yTr2>aw*t za}fW89f3%+`-970@f5lPGPDC|%XzTL{KUu8#=vbU*v4%CldO;YG{hF%bHT6Y9Px)- z65_O1357bAjLEk~#1rDf=o@NBfG_z;Sz!sakm-e>hX_73h)8#FGi^Bq|;%*H($e;7x2#_hkI3 z832WazXE_W|GZg+$u_Wdt6aclw|pCZ$pN(ITldfA26Q9 z8m-l%ht_l4f=ZC7@QO&nKIN}}#%4qkaH^X6!fxU3?Hm8lYDmNMBX3hK9E!`5xV8t5 zJdgL_-G$a*ZhU=L?Q1TvPVh!FPDqyhH5-ym+$OksLA(Y2c-p`YA>-e1&|MR32LIzt z|4S2VzXON4?NEWK#y)#**B((5Xh5Z(f0z9%=3Q;#x_9fX*!ERbliF%6!OAX(R5re2 zpE=)g(p>tKNMv6dP=n-j<)C1GR1!~FY|HdyUL517fo`n#&?ozkl^Hr|pGrH~RgJz? zwd9jEnAOgtNB2GJQd}SY$kaRxs?xi?&oZa4QhoAH!>8QJ4vf>gvYD}uDfJOH=hMz zW-`4Kg5>I}Sr{86h`Kqh3K~nMZjL25>;Rbs9u6;5Y>3G$R!@v?J%REUtl!@_WIcBk zn`L4zvFaQ@=a(6IiREyi7U`kACK!jCHMJVv56Gr0%CmHFG?B#QNCAq}TQI)P}k!D_FBG*SeLr}c| zKjJ9?zL%^^x`>kC%Ah`x$r|^XYHICrnI4(1H>7p^m9O25aOF7$)G@{074dlZQLA=z zWTIsvLMUOJ+!!z7)V zC0B9y2WDyEb)ZjKJNIPH?J3@@y=%Wa4$`wI!mCRFUh`<_62PbFkDV#j$wU6Br7qP$f>o=SJ>oSNUKoLQ}$|N2hb zTc&jV7|8OGDD{H5K{ys*#Uwqtg2RjMaBCP@RmTqjq8fweQHlqz78e)|CsBei+x@Z{ zEyIjvD&b>x2JC9#9f|SEdc$l$t=-UZAr{BnH*fEPypXc~G}CdgS888HdN|(RI;li! zSUDSpQs-!Zfs?iHoMWpljOC=c+aS)K5>^;6#M5c~7>Od8h!LZyczAiS^0 zDZa>pGs`(NQ9j9^maj74sLS{?d)hPKjkxhVY7CGKxmQ@{mhQ%MpR@An&5X=2IvC2W zkztl~o9yC}`d%b*0AK4VwL<%~;Z6S8)!o;!$L=uBUe>}!(kYfZHsniJVd;aCMBH0x z)N}~7@o9y`uY`VPu}hnyN71N5sZ~~?PNFM9cUff1Z%SUSUjcP_hFrTZ<7(z`b=4a( zDT`j>q~kGTL@;y3h;KaM?xW0_0k1??jBoLYmlE^Z|OHTbLra{d?drrk2y) zG{xgQBg%X^OF->LuOB(JNzfyF&AkfW+cMQWYl!#A-A;ILFS*8CPPswpC-kG1QL?Ba zGax=d;05IJNE%8&f=hP^6W{3DdVuWlb6W&%Xh-T@?1x|4G`SnDG~pJToe$-f{Xy7rPJL5zV>quKg`gEpLch6}o`XXKk35H-jBtL}l3r?VRqjVT#Vqr5@P?GS5mUGO@+#j@lx2&_l z&U@MveCN~YveCv_oQZtA?N^v>ktyLn_2(jjy-FJ1Du$Q%KMA`9(1&f=hn(^p4>J~yw-3Vt#6f$3M$d+RZel?ptm*OUbt@42L%W4#rvoPG7279 z&{cTmoT9Q^AkXd^kE2?1X$DD(Mp7{f{(_6Y*oo~Ur$o+B;LLh;vjDeWY?bO+0hR%n zPdY8xt3T&$tJINZ!Bs^)x%v6g=>EoKMcub@v4*zAtVD@kuge>ob1|ERT~A|eCbDvI z7U<#Rtg#`Z%Mz1IExu>YoeA^^&H9cB7+8o*?{IimbfbIT)Pyhuv<;CrCKEp`8xb|? zl$g~?^lGQUg649Wvj+=tR!#_zX4x#8z=}kP56Fx7sSL>tb;mRd20w+wIy|7#QK}w6X}uVRs-~4 z^yQ&qGue*58vkM5at&oEJ9-Qg=fanaKHU5zPAE^0VNzFX#1XmHuG>KLHOO?&XS(Nw zR7ZQl##_PI$e_^$#Q4$}#i>@^N~U=f^Vz|*Rw=LYTD3!2AI0@9(kOYepE;jOc5{9*6kD2VBeppYV#CtAB@&TpM8*%!^)KE656fsfuI{O`|rKd`NHTdMXh>P}`oiFO^o*njdB?am!t1%W92kdHu# zw)H#M`0Jb2mL|m7xTlVr#`-&y31f4fWAEFeZzMWow0MtV7N#2ASB6cenRP`L9PTh) zgZ9BW-<7_m?hKj4N!Sb-^33(6F`a zn8`d3`W=$yIUAl-l%G6?RxvR<<(s$iond@`smZT5gJhQPh$I$7WMIdPg-;mw5(}g? zBl8f@Sq>Az*bl@O4+-A3w9kOs>r9iofs~QAy|4Dg5`$I_JRW)B4cTw|L&UI`7kruhkUwQ#5-+_6-&s{#e$7 zRd!sWHf~L54Po5B>G|~O64&mHYiwc_^Swc zFz*e?Y;-HfI+my)yi{`t^xohx$S`q8+;6k#RItr`{FKt+P{{p}gE?-mjE=^bMJ>$G zo#S$Df`ca~Fst`##tOCx>m`Th-7|4SG1JPYXOUhic94T>h-ldl<@1k^<2c1z1QX&iM)0ouDm`0WZDJML ztIBBOEUPQCn{I-*H&!MKt{G$0Oa z>dCWKfAk6R8D?m782Phj;n!47di_2MuWfn>-FL2DsQ;u0?f!>53aEqeM^!#gb?OQY ztroT(3zS$f1s~uyL-QOvA?YS@lkK|N$FQosTZIhXG33bA10Gt>y|nr~5Vgy_!(3wl zoWooh<;KerWOD|gcVRiIGWq5n>+*LvTzsSrsa+vHqtpUo`%CRKR_k&)JDDYITR+kD z?K1`YwG=0!;iDpzIgGEhwYo)AnKwz)2XkVUZu}hh5@-9_mn;5N284G{y$`A)5m&9W z61Vx|s)`{jn`;SsX34)HmI{eEnF&JE=p zbNMDw;r4sBx#rxxTL%H1*GfADTKrBA{@xqpz;#yF;QIbl)(v2x(x|&iL(r-BvqVOu z^BzqTKSX=_Eq8#C;3>dHg)-X#@}!I6jiU85M;HCP0Mi(Gttnrb5)f|^1;vN*9<7{V z2gllNJ@J<|Iytk97}{{$ZD>>cOCaxQ(=j4g-qAd(eY7y}km5FRuLaEBN6Wb)K}r0z zO#a%=GcN3nZxorGDfFS5HKKC5f29R<&7p1!T+lu`f^gq@5X8~YwFT@~Wg-eQeUP~= zQ9GqSMTfo@A$b%p2ZySYyLgO@0}9buDg%^k`6Ky|a=uqC_Or$(l+^x@?#w7nHYu`BQZ95locV&Gt_|;O#!y8TJErSs= zV+T{jVDP+ULAyGUi}zK<<|$^>+Yqno5cZjvOX;^LbBNX8Tbx<88U+M1=|KmHc_k6F z8PD*cW%@CF?5R!ZmZN8$O%)$L6{(XB*GP0Mo-w(ObntN2Y@p|I_kCq1ELvE7_L0y? z;|zVkb4H1`zUw^EqTOX*SGu%>`_g7FTP0b_YYhx3jGEQ#iMtsM5Qz37OaW*B%AAKMLhF+sxq9wQohvnCHQ4gMOthLH2WV%@G-<@|MT=G}RyBhHk8$Q85yD)YBqx zAkHU+cnT2Q=k5>8Pu0m3RQ^ILbA(^~K0(}~IKAdK3ok>-2H2+(*sb1IS-=+ipe_7e z&a4L`-XK6Uul9!&*5=kXAsbxRHIKtikz6E(bVN_vxTm-1yPcMspDiP+P!2nPJ+rbw z)M6YsLJe8PAlhFrn7Kc>bXrt7cadh9gp9czhN#DymaF}RCQ&~y5v_BHzPQOr!z zVN_EL8ay~4pL2WpZhW*S=8p%Jd~)yhGOd33*H3p%*a;{lmvedsJBI7KMez62T=2F5 zH%ubbmKBzVKgN+Ty$%tiIF*ZF-L6=OxZATLtw56{LW9(`G)_{*F)u+!vIL;Ic|Yw^ zzwE2k!}BxcZJy(dcYF4^{5H&XFSE2uh3US#c6opEOtJr_I=K-W3N@qCe7)mymlP%btDPQ=n?fd|C;20>af$*=lHTUngruVtagxZA5dX_NJH6d zz@0@tO@xo=1&d2Ik`Dl*4A79k;ZLW=pV zQtfg#yS33v<#!N;22OLD%3NA<^AF z;nt`^@zJCH;l27|6wgqE)Emd{O6L0;?AN#Rbp{`LINikFct@>Mk33+uh&n>JFIEco zRaBY#aYnsz)rvnenzhhyjXq7lTzawkeWpI2e-3r59sj#U9nPs!)nQmVePLTwkhmEU`Ad138 zC9(vCHn~E&E-lmwTtS-fEqmxgTcB^{uIKiqc;s?kddF#lYyKH3kdWz9l!)Q6Q36*w zTv}Ed>>`0ZoaNwo7Ei`j^!#zev` zyOI&JAh%dUuh8(~(G!<5V}G05KD#}PGnaG38IEQ-k873sJ-=VJ1jBN>-zz8@nA511lbz&2AF+<%wC|*Ap`LeYoc3(dO{mb~)T;!A0Tkh5t>!8+ zng}#ryxMZ95($o~RMY)ufd>3saTM~+z?5XwB1hm|`-dEsSQpQO$+M>eJd)+KWuJ%W zXDz~G6vN|ngHeEfD>+lhz3}UZ>>2ZU=~xf6>UX?6Edd3VIcG<{g!kja zI`{G>+c$I-B#LU^^sf5M_=001!13_PE!mAD3)vTbUdf>5`bTlMTUT?s?|6iwqc{ck z_u{eQEk_^KtgONOa*g6Py|a4r@dueddF~|Nr7!a-<+ksc3eri}U_u?|ZizS5MRd3+ zS=baU#KPg9%Ddmm{fUWdMYKR`k$|FoYcpWFC#$6#4+keK?)@^$d-1B@q3(6(Rkn#f{N8LJnoK&Ty z{ri-I`!f2Nbxt`7U%vru79VqaOmkRj5c9`ub+?4E*!TDpww0vhAN7WX>q{|e2WSZ0F7Fg z-o?c8=AC#)%RP&HKN!0xU|w+LamvbKny4-z(=?Aup9T!JJZC90>(4pMFgmfGpG}%g zkSrE=tZIXFKIE9bAatJSohx{@HVLZ^2Nc-sE(-Z73{2JUjGD`Kg!F| z6jEz+8=ftuy7@JnfdmwfQYNV_o(-x+ZEAd3npxizlvzoRPau1ASJ=pJI+tsf?AF)$ z{LkJKp_lTjyD8s)v z5&5RyMJ+asQ_BlH`Zs$hmoyS%Tni&EgOWWRP1=tf65vO9A>Z_q`di>Kk3?EhCp71; zXO39D2>{xV?OW8aD~$JGex{0>s#)i{?Qz6Av@LN|jmZ`*t)DWOO(eD54-xJgovBJ* zdm?P(OnHBYC$)FEbXLP2WN6{DurmMw^NYuE;td!^wKzj}AMd<%N*|or48Akqdi^4> zWCR-rV}ovFN6Oh>3;zut!dW@cG!B>`! zI@ozTO-Cwwjt*E<4k_S%P%AgD%~v~ms6NELHI%Xux%F2W$3V%>Cnj-?YgUsp~in^N6{r^uc2iT zP{MPdb$If(7&XD@q;$g;!)Aj2v1?8}m(@pGZpj|7n%2K-aC1{&fL5meB`vRCS3tfp z_s8^Pam&vh*u$&Y7o;KPPzi%?$VX*8jFrfm6Ec8WfE~5w71Bs&UK7w}p~}4}cet)@ zaSc6^RXWg*U5I#*1|JI5`LA~BL{9zC!tdCjL}+d(Li ziQ}_FWSx0Id8}VV-iubM84P^?&R1}RqNK6&4Ys&9Yh3;n(I|vUjPj^CLQay}@|_Lf zW)Jap%u8`Ffv}!bq1rfYlSN2+EzzcGTt+{bb_miWr;ibuCk?@BCgMP=#3)wsO zl!{!#Z(%+K^jDt>!{e|42GPu66hq7Tz<@K{%^ss`n2TM^#6nwzv2y^lg1U-xk+ zCwUuMr&|$UV(x+x8ijm8o>b8bpyWfNmafQG>i(mLL85OYN!d#I?Sss93@x$}C(MUK z(5bfXKHLfpZ!4LcS?`f6kXS@^ENk&wH;@!`Fpu0KLHS9FdBeoH7#{X@N2 zemD<$BWs_AJ6 zHbAOQv>W^6QfbH2NB{A~WM8ot8_iU_`LOdhyboD_l~TW%n6g;aNq9F)@jfrFTzzQ; zSFlaHR^y^EJxVMxiR+x5L((>v1DtmvyZ>?;eV6h5YUb2&? zezOY^@=Mm_?nGS&R~lJEv_iXf;$C^@qJfC1&pM;Z=LY{FpHg# z3b?(gU0^4#9R0=~3CTwRl1c0CM;I9SdTScasm-CTf88L-sov*ST#gef>2NB6Fk;2{ zdAwpQAdlv`fcUbEb9zchbBTi}|AztOxA6qRTs5W};IVQm;|}BZSvw9_s;e2D-P0jS z1Li5G7E6-k;CH%@GkyxtFPJ;0;AZx!bxK=qvGk@F=CxnjJq9WOUbA)E>Z6^_aUzOg zlLz;}EHAJbAFc7#2=O;NC@PE^SJ=@Ig}){>oF}2TAMgOBhkx7ZVdBNZjfkiWR__$f z{|C+qL#xB;AW3slt0gJ*;;yrSHEBGSn#mBGy_VYJuF45C(+SxCuhDB#KJ&i_AL9s+ z2Iyu{>o=B9zp*k5tnBe`41g?#T=-EsrwaTzJ{0~Vn|z(2swCj zR&d0mW&ZE0&vM)z4V;%1eu|z-rKm=lVPO@l`$=PdbiH}{Gi=c0p%_4S;<~_H5Y?sgEqp&pubTCTFm<20P3oPQxvrVgybdBDm~T^JRkb;9xPUSgw^nLv-b2A>}(i2 zrMnJ2ujjp#+6@RZ2|2S~ud!MrYFvPZY72@)>%wa*`DM;M6s%8EvYhXK@;1@VhX*g> zi~b4`dJ4=knbSTYs#%@dkA}umvK@NYrHnEOSnuwNuUseJ>h!M1Tf~wp5vyogh>S&S zMdtTI1OJPh-2Zdlb+_Q{Hw>-<)93Kp`A@#)9|An+|Kx*$`Llws2V!rOk$aJU77iXj z0rQ^%LebrV#J`W$1ONNa-I4geABS%;3>F)$+kp@+-gIL3U+&)4`m5-s<+J|=)Nne{ literal 29649 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 )9dT=4! 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⁣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 literal 52706 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 diff --git a/docs/images/discord_oauth2_scope.png b/docs/images/discord_oauth2_scope.png index 9e2cdeff0760f6f498a0743e5acf0b4aad9860c4..cfec3676aa731bd1c95e73d7b66e91f6182b8b0c 100644 GIT binary patch literal 35400 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

cgG~wgRF%?yCr@?ZyF>(gyDD69 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 literal 51849 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 Tuj_vS|5P7oJuH9l?9KlIyuJ*i From fa7f257b41805fbb85a52c0b2a7e7c8188792324 Mon Sep 17 00:00:00 2001 From: Vincent Date: Tue, 30 Nov 2021 20:01:16 +0800 Subject: [PATCH 056/180] Trying to see how blurple would look --- docs/_static/style.css | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/_static/style.css b/docs/_static/style.css index b083fecdb2..5d1d51e8f4 100644 --- a/docs/_static/style.css +++ b/docs/_static/style.css @@ -40,6 +40,7 @@ Historically however, thanks to: --blue-4: #003eaa; --blue-5: #002275; --blue-6: #000f40; + --blurple: #7289DA; --settings: var(--grey-1); --settings-hover: var(--grey-1-8); @@ -56,7 +57,7 @@ Historically however, thanks to: --nav-hover-text: var(--grey-6); --nav-header-text: var(--black); --sub-header-background: var(--grey-6); - --search-border: var(--grey-4); + --search-border: var(--blurple); --search-text: var(--white); --search-focus: var(--blue-1); --search-button: var(--grey-1); @@ -65,7 +66,7 @@ Historically however, thanks to: --footer-link: var(--grey-6); --hr-border: var(--grey-2); --main-big-headers-text: var(--black); - --main-big-headers-border: var(--grey-4); + --main-big-headers-border: var(--blurple); --main-h5-header-text: var(--black); --main-h6-header-text: var(--grey-4); --main-h4-header-border: var(--grey-4); @@ -118,7 +119,7 @@ Historically however, thanks to: --link-text: var(--blue-1); --link-hover-text: var(--blue-2); --main-text: var(--white); - --sub-header-background: var(--grey-8); + --sub-header-background: var(--blurple); --search-border: var(--grey-5); --nav-background: var(--main-background); --nav-text: var(--grey-1); From ef5cb5dc33637c8e18ef91d470ebe1fb82aaaa2c Mon Sep 17 00:00:00 2001 From: Vincent Date: Tue, 30 Nov 2021 20:56:27 +0800 Subject: [PATCH 057/180] Fixing Some Doc Types And Lints Docs --- discord/__init__.py | 2 +- discord/abc.py | 2 +- discord/activity.py | 2 +- discord/appinfo.py | 2 +- discord/asset.py | 4 +- discord/audit_logs.py | 2 +- docs/conf.py | 222 ++++++++++++------------ docs/extensions/attributetable.py | 188 +++++++++++++------- docs/extensions/builder.py | 61 ++++--- docs/extensions/details.py | 34 ++-- docs/extensions/exception_hierarchy.py | 18 +- docs/extensions/nitpick_file_ignorer.py | 12 +- docs/extensions/resourcelinks.py | 12 +- 13 files changed, 322 insertions(+), 239 deletions(-) diff --git a/discord/__init__.py b/discord/__init__.py index c7169908c3..b9a97d0f66 100644 --- a/discord/__init__.py +++ b/discord/__init__.py @@ -9,7 +9,7 @@ """ -__title__ = 'discord' +__title__ = 'pycord' __author__ = 'Pycord Development' __license__ = 'MIT' __copyright__ = 'Copyright 2015-2021 Rapptz & Copyright 2021-present Pycord Development' diff --git a/discord/abc.py b/discord/abc.py index 8aeec0b9dc..a18a18c4bb 100644 --- a/discord/abc.py +++ b/discord/abc.py @@ -1243,7 +1243,7 @@ async def send( ): """|coro| - Sends a message to the destination with the content given. + Sends a message to the destination where the content was given. The content must be a type that can convert to a string through ``str(content)``. If the content is set to ``None`` (the default), then the ``embed`` parameter must diff --git a/discord/activity.py b/discord/activity.py index 98dd4ac5ae..b29d1876f7 100644 --- a/discord/activity.py +++ b/discord/activity.py @@ -43,7 +43,7 @@ 'CustomActivity', ) -"""If curious, this is the current schema for an activity. +"""If your curious, this is the current schema for an activity. It's fairly long so I will document it here: diff --git a/discord/appinfo.py b/discord/appinfo.py index b9d208439a..56cc989e4e 100644 --- a/discord/appinfo.py +++ b/discord/appinfo.py @@ -47,7 +47,7 @@ class AppInfo: - """Represents the application info for the bot provided by Discord. + """Represents the application info for the bot from discord. Attributes diff --git a/discord/asset.py b/discord/asset.py index dade1397cd..ed09ad3e12 100644 --- a/discord/asset.py +++ b/discord/asset.py @@ -365,12 +365,12 @@ def with_format(self, format: ValidAssetFormatTypes, /) -> Asset: Parameters ------------ format: :class:`str` - The new format of the asset. + The new format of an asset. Raises ------- InvalidArgument - The asset had an invalid format. + The asset has an invalid format. Returns -------- diff --git a/discord/audit_logs.py b/discord/audit_logs.py index 7e09d2c21f..a3b0b66610 100644 --- a/discord/audit_logs.py +++ b/discord/audit_logs.py @@ -315,7 +315,7 @@ class _AuditLogProxyStageInstanceAction: class AuditLogEntry(Hashable): r"""Represents an Audit Log entry. - You retrieve these via :meth:`Guild.audit_logs`. + You retrieve these through :meth:`Guild.audit_logs`. .. container:: operations diff --git a/docs/conf.py b/docs/conf.py index 61a3a29f6b..a9cfaac42a 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -18,45 +18,45 @@ # If extensions (or modules to document with autodoc) are in another directory, # add these directories to sys.path here. If the directory is relative to the # documentation root, use os.path.abspath to make it absolute, like shown here. -sys.path.insert(0, os.path.abspath('..')) -sys.path.append(os.path.abspath('extensions')) +sys.path.insert(0, os.path.abspath("..")) +sys.path.append(os.path.abspath("extensions")) # -- General configuration ------------------------------------------------ # If your documentation needs a minimal Sphinx version, state it here. -#needs_sphinx = '1.0' +# needs_sphinx = '1.0' # Add any Sphinx extension module names here, as strings. They can be # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ - 'builder', - 'sphinx.ext.autodoc', - 'sphinx.ext.extlinks', - 'sphinx.ext.intersphinx', - 'sphinx.ext.napoleon', - 'sphinxcontrib_trio', - 'details', - 'exception_hierarchy', - 'attributetable', - 'resourcelinks', - 'nitpick_file_ignorer', + "builder", + "sphinx.ext.autodoc", + "sphinx.ext.extlinks", + "sphinx.ext.intersphinx", + "sphinx.ext.napoleon", + "sphinxcontrib_trio", + "details", + "exception_hierarchy", + "attributetable", + "resourcelinks", + "nitpick_file_ignorer", ] -autodoc_member_order = 'bysource' -autodoc_typehints = 'none' +autodoc_member_order = "bysource" +autodoc_typehints = "none" # maybe consider this? # napoleon_attr_annotations = False extlinks = { - 'issue': ('https://github.com/Pycord-Development/pycord/issues/%s', 'GH-'), + "issue": ("https://github.com/Pycord-Development/pycord/issues/%s", "GH-"), } # Links used for cross-referencing stuff in other documentation intersphinx_mapping = { - 'py': ('https://docs.python.org/3', None), - 'aio': ('https://docs.aiohttp.org/en/stable/', None), - 'req': ('https://docs.python-requests.org/en/latest/', None) + "py": ("https://docs.python.org/3", None), + "aio": ("https://docs.aiohttp.org/en/stable/", None), + "req": ("https://docs.python-requests.org/en/latest/", None), } rst_prolog = """ @@ -67,20 +67,20 @@ """ # Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] +templates_path = ["_templates"] # The suffix of source filenames. -source_suffix = '.rst' +source_suffix = ".rst" # The encoding of source files. -#source_encoding = 'utf-8-sig' +# source_encoding = 'utf-8-sig' # The master toctree document. -master_doc = 'index' +master_doc = "index" # General information about the project. -project = 'Pycord' -copyright = '2015-2021, Rapptz & 2021-present, Pycord Development' +project = "Pycord" +copyright = "2015-2021, Rapptz & 2021-present, Pycord Development" # The version info for the project you're documenting, acts as replacement for # |version| and |release|, also used in various other places throughout the @@ -88,15 +88,17 @@ # # The short X.Y version. -version = '' -with open('../discord/__init__.py') as f: - version = re.search(r'^__version__\s*=\s*[\'"]([^\'"]*)[\'"]', f.read(), re.MULTILINE).group(1) +version = "" +with open("../discord/__init__.py") as f: + version = re.search( + r'^__version__\s*=\s*[\'"]([^\'"]*)[\'"]', f.read(), re.MULTILINE + ).group(1) # The full version, including alpha/beta/rc tags. release = version # This assumes a tag is available for final releases -branch = 'master' if version.endswith('a') else 'v' + version +branch = "master" if version.endswith("a") else "v" + version # The language for content autogenerated by Sphinx. Refer to documentation # for a list of supported languages. @@ -105,48 +107,48 @@ # Usually you set "language" from the command line for these cases. language = None -locale_dirs = ['locale/'] +locale_dirs = ["locale/"] gettext_compact = False # There are two options for replacing |today|: either, you set today to some # non-false value, then it is used: -#today = '' +# today = '' # Else, today_fmt is used as the format for a strftime call. -#today_fmt = '%B %d, %Y' +# today_fmt = '%B %d, %Y' # List of patterns, relative to source directory, that match files and # directories to ignore when looking for source files. -exclude_patterns = ['_build'] +exclude_patterns = ["_build"] # The reST default role (used for this markup: `text`) to use for all # documents. -#default_role = None +# default_role = None # If true, '()' will be appended to :func: etc. cross-reference text. -#add_function_parentheses = True +# add_function_parentheses = True # If true, the current module name will be prepended to all description # unit titles (such as .. function::). -#add_module_names = True +# add_module_names = True # If true, sectionauthor and moduleauthor directives will be shown in the # output. They are ignored by default. -#show_authors = False +# show_authors = False # The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'friendly' +pygments_style = "friendly" # A list of ignored prefixes for module index sorting. -#modindex_common_prefix = [] +# modindex_common_prefix = [] # If true, keep warnings as "system message" paragraphs in the built documents. -#keep_warnings = False +# keep_warnings = False # Nitpicky mode options nitpick_ignore_files = [ - "migrating", - "whats_new", + "migrating", + "whats_new", ] # -- Options for HTML output ---------------------------------------------- @@ -155,21 +157,21 @@ # The theme to use for HTML and HTML Help pages. See the documentation for # a list of builtin themes. -html_theme = 'basic' +html_theme = "basic" html_context = { - 'discord_invite': 'https://pycord.dev/discord', - 'discord_extensions': [ - ('discord.ext.commands', 'ext/commands'), - ('discord.ext.tasks', 'ext/tasks'), - ], + "discord_invite": "https://pycord.dev/discord", + "discord_extensions": [ + ("discord.ext.commands", "ext/commands"), + ("discord.ext.tasks", "ext/tasks"), + ], } resource_links = { - 'discord': 'https://pycord.dev/discord', - 'issues': 'https://github.com/Pycord-Development/pycord/issues', - 'discussions': 'https://github.com/Pycord-Development/pycord/discussions', - 'examples': f'https://github.com/Pycord-Development/pycord/tree/{branch}/examples', + "discord": "https://pycord.dev/discord", + "issues": "https://github.com/Pycord-Development/pycord/issues", + "discussions": "https://github.com/Pycord-Development/pycord/discussions", + "examples": f"https://github.com/Pycord-Development/pycord/tree/{branch}/examples", } # Theme options are theme-specific and customize the look and feel of a theme @@ -179,155 +181,143 @@ # } # Add any paths that contain custom themes here, relative to this directory. -#html_theme_path = [] +# html_theme_path = [] # The name for this set of Sphinx documents. If None, it defaults to # " v documentation". -#html_title = None +# html_title = None # A shorter title for the navigation bar. Default is the same as html_title. -#html_short_title = None +# html_short_title = None # The name of an image file (relative to this directory) to place at the top # of the sidebar. -#html_logo = None +# html_logo = None # The name of an image file (within the static path) to use as favicon of the # docs. This file should be a Windows icon file (.ico) being 16x16 or 32x32 # pixels large. -html_favicon = './images/pycord.ico' +html_favicon = "./images/pycord.ico" # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ['_static'] +html_static_path = ["_static"] # Add any extra paths that contain custom files (such as robots.txt or # .htaccess) here, relative to this directory. These files are copied # directly to the root of the documentation. -#html_extra_path = [] +# html_extra_path = [] # If not '', a 'Last updated on:' timestamp is inserted at every page bottom, # using the given strftime format. -#html_last_updated_fmt = '%b %d, %Y' +# html_last_updated_fmt = '%b %d, %Y' # If true, SmartyPants will be used to convert quotes and dashes to # typographically correct entities. -#html_use_smartypants = True +# html_use_smartypants = True # Custom sidebar templates, maps document names to template names. -#html_sidebars = {} +# html_sidebars = {} # Additional templates that should be rendered to pages, maps page names to # template names. -#html_additional_pages = {} +# html_additional_pages = {} # If false, no module index is generated. -#html_domain_indices = True +# html_domain_indices = True # If false, no index is generated. -#html_use_index = True +# html_use_index = True # If true, the index is split into individual pages for each letter. -#html_split_index = False +# html_split_index = False # If true, links to the reST sources are added to the pages. -#html_show_sourcelink = True +# html_show_sourcelink = True # If true, "Created using Sphinx" is shown in the HTML footer. Default is True. -#html_show_sphinx = True +# html_show_sphinx = True # If true, "(C) Copyright ..." is shown in the HTML footer. Default is True. -#html_show_copyright = True +# html_show_copyright = True # If true, an OpenSearch description file will be output, and all pages will # contain a tag referring to it. The value of this option must be the # base URL from which the finished HTML is served. -#html_use_opensearch = '' +# html_use_opensearch = '' # This is the file name suffix for HTML files (e.g. ".xhtml"). -#html_file_suffix = None +# html_file_suffix = None # Language to be used for generating the HTML full-text search index. # Sphinx supports the following languages: # 'da', 'de', 'en', 'es', 'fi', 'fr', 'hu', 'it', 'ja' # 'nl', 'no', 'pt', 'ro', 'ru', 'sv', 'tr' -#html_search_language = 'en' +# html_search_language = 'en' # A dictionary with options for the search language support, empty by default. # Now only 'ja' uses this config value -#html_search_options = {'type': 'default'} +# html_search_options = {'type': 'default'} # The name of a javascript file (relative to the configuration directory) that # implements a search results scorer. If empty, the default will be used. -html_search_scorer = '_static/scorer.js' +html_search_scorer = "_static/scorer.js" -html_js_files = [ - 'custom.js', - 'settings.js', - 'copy.js', - 'sidebar.js' -] +html_js_files = ["custom.js", "settings.js", "copy.js", "sidebar.js"] # Output file base name for HTML help builder. -htmlhelp_basename = 'discord.pydoc' +htmlhelp_basename = "discord.pydoc" # -- Options for LaTeX output --------------------------------------------- latex_elements = { -# The paper size ('letterpaper' or 'a4paper'). -#'papersize': 'letterpaper', - -# The font size ('10pt', '11pt' or '12pt'). -#'pointsize': '10pt', - -# Additional stuff for the LaTeX preamble. -#'preamble': '', - -# Latex figure (float) alignment -#'figure_align': 'htbp', + # The paper size ('letterpaper' or 'a4paper'). + #'papersize': 'letterpaper', + # The font size ('10pt', '11pt' or '12pt'). + #'pointsize': '10pt', + # Additional stuff for the LaTeX preamble. + #'preamble': '', + # Latex figure (float) alignment + #'figure_align': 'htbp', } # Grouping the document tree into LaTeX files. List of tuples # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ - ('index', 'pycord.tex', 'pycord Documentation', - 'Pycord Development', 'manual'), + ("index", "pycord.tex", "pycord Documentation", "Pycord Development", "manual"), ] # The name of an image file (relative to this directory) to place at the top of # the title page. -#latex_logo = None +# latex_logo = None # For "manual" documents, if this is true, then toplevel headings are parts, # not chapters. -#latex_use_parts = False +# latex_use_parts = False # If true, show page references after internal links. -#latex_show_pagerefs = False +# latex_show_pagerefs = False # If true, show URL addresses after external links. -#latex_show_urls = False +# latex_show_urls = False # Documents to append as an appendix to all manuals. -#latex_appendices = [] +# latex_appendices = [] # If false, no module index is generated. -#latex_domain_indices = True +# latex_domain_indices = True # -- Options for manual page output --------------------------------------- # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). -man_pages = [ - ('index', 'pycord', 'pycord Documentation', - ['Pycord Development'], 1) -] +man_pages = [("index", "pycord", "pycord Documentation", ["Pycord Development"], 1)] # If true, show URL addresses after external links. -#man_show_urls = False +# man_show_urls = False # -- Options for Texinfo output ------------------------------------------- @@ -336,19 +326,25 @@ # (source start file, target name, title, author, # dir menu entry, description, category) texinfo_documents = [ - ('index', 'pycord', 'pycord Documentation', - 'Pycord Development', 'pycord', 'One line description of project.', - 'Miscellaneous'), + ( + "index", + "pycord", + "pycord Documentation", + "Pycord Development", + "pycord", + "One line description of project.", + "Miscellaneous", + ), ] # Documents to append as an appendix to all manuals. -#texinfo_appendices = [] +# texinfo_appendices = [] # If false, no module index is generated. -#texinfo_domain_indices = True +# texinfo_domain_indices = True # How to display URL addresses: 'footnote', 'no', or 'inline'. -#texinfo_show_urls = 'footnote' +# texinfo_show_urls = 'footnote' # If true, do not generate a @detailmenu in the "Top" node's menu. -#texinfo_no_detailmenu = False \ No newline at end of file +# texinfo_no_detailmenu = False diff --git a/docs/extensions/attributetable.py b/docs/extensions/attributetable.py index c38aeb57de..ea9ebebdd8 100644 --- a/docs/extensions/attributetable.py +++ b/docs/extensions/attributetable.py @@ -9,60 +9,78 @@ import os import re + class attributetable(nodes.General, nodes.Element): pass + class attributetablecolumn(nodes.General, nodes.Element): pass + class attributetabletitle(nodes.TextElement): pass + class attributetableplaceholder(nodes.General, nodes.Element): pass + class attributetablebadge(nodes.TextElement): pass + class attributetable_item(nodes.Part, nodes.Element): pass + def visit_attributetable_node(self, node): class_ = node["python-class"] self.body.append(f'

') + self.body.append("
") + def depart_attributetablecolumn_node(self, node): - self.body.append('') + self.body.append("") + def depart_attributetabletitle_node(self, node): - self.body.append('') + self.body.append("") + def depart_attributetablebadge_node(self, node): - self.body.append('') + self.body.append("") + def depart_attributetable_item_node(self, node): - self.body.append('') + self.body.append("") + + +_name_parser_regex = re.compile(r"(?P[\w.]+\.)?(?P\w+)") -_name_parser_regex = re.compile(r'(?P[\w.]+\.)?(?P\w+)') class PyAttributeTable(SphinxDirective): has_content = False @@ -74,13 +92,15 @@ class PyAttributeTable(SphinxDirective): def parse_name(self, content): path, name = _name_parser_regex.match(content).groups() if path: - modulename = path.rstrip('.') + modulename = path.rstrip(".") else: - modulename = self.env.temp_data.get('autodoc:module') + modulename = self.env.temp_data.get("autodoc:module") if not modulename: - modulename = self.env.ref_context.get('py:module') + modulename = self.env.ref_context.get("py:module") if modulename is None: - raise RuntimeError('modulename somehow None for %s in %s.' % (content, self.env.docname)) + raise RuntimeError( + "modulename somehow None for %s in %s." % (content, self.env.docname) + ) return modulename, name @@ -112,29 +132,33 @@ def run(self): replaced. """ content = self.arguments[0].strip() - node = attributetableplaceholder('') + node = attributetableplaceholder("") modulename, name = self.parse_name(content) - node['python-doc'] = self.env.docname - node['python-module'] = modulename - node['python-class'] = name - node['python-full-name'] = f'{modulename}.{name}' + node["python-doc"] = self.env.docname + node["python-module"] = modulename + node["python-class"] = name + node["python-full-name"] = f"{modulename}.{name}" return [node] + def build_lookup_table(env): # Given an environment, load up a lookup table of # full-class-name: objects result = {} - domain = env.domains['py'] + domain = env.domains["py"] ignored = { - 'data', 'exception', 'module', 'class', + "data", + "exception", + "module", + "class", } for (fullname, _, objtype, docname, _, _) in domain.get_objects(): if objtype in ignored: continue - classname, _, child = fullname.rpartition('.') + classname, _, child = fullname.rpartition(".") try: result[classname].append(child) except KeyError: @@ -143,36 +167,46 @@ def build_lookup_table(env): return result -TableElement = namedtuple('TableElement', 'fullname label badge') +TableElement = namedtuple("TableElement", "fullname label badge") + def process_attributetable(app, doctree, fromdocname): env = app.builder.env lookup = build_lookup_table(env) for node in doctree.traverse(attributetableplaceholder): - modulename, classname, fullname = node['python-module'], node['python-class'], node['python-full-name'] + modulename, classname, fullname = ( + node["python-module"], + node["python-class"], + node["python-full-name"], + ) groups = get_class_results(lookup, modulename, classname, fullname) - table = attributetable('') + table = attributetable("") for label, subitems in groups.items(): if not subitems: continue - table.append(class_results_to_node(label, sorted(subitems, key=lambda c: c.label))) + table.append( + class_results_to_node(label, sorted(subitems, key=lambda c: c.label)) + ) - table['python-class'] = fullname + table["python-class"] = fullname if not table: node.replace_self([]) else: node.replace_self([table]) + def get_class_results(lookup, modulename, name, fullname): module = importlib.import_module(modulename) cls = getattr(module, name) - groups = OrderedDict([ - (_('Attributes'), []), - (_('Methods'), []), - ]) + groups = OrderedDict( + [ + (_("Attributes"), []), + (_("Methods"), []), + ] + ) try: members = lookup[fullname] @@ -180,8 +214,8 @@ def get_class_results(lookup, modulename, name, fullname): return groups for attr in members: - attrlookup = f'{fullname}.{attr}' - key = _('Attributes') + attrlookup = f"{fullname}.{attr}" + key = _("Attributes") badge = None label = attr value = None @@ -192,53 +226,73 @@ def get_class_results(lookup, modulename, name, fullname): break if value is not None: - doc = value.__doc__ or '' - if inspect.iscoroutinefunction(value) or doc.startswith('|coro|'): - key = _('Methods') - badge = attributetablebadge('async', 'async') - badge['badge-type'] = _('coroutine') + doc = value.__doc__ or "" + if inspect.iscoroutinefunction(value) or doc.startswith("|coro|"): + key = _("Methods") + badge = attributetablebadge("async", "async") + badge["badge-type"] = _("coroutine") elif isinstance(value, classmethod): - key = _('Methods') - label = f'{name}.{attr}' - badge = attributetablebadge('cls', 'cls') - badge['badge-type'] = _('classmethod') + key = _("Methods") + label = f"{name}.{attr}" + badge = attributetablebadge("cls", "cls") + badge["badge-type"] = _("classmethod") elif inspect.isfunction(value): - if doc.startswith(('A decorator', 'A shortcut decorator')): + if doc.startswith(("A decorator", "A shortcut decorator")): # finicky but surprisingly consistent - badge = attributetablebadge('@', '@') - badge['badge-type'] = _('decorator') - key = _('Methods') + badge = attributetablebadge("@", "@") + badge["badge-type"] = _("decorator") + key = _("Methods") else: - key = _('Methods') - badge = attributetablebadge('def', 'def') - badge['badge-type'] = _('method') + key = _("Methods") + badge = attributetablebadge("def", "def") + badge["badge-type"] = _("method") groups[key].append(TableElement(fullname=attrlookup, label=label, badge=badge)) return groups + def class_results_to_node(key, elements): title = attributetabletitle(key, key) - ul = nodes.bullet_list('') + ul = nodes.bullet_list("") for element in elements: - ref = nodes.reference('', '', internal=True, - refuri='#' + element.fullname, - anchorname='', - *[nodes.Text(element.label)]) - para = addnodes.compact_paragraph('', '', ref) + ref = nodes.reference( + "", + "", + internal=True, + refuri="#" + element.fullname, + anchorname="", + *[nodes.Text(element.label)], + ) + para = addnodes.compact_paragraph("", "", ref) if element.badge is not None: - ul.append(attributetable_item('', element.badge, para)) + ul.append(attributetable_item("", element.badge, para)) else: - ul.append(attributetable_item('', para)) + ul.append(attributetable_item("", para)) + + return attributetablecolumn("", title, ul) - return attributetablecolumn('', title, ul) def setup(app): - app.add_directive('attributetable', PyAttributeTable) - app.add_node(attributetable, html=(visit_attributetable_node, depart_attributetable_node)) - app.add_node(attributetablecolumn, html=(visit_attributetablecolumn_node, depart_attributetablecolumn_node)) - app.add_node(attributetabletitle, html=(visit_attributetabletitle_node, depart_attributetabletitle_node)) - app.add_node(attributetablebadge, html=(visit_attributetablebadge_node, depart_attributetablebadge_node)) - app.add_node(attributetable_item, html=(visit_attributetable_item_node, depart_attributetable_item_node)) + app.add_directive("attributetable", PyAttributeTable) + app.add_node( + attributetable, html=(visit_attributetable_node, depart_attributetable_node) + ) + app.add_node( + attributetablecolumn, + html=(visit_attributetablecolumn_node, depart_attributetablecolumn_node), + ) + app.add_node( + attributetabletitle, + html=(visit_attributetabletitle_node, depart_attributetabletitle_node), + ) + app.add_node( + attributetablebadge, + html=(visit_attributetablebadge_node, depart_attributetablebadge_node), + ) + app.add_node( + attributetable_item, + html=(visit_attributetable_item_node, depart_attributetable_item_node), + ) app.add_node(attributetableplaceholder) - app.connect('doctree-resolved', process_attributetable) + app.connect("doctree-resolved", process_attributetable) diff --git a/docs/extensions/builder.py b/docs/extensions/builder.py index 849f4b5a93..f867ee49a1 100644 --- a/docs/extensions/builder.py +++ b/docs/extensions/builder.py @@ -2,15 +2,15 @@ from sphinx.environment.adapters.indexentries import IndexEntries from sphinx.writers.html5 import HTML5Translator + class DPYHTML5Translator(HTML5Translator): def visit_section(self, node) -> None: self.section_level += 1 - self.body.append( - self.starttag(node, 'section')) + self.body.append(self.starttag(node, "section")) def depart_section(self, node) -> None: self.section_level -= 1 - self.body.append('\n') + self.body.append("\n") def visit_table(self, node) -> None: self.body.append('
') @@ -18,7 +18,8 @@ def visit_table(self, node) -> None: def depart_table(self, node) -> None: super().depart_table(node) - self.body.append('
') + self.body.append("") + class DPYStandaloneHTMLBuilder(StandaloneHTMLBuilder): # This is mostly copy pasted from Sphinx. @@ -28,50 +29,56 @@ def write_genindex(self) -> None: genindex = IndexEntries(self.env).create_index(self, group_entries=False) indexcounts = [] for _k, entries in genindex: - indexcounts.append(sum(1 + len(subitems) - for _, (_, subitems, _) in entries)) + indexcounts.append( + sum(1 + len(subitems) for _, (_, subitems, _) in entries) + ) genindexcontext = { - 'genindexentries': genindex, - 'genindexcounts': indexcounts, - 'split_index': self.config.html_split_index, + "genindexentries": genindex, + "genindexcounts": indexcounts, + "split_index": self.config.html_split_index, } if self.config.html_split_index: - self.handle_page('genindex', genindexcontext, - 'genindex-split.html') - self.handle_page('genindex-all', genindexcontext, - 'genindex.html') + self.handle_page("genindex", genindexcontext, "genindex-split.html") + self.handle_page("genindex-all", genindexcontext, "genindex.html") for (key, entries), count in zip(genindex, indexcounts): - ctx = {'key': key, 'entries': entries, 'count': count, - 'genindexentries': genindex} - self.handle_page('genindex-' + key, ctx, - 'genindex-single.html') + ctx = { + "key": key, + "entries": entries, + "count": count, + "genindexentries": genindex, + } + self.handle_page("genindex-" + key, ctx, "genindex-single.html") else: - self.handle_page('genindex', genindexcontext, 'genindex.html') + self.handle_page("genindex", genindexcontext, "genindex.html") def add_custom_jinja2(app) -> None: env = app.builder.templates.environment - env.tests['prefixedwith'] = str.startswith - env.tests['suffixedwith'] = str.endswith + env.tests["prefixedwith"] = str.startswith + env.tests["suffixedwith"] = str.endswith + def add_builders(app) -> None: """This is necessary because RTD injects their own for some reason.""" - app.set_translator('html', DPYHTML5Translator, override=True) + app.set_translator("html", DPYHTML5Translator, override=True) app.add_builder(DPYStandaloneHTMLBuilder, override=True) try: - original = app.registry.builders['readthedocs'] + original = app.registry.builders["readthedocs"] except KeyError: pass else: - injected_mro = tuple(base if base is not StandaloneHTMLBuilder else DPYStandaloneHTMLBuilder - for base in original.mro()[1:]) - new_builder = type(original.__name__, injected_mro, {'name': 'readthedocs'}) - app.set_translator('readthedocs', DPYHTML5Translator, override=True) + injected_mro = tuple( + base if base is not StandaloneHTMLBuilder else DPYStandaloneHTMLBuilder + for base in original.mro()[1:] + ) + new_builder = type(original.__name__, injected_mro, {"name": "readthedocs"}) + app.set_translator("readthedocs", DPYHTML5Translator, override=True) app.add_builder(new_builder, override=True) + def setup(app) -> None: add_builders(app) - app.connect('builder-inited', add_custom_jinja2) + app.connect("builder-inited", add_custom_jinja2) diff --git a/docs/extensions/details.py b/docs/extensions/details.py index 96f39d5b64..7c4d7d6a5c 100644 --- a/docs/extensions/details.py +++ b/docs/extensions/details.py @@ -3,32 +3,43 @@ from docutils.parsers.rst.roles import set_classes from docutils import nodes + class details(nodes.General, nodes.Element): pass + class summary(nodes.General, nodes.Element): pass + def visit_details_node(self, node): - self.body.append(self.starttag(node, 'details', CLASS=node.attributes.get('class', ''))) + self.body.append( + self.starttag(node, "details", CLASS=node.attributes.get("class", "")) + ) + def visit_summary_node(self, node): - self.body.append(self.starttag(node, 'summary', CLASS=node.attributes.get('summary-class', ''))) + self.body.append( + self.starttag(node, "summary", CLASS=node.attributes.get("summary-class", "")) + ) self.body.append(node.rawsource) + def depart_details_node(self, node): - self.body.append('\n') + self.body.append("\n") + def depart_summary_node(self, node): - self.body.append('') + self.body.append("") + class DetailsDirective(Directive): final_argument_whitespace = True optional_arguments = 1 option_spec = { - 'class': directives.class_option, - 'summary-class': directives.class_option, + "class": directives.class_option, + "summary-class": directives.class_option, } has_content = True @@ -37,19 +48,22 @@ def run(self): set_classes(self.options) self.assert_has_content() - text = '\n'.join(self.content) + text = "\n".join(self.content) node = details(text, **self.options) if self.arguments: summary_node = summary(self.arguments[0], **self.options) - summary_node.source, summary_node.line = self.state_machine.get_source_and_line(self.lineno) + ( + summary_node.source, + summary_node.line, + ) = self.state_machine.get_source_and_line(self.lineno) node += summary_node self.state.nested_parse(self.content, self.content_offset, node) return [node] + def setup(app): app.add_node(details, html=(visit_details_node, depart_details_node)) app.add_node(summary, html=(visit_summary_node, depart_summary_node)) - app.add_directive('details', DetailsDirective) - + app.add_directive("details", DetailsDirective) diff --git a/docs/extensions/exception_hierarchy.py b/docs/extensions/exception_hierarchy.py index cc69a7ce7f..1e80acb92c 100644 --- a/docs/extensions/exception_hierarchy.py +++ b/docs/extensions/exception_hierarchy.py @@ -4,24 +4,32 @@ from docutils import nodes from sphinx.locale import _ + class exception_hierarchy(nodes.General, nodes.Element): pass + def visit_exception_hierarchy_node(self, node): - self.body.append(self.starttag(node, 'div', CLASS='exception-hierarchy-content')) + self.body.append(self.starttag(node, "div", CLASS="exception-hierarchy-content")) + def depart_exception_hierarchy_node(self, node): - self.body.append('\n') + self.body.append("\n") + class ExceptionHierarchyDirective(Directive): has_content = True def run(self): self.assert_has_content() - node = exception_hierarchy('\n'.join(self.content)) + node = exception_hierarchy("\n".join(self.content)) self.state.nested_parse(self.content, self.content_offset, node) return [node] + def setup(app): - app.add_node(exception_hierarchy, html=(visit_exception_hierarchy_node, depart_exception_hierarchy_node)) - app.add_directive('exception_hierarchy', ExceptionHierarchyDirective) + app.add_node( + exception_hierarchy, + html=(visit_exception_hierarchy_node, depart_exception_hierarchy_node), + ) + app.add_directive("exception_hierarchy", ExceptionHierarchyDirective) diff --git a/docs/extensions/nitpick_file_ignorer.py b/docs/extensions/nitpick_file_ignorer.py index f5dff1d120..3b205da5fc 100644 --- a/docs/extensions/nitpick_file_ignorer.py +++ b/docs/extensions/nitpick_file_ignorer.py @@ -5,18 +5,20 @@ class NitpickFileIgnorer(logging.Filter): - def __init__(self, app: Sphinx) -> None: self.app = app super().__init__() def filter(self, record: sphinx_logging.SphinxLogRecord) -> bool: - if getattr(record, 'type', None) == 'ref': - return record.location.get('refdoc') not in self.app.config.nitpick_ignore_files + if getattr(record, "type", None) == "ref": + return ( + record.location.get("refdoc") + not in self.app.config.nitpick_ignore_files + ) return True def setup(app: Sphinx): - app.add_config_value('nitpick_ignore_files', [], '') + app.add_config_value("nitpick_ignore_files", [], "") f = NitpickFileIgnorer(app) - sphinx_logging.getLogger('sphinx.transforms.post_transforms').logger.addFilter(f) + sphinx_logging.getLogger("sphinx.transforms.post_transforms").logger.addFilter(f) diff --git a/docs/extensions/resourcelinks.py b/docs/extensions/resourcelinks.py index f2e132984f..5abc454a95 100644 --- a/docs/extensions/resourcelinks.py +++ b/docs/extensions/resourcelinks.py @@ -22,7 +22,7 @@ def role( lineno: int, inliner: Inliner, options: Dict = {}, - content: List[str] = [] + content: List[str] = [], ) -> Tuple[List[Node], List[system_message]]: text = utils.unescape(text) @@ -32,13 +32,15 @@ def role( title = full_url pnode = nodes.reference(title, title, internal=False, refuri=full_url) return [pnode], [] + return role def add_link_role(app: Sphinx) -> None: - app.add_role('resource', make_link_role(app.config.resource_links)) + app.add_role("resource", make_link_role(app.config.resource_links)) + def setup(app: Sphinx) -> Dict[str, Any]: - app.add_config_value('resource_links', {}, 'env') - app.connect('builder-inited', add_link_role) - return {'version': sphinx.__display_version__, 'parallel_read_safe': True} + app.add_config_value("resource_links", {}, "env") + app.connect("builder-inited", add_link_role) + return {"version": sphinx.__display_version__, "parallel_read_safe": True} From f6e0e26413551aa5651fe8889307a4ae8be55c17 Mon Sep 17 00:00:00 2001 From: Vincent Date: Tue, 30 Nov 2021 21:01:39 +0800 Subject: [PATCH 058/180] Added Notice So I Don't forget --- discord/channel.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/discord/channel.py b/discord/channel.py index 81f7e3ab39..f7e39fde34 100644 --- a/discord/channel.py +++ b/discord/channel.py @@ -23,6 +23,8 @@ DEALINGS IN THE SOFTWARE. """ +# TODO: Check Docstrings Of This And Everything Under + from __future__ import annotations import time From b799740b2eee600ee40fdd53d3ae8ef8925404f3 Mon Sep 17 00:00:00 2001 From: Lala Sabathil Date: Tue, 30 Nov 2021 15:22:41 +0100 Subject: [PATCH 059/180] Apply suggestions from code review Co-authored-by: BobDotCom <71356958+BobDotCom@users.noreply.github.com> --- discord/activity.py | 2 +- discord/appinfo.py | 2 +- discord/asset.py | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/discord/activity.py b/discord/activity.py index b29d1876f7..0f631e51e1 100644 --- a/discord/activity.py +++ b/discord/activity.py @@ -43,7 +43,7 @@ 'CustomActivity', ) -"""If your curious, this is the current schema for an activity. +"""If you're curious, this is the current schema for an activity. It's fairly long so I will document it here: diff --git a/discord/appinfo.py b/discord/appinfo.py index 56cc989e4e..b9d208439a 100644 --- a/discord/appinfo.py +++ b/discord/appinfo.py @@ -47,7 +47,7 @@ class AppInfo: - """Represents the application info for the bot from discord. + """Represents the application info for the bot provided by Discord. Attributes diff --git a/discord/asset.py b/discord/asset.py index ed09ad3e12..9495476671 100644 --- a/discord/asset.py +++ b/discord/asset.py @@ -365,7 +365,7 @@ def with_format(self, format: ValidAssetFormatTypes, /) -> Asset: Parameters ------------ format: :class:`str` - The new format of an asset. + The new format of the asset. Raises ------- From 2877110e84bc89f1bba8dd0cd8e16ffc844f9cdb Mon Sep 17 00:00:00 2001 From: RPS Date: Tue, 30 Nov 2021 22:30:51 +0800 Subject: [PATCH 060/180] Update docs/whats_new.rst Co-authored-by: BobDotCom <71356958+BobDotCom@users.noreply.github.com> --- docs/whats_new.rst | 29 ++--------------------------- 1 file changed, 2 insertions(+), 27 deletions(-) diff --git a/docs/whats_new.rst b/docs/whats_new.rst index 5db834775a..63a48b3264 100644 --- a/docs/whats_new.rst +++ b/docs/whats_new.rst @@ -16,33 +16,8 @@ in specific versions. v2.0.0 ------ -This does not Show Changes with discord.py 2.0, for a list go to :doc:`migrating` - -Fixes/Removals -~~~~~~~~~~~~~~ - -- Pycord doesn't check for duplicate files anymore (:issue:`333`) -- - - -New Features -~~~~~~~~~~~~ - -- Application Command Support Added :meth:`slash_command` :func:`message_command` & :func:`user_command` - -.. note:: - - These Classes Are Aliased Versions Of :func:`ApplicationCommand` :func:`UserCommand` & :func:`MessageCommand` - -- Application Has it's own Context :class:`ApplicationContext` -- Autocomplete Has it's own Context :class:`AutocompleteContext` - - -Miscellaneous -~~~~~~~~~~~~~ - -- Userbots Were Removed -- ``on_socket_response`` Was Removed for performance reasons +The changeset for this version are too big to be listed here, for more information please +see :ref:`the migrating page `. .. _vp1p7p3: From 66fc64a897c1276d9cb011d978dd7d5e53440101 Mon Sep 17 00:00:00 2001 From: RPS Date: Tue, 30 Nov 2021 22:33:57 +0800 Subject: [PATCH 061/180] Fix --- discord/__init__.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/discord/__init__.py b/discord/__init__.py index b9a97d0f66..c7169908c3 100644 --- a/discord/__init__.py +++ b/discord/__init__.py @@ -9,7 +9,7 @@ """ -__title__ = 'pycord' +__title__ = 'discord' __author__ = 'Pycord Development' __license__ = 'MIT' __copyright__ = 'Copyright 2015-2021 Rapptz & Copyright 2021-present Pycord Development' From c858b7629751b9ada0cf993bbc4577f3b3f24561 Mon Sep 17 00:00:00 2001 From: BobDotCom <71356958+BobDotCom@users.noreply.github.com> Date: Tue, 30 Nov 2021 09:29:20 -0600 Subject: [PATCH 062/180] Revert ambiguous merge commit --- docs/migrating.rst | 101 ++++++++++++++++++++++++++++----------------- 1 file changed, 63 insertions(+), 38 deletions(-) diff --git a/docs/migrating.rst b/docs/migrating.rst index cd101e41fb..e9ec2a5f41 100644 --- a/docs/migrating.rst +++ b/docs/migrating.rst @@ -13,7 +13,8 @@ message components and much more. Since Pycord is still relatively new, we have attempted to make the migration from discord.py and v1 to pycord and v2 as smooth as possible. -- `on_socket_response` Was Removed +Python Version Change +----------------------- In order to make development easier and also to allow for our dependencies to upgrade to allow usage of 3.10 or higher, the library had to remove support for Python versions lower than 3.8, which essentially means that **support for Python @@ -296,33 +297,70 @@ Major Model Changes Below are major model changes that have happened in v2.0 +Snowflakes are int +~~~~~~~~~~~~~~~~~~~~ Before v2.0, all snowflakes (the ``id`` attribute) were strings. This has been changed to :class:`int`. -User API --------- - -Anything allowing you to Use user Account's have been removed - -The following Classes Were Deleted in addendum +Quick example: :: -``Profile``, ``Relationship``, ``CallMessage``, ``GroupCall``, + # before + ch = client.get_channel('84319995256905728') + if message.author.id == '80528701850124288': + ... -``RelationshipType``, ``HypeSquadHouse```, ``PremiumType``, ``UserContentFilter``, ``FriendFlags``, ``Theme``, + # after + ch = client.get_channel(84319995256905728) + if message.author.id == 80528701850124288: + ... -``GroupChannel.add_recipients``, ``remove_recipients`` +This change allows for fewer errors when using the Copy ID feature in the official client since you no longer have +to wrap it in quotes and allows for optimisation opportunities by allowing ETF to be used instead of JSON internally. -``Guild.ack`` +Server is now Guild +~~~~~~~~~~~~~~~~~~~~~ -``Client.fetch_user_profile`` +The official API documentation calls the "Server" concept a "Guild" instead. In order to be more consistent with the +API documentation when necessary, the model has been renamed to :class:`Guild` and all instances referring to it has +been changed as well. + +A list of changes is as follows: + ++-------------------------------+----------------------------------+ +| Before | After | ++-------------------------------+----------------------------------+ +| ``Message.server`` | :attr:`Message.guild` | ++-------------------------------+----------------------------------+ +| ``Channel.server`` | :attr:`.GuildChannel.guild` | ++-------------------------------+----------------------------------+ +| ``Client.servers`` | :attr:`Client.guilds` | ++-------------------------------+----------------------------------+ +| ``Client.get_server`` | :meth:`Client.get_guild` | ++-------------------------------+----------------------------------+ +| ``Emoji.server`` | :attr:`Emoji.guild` | ++-------------------------------+----------------------------------+ +| ``Role.server`` | :attr:`Role.guild` | ++-------------------------------+----------------------------------+ +| ``Invite.server`` | :attr:`Invite.guild` | ++-------------------------------+----------------------------------+ +| ``Member.server`` | :attr:`Member.guild` | ++-------------------------------+----------------------------------+ +| ``Permissions.manage_server`` | :attr:`Permissions.manage_guild` | ++-------------------------------+----------------------------------+ +| ``VoiceClient.server`` | :attr:`VoiceClient.guild` | ++-------------------------------+----------------------------------+ +| ``Client.create_server`` | :meth:`Client.create_guild` | ++-------------------------------+----------------------------------+ .. _migrating_2_0_model_state: -``ClientUser.email``, ``premium``, ``premium_type``, ``get_relationship``, ``relationships```, ``friends``, ``blocked``, ``create_group``, ``edit_settings`` +Models are Stateful +~~~~~~~~~~~~~~~~~~~~~ -Every ``ClientUser.edit()`` ``password``, ``new_password``, ``email``, ``house arguments`` +As mentioned earlier, a lot of functionality was moved out of :class:`Client` and +put into their respective :ref:`model `. -``User.relationship``, ``mutual_friends``, ``is_friend``, ``is_blocked``, ``block``, ``unblock``, ``remove_friend``, ``send_friend_request``, ``profile`` +A list of these changes is enumerated below. +---------------------------------------+------------------------------------------------------------------------------+ | Before | After | @@ -442,29 +480,16 @@ Every ``ClientUser.edit()`` ``password``, ``new_password``, ``email``, ``house a | ``Client.wait_until_ready`` | No change | +---------------------------------------+------------------------------------------------------------------------------+ -SpeedUps --------- -The library has significantly improved in speed since v1.7.x -Some Speed results are shown below: - -+-------------------------------+----------------------------------+----------------------------------+ -| Testsetup | boot up before | boot up now | -+-------------------------------+----------------------------------+----------------------------------+ -| 735 guilds (with chunking) | 57s/1.7 GiB RAM | 42s/1.4 GiB RAM | -+-------------------------------+----------------------------------+----------------------------------+ -| 27k guilds (with chunking) | 477s/8 GiB RAM | 303s/7.2 GiB | -+-------------------------------+----------------------------------+----------------------------------+ -| 48k guilds (without chunking) | 109s | 67s | -+-------------------------------+----------------------------------+----------------------------------+ -| 106k guilds (without chunking)| 3300s | 3090s | -+-------------------------------+----------------------------------+----------------------------------+ - -.. note:: - - Performance May Differ with Computer/Server specs and location - -- The public API is completely type-hinted -- Most ``edit`` methods now return their updated counterpart rather than doing an in-place edit +Property Changes +~~~~~~~~~~~~~~~~~~ + +In order to be a bit more consistent, certain things that were properties were changed to methods instead. + +The following are now methods instead of properties (requires parentheses): + +- :meth:`Role.is_default` +- :meth:`Client.is_ready` +- :meth:`Client.is_closed` Dict Value Change ~~~~~~~~~~~~~~~~~~~~~ From cc1a21eda49f28f8f3543abde32ffa82d7c3aec2 Mon Sep 17 00:00:00 2001 From: BobDotCom <71356958+BobDotCom@users.noreply.github.com> Date: Tue, 30 Nov 2021 09:46:57 -0600 Subject: [PATCH 063/180] Fix documentation errors part 1 --- discord/bot.py | 60 ++++++++++++++++++++------------------------------ 1 file changed, 24 insertions(+), 36 deletions(-) diff --git a/discord/bot.py b/discord/bot.py index 6cb0985c8c..a95fbd7998 100644 --- a/discord/bot.py +++ b/discord/bot.py @@ -28,9 +28,8 @@ import asyncio import collections import inspect +import sys import traceback -from .commands.errors import CheckFailure - from typing import ( Any, Callable, @@ -42,11 +41,8 @@ Union, ) -import sys - from .client import Client -from .shard import AutoShardedClient -from .utils import MISSING, get, find, async_all +from .cog import CogMixin from .commands import ( SlashCommand, SlashCommandGroup, @@ -57,11 +53,12 @@ AutocompleteContext, command, ) -from .cog import CogMixin - +from .commands.errors import CheckFailure +from .enums import InteractionType from .errors import Forbidden, DiscordException from .interactions import Interaction -from .enums import InteractionType +from .shard import AutoShardedClient +from .utils import MISSING, get, find, async_all CoroFunc = Callable[..., Coroutine[Any, Any, Any]] CFT = TypeVar('CFT', bound=CoroFunc) @@ -684,17 +681,15 @@ async def on_application_command_error( # TODO: Remove these from commands.Bot def check(self, func): - r"""A decorator that adds a global check to the bot. - A global check is similar to a :func:`.check` that is applied - on a per command basis except it is run before any command checks - have been verified and applies to every command the bot has. + """A decorator that adds a global check to the bot. A global check is similar to a :func:`.check` that is + applied on a per command basis except it is run before any command checks have been verified and applies to + every command the bot has. .. note:: - This function can either be a regular function or a coroutine. - Similar to a command :func:`.check`\, this takes a single parameter - of type :class:`.Context` and can only raise exceptions inherited from - :exc:`.CommandError`. + This function can either be a regular function or a coroutine. Similar to a command :func:`.check`, this + takes a single parameter of type :class:`.Context` and can only raise exceptions inherited from + :exc:`.CommandError`. Example --------- @@ -710,17 +705,15 @@ def check_commands(ctx): return func def add_check(self, func, *, call_once: bool = False) -> None: - """Adds a global check to the bot. - This is the non-decorator interface to :meth:`.check` - and :meth:`.check_once`. + """Adds a global check to the bot. This is the non-decorator interface to :meth:`.check` and + :meth:`.check_once`. Parameters ----------- func The function that was used as a global check. call_once: :class:`bool` - If the function should only be called once per - :meth:`.invoke` call. + If the function should only be called once per :meth:`.Bot.invoke` call. """ @@ -751,26 +744,21 @@ def remove_check(self, func, *, call_once: bool = False) -> None: pass def check_once(self, func): - r"""A decorator that adds a "call once" global check to the bot. - Unlike regular global checks, this one is called only once - per :meth:`.invoke` call. - Regular global checks are called whenever a command is called - or :meth:`.Command.can_run` is called. This type of check - bypasses that and ensures that it's called only once, even inside - the default help command. + """A decorator that adds a "call once" global check to the bot. Unlike regular global checks, this one is called + only once per :meth:`.Bot.invoke` call. Regular global checks are called whenever a command is called or + :meth:`.Command.can_run` is called. This type of check bypasses that and ensures that it's called only once, + even inside the default help command. .. note:: - When using this function the :class:`.Context` sent to a group subcommand - may only parse the parent command and not the subcommands due to it - being invoked once per :meth:`.Bot.invoke` call. + When using this function the :class:`.Context` sent to a group subcommand may only parse the parent command + and not the subcommands due to it being invoked once per :meth:`.Bot.invoke` call. .. note:: - This function can either be a regular function or a coroutine. - Similar to a command :func:`.check`\, this takes a single parameter - of type :class:`.Context` and can only raise exceptions inherited from - :exc:`.CommandError`. + This function can either be a regular function or a coroutine. Similar to a command :func:`.check`, + this takes a single parameter of type :class:`.Context` and can only raise exceptions inherited from + :exc:`.CommandError`. Example --------- From 15cf6eaead1fbe8f20761cfb012c06fd9b6cb2ff Mon Sep 17 00:00:00 2001 From: BobDotCom <71356958+BobDotCom@users.noreply.github.com> Date: Tue, 30 Nov 2021 09:53:32 -0600 Subject: [PATCH 064/180] Fix documentation errors part 2 --- docs/api.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/api.rst b/docs/api.rst index 812d35f64a..d269a40fa9 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -2801,7 +2801,7 @@ of :class:`enum.Enum`. Represents the embedded application Ocho QA. - .. attribute:: pn_stagging + .. attribute:: poker_night_staging Represents the embedded application Poker Night Staging. @@ -2809,7 +2809,7 @@ of :class:`enum.Enum`. Represents the embedded application Poker Night. - .. attribute:: poker_night + .. attribute:: poker_night_qa Represents the embedded application Poker QA. From c7d623ec0dbc5c1241d2b7dd6d449a821da420ed Mon Sep 17 00:00:00 2001 From: BobDotCom <71356958+BobDotCom@users.noreply.github.com> Date: Tue, 30 Nov 2021 09:54:32 -0600 Subject: [PATCH 065/180] Fix documentation errors part 3 --- docs/index.rst | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/index.rst b/docs/index.rst index 3a15d26760..aa8bce43c4 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -74,3 +74,4 @@ If you're looking for something related to the project itself, it's here. whats_new version_guarantees migrating + migrating_to_v1 From 06ed7792e25d086db3d950998134eb8a5ef9684d Mon Sep 17 00:00:00 2001 From: Vincent Date: Wed, 1 Dec 2021 10:09:05 +0800 Subject: [PATCH 066/180] Re-adding Old Versions --- docs/whats_new.rst | 364 ++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 363 insertions(+), 1 deletion(-) diff --git a/docs/whats_new.rst b/docs/whats_new.rst index 63a48b3264..2e4c9f57f5 100644 --- a/docs/whats_new.rst +++ b/docs/whats_new.rst @@ -829,4 +829,366 @@ Bug Fixes - Fix issue with speaking state being cast to ``int`` when it was invalid. - Fix some issues with loop cleanup that some users experienced on Linux machines. -- Fix voice handshake race condition (:issue:`2056`, :issue:`2063`) \ No newline at end of file +- Fix voice handshake race condition (:issue:`2056`, :issue:`2063`) + +v1.0.0 +-------- + +The changeset for this version are too big to be listed here, for more information please +see :ref:`the migrating page `. + + +.. _vp0p16p6: + +v0.16.6 +-------- + +Bug Fixes +~~~~~~~~~~ + +- Fix issue with :meth:`Client.create_server` that made it stop working. +- Fix main thread being blocked upon calling ``StreamPlayer.stop``. +- Handle HEARTBEAT_ACK and resume gracefully when it occurs. +- Fix race condition when pre-emptively rate limiting that caused releasing an already released lock. +- Fix invalid state errors when immediately cancelling a coroutine. + +.. _vp0p16p1: + +v0.16.1 +-------- + +This release is just a bug fix release with some better rate limit implementation. + +Bug Fixes +~~~~~~~~~~~ + +- Servers are now properly chunked for user bots. +- The CDN URL is now used instead of the API URL for assets. +- Rate limit implementation now tries to use header information if possible. +- Event loop is now properly propagated (:issue:`420`) +- Allow falsey values in :meth:`Client.send_message` and :meth:`Client.send_file`. + +.. _vp0p16p0: + +v0.16.0 +--------- + +New Features +~~~~~~~~~~~~~~ + +- Add :attr:`Channel.overwrites` to get all the permission overwrites of a channel. +- Add :attr:`Server.features` to get information about partnered servers. + +Bug Fixes +~~~~~~~~~~ + +- Timeout when waiting for offline members while triggering :func:`on_ready`. + + - The fact that we did not timeout caused a gigantic memory leak in the library that caused + thousands of duplicate :class:`Member` instances causing big memory spikes. + +- Discard null sequences in the gateway. + + - The fact these were not discarded meant that :func:`on_ready` kept being called instead of + :func:`on_resumed`. Since this has been corrected, in most cases :func:`on_ready` will be + called once or twice with :func:`on_resumed` being called much more often. + +.. _vp0p15p1: + +v0.15.1 +--------- + +- Fix crash on duplicate or out of order reactions. + +.. _vp0p15p0: + +v0.15.0 +-------- + +New Features +~~~~~~~~~~~~~~ + +- Rich Embeds for messages are now supported. + + - To do so, create your own :class:`Embed` and pass the instance to the ``embed`` keyword argument to :meth:`Client.send_message` or :meth:`Client.edit_message`. +- Add :meth:`Client.clear_reactions` to remove all reactions from a message. +- Add support for MESSAGE_REACTION_REMOVE_ALL event, under :func:`on_reaction_clear`. +- Add :meth:`Permissions.update` and :meth:`PermissionOverwrite.update` for bulk permission updates. + + - This allows you to use e.g. ``p.update(read_messages=True, send_messages=False)`` in a single line. +- Add :meth:`PermissionOverwrite.is_empty` to check if the overwrite is empty (i.e. has no overwrites set explicitly as true or false). + +For the command extension, the following changed: + +- ``Context`` is no longer slotted to facilitate setting dynamic attributes. + +.. _vp0p14p3: + +v0.14.3 +--------- + +Bug Fixes +~~~~~~~~~~~ + +- Fix crash when dealing with MESSAGE_REACTION_REMOVE +- Fix incorrect buckets for reactions. + +.. _v0p14p2: + +v0.14.2 +--------- + +New Features +~~~~~~~~~~~~~~ + +- :meth:`Client.wait_for_reaction` now returns a namedtuple with ``reaction`` and ``user`` attributes. + - This is for better support in the case that ``None`` is returned since tuple unpacking can lead to issues. + +Bug Fixes +~~~~~~~~~~ + +- Fix bug that disallowed ``None`` to be passed for ``emoji`` parameter in :meth:`Client.wait_for_reaction`. + +.. _v0p14p1: + +v0.14.1 +--------- + +Bug fixes +~~~~~~~~~~ + +- Fix bug with `Reaction` not being visible at import. + - This was also breaking the documentation. + +.. _v0p14p0: + +v0.14.0 +-------- + +This update adds new API features and a couple of bug fixes. + +New Features +~~~~~~~~~~~~~ + +- Add support for Manage Webhooks permission under :attr:`Permissions.manage_webhooks` +- Add support for ``around`` argument in 3.5+ :meth:`Client.logs_from`. +- Add support for reactions. + - :meth:`Client.add_reaction` to add a reactions + - :meth:`Client.remove_reaction` to remove a reaction. + - :meth:`Client.get_reaction_users` to get the users that reacted to a message. + - :attr:`Permissions.add_reactions` permission bit support. + - Two new events, :func:`on_reaction_add` and :func:`on_reaction_remove`. + - :attr:`Message.reactions` to get reactions from a message. + - :meth:`Client.wait_for_reaction` to wait for a reaction from a user. + +Bug Fixes +~~~~~~~~~~ + +- Fix bug with Paginator still allowing lines that are too long. +- Fix the :attr:`Permissions.manage_emojis` bit being incorrect. + +.. _v0p13p0: + +v0.13.0 +--------- + +This is a backwards compatible update with new features. + +New Features +~~~~~~~~~~~~~ + +- Add the ability to manage emojis. + + - :meth:`Client.create_custom_emoji` to create new emoji. + - :meth:`Client.edit_custom_emoji` to edit an old emoji. + - :meth:`Client.delete_custom_emoji` to delete a custom emoji. +- Add new :attr:`Permissions.manage_emojis` toggle. + + - This applies for :class:`PermissionOverwrite` as well. +- Add new statuses for :class:`Status`. + + - :attr:`Status.dnd` (aliased with :attr:`Status.do_not_disturb`\) for Do Not Disturb. + - :attr:`Status.invisible` for setting your status to invisible (please see the docs for a caveat). +- Deprecate :meth:`Client.change_status` + + - Use :meth:`Client.change_presence` instead for better more up to date functionality. + - This method is subject for removal in a future API version. +- Add :meth:`Client.change_presence` for changing your status with the new Discord API change. + + - This is the only method that allows changing your status to invisible or do not disturb. + +Bug Fixes +~~~~~~~~~~ + +- Paginator pages do not exceed their max_size anymore (:issue:`340`) +- Do Not Disturb users no longer show up offline due to the new :class:`Status` changes. + +.. _v0p12p0: + +v0.12.0 +--------- + +This is a bug fix update that also comes with new features. + +New Features +~~~~~~~~~~~~~ + +- Add custom emoji support. + + - Adds a new class to represent a custom Emoji named :class:`Emoji` + - Adds a utility generator function, :meth:`Client.get_all_emojis`. + - Adds a list of emojis on a server, :attr:`Server.emojis`. + - Adds a new event, :func:`on_server_emojis_update`. +- Add new server regions to :class:`ServerRegion` + + - :attr:`ServerRegion.eu_central` and :attr:`ServerRegion.eu_west`. +- Add support for new pinned system message under :attr:`MessageType.pins_add`. +- Add order comparisons for :class:`Role` to allow it to be compared with regards to hierarchy. + + - This means that you can now do ``role_a > role_b`` etc to check if ``role_b`` is lower in the hierarchy. + +- Add :attr:`Server.role_hierarchy` to get the server's role hierarchy. +- Add :attr:`Member.server_permissions` to get a member's server permissions without their channel specific overwrites. +- Add :meth:`Client.get_user_info` to retrieve a user's info from their ID. +- Add a new ``Player`` property, ``Player.error`` to fetch the error that stopped the player. + + - To help with this change, a player's ``after`` function can now take a single parameter denoting the current player. +- Add support for server verification levels. + + - Adds a new enum called :class:`VerificationLevel`. + - This enum can be used in :meth:`Client.edit_server` under the ``verification_level`` keyword argument. + - Adds a new attribute in the server, :attr:`Server.verification_level`. +- Add :attr:`Server.voice_client` shortcut property for :meth:`Client.voice_client_in`. + + - This is technically old (was added in v0.10.0) but was undocumented until v0.12.0. + +For the command extension, the following are new: + +- Add custom emoji converter. +- All default converters that can take IDs can now convert via ID. +- Add coroutine support for ``Bot.command_prefix``. +- Add a method to reset command cooldown. + +Bug Fixes +~~~~~~~~~~ + +- Fix bug that caused the library to not work with the latest ``websockets`` library. +- Fix bug that leaked keep alive threads (:issue:`309`) +- Fix bug that disallowed :class:`ServerRegion` from being used in :meth:`Client.edit_server`. +- Fix bug in :meth:`Channel.permissions_for` that caused permission resolution to happen out of order. +- Fix bug in :attr:`Member.top_role` that did not account for same-position roles. + +.. _v0p11p0: + +v0.11.0 +-------- + +This is a minor bug fix update that comes with a gateway update (v5 -> v6). + +Breaking Changes +~~~~~~~~~~~~~~~~~ + +- ``Permissions.change_nicknames`` has been renamed to :attr:`Permissions.change_nickname` to match the UI. + +New Features +~~~~~~~~~~~~~ + +- Add the ability to prune members via :meth:`Client.prune_members`. +- Switch the websocket gateway version to v6 from v5. This allows the library to work with group DMs and 1-on-1 calls. +- Add :attr:`AppInfo.owner` attribute. +- Add :class:`CallMessage` for group voice call messages. +- Add :class:`GroupCall` for group voice call information. +- Add :attr:`Message.system_content` to get the system message. +- Add the remaining VIP servers and the Brazil servers into :class:`ServerRegion` enum. +- Add ``stderr`` argument to :meth:`VoiceClient.create_ffmpeg_player` to redirect stderr. +- The library now handles implicit permission resolution in :meth:`Channel.permissions_for`. +- Add :attr:`Server.mfa_level` to query a server's 2FA requirement. +- Add :attr:`Permissions.external_emojis` permission. +- Add :attr:`Member.voice` attribute that refers to a :class:`VoiceState`. + + - For backwards compatibility, the member object will have properties mirroring the old behaviour. + +For the command extension, the following are new: + +- Command cooldown system with the ``cooldown`` decorator. +- ``UserInputError`` exception for the hierarchy for user input related errors. + +Bug Fixes +~~~~~~~~~~ + +- :attr:`Client.email` is now saved when using a token for user accounts. +- Fix issue when removing roles out of order. +- Fix bug where discriminators would not update. +- Handle cases where ``HEARTBEAT`` opcode is received. This caused bots to disconnect seemingly randomly. + +For the command extension, the following bug fixes apply: + +- ``Bot.check`` decorator is actually a decorator not requiring parentheses. +- ``Bot.remove_command`` and ``Group.remove_command`` no longer throw if the command doesn't exist. +- Command names are no longer forced to be ``lower()``. +- Fix a bug where Member and User converters failed to work in private message contexts. +- ``HelpFormatter`` now ignores hidden commands when deciding the maximum width. + +.. _v0p10p0: + +v0.10.0 +------- + +For breaking changes, see `0.10.0 migration `_. The breaking changes listed there will not be enumerated below. Since this version is rather a big departure from v0.9.2, this change log will be non-exhaustive. + +New Features +~~~~~~~~~~~~~ + +- The library is now fully ``asyncio`` compatible, allowing you to write non-blocking code a lot more easily. +- The library now fully handles 429s and unconditionally retries on 502s. +- A new command extension module was added but is currently undocumented. Figuring it out is left as an exercise to the reader. +- Two new exception types, :exc:`Forbidden` and :exc:`NotFound` to denote permission errors or 404 errors. +- Added :meth:`Client.delete_invite` to revoke invites. +- Added support for sending voice. Check :class:`VoiceClient` for more details. +- Added :meth:`Client.wait_for_message` coroutine to aid with follow up commands. +- Added :data:`version_info` named tuple to check version info of the library. +- Login credentials are now cached to have a faster login experience. You can disable this by passing in ``cache_auth=False`` + when constructing a :class:`Client`. +- New utility function, :func:`discord.utils.get` to simplify retrieval of items based on attributes. +- All data classes now support ``!=``, ``==``, ``hash(obj)`` and ``str(obj)``. +- Added :meth:`Client.get_bans` to get banned members from a server. +- Added :meth:`Client.invites_from` to get currently active invites in a server. +- Added :attr:`Server.me` attribute to get the :class:`Member` version of :attr:`Client.user`. +- Most data classes now support a ``hash(obj)`` function to allow you to use them in ``set`` or ``dict`` classes or subclasses. +- Add :meth:`Message.clean_content` to get a text version of the content with the user and channel mentioned changed into their names. +- Added a way to remove the messages of the user that just got banned in :meth:`Client.ban`. +- Added :meth:`Client.wait_until_ready` to facilitate easy creation of tasks that require the client cache to be ready. +- Added :meth:`Client.wait_until_login` to facilitate easy creation of tasks that require the client to be logged in. +- Add :class:`discord.Game` to represent any game with custom text to send to :meth:`Client.change_status`. +- Add :attr:`Message.nonce` attribute. +- Add :meth:`Member.permissions_in` as another way of doing :meth:`Channel.permissions_for`. +- Add :meth:`Client.move_member` to move a member to another voice channel. +- You can now create a server via :meth:`Client.create_server`. +- Added :meth:`Client.edit_server` to edit existing servers. +- Added :meth:`Client.server_voice_state` to server mute or server deafen a member. +- If you are being rate limited, the library will now handle it for you. +- Add :func:`on_member_ban` and :func:`on_member_unban` events that trigger when a member is banned/unbanned. + +Performance Improvements +~~~~~~~~~~~~~~~~~~~~~~~~~ + +- All data classes now use ``__slots__`` which greatly reduce the memory usage of things kept in cache. +- Due to the usage of ``asyncio``, the CPU usage of the library has gone down significantly. +- A lot of the internal cache lists were changed into dictionaries to change the ``O(n)`` lookup into ``O(1)``. +- Compressed READY is now on by default. This means if you're on a lot of servers (or maybe even a few) you would + receive performance improvements by having to download and process less data. +- While minor, change regex from ``\d+`` to ``[0-9]+`` to avoid unnecessary unicode character lookups. + +Bug Fixes +~~~~~~~~~~ + +- Fix bug where guilds being updated did not edit the items in cache. +- Fix bug where ``member.roles`` were empty upon joining instead of having the ``@everyone`` role. +- Fix bug where :meth:`Role.is_everyone` was not being set properly when the role was being edited. +- :meth:`Client.logs_from` now handles cases where limit > 100 to sidestep the discord API limitation. +- Fix bug where a role being deleted would trigger a ``ValueError``. +- Fix bug where :meth:`Permissions.kick_members` and :meth:`Permissions.ban_members` were flipped. +- Mentions are now triggered normally. This was changed due to the way discord handles it internally. +- Fix issue when a :class:`Message` would attempt to upgrade a :attr:`Message.server` when the channel is + a :class:`Object`. +- Unavailable servers were not being added into cache, this has been corrected. \ No newline at end of file From 0cd6eb5977d633d1acd08354b2c7057c1b7e1035 Mon Sep 17 00:00:00 2001 From: Vincent Date: Wed, 1 Dec 2021 10:42:56 +0800 Subject: [PATCH 067/180] Change To Grey From Blurple --- docs/_static/style.css | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/_static/style.css b/docs/_static/style.css index 5d1d51e8f4..d91ece1c05 100644 --- a/docs/_static/style.css +++ b/docs/_static/style.css @@ -57,7 +57,7 @@ Historically however, thanks to: --nav-hover-text: var(--grey-6); --nav-header-text: var(--black); --sub-header-background: var(--grey-6); - --search-border: var(--blurple); + --search-border: var(--grey-7); --search-text: var(--white); --search-focus: var(--blue-1); --search-button: var(--grey-1); @@ -66,7 +66,7 @@ Historically however, thanks to: --footer-link: var(--grey-6); --hr-border: var(--grey-2); --main-big-headers-text: var(--black); - --main-big-headers-border: var(--blurple); + --main-big-headers-border: var(--grey-7); --main-h5-header-text: var(--black); --main-h6-header-text: var(--grey-4); --main-h4-header-border: var(--grey-4); @@ -119,7 +119,7 @@ Historically however, thanks to: --link-text: var(--blue-1); --link-hover-text: var(--blue-2); --main-text: var(--white); - --sub-header-background: var(--blurple); + --sub-header-background: var(--grey-7); --search-border: var(--grey-5); --nav-background: var(--main-background); --nav-text: var(--grey-1); From 10f48772806a620c86c40c979c2626004e6809a9 Mon Sep 17 00:00:00 2001 From: Vincent Date: Thu, 2 Dec 2021 10:22:19 +0800 Subject: [PATCH 068/180] Fix Typos --- .gitignore | 1 + discord/channel.py | 6 ++---- discord/client.py | 2 +- docs/index.rst | 2 +- 4 files changed, 5 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index b13a0aa4bb..086bc77cd0 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,4 @@ __pycache__ .vs/slnx.sqlite env/ build/ +node_modules/* \ No newline at end of file diff --git a/discord/channel.py b/discord/channel.py index f7e39fde34..844b88cdc0 100644 --- a/discord/channel.py +++ b/discord/channel.py @@ -23,8 +23,6 @@ DEALINGS IN THE SOFTWARE. """ -# TODO: Check Docstrings Of This And Everything Under - from __future__ import annotations import time @@ -99,7 +97,7 @@ async def _single_delete_strategy(messages: Iterable[Message]): class TextChannel(discord.abc.Messageable, discord.abc.GuildChannel, Hashable): - """Represents a Discord guild text channel. + """Represents a Discord text channel. .. container:: operations @@ -241,7 +239,7 @@ def is_nsfw(self) -> bool: return self.nsfw def is_news(self) -> bool: - """:class:`bool`: Checks if the channel is a news channel.""" + """:class:`bool`: Checks if the channel is a news/anouncements channel.""" return self._type == ChannelType.news.value @property diff --git a/discord/client.py b/discord/client.py index bcaff2cd7e..4ae40f555a 100644 --- a/discord/client.py +++ b/discord/client.py @@ -238,7 +238,7 @@ def __init__( if VoiceClient.warn_nacl: VoiceClient.warn_nacl = False - _log.warning("PyNaCl is not installed, voice will NOT be supported") + _log.warning("PyNaCl is not installed, Voice will NOT be supported") # internals diff --git a/docs/index.rst b/docs/index.rst index aa8bce43c4..96c09be23f 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -4,7 +4,7 @@ contain the root `toctree` directive. Welcome to Pycord -=========================== +================= .. image:: /images/snake.svg .. image:: /images/snake_dark.svg From d6bee971d13bfe5317f3e991fe2e6b9a556e235d Mon Sep 17 00:00:00 2001 From: Vincent Date: Thu, 2 Dec 2021 10:39:08 +0800 Subject: [PATCH 069/180] Fixing More Typos And Making More TODO:'s --- discord/client.py | 4 +++- discord/types/__init__.py | 3 ++- discord/ui/__init__.py | 4 ++-- discord/webhook/__init__.py | 4 ++-- discord/webhook/async_.py | 2 -- 5 files changed, 9 insertions(+), 8 deletions(-) diff --git a/discord/client.py b/discord/client.py index 4ae40f555a..06e397f0f4 100644 --- a/discord/client.py +++ b/discord/client.py @@ -262,7 +262,7 @@ def latency(self) -> float: return float('nan') if not ws else ws.latency def is_ws_ratelimited(self) -> bool: - """:class:`bool`: Whether the websocket is currently rate limited. + """:class:`bool`: Whether the websocket is currently rate limited or not. This can be useful to know when deciding whether you should query members using HTTP or via the gateway. @@ -676,6 +676,8 @@ def is_closed(self) -> bool: """:class:`bool`: Indicates if the websocket connection is closed.""" return self._closed + # TODO: Finish Checking For Errors + @property def activity(self) -> Optional[ActivityTypes]: """Optional[:class:`.BaseActivity`]: The activity being used upon diff --git a/discord/types/__init__.py b/discord/types/__init__.py index 6ab9eff74c..7088d50a9d 100644 --- a/discord/types/__init__.py +++ b/discord/types/__init__.py @@ -2,9 +2,10 @@ discord.types ~~~~~~~~~~~~~~ +# TODO: Look For Typos + Typings for the Discord API :copyright: (c) 2015-2021 Rapptz & (c) 2021-present Pycord Development :license: MIT, see LICENSE for more details. - """ diff --git a/discord/ui/__init__.py b/discord/ui/__init__.py index 91e7ecf739..2634fadf8e 100644 --- a/discord/ui/__init__.py +++ b/discord/ui/__init__.py @@ -1,8 +1,8 @@ """ discord.ui -~~~~~~~~~~~ +~~~~~~~~~~ -Bot UI Kit helper for the Discord API +UI Kit helper for the Discord API :copyright: (c) 2015-2021 Rapptz & (c) 2021-present Pycord Development :license: MIT, see LICENSE for more details. diff --git a/discord/webhook/__init__.py b/discord/webhook/__init__.py index ce5609b7b1..22b95f288e 100644 --- a/discord/webhook/__init__.py +++ b/discord/webhook/__init__.py @@ -1,8 +1,8 @@ """ discord.webhook -~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~ -Webhook support +Support For Webhooks :copyright: (c) 2015-2021 Rapptz & (c) 2021-present Pycord Development :license: MIT, see LICENSE for more details. diff --git a/discord/webhook/async_.py b/discord/webhook/async_.py index fab5809677..f87620adda 100644 --- a/discord/webhook/async_.py +++ b/discord/webhook/async_.py @@ -1204,8 +1204,6 @@ async def edit( Whether to use the bot token over the webhook token if available. Defaults to ``True``. - .. versionadded:: 2.0 - Raises ------- HTTPException From eb5e0b26c2ee509239de288dcdb525a931f4920e Mon Sep 17 00:00:00 2001 From: Vincent Date: Thu, 2 Dec 2021 15:01:35 +0800 Subject: [PATCH 070/180] Fixes --- .gitignore | 3 ++- discord/client.py | 6 ++---- docs/intents.rst | 12 ++++++------ 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/.gitignore b/.gitignore index 086bc77cd0..232160887a 100644 --- a/.gitignore +++ b/.gitignore @@ -21,4 +21,5 @@ __pycache__ .vs/slnx.sqlite env/ build/ -node_modules/* \ No newline at end of file +node_modules/* +test.py diff --git a/discord/client.py b/discord/client.py index 06e397f0f4..fdb8e64e8d 100644 --- a/discord/client.py +++ b/discord/client.py @@ -676,8 +676,6 @@ def is_closed(self) -> bool: """:class:`bool`: Indicates if the websocket connection is closed.""" return self._closed - # TODO: Finish Checking For Errors - @property def activity(self) -> Optional[ActivityTypes]: """Optional[:class:`.BaseActivity`]: The activity being used upon @@ -835,7 +833,7 @@ def get_user(self, id: int, /) -> Optional[User]: return self._connection.get_user(id) def get_emoji(self, id: int, /) -> Optional[Emoji]: - """Returns an emoji with the given ID. + """Returns the emoji with the given ID. Parameters ----------- @@ -850,7 +848,7 @@ def get_emoji(self, id: int, /) -> Optional[Emoji]: return self._connection.get_emoji(id) def get_sticker(self, id: int, /) -> Optional[GuildSticker]: - """Returns a guild sticker with the given ID. + """Returns the guild sticker with the given ID. .. versionadded:: 2.0 diff --git a/docs/intents.rst b/docs/intents.rst index ce065add1c..80315b05af 100644 --- a/docs/intents.rst +++ b/docs/intents.rst @@ -57,7 +57,7 @@ Another example showing a bot that only deals with messages and guild informatio Privileged Intents --------------------- -With the API change requiring bot authors to specify intents, some intents were restricted further and require more manual steps. These intents are called **privileged intents**. +With the API change requiring bot owners to specify intents, some intents were restricted further and require more manual steps. These intents are called **privileged intents**. A privileged intent is one that requires you to go to the developer portal and manually enable it. To enable privileged intents do the following: @@ -84,14 +84,14 @@ A privileged intent is one that requires you to go to the developer portal and m through code as well. Do I need privileged intents? -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This is a quick checklist to see if you need specific privileged intents. .. _need_presence_intent: Presence Intent -+++++++++++++++++ ++++++++++++++++ - Whether you use :attr:`Member.status` at all to track member statuses. - Whether you use :attr:`Member.activity` or :attr:`Member.activities` to check member's activities. @@ -99,7 +99,7 @@ Presence Intent .. _need_members_intent: Member Intent -+++++++++++++++ ++++++++++++++ - Whether you track member joins or member leaves, corresponds to :func:`on_member_join` and :func:`on_member_remove` events. - Whether you want to track member updates such as nickname or role changes. @@ -110,7 +110,7 @@ Member Intent .. _need_message_content_intent: Message Content Intent -++++++++++++++++++++++++ +++++++++++++++++++++++ - Whether you have a message based command system using ext.commands - Whether you use the :func:`on_message` event for anything, such as auto-moderation. @@ -166,7 +166,7 @@ Troubleshooting Some common issues relating to the mandatory intent change. Where'd my members go? -~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~ Due to an :ref:`API change ` Discord is now forcing developers who want member caching to explicitly opt-in to it. This is a Discord mandated change and there is no way to bypass it. In order to get members back you have to explicitly enable the :ref:`members privileged intent ` and change the :attr:`Intents.members` attribute to true. From 0eadb587c56571a7a815629c9e90ef64e30390e3 Mon Sep 17 00:00:00 2001 From: Vincent Date: Thu, 2 Dec 2021 15:02:45 +0800 Subject: [PATCH 071/180] Making Title Cards Smaller --- docs/intents.rst | 6 +++--- docs/intro.rst | 4 ++-- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/intents.rst b/docs/intents.rst index 80315b05af..d11b151f87 100644 --- a/docs/intents.rst +++ b/docs/intents.rst @@ -143,7 +143,7 @@ Other events that take a :class:`Member` will require the use of the member cach .. _retrieving_members: Retrieving Members --------------------- +------------------ If the cache is disabled or you disable chunking guilds at startup, we might still need a way to load members. The library offers a few ways to do this: @@ -161,7 +161,7 @@ If the cache is disabled or you disable chunking guilds at startup, we might sti It should be noted that the gateway has a strict rate limit of 120 requests per 60 seconds. Troubleshooting ------------------- +--------------- Some common issues relating to the mandatory intent change. @@ -186,7 +186,7 @@ For example: # bot = commands.Bot(command_prefix='!', intents=intents) Why does ``on_ready`` take so long to fire? -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ As part of the API change regarding intents, Discord also changed how members are loaded in the beginning. Originally the library could request 75 guilds at once and only request members from guilds that have the :attr:`Guild.large` attribute set to ``True``. With the new intent changes, Discord mandates that we can only send 1 guild per request. This causes a 75x slowdown which is further compounded by the fact that *all* guilds, not just large guilds are being requested. diff --git a/docs/intro.rst b/docs/intro.rst index 4fb59658da..4b0e39bf89 100644 --- a/docs/intro.rst +++ b/docs/intro.rst @@ -11,7 +11,7 @@ This is the documentation for Pycord, a library for Python to aid in creating applications that utilise the Discord API. Prerequisites ---------------- +------------- Pycord works with Python 3.8 or higher. Support for earlier versions of Python is not provided. Python 2.7 or lower is not supported. Python 3.7 or lower is not supported. @@ -99,7 +99,7 @@ However, for the quick and dirty: Congratulations. You now have a virtual environment all set up. Basic Concepts ---------------- +-------------- Pycord revolves around the concept of :ref:`events `. An event is something you listen to and then respond to. For example, when a message From 6f63da8803797f34fbf4fb5913f5298d237d8a22 Mon Sep 17 00:00:00 2001 From: Vincent Date: Thu, 2 Dec 2021 15:04:00 +0800 Subject: [PATCH 072/180] Making Title Cards Smaller --- docs/intro.rst | 4 ++-- docs/logging.rst | 2 +- docs/migrating_to_v1.rst | 16 ++++++++-------- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/docs/intro.rst b/docs/intro.rst index 4b0e39bf89..2862a4ffaa 100644 --- a/docs/intro.rst +++ b/docs/intro.rst @@ -5,7 +5,7 @@ .. _intro: Introduction -============== +============ This is the documentation for Pycord, a library for Python to aid in creating applications that utilise the Discord API. @@ -60,7 +60,7 @@ For a Debian-based system, the following command will get these dependencies: Remember to check your permissions! Virtual Environments -~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~ Sometimes you want to keep libraries from polluting system installs or use a different version of libraries than the ones installed on the system. You might also not have permissions to install libraries system-wide. diff --git a/docs/logging.rst b/docs/logging.rst index 7f1411ccba..dfb95dd644 100644 --- a/docs/logging.rst +++ b/docs/logging.rst @@ -4,7 +4,7 @@ .. _logging_setup: Setting Up Logging -=================== +================== *Pycord* logs errors and debug information via the :mod:`logging` python module. It is strongly recommended that the logging module is diff --git a/docs/migrating_to_v1.rst b/docs/migrating_to_v1.rst index baf97160f0..6ee2611d21 100644 --- a/docs/migrating_to_v1.rst +++ b/docs/migrating_to_v1.rst @@ -3,7 +3,7 @@ .. _migrating_1_0: Migrating to v1.0 -====================== +================= v1.0 is one of the biggest breaking changes in the library due to a complete redesign. @@ -15,19 +15,19 @@ Part of the redesign involves making things more easy to use and natural. Things :ref:`models ` instead of requiring a :class:`Client` instance to do any work. Python Version Change ------------------------ +--------------------- In order to make development easier and also to allow for our dependencies to upgrade to allow usage of 3.7 or higher, the library had to remove support for Python versions lower than 3.5.3, which essentially means that **support for Python 3.4 is dropped**. Major Model Changes ---------------------- +------------------- Below are major model changes that have happened in v1.0 Snowflakes are int -~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~ Before v1.0, all snowflakes (the ``id`` attribute) were strings. This has been changed to :class:`int`. @@ -47,7 +47,7 @@ This change allows for fewer errors when using the Copy ID feature in the offici to wrap it in quotes and allows for optimisation opportunities by allowing ETF to be used instead of JSON internally. Server is now Guild -~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~ The official API documentation calls the "Server" concept a "Guild" instead. In order to be more consistent with the API documentation when necessary, the model has been renamed to :class:`Guild` and all instances referring to it has @@ -84,7 +84,7 @@ A list of changes is as follows: .. _migrating_1_0_model_state: Models are Stateful -~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~ As mentioned earlier, a lot of functionality was moved out of :class:`Client` and put into their respective :ref:`model `. @@ -210,7 +210,7 @@ A list of these changes is enumerated below. +---------------------------------------+------------------------------------------------------------------------------+ Property Changes -~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~ In order to be a bit more consistent, certain things that were properties were changed to methods instead. @@ -221,7 +221,7 @@ The following are now methods instead of properties (requires parentheses): - :meth:`Client.is_closed` Dict Value Change -~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~ Prior to v1.0 some aggregating properties that retrieved models would return "dict view" objects. From 8871d9003f9db9d51b41020b8078a4dc95064ea5 Mon Sep 17 00:00:00 2001 From: Vincent Date: Thu, 2 Dec 2021 15:05:37 +0800 Subject: [PATCH 073/180] Making Title Cards Smaller --- docs/migrating_to_v1.rst | 46 ++++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/docs/migrating_to_v1.rst b/docs/migrating_to_v1.rst index 6ee2611d21..f45f63a120 100644 --- a/docs/migrating_to_v1.rst +++ b/docs/migrating_to_v1.rst @@ -240,7 +240,7 @@ The following views were changed to a list: - :attr:`Guild.members` Voice State Changes -~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~ Earlier, in v0.11.0 a :class:`VoiceState` class was added to refer to voice states along with a :attr:`Member.voice` attribute to refer to it. @@ -264,7 +264,7 @@ Quick example: :: User and Member Type Split -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~ In v1.0 to save memory, :class:`User` and :class:`Member` are no longer inherited. Instead, they are "flattened" by having equivalent properties that map out to the functional underlying :class:`User`. Thus, there is no functional @@ -277,7 +277,7 @@ of all :class:`User` your client can see with :attr:`Client.users`. .. _migrating_1_0_channel_split: Channel Type Split -~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~ Prior to v1.0, channels were two different types, ``Channel`` and ``PrivateChannel`` with a ``is_private`` property to help differentiate between them. @@ -312,7 +312,7 @@ With this type split also came event changes, which are enumerated in :ref:`migr Miscellaneous Model Changes -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~ There were lots of other things added or removed in the models in general. @@ -415,7 +415,7 @@ They will be enumerated here. .. _migrating_1_0_sending_messages: Sending Messages ------------------- +---------------- One of the changes that were done was the merger of the previous ``Client.send_message`` and ``Client.send_file`` functionality into a single method, :meth:`~abc.Messageable.send`. @@ -454,7 +454,7 @@ This change was to facilitate multiple file uploads: :: .. _migrating_1_0_async_iter: Asynchronous Iterators ------------------------- +---------------------- Prior to v1.0, certain functions like ``Client.logs_from`` would return a different type if done in Python 3.4 or 3.5+. @@ -495,7 +495,7 @@ The following return :class:`AsyncIterator`: .. _migrating_1_0_event_changes: Event Changes --------------- +------------- A lot of events have gone through some changes. @@ -587,7 +587,7 @@ updated (i.e. :class:`DMChannel` and :class:`GroupChannel`). .. _migrating_1_0_voice: Voice Changes ---------------- +------------- Voice sending has gone through a complete redesign. @@ -654,7 +654,7 @@ An added benefit of the redesign is that it will be much more resilient towards .. _migrating_1_0_wait_for: Waiting For Events --------------------- +------------------ Prior to v1.0, the machinery for waiting for an event outside of the event itself was done through two different functions, ``Client.wait_for_message`` and ``Client.wait_for_reaction``. One problem with one such approach is that it did @@ -699,7 +699,7 @@ when reached instead of setting the return to ``None``. For example: await channel.send('You said {0.content}, {0.author}.'.format(msg)) Upgraded Dependencies ------------------------ +--------------------- Following v1.0 of the library, we've updated our requirements to :doc:`aiohttp ` v2.0 or higher. @@ -728,7 +728,7 @@ Since it is better to not create a session for every request, you should store i ``session.close`` on it when it needs to be disposed. Sharding ----------- +-------- The library has received significant changes on how it handles sharding and now has sharding as a first-class citizen. @@ -759,7 +759,7 @@ If you want more control over the sharding you can specify ``shard_count`` and ` For users of the command extension, there is also :class:`~ext.commands.AutoShardedBot` which behaves similarly. Connection Improvements -------------------------- +----------------------- In v1.0, the auto reconnection logic has been powered up significantly. @@ -773,13 +773,13 @@ need to specify it unless turning it off. .. _migrating_1_0_commands: Command Extension Changes --------------------------- +------------------------- Due to the :ref:`migrating_1_0_model_state` changes, some of the design of the extension module had to undergo some design changes as well. Context Changes -~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~ In v1.0, the :class:`.Context` has received a lot of changes with how it's retrieved and used. @@ -824,7 +824,7 @@ Since the :class:`~ext.commands.Context` is now passed by default, several short - This is useful if you want to show the user help if they misused a command. Subclassing Context -++++++++++++++++++++ ++++++++++++++++++++ In v1.0, there is now the ability to subclass :class:`~ext.commands.Context` and use it instead of the default provided one. @@ -859,7 +859,7 @@ Now inside your commands you will have access to your custom context: .. _migrating_1_0_removed_helpers: Removed Helpers -+++++++++++++++++ ++++++++++++++++ With the new :class:`.Context` changes, a lot of message sending helpers have been removed. @@ -880,7 +880,7 @@ For a full list of changes, see below: +-----------------+------------------------------------------------------------+ Command Changes -~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~ As mentioned earlier, the first command change is that ``pass_context=True`` no longer exists, so there is no need to pass this as a parameter. @@ -904,7 +904,7 @@ For :class:`~ext.commands.Group` and :class:`~ext.commands.Bot` the following ch - Use :attr:`~.GroupMixin.all_commands` to get the old :class:`dict` with all commands. Check Changes -~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~ Prior to v1.0, :func:`~ext.commands.check`\s could only be synchronous. As of v1.0 checks can now be coroutines. @@ -921,7 +921,7 @@ Along with this change, a couple new checks were added. - This is powered by the new :meth:`TextChannel.is_nsfw` method. Event Changes -~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~ All command extension events have changed. @@ -947,7 +947,7 @@ have been re-ordered to use the :class:`~ext.commands.Context` as its first para and commands. HelpFormatter and Help Command Changes -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The ``HelpFormatter`` class has been removed. It has been replaced with a :class:`~.commands.HelpCommand` class. This class now stores all the command handling and processing of the help command. @@ -1005,7 +1005,7 @@ For example, to implement a :class:`~.commands.HelpCommand` in a cog, the follow For more information, check out the relevant :ref:`documentation `. Cog Changes -~~~~~~~~~~~~~ +~~~~~~~~~~~ Cogs have completely been revamped. They are documented in :ref:`ext_commands_cogs` as well. @@ -1065,7 +1065,7 @@ An example cog with every special method registered and a custom name is as foll .. _migrating_1_0_before_after_hook: Before and After Invocation Hooks -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Commands have gained new before and after invocation hooks that allow you to do an action before and after a command is run. @@ -1137,7 +1137,7 @@ The invocation order is as follows: 7. Global after invocation hook Converter Changes -~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~ Prior to v1.0, a converter was a type hint that could be a callable that could be invoked with a singular argument denoting the argument passed by the user as a string. From ec16ec8271413cca628e29b5c0d4c62428865770 Mon Sep 17 00:00:00 2001 From: Vincent Date: Thu, 2 Dec 2021 15:10:56 +0800 Subject: [PATCH 074/180] Remove Old Migrating From Page --- docs/migrating.rst | 1224 ++------------------------------------------ 1 file changed, 38 insertions(+), 1186 deletions(-) diff --git a/docs/migrating.rst b/docs/migrating.rst index e9ec2a5f41..6639475879 100644 --- a/docs/migrating.rst +++ b/docs/migrating.rst @@ -3,7 +3,7 @@ .. _migrating_2_0: Migrating to v2.0 -====================== +================= v2.0 includes many breaking changes and added features. @@ -14,30 +14,30 @@ Since Pycord is still relatively new, we have attempted to make the migration fr smooth as possible. Python Version Change ------------------------ +--------------------- In order to make development easier and also to allow for our dependencies to upgrade to allow usage of 3.10 or higher, the library had to remove support for Python versions lower than 3.8, which essentially means that **support for Python 3.7 is dropped**. Migration to Pycord ---------------------- +------------------- We have tried to make the migration as smooth as possible. The only breaking changes that we have made are improvements, not deletions in favor of a new style. We're going to provide as much backwards support as possible, though there will be some changes to the API as is to be expected in major releases. New Package Name -~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~ The package name has been changed from ``discord.py`` to ``py-cord``, because our package is a fork of the original discord.py package. Breaking Changes ------------------- +---------------- The following changes are breaking changes, and will cause your code to stop working if you use any of these features. User Account Support Removed -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ User account ("userbot") is no longer supported. Thus, many features that were only applicable to them have been removed. Please note, this means that detection of Nitro is no longer possible. @@ -68,7 +68,7 @@ The following features have been removed due to being solely related to user acc - The ``fetch_user_profile`` method of :class:`Client` Use of timezone-aware datetime -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Datetime objects are now required to be timezone-aware by the library internals. This means that you will need to convert your datetime objects to a timezone-aware datetime object (or make them timezone-aware from the beginning) before passing them to the library. Instead of ``datetime.datetime.utcnow``, you should use @@ -84,65 +84,65 @@ before passing them to the library. Instead of ``datetime.datetime.utcnow``, you Methods of :class:`Client` -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~ - ``request_offline_members`` This has been depreciated since v1.5. - ``logout`` This was an alias for :meth:`Client.close`, which is now the preferred method. Embed __bool__ method changed -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The ``__bool__`` method of :class:`Embed` has been changed (affects ``bool(Embed)``). It will now always return truthy values. Previously it only considered text fields. Duplicate registration of cogs -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :meth:`Bot.add_cog` now raises when a cog with the same name is already registered. The ``override`` argument can be used to bring back the 1.x behavior. ExtensionNotFound.original removed -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The ``original`` attribute of :class:`ExtensionNotFound` has been removed. This previously returned ``None`` for compatibility. MemberCacheFlags.online removed -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Due to a Discord limitation, the ``online`` attribute of :class:`MemberCacheFlags` has been removed. Message.type for replies changed -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :attr:`Message.type` has been changed for replies. It now returns :attr:`MessageType.reply` instead of :attr:`MessageType.default`. Private channel events removed -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ ``private_channel_create`` and ``private_channel_delete`` events will no longer be dispatched due to Discord limitations. Command clean_params type changed -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The :attr:`~.ext.commands.Command.clean_params` attribute of :class:`ext.commands.Command` has been changed to return a :class:`dict` instead of an ``OrderedDict``. DMChannel recipient changed -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~ :attr:`DMChannel.recipient` is now optional, and will return ``None`` in many cases. User and Member permissions_in -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Use :meth:`abc.GuildChannel.permissions_for` instead. GuildChannel permissions_for changed -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The :meth:`abc.GuildChannel.permissions_for` method's first argument is now positional only. Client guild_subscriptions removed -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The ``guild_subscriptions`` attribute of :class:`Client` has been removed, as it has been replaced by the :ref:`intents ` system. Webhook changes -~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~ :class:`Webhook` was overhauled. @@ -170,19 +170,19 @@ Webhook changes HelpCommand clean_prefix removed -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The ``clean_prefix`` attribute of :class:`HelpCommand` has been removed. This was moved to :attr:`ext.commands.Context.clean_prefix` Sticker preview image removed -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The ``preview_image`` attribute of :class:`Sticker` has been removed, as Discord no longer provides the data needed for this. Asset Changes -~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~ Assets have been changed. - Asset-related attributes that previously returned hash strings (e.g. :attr:`User.avatar`) now return :class:`Asset`. @@ -222,29 +222,29 @@ Assets have been changed. Color blurple changed -~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~ The ``Colour.blurple`` method has been changed to :meth:`Colour.og_blurple`, and :meth:`Colour.blurple` now returns the new theme color. ``self_bot`` argument -~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~ The ``self_bot`` argument of :class:`~.ext.commands.Bot` has been removed, since user bots are no longer supported. VerificationLevel attributes -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The ``table_flip`` (alias of :attr:`~.VerificationLevel.high`) attribute of :class:`VerificationLevel` has been removed. The ``extreme``, ``very_high``, and ``double_table_flip`` attributes were removed and have been replaced with :attr:`~.VerificationLevel.highest`. Arguments of ``oauth_url`` changed -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The ``permissions``, ``guild``, ``redirect_uri``, and ``scopes`` arguments of :func:`utils.oauth_url` have been changed to be keyword only. StageChannel changes -~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~ Due to the introduction of :class:`StageInstance`, which represents the current session of a :class:`StageChannel`; - :meth:`StageChannel.edit` can no longer be used to edit :attr:`~.StageChannel.topic`. Use :meth:`StageInstance.edit` @@ -253,1191 +253,43 @@ Due to the introduction of :class:`StageInstance`, which represents the current Message channel attribute changed -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :attr:`Message.channel` can now return :class:`Thread`. Guild methods changed -~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~ The :meth:`~.Guild.get_channel`, :meth:`~.Guild.get_role`, :meth:`~.Guild.get_member_named`, :meth:`~.Guild.fetch_member`, and :meth:`~.Guild.fetch_emoji` methods' first arguments are now positional only. Guild create_text_channel topic argument -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ The ``topic`` argument of :meth:`Guild.create_text_channel` no longer accepts ``None``. Reaction custom emoji -~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~ The ``custom_emoji`` attribute of :class:`Reaction` has been replaced with the :meth:`Reaction.is_custom_emoji` method for consistency. Reaction users arguments changed -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Arguments of :meth:`Reaction.users` have been changed to be keyword only. IntegrationAccount id attribute changed -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ :attr:`IntegrationAccount.id` is now a :class:`str` instead of an :class:`int`, due to Discord changes. BadInviteArgument arguments changed -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -: - - -BEGIN OLD DOCS -================ -Major Model Changes ---------------------- - -Below are major model changes that have happened in v2.0 - - -Snowflakes are int -~~~~~~~~~~~~~~~~~~~~ - -Before v2.0, all snowflakes (the ``id`` attribute) were strings. This has been changed to :class:`int`. - -Quick example: :: - - # before - ch = client.get_channel('84319995256905728') - if message.author.id == '80528701850124288': - ... - - # after - ch = client.get_channel(84319995256905728) - if message.author.id == 80528701850124288: - ... - -This change allows for fewer errors when using the Copy ID feature in the official client since you no longer have -to wrap it in quotes and allows for optimisation opportunities by allowing ETF to be used instead of JSON internally. - -Server is now Guild -~~~~~~~~~~~~~~~~~~~~~ - -The official API documentation calls the "Server" concept a "Guild" instead. In order to be more consistent with the -API documentation when necessary, the model has been renamed to :class:`Guild` and all instances referring to it has -been changed as well. - -A list of changes is as follows: - -+-------------------------------+----------------------------------+ -| Before | After | -+-------------------------------+----------------------------------+ -| ``Message.server`` | :attr:`Message.guild` | -+-------------------------------+----------------------------------+ -| ``Channel.server`` | :attr:`.GuildChannel.guild` | -+-------------------------------+----------------------------------+ -| ``Client.servers`` | :attr:`Client.guilds` | -+-------------------------------+----------------------------------+ -| ``Client.get_server`` | :meth:`Client.get_guild` | -+-------------------------------+----------------------------------+ -| ``Emoji.server`` | :attr:`Emoji.guild` | -+-------------------------------+----------------------------------+ -| ``Role.server`` | :attr:`Role.guild` | -+-------------------------------+----------------------------------+ -| ``Invite.server`` | :attr:`Invite.guild` | -+-------------------------------+----------------------------------+ -| ``Member.server`` | :attr:`Member.guild` | -+-------------------------------+----------------------------------+ -| ``Permissions.manage_server`` | :attr:`Permissions.manage_guild` | -+-------------------------------+----------------------------------+ -| ``VoiceClient.server`` | :attr:`VoiceClient.guild` | -+-------------------------------+----------------------------------+ -| ``Client.create_server`` | :meth:`Client.create_guild` | -+-------------------------------+----------------------------------+ - -.. _migrating_2_0_model_state: - -Models are Stateful -~~~~~~~~~~~~~~~~~~~~~ - -As mentioned earlier, a lot of functionality was moved out of :class:`Client` and -put into their respective :ref:`model `. - -A list of these changes is enumerated below. - -+---------------------------------------+------------------------------------------------------------------------------+ -| Before | After | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.add_reaction`` | :meth:`Message.add_reaction` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.add_roles`` | :meth:`Member.add_roles` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.ban`` | :meth:`Member.ban` or :meth:`Guild.ban` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.change_nickname`` | :meth:`Member.edit` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.clear_reactions`` | :meth:`Message.clear_reactions` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.create_channel`` | :meth:`Guild.create_text_channel` and :meth:`Guild.create_voice_channel` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.create_custom_emoji`` | :meth:`Guild.create_custom_emoji` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.create_invite`` | :meth:`abc.GuildChannel.create_invite` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.create_role`` | :meth:`Guild.create_role` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.delete_channel`` | :meth:`abc.GuildChannel.delete` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.delete_channel_permissions`` | :meth:`abc.GuildChannel.set_permissions` with ``overwrite`` set to ``None`` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.delete_custom_emoji`` | :meth:`Emoji.delete` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.delete_invite`` | :meth:`Invite.delete` or :meth:`Client.delete_invite` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.delete_message`` | :meth:`Message.delete` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.delete_messages`` | :meth:`TextChannel.delete_messages` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.delete_role`` | :meth:`Role.delete` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.delete_server`` | :meth:`Guild.delete` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.edit_channel`` | :meth:`TextChannel.edit` or :meth:`VoiceChannel.edit` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.edit_channel_permissions`` | :meth:`abc.GuildChannel.set_permissions` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.edit_custom_emoji`` | :meth:`Emoji.edit` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.edit_message`` | :meth:`Message.edit` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.edit_profile`` | :meth:`ClientUser.edit` (you get this from :attr:`Client.user`) | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.edit_role`` | :meth:`Role.edit` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.edit_server`` | :meth:`Guild.edit` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.estimate_pruned_members`` | :meth:`Guild.estimate_pruned_members` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.get_all_emojis`` | :attr:`Client.emojis` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.get_bans`` | :meth:`Guild.bans` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.get_invite`` | :meth:`Client.fetch_invite` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.get_message`` | :meth:`abc.Messageable.fetch_message` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.get_reaction_users`` | :meth:`Reaction.users` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.get_user_info`` | :meth:`Client.fetch_user` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.invites_from`` | :meth:`abc.GuildChannel.invites` or :meth:`Guild.invites` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.join_voice_channel`` | :meth:`VoiceChannel.connect` (see :ref:`migrating_2_0_voice`) | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.kick`` | :meth:`Guild.kick` or :meth:`Member.kick` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.leave_server`` | :meth:`Guild.leave` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.logs_from`` | :meth:`abc.Messageable.history` (see :ref:`migrating_2_0_async_iter`) | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.move_channel`` | :meth:`TextChannel.edit` or :meth:`VoiceChannel.edit` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.move_member`` | :meth:`Member.edit` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.move_role`` | :meth:`Role.edit` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.pin_message`` | :meth:`Message.pin` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.pins_from`` | :meth:`abc.Messageable.pins` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.prune_members`` | :meth:`Guild.prune_members` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.purge_from`` | :meth:`TextChannel.purge` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.remove_reaction`` | :meth:`Message.remove_reaction` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.remove_roles`` | :meth:`Member.remove_roles` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.replace_roles`` | :meth:`Member.edit` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.send_file`` | :meth:`abc.Messageable.send` (see :ref:`migrating_2_0_sending_messages`) | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.send_message`` | :meth:`abc.Messageable.send` (see :ref:`migrating_2_0_sending_messages`) | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.send_typing`` | :meth:`abc.Messageable.trigger_typing` (use :meth:`abc.Messageable.typing`) | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.server_voice_state`` | :meth:`Member.edit` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.start_private_message`` | :meth:`User.create_dm` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.unban`` | :meth:`Guild.unban` or :meth:`Member.unban` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.unpin_message`` | :meth:`Message.unpin` | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.wait_for_message`` | :meth:`Client.wait_for` (see :ref:`migrating_2_0_wait_for`) | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.wait_for_reaction`` | :meth:`Client.wait_for` (see :ref:`migrating_2_0_wait_for`) | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.wait_until_login`` | Removed | -+---------------------------------------+------------------------------------------------------------------------------+ -| ``Client.wait_until_ready`` | No change | -+---------------------------------------+------------------------------------------------------------------------------+ - -Property Changes -~~~~~~~~~~~~~~~~~~ - -In order to be a bit more consistent, certain things that were properties were changed to methods instead. - -The following are now methods instead of properties (requires parentheses): - -- :meth:`Role.is_default` -- :meth:`Client.is_ready` -- :meth:`Client.is_closed` - -Dict Value Change -~~~~~~~~~~~~~~~~~~~~~ - -Prior to v2.0 some aggregating properties that retrieved models would return "dict view" objects. - -As a consequence, when the dict would change size while you would iterate over it, a RuntimeError would -be raised and crash the task. To alleviate this, the "dict view" objects were changed into lists. - -The following views were changed to a list: - -- :attr:`Client.guilds` -- :attr:`Client.users` (new in v2.0) -- :attr:`Client.emojis` (new in v2.0) -- :attr:`Guild.channels` -- :attr:`Guild.text_channels` (new in v2.0) -- :attr:`Guild.voice_channels` (new in v2.0) -- :attr:`Guild.emojis` -- :attr:`Guild.members` - -Voice State Changes -~~~~~~~~~~~~~~~~~~~~~ - -Earlier, in v0.11.0 a :class:`VoiceState` class was added to refer to voice states along with a -:attr:`Member.voice` attribute to refer to it. - -However, it was transparent to the user. In an effort to make the library save more memory, the -voice state change is now more visible. - -The only way to access voice attributes is via the :attr:`Member.voice` attribute. Note that if -the member does not have a voice state this attribute can be ``None``. - -Quick example: :: - - # before - member.deaf - member.voice.voice_channel - - # after - if member.voice: # can be None - member.voice.deaf - member.voice.channel - - -User and Member Type Split -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -In v2.0 to save memory, :class:`User` and :class:`Member` are no longer inherited. Instead, they are "flattened" -by having equivalent properties that map out to the functional underlying :class:`User`. Thus, there is no functional -change in how they are used. However this breaks :func:`isinstance` checks and thus is something to keep in mind. - -These memory savings were accomplished by having a global :class:`User` cache, and as a positive consequence you -can now easily fetch a :class:`User` by their ID by using the new :meth:`Client.get_user`. You can also get a list -of all :class:`User` your client can see with :attr:`Client.users`. - -.. _migrating_2_0_channel_split: - -Channel Type Split -~~~~~~~~~~~~~~~~~~~~~ - -Prior to v2.0, channels were two different types, ``Channel`` and ``PrivateChannel`` with a ``is_private`` -property to help differentiate between them. - -In order to save memory the channels have been split into 4 different types: - -- :class:`TextChannel` for guild text channels. -- :class:`VoiceChannel` for guild voice channels. -- :class:`DMChannel` for DM channels with members. -- :class:`GroupChannel` for Group DM channels with members. - -With this split came the removal of the ``is_private`` attribute. You should now use :func:`isinstance`. - -The types are split into two different :ref:`discord_api_abcs`: - -- :class:`abc.GuildChannel` for guild channels. -- :class:`abc.PrivateChannel` for private channels (DMs and group DMs). - -So to check if something is a guild channel you would do: :: - - isinstance(channel, discord.abc.GuildChannel) - -And to check if it's a private channel you would do: :: - - isinstance(channel, discord.abc.PrivateChannel) - -Of course, if you're looking for only a specific type you can pass that too, e.g. :: - - isinstance(channel, discord.TextChannel) - -With this type split also came event changes, which are enumerated in :ref:`migrating_2_0_event_changes`. - - -Miscellaneous Model Changes -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -There were lots of other things added or removed in the models in general. - -They will be enumerated here. - -**Removed** - -- :meth:`Client.login` no longer accepts email and password logins. - - - Use a token and ``bot=False``. - -- ``Client.get_all_emojis`` - - - Use :attr:`Client.emojis` instead. - -- ``Client.messages`` - - - Use read-only :attr:`Client.cached_messages` instead. - -- ``Client.wait_for_message`` and ``Client.wait_for_reaction`` are gone. - - - Use :meth:`Client.wait_for` instead. - -- ``Channel.voice_members`` - - - Use :attr:`VoiceChannel.members` instead. - -- ``Channel.is_private`` - - - Use ``isinstance`` instead with one of the :ref:`discord_api_abcs` instead. - - e.g. ``isinstance(channel, discord.abc.GuildChannel)`` will check if it isn't a private channel. - -- ``Client.accept_invite`` - - - There is no replacement for this one. This functionality is deprecated API wise. - -- ``Guild.default_channel`` / ``Server.default_channel`` and ``Channel.is_default`` - - - The concept of a default channel was removed from Discord. - See `#329 `_. - -- ``Message.edited_timestamp`` - - - Use :attr:`Message.edited_at` instead. - -- ``Message.timestamp`` - - - Use :attr:`Message.created_at` instead. - -- ``Colour.to_tuple()`` - - - Use :meth:`Colour.to_rgb` instead. - -- ``Permissions.view_audit_logs`` - - - Use :attr:`Permissions.view_audit_log` instead. - -- ``Member.game`` - - - Use :attr:`Member.activities` instead. - -- ``Guild.role_hierarchy`` / ``Server.role_hierarchy`` - - - Use :attr:`Guild.roles` instead. Note that while sorted, it is in the opposite order - of what the old ``Guild.role_hierarchy`` used to be. - -**Changed** - -- :attr:`Member.avatar_url` and :attr:`User.avatar_url` now return the default avatar if a custom one is not set. -- :attr:`Message.embeds` is now a list of :class:`Embed` instead of :class:`dict` objects. -- :attr:`Message.attachments` is now a list of :class:`Attachment` instead of :class:`dict` object. -- :attr:`Guild.roles` is now sorted through hierarchy. The first element is always the ``@everyone`` role. - -**Added** - -- :class:`Attachment` to represent a discord attachment. -- :class:`CategoryChannel` to represent a channel category. -- :attr:`VoiceChannel.members` for fetching members connected to a voice channel. -- :attr:`TextChannel.members` for fetching members that can see the channel. -- :attr:`Role.members` for fetching members that have the role. -- :attr:`Guild.text_channels` for fetching text channels only. -- :attr:`Guild.voice_channels` for fetching voice channels only. -- :attr:`Guild.categories` for fetching channel categories only. -- :attr:`TextChannel.category` and :attr:`VoiceChannel.category` to get the category a channel belongs to. -- :meth:`Guild.by_category` to get channels grouped by their category. -- :attr:`Guild.chunked` to check member chunking status. -- :attr:`Guild.explicit_content_filter` to fetch the content filter. -- :attr:`Guild.shard_id` to get a guild's Shard ID if you're sharding. -- :attr:`Client.users` to get all visible :class:`User` instances. -- :meth:`Client.get_user` to get a :class:`User` by ID. -- :meth:`User.avatar_url_as` to get an avatar in a specific size or format. -- :meth:`Guild.vanity_invite` to fetch the guild's vanity invite. -- :meth:`Guild.audit_logs` to fetch the guild's audit logs. -- :attr:`Message.webhook_id` to fetch the message's webhook ID. -- :attr:`Message.activity` and :attr:`Message.application` for Rich Presence related information. -- :meth:`TextChannel.is_nsfw` to check if a text channel is NSFW. -- :meth:`Colour.from_rgb` to construct a :class:`Colour` from RGB tuple. -- :meth:`Guild.get_role` to get a role by its ID. - -.. _migrating_2_0_sending_messages: - -Sending Messages ------------------- - -One of the changes that were done was the merger of the previous ``Client.send_message`` and ``Client.send_file`` -functionality into a single method, :meth:`~abc.Messageable.send`. - -Basically: :: - - # before - await client.send_message(channel, 'Hello') - - # after - await channel.send('Hello') - -This supports everything that the old ``send_message`` supported such as embeds: :: - - e = discord.Embed(title='foo') - await channel.send('Hello', embed=e) - -There is a caveat with sending files however, as this functionality was expanded to support multiple -file attachments, you must now use a :class:`File` pseudo-namedtuple to upload a single file. :: - - # before - await client.send_file(channel, 'cool.png', filename='testing.png', content='Hello') - - # after - await channel.send('Hello', file=discord.File('cool.png', 'testing.png')) - -This change was to facilitate multiple file uploads: :: - - my_files = [ - discord.File('cool.png', 'testing.png'), - discord.File(some_fp, 'cool_filename.png'), - ] - - await channel.send('Your images:', files=my_files) - -.. _migrating_2_0_async_iter: - -Asynchronous Iterators ------------------------- - -Prior to v2.0, certain functions like ``Client.logs_from`` would return a different type if done in Python 3.4 or 3.5+. - -In v2.0, this change has been reverted and will now return a singular type meeting an abstract concept called -:class:`AsyncIterator`. - -This allows you to iterate over it like normal: :: - - async for message in channel.history(): - print(message) - -Or turn it into a list: :: - - messages = await channel.history().flatten() - for message in messages: - print(message) - -A handy aspect of returning :class:`AsyncIterator` is that it allows you to chain functions together such as -:meth:`AsyncIterator.map` or :meth:`AsyncIterator.filter`: :: - - async for m_id in channel.history().filter(lambda m: m.author == client.user).map(lambda m: m.id): - print(m_id) - -The functions passed to :meth:`AsyncIterator.map` or :meth:`AsyncIterator.filter` can be either coroutines or regular -functions. - -You can also get single elements a la :func:`discord.utils.find` or :func:`discord.utils.get` via -:meth:`AsyncIterator.get` or :meth:`AsyncIterator.find`: :: - - my_last_message = await channel.history().get(author=client.user) - -The following return :class:`AsyncIterator`: - -- :meth:`abc.Messageable.history` -- :meth:`Guild.audit_logs` -- :meth:`Reaction.users` - -.. _migrating_2_0_event_changes: - -Event Changes --------------- - -A lot of events have gone through some changes. - -Many events with ``server`` in the name were changed to use ``guild`` instead. - -Before: - -- ``on_server_join`` -- ``on_server_remove`` -- ``on_server_update`` -- ``on_server_role_create`` -- ``on_server_role_delete`` -- ``on_server_role_update`` -- ``on_server_emojis_update`` -- ``on_server_available`` -- ``on_server_unavailable`` - -After: - -- :func:`on_guild_join` -- :func:`on_guild_remove` -- :func:`on_guild_update` -- :func:`on_guild_role_create` -- :func:`on_guild_role_delete` -- :func:`on_guild_role_update` -- :func:`on_guild_emojis_update` -- :func:`on_guild_available` -- :func:`on_guild_unavailable` - - -The :func:`on_voice_state_update` event has received an argument change. - -Before: :: - - async def on_voice_state_update(before, after) - -After: :: - - async def on_voice_state_update(member, before, after) - -Instead of two :class:`Member` objects, the new event takes one :class:`Member` object and two :class:`VoiceState` objects. - -The :func:`on_guild_emojis_update` event has received an argument change. - -Before: :: - - async def on_guild_emojis_update(before, after) - -After: :: - - async def on_guild_emojis_update(guild, before, after) - -The first argument is now the :class:`Guild` that the emojis were updated from. - -The :func:`on_member_ban` event has received an argument change as well: - -Before: :: - - async def on_member_ban(member) - -After: :: - - async def on_member_ban(guild, user) - -As part of the change, the event can either receive a :class:`User` or :class:`Member`. To help in the cases that have -:class:`User`, the :class:`Guild` is provided as the first parameter. - -The ``on_channel_`` events have received a type level split (see :ref:`migrating_2_0_channel_split`). - -Before: - -- ``on_channel_delete`` -- ``on_channel_create`` -- ``on_channel_update`` - -After: - -- :func:`on_guild_channel_delete` -- :func:`on_guild_channel_create` -- :func:`on_guild_channel_update` -- :func:`on_private_channel_delete` -- :func:`on_private_channel_create` -- :func:`on_private_channel_update` - -The ``on_guild_channel_`` events correspond to :class:`abc.GuildChannel` being updated (i.e. :class:`TextChannel` -and :class:`VoiceChannel`) and the ``on_private_channel_`` events correspond to :class:`abc.PrivateChannel` being -updated (i.e. :class:`DMChannel` and :class:`GroupChannel`). - -.. _migrating_2_0_voice: - -Voice Changes ---------------- - -Voice sending has gone through a complete redesign. - -In particular: - -- Connection is done through :meth:`VoiceChannel.connect` instead of ``Client.join_voice_channel``. -- You no longer create players and operate on them (you no longer store them). -- You instead request :class:`VoiceClient` to play an :class:`AudioSource` via :meth:`VoiceClient.play`. -- There are different built-in :class:`AudioSource`\s. - - - :class:`FFmpegPCMAudio` is the equivalent of ``create_ffmpeg_player`` - -- create_ffmpeg_player/create_stream_player/create_ytdl_player have all been removed. - - - The goal is to create :class:`AudioSource` instead. - -- Using :meth:`VoiceClient.play` will not return an ``AudioPlayer``. - - - Instead, it's "flattened" like :class:`User` -> :class:`Member` is. - -- The ``after`` parameter now takes a single parameter (the error). - -Basically: - -Before: :: - - vc = await client.join_voice_channel(channel) - player = vc.create_ffmpeg_player('testing.mp3', after=lambda: print('done')) - player.start() - - player.is_playing() - player.pause() - player.resume() - player.stop() - # ... - -After: :: - - vc = await channel.connect() - vc.play(discord.FFmpegPCMAudio('testing.mp3'), after=lambda e: print('done', e)) - vc.is_playing() - vc.pause() - vc.resume() - vc.stop() - # ... - -With the changed :class:`AudioSource` design, you can now change the source that the :class:`VoiceClient` is -playing at runtime via :attr:`VoiceClient.source`. - -For example, you can add a :class:`PCMVolumeTransformer` to allow changing the volume: :: - - vc.source = discord.PCMVolumeTransformer(vc.source) - vc.source.volume = 0.6 - -An added benefit of the redesign is that it will be much more resilient towards reconnections: - -- The voice websocket will now automatically re-connect and re-do the handshake when disconnected. -- The initial connect handshake will now retry up to 5 times so you no longer get as many ``asyncio.TimeoutError``. -- Audio will now stop and resume when a disconnect is found. - - - This includes changing voice regions etc. - - -.. _migrating_2_0_wait_for: - -Waiting For Events --------------------- - -Prior to v2.0, the machinery for waiting for an event outside of the event itself was done through two different -functions, ``Client.wait_for_message`` and ``Client.wait_for_reaction``. One problem with one such approach is that it did -not allow you to wait for events outside of the ones provided by the library. - -In v2.0 the concept of waiting for another event has been generalised to work with any event as :meth:`Client.wait_for`. - -For example, to wait for a message: :: - - # before - msg = await client.wait_for_message(author=message.author, channel=message.channel) - - # after - def pred(m): - return m.author == message.author and m.channel == message.channel - - msg = await client.wait_for('message', check=pred) - -To facilitate multiple returns, :meth:`Client.wait_for` returns either a single argument, no arguments, or a tuple of -arguments. - -For example, to wait for a reaction: :: - - reaction, user = await client.wait_for('reaction_add', check=lambda r, u: u.id == 176995180300206080) - - # use user and reaction - -Since this function now can return multiple arguments, the ``timeout`` parameter will now raise a :exc:`asyncio.TimeoutError` -when reached instead of setting the return to ``None``. For example: - -.. code-block:: python3 - - def pred(m): - return m.author == message.author and m.channel == message.channel - - try: - - msg = await client.wait_for('message', check=pred, timeout=60.0) - except asyncio.TimeoutError: - await channel.send('You took too long...') - else: - await channel.send('You said {0.content}, {0.author}.'.format(msg)) - -Upgraded Dependencies ------------------------ - -Following v2.0 of the library, we've updated our requirements to :doc:`aiohttp ` v2.0 or higher. - -Since this is a backwards incompatible change, it is recommended that you see the -`changes `_ -and the :doc:`aio:migration_to_2xx` pages for details on the breaking changes in -:doc:`aiohttp `. - -Of the most significant for common users is the removal of helper functions such as: - -- ``aiohttp.get`` -- ``aiohttp.post`` -- ``aiohttp.delete`` -- ``aiohttp.patch`` -- ``aiohttp.head`` -- ``aiohttp.put`` -- ``aiohttp.request`` - -It is recommended that you create a session instead: :: - - async with aiohttp.ClientSession() as sess: - async with sess.get('url') as resp: - # work with resp - -Since it is better to not create a session for every request, you should store it in a variable and then call -``session.close`` on it when it needs to be disposed. - -Sharding ----------- - -The library has received significant changes on how it handles sharding and now has sharding as a first-class citizen. - -If using a Bot account and you want to shard your bot in a single process then you can use the :class:`AutoShardedClient`. - -This class allows you to use sharding without having to launch multiple processes or deal with complicated IPC. - -It should be noted that **the sharded client does not support user accounts**. This is due to the changes in connection -logic and state handling. - -Usage is as simple as doing: :: - - client = discord.AutoShardedClient() - -instead of using :class:`Client`. - -This will launch as many shards as your bot needs using the ``/gateway/bot`` endpoint, which allocates about 1000 guilds -per shard. - -If you want more control over the sharding you can specify ``shard_count`` and ``shard_ids``. :: - - # launch 10 shards regardless - client = discord.AutoShardedClient(shard_count=10) - - # launch specific shard IDs in this process - client = discord.AutoShardedClient(shard_count=10, shard_ids=(1, 2, 5, 6)) - -For users of the command extension, there is also :class:`~ext.commands.AutoShardedBot` which behaves similarly. - -Connection Improvements -------------------------- - -In v2.0, the auto reconnection logic has been powered up significantly. - -:meth:`Client.connect` has gained a new keyword argument, ``reconnect`` that defaults to ``True`` which controls -the reconnect logic. When enabled, the client will automatically reconnect in all instances of your internet going -offline or Discord going offline with exponential back-off. - -:meth:`Client.run` and :meth:`Client.start` gains this keyword argument as well, but for most cases you will not -need to specify it unless turning it off. - -.. _migrating_2_0_commands: - -Command Extension Changes --------------------------- - -Due to the :ref:`migrating_2_0_model_state` changes, some of the design of the extension module had to -undergo some design changes as well. - -Context Changes -~~~~~~~~~~~~~~~~~ - -In v2.0, the :class:`.Context` has received a lot of changes with how it's retrieved and used. - -The biggest change is that ``pass_context=True`` no longer exists, :class:`.Context` is always passed. Ergo: - -.. code-block:: python3 - - # before - @bot.command() - async def foo(): - await bot.say('Hello') - - # after - @bot.command() - async def foo(ctx): - await ctx.send('Hello') - -The reason for this is because :class:`~ext.commands.Context` now meets the requirements of :class:`abc.Messageable`. This -makes it have similar functionality to :class:`TextChannel` or :class:`DMChannel`. Using :meth:`~.Context.send` -will either DM the user in a DM context or send a message in the channel it was in, similar to the old ``bot.say`` -functionality. The old helpers have been removed in favour of the new :class:`abc.Messageable` interface. See -:ref:`migrating_2_0_removed_helpers` for more information. - -Since the :class:`~ext.commands.Context` is now passed by default, several shortcuts have been added: - -**New Shortcuts** - -- :attr:`ctx.author ` is a shortcut for ``ctx.message.author``. -- :attr:`ctx.guild ` is a shortcut for ``ctx.message.guild``. -- :attr:`ctx.channel ` is a shortcut for ``ctx.message.channel``. -- :attr:`ctx.me ` is a shortcut for ``ctx.message.guild.me`` or ``ctx.bot.user``. -- :attr:`ctx.voice_client ` is a shortcut for ``ctx.message.guild.voice_client``. - -**New Functionality** - -- :meth:`.Context.reinvoke` to invoke a command again. - - - This is useful for bypassing cooldowns. -- :attr:`.Context.valid` to check if a context can be invoked with :meth:`.Bot.invoke`. -- :meth:`.Context.send_help` to show the help command for an entity using the new :class:`~.ext.commands.HelpCommand` system. - - - This is useful if you want to show the user help if they misused a command. - -Subclassing Context -++++++++++++++++++++ - -In v2.0, there is now the ability to subclass :class:`~ext.commands.Context` and use it instead of the default -provided one. - -For example, if you want to add some functionality to the context: - -.. code-block:: python3 - - class MyContext(commands.Context): - @property - def secret(self): - return 'my secret here' - -Then you can use :meth:`~ext.commands.Bot.get_context` inside :func:`on_message` with combination with -:meth:`~ext.commands.Bot.invoke` to use your custom context: - -.. code-block:: python3 - - class MyBot(commands.Bot): - async def on_message(self, message): - ctx = await self.get_context(message, cls=MyContext) - await self.invoke(ctx) - -Now inside your commands you will have access to your custom context: - -.. code-block:: python3 - - @bot.command() - async def secret(ctx): - await ctx.send(ctx.secret) - -.. _migrating_2_0_removed_helpers: - -Removed Helpers -+++++++++++++++++ - -With the new :class:`.Context` changes, a lot of message sending helpers have been removed. - -For a full list of changes, see below: - -+-----------------+------------------------------------------------------------+ -| Before | After | -+-----------------+------------------------------------------------------------+ -| ``Bot.say`` | :meth:`.Context.send` | -+-----------------+------------------------------------------------------------+ -| ``Bot.upload`` | :meth:`.Context.send` | -+-----------------+------------------------------------------------------------+ -| ``Bot.whisper`` | ``ctx.author.send`` | -+-----------------+------------------------------------------------------------+ -| ``Bot.type`` | :meth:`.Context.typing` or :meth:`.Context.trigger_typing` | -+-----------------+------------------------------------------------------------+ -| ``Bot.reply`` | No replacement. | -+-----------------+------------------------------------------------------------+ - -Command Changes -~~~~~~~~~~~~~~~~~ - -As mentioned earlier, the first command change is that ``pass_context=True`` no longer -exists, so there is no need to pass this as a parameter. - -Another change is the removal of ``no_pm=True``. Instead, use the new :func:`~ext.commands.guild_only` built-in -check. - -The ``commands`` attribute of :class:`~ext.commands.Bot` and :class:`~ext.commands.Group` have been changed from a -dictionary to a set that does not have aliases. To retrieve the previous dictionary behaviour, use ``all_commands`` instead. - -Command instances have gained new attributes and properties: - -1. :attr:`~ext.commands.Command.signature` to get the signature of the command. -2. :attr:`~.Command.usage`, an attribute to override the default signature. -3. :attr:`~.Command.root_parent` to get the root parent group of a subcommand. - -For :class:`~ext.commands.Group` and :class:`~ext.commands.Bot` the following changed: - -- Changed :attr:`~.GroupMixin.commands` to be a :class:`set` without aliases. - - - Use :attr:`~.GroupMixin.all_commands` to get the old :class:`dict` with all commands. - -Check Changes -~~~~~~~~~~~~~~~ - -Prior to v2.0, :func:`~ext.commands.check`\s could only be synchronous. As of v2.0 checks can now be coroutines. - -Along with this change, a couple new checks were added. - -- :func:`~ext.commands.guild_only` replaces the old ``no_pm=True`` functionality. -- :func:`~ext.commands.is_owner` uses the :meth:`Client.application_info` endpoint by default to fetch owner ID. - - - This is actually powered by a different function, :meth:`~ext.commands.Bot.is_owner`. - - You can set the owner ID yourself by setting :attr:`.Bot.owner_id`. - -- :func:`~ext.commands.is_nsfw` checks if the channel the command is in is a NSFW channel. - - - This is powered by the new :meth:`TextChannel.is_nsfw` method. - -Event Changes -~~~~~~~~~~~~~~~ - -All command extension events have changed. - -Before: :: - - on_command(command, ctx) - on_command_completion(command, ctx) - on_command_error(error, ctx) - -After: :: - - on_command(ctx) - on_command_completion(ctx) - on_command_error(ctx, error) - -The extraneous ``command`` parameter in :func:`.on_command` and :func:`.on_command_completion` -have been removed. The :class:`~ext.commands.Command` instance was not kept up-to date so it was incorrect. In order to get -the up to date :class:`~ext.commands.Command` instance, use the :attr:`.Context.command` -attribute. - -The error handlers, either :meth:`.Command.error` or :func:`.on_command_error`, -have been re-ordered to use the :class:`~ext.commands.Context` as its first parameter to be consistent with other events -and commands. - -HelpFormatter and Help Command Changes -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The ``HelpFormatter`` class has been removed. It has been replaced with a :class:`~.commands.HelpCommand` class. This class now stores all the command handling and processing of the help command. - -The help command is now stored in the :attr:`.Bot.help_command` attribute. As an added extension, you can disable the help command completely by assigning the attribute to ``None`` or passing it at ``__init__`` as ``help_command=None``. - -The new interface allows the help command to be customised through special methods that can be overridden. - -- :meth:`.HelpCommand.send_bot_help` - - Called when the user requested for help with the entire bot. -- :meth:`.HelpCommand.send_cog_help` - - Called when the user requested for help with a specific cog. -- :meth:`.HelpCommand.send_group_help` - - Called when the user requested for help with a :class:`~.commands.Group` -- :meth:`.HelpCommand.send_command_help` - - Called when the user requested for help with a :class:`~.commands.Command` -- :meth:`.HelpCommand.get_destination` - - Called to know where to send the help messages. Useful for deciding whether to DM or not. -- :meth:`.HelpCommand.command_not_found` - - A function (or coroutine) that returns a presentable no command found string. -- :meth:`.HelpCommand.subcommand_not_found` - - A function (or coroutine) that returns a string when a subcommand is not found. -- :meth:`.HelpCommand.send_error_message` - - A coroutine that gets passed the result of :meth:`.HelpCommand.command_not_found` and :meth:`.HelpCommand.subcommand_not_found`. - - By default it just sends the message. But you can, for example, override it to put it in an embed. -- :meth:`.HelpCommand.on_help_command_error` - - The :ref:`error handler ` for the help command if you want to add one. -- :meth:`.HelpCommand.prepare_help_command` - - A coroutine that is called right before the help command processing is done. - -Certain subclasses can implement more customisable methods. - -The old ``HelpFormatter`` was replaced with :class:`~.commands.DefaultHelpCommand`\, which implements all of the logic of the old help command. The customisable methods can be found in the accompanying documentation. - -The library now provides a new more minimalistic :class:`~.commands.HelpCommand` implementation that doesn't take as much space, :class:`~.commands.MinimalHelpCommand`. The customisable methods can also be found in the accompanying documentation. - -A frequent request was if you could associate a help command with a cog. The new design allows for dynamically changing of cog through binding it to the :attr:`.HelpCommand.cog` attribute. After this assignment the help command will pretend to be part of the cog and everything should work as expected. When the cog is unloaded then the help command will be "unbound" from the cog. - -For example, to implement a :class:`~.commands.HelpCommand` in a cog, the following snippet can be used. - -.. code-block:: python3 - - class MyHelpCommand(commands.MinimalHelpCommand): - def get_command_signature(self, command): - return '{0.clean_prefix}{1.qualified_name} {1.signature}'.format(self, command) - - class MyCog(commands.Cog): - def __init__(self, bot): - self._original_help_command = bot.help_command - bot.help_command = MyHelpCommand() - bot.help_command.cog = self - - def cog_unload(self): - self.bot.help_command = self._original_help_command - -For more information, check out the relevant :ref:`documentation `. - -Cog Changes -~~~~~~~~~~~~~ - -Cogs have completely been revamped. They are documented in :ref:`ext_commands_cogs` as well. - -Cogs are now required to have a base class, :class:`~.commands.Cog` for future proofing purposes. This comes with special methods to customise some behaviour. - -* :meth:`.Cog.cog_unload` - - This is called when a cog needs to do some cleanup, such as cancelling a task. -* :meth:`.Cog.bot_check_once` - - This registers a :meth:`.Bot.check_once` check. -* :meth:`.Cog.bot_check` - - This registers a regular :meth:`.Bot.check` check. -* :meth:`.Cog.cog_check` - - This registers a check that applies to every command in the cog. -* :meth:`.Cog.cog_command_error` - - This is a special error handler that is called whenever an error happens inside the cog. -* :meth:`.Cog.cog_before_invoke` and :meth:`.Cog.cog_after_invoke` - - A special method that registers a cog before and after invoke hook. More information can be found in :ref:`migrating_2_0_before_after_hook`. - -Those that were using listeners, such as ``on_message`` inside a cog will now have to explicitly mark them as such using the :meth:`.commands.Cog.listener` decorator. - -Along with that, cogs have gained the ability to have custom names through specifying it in the class definition line. More options can be found in the metaclass that facilitates all this, :class:`.commands.CogMeta`. - -An example cog with every special method registered and a custom name is as follows: - -.. code-block:: python3 - - class MyCog(commands.Cog, name='Example Cog'): - def cog_unload(self): - print('cleanup goes here') - - def bot_check(self, ctx): - print('bot check') - return True - - def bot_check_once(self, ctx): - print('bot check once') - return True - - async def cog_check(self, ctx): - print('cog local check') - return await ctx.bot.is_owner(ctx.author) - - async def cog_command_error(self, ctx, error): - print('Error in {0.command.qualified_name}: {1}'.format(ctx, error)) - - async def cog_before_invoke(self, ctx): - print('cog local before: {0.command.qualified_name}'.format(ctx)) - - async def cog_after_invoke(self, ctx): - print('cog local after: {0.command.qualified_name}'.format(ctx)) - - @commands.Cog.listener() - async def on_message(self, message): - pass - - -.. _migrating_2_0_before_after_hook: - -Before and After Invocation Hooks ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +: -Commands have gained new before and after invocation hooks that allow you to do an action before and after a command is -run. - -They take a single parameter, :class:`~ext.commands.Context` and they must be a coroutine. - -They are on a global, per-cog, or per-command basis. - -Basically: :: - - - # global hooks: - - @bot.before_invoke - async def before_any_command(ctx): - # do something before a command is called - pass - - @bot.after_invoke - async def after_any_command(ctx): - # do something after a command is called - pass - -The after invocation is hook always called, **regardless of an error in the command**. This makes it ideal for some error -handling or clean up of certain resources such a database connection. - -The per-command registration is as follows: :: - - @bot.command() - async def foo(ctx): - await ctx.send('foo') - - @foo.before_invoke - async def before_foo_command(ctx): - # do something before the foo command is called - pass - - @foo.after_invoke - async def after_foo_command(ctx): - # do something after the foo command is called - pass - -The special cog method for these is :meth:`.Cog.cog_before_invoke` and :meth:`.Cog.cog_after_invoke`, e.g.: - -.. code-block:: python3 - - class MyCog(commands.Cog): - async def cog_before_invoke(self, ctx): - ctx.secret_cog_data = 'foo' - - async def cog_after_invoke(self, ctx): - print('{0.command} is done...'.format(ctx)) - - @commands.command() - async def foo(self, ctx): - await ctx.send(ctx.secret_cog_data) - -To check if a command failed in the after invocation hook, you can use -:attr:`.Context.command_failed`. - -The invocation order is as follows: - -1. Command local before invocation hook -2. Cog local before invocation hook -3. Global before invocation hook -4. The actual command -5. Command local after invocation hook -6. Cog local after invocation hook -7. Global after invocation hook - -Converter Changes -~~~~~~~~~~~~~~~~~~~ - -Prior to v2.0, a converter was a type hint that could be a callable that could be invoked -with a singular argument denoting the argument passed by the user as a string. - -This system was eventually expanded to support a :class:`~ext.commands.Converter` system to -allow plugging in the :class:`~ext.commands.Context` and do more complicated conversions such -as the built-in "discord" converters. - -In v2.0 this converter system was revamped to allow instances of :class:`~ext.commands.Converter` derived -classes to be passed. For consistency, the :meth:`~ext.commands.Converter.convert` method was changed to -always be a coroutine and will now take the two arguments as parameters. - -Essentially, before: :: - - class MyConverter(commands.Converter): - def convert(self): - return self.ctx.message.server.me - -After: :: - - class MyConverter(commands.Converter): - async def convert(self, ctx, argument): - return ctx.me - -The command framework also got a couple new converters: -- :class:`~ext.commands.clean_content` this is akin to :attr:`Message.clean_content` which scrubs mentions. -- :class:`~ext.commands.UserConverter` will now appropriately convert :class:`User` only. -- ``ChannelConverter`` is now split into two different converters. +Where Is The 1.0.0 Migation Page? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - - :class:`~ext.commands.TextChannelConverter` for :class:`TextChannel`. - - :class:`~ext.commands.VoiceChannelConverter` for :class:`VoiceChannel`. +Is is here: :doc:`migrating_to_v1` \ No newline at end of file From d16e8c386b666f2ec436a19db113b0f24d266905 Mon Sep 17 00:00:00 2001 From: Vincent Date: Thu, 2 Dec 2021 17:10:04 +0800 Subject: [PATCH 075/180] Fix --- docs/version_guarantees.rst | 3 +-- docs/whats_new.rst | 6 +++--- 2 files changed, 4 insertions(+), 5 deletions(-) diff --git a/docs/version_guarantees.rst b/docs/version_guarantees.rst index 7909bd6b5d..2216579c82 100644 --- a/docs/version_guarantees.rst +++ b/docs/version_guarantees.rst @@ -26,5 +26,4 @@ Examples of Non-Breaking Changes - Changing the behaviour of a function to fix a bug. - Changes in the documentation. - Modifying the internal HTTP handling. -- Upgrading the dependencies to a new version, major or otherwise. - +- Upgrading the dependencies to a new version, major or otherwise. \ No newline at end of file diff --git a/docs/whats_new.rst b/docs/whats_new.rst index 2e4c9f57f5..c6107b5c81 100644 --- a/docs/whats_new.rst +++ b/docs/whats_new.rst @@ -650,7 +650,7 @@ Bug Fixes .. _vp1p2p3: v1.2.3 --------- +------- Bug Fixes ~~~~~~~~~~~ @@ -664,7 +664,7 @@ Bug Fixes .. _vp1p2p2: v1.2.2 --------- +------- Bug Fixes ~~~~~~~~~~~ @@ -674,7 +674,7 @@ Bug Fixes .. _vp1p2p1: v1.2.1 --------- +------- Bug Fixes ~~~~~~~~~~~ From 11fb2a34122c5c069066315b91efd4429d878bce Mon Sep 17 00:00:00 2001 From: Lala Sabathil Date: Thu, 2 Dec 2021 20:05:50 +0100 Subject: [PATCH 076/180] Update docs/intents.rst Co-authored-by: BobDotCom <71356958+BobDotCom@users.noreply.github.com> --- docs/intents.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/intents.rst b/docs/intents.rst index d11b151f87..f0e8ab79b4 100644 --- a/docs/intents.rst +++ b/docs/intents.rst @@ -84,7 +84,7 @@ A privileged intent is one that requires you to go to the developer portal and m through code as well. Do I need privileged intents? -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ This is a quick checklist to see if you need specific privileged intents. From d3d12427c935b34d1a09835d3e5b5da85d453e52 Mon Sep 17 00:00:00 2001 From: Lala Sabathil Date: Thu, 2 Dec 2021 20:06:22 +0100 Subject: [PATCH 077/180] Update docs/migrating.rst Co-authored-by: BobDotCom <71356958+BobDotCom@users.noreply.github.com> --- docs/migrating.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/migrating.rst b/docs/migrating.rst index 6639475879..df27857310 100644 --- a/docs/migrating.rst +++ b/docs/migrating.rst @@ -292,4 +292,4 @@ BadInviteArgument arguments changed Where Is The 1.0.0 Migation Page? ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Is is here: :doc:`migrating_to_v1` \ No newline at end of file +The v1.0 migration guide can be found at :ref:`migrating_1_0`. \ No newline at end of file From e5ba1efcb58f4e7c2095f8c505a8040272fbf3b5 Mon Sep 17 00:00:00 2001 From: Vincent Date: Fri, 3 Dec 2021 10:27:01 +0800 Subject: [PATCH 078/180] Fixing Examples --- examples/interactionsBot/bot.py | 28 +++++----- .../interactionsBot/cog_group/__init__.py | 34 ++++++------ examples/interactionsBot/cogs/button_cog.py | 36 ++++++++----- examples/interactionsBot/cogs/dropdown_cog.py | 29 +++++++---- .../interactionsBot/cogs/slashGroup_cog.py | 52 +++++++++++-------- .../interactionsBot/cogs/slashOption_cog.py | 32 +++++++----- examples/interactionsBot/cogs/slash_cog.py | 29 ++++++----- 7 files changed, 140 insertions(+), 100 deletions(-) diff --git a/examples/interactionsBot/bot.py b/examples/interactionsBot/bot.py index 93e248433e..3a65fedb11 100644 --- a/examples/interactionsBot/bot.py +++ b/examples/interactionsBot/bot.py @@ -8,34 +8,36 @@ from discord.ui.view import View -#inherits commands.Bot -class BotClass(commands.Bot): +# inherits commands.Bot +class BotClass(discord.Bot): def __init__(self): - super().__init__(command_prefix=">") + super().__init__() self.persistent_views_added = False - + # For making the intreaction Button works even after restart. async def on_ready(self): if not self.persistent_views_added: - + # You can add classes to the to make it work after restart # self.add_view() - print(f'Connected as {self.user} with ID {self.user.id}') + print(f"Connected as {self.user} with ID {self.user.id}") print("------") self.persistent_views_added = True - -client = BotClass() -for filename in os.listdir('./cogs'): + +bot = BotClass() + +for filename in os.listdir("./cogs"): if filename.endswith(".py"): - client.load_extension(f'cogs.{filename[:-3]}') + bot.load_extension(f"cogs.{filename[:-3]}") # using SlashCommandGroup import cog_group + cog_group.addition() # subtraction method is called last because of inside it. -# calling subtraction first then addition would most likely not work and won't register addition slash command. -cog_group.subtraction(client) +# calling subtraction first then addition would most likely not work and won't register addition slash command. +cog_group.subtraction(bot) -client.run("token") +bot.run("token") diff --git a/examples/interactionsBot/cog_group/__init__.py b/examples/interactionsBot/cog_group/__init__.py index 507f1e36c2..25531ed021 100644 --- a/examples/interactionsBot/cog_group/__init__.py +++ b/examples/interactionsBot/cog_group/__init__.py @@ -11,25 +11,27 @@ from discord.commands.commands import Option, SlashCommandGroup from discord.ext.commands.context import Context -MathGroup = SlashCommandGroup("math", "maths!.",guild_ids=[...]) - -def addition(): # you can use whatever parameters needed for you command. - #the main decorator will be called inside the method. - @MathGroup.command(name= "add",guild_ids=[...],description="addition!") - async def add(ctx:Context, - number1:Option(int,"first integer"), # refer to slashOption.py - number2:Option(int,"second integer") # refer to slashOption.py - ): +MathGroup = SlashCommandGroup("math", "maths!.", guild_ids=[...]) + + +def addition(): # you can use whatever parameters needed for you command. + # the main decorator will be called inside the method. + @MathGroup.command(name="add", guild_ids=[...], description="addition!") + async def add( + ctx: Context, + number1: Option(int, "first integer"), # refer to slashOption.py + number2: Option(int, "second integer"), # refer to slashOption.py + ): await ctx.respond(f"{number1}+{number2}={number1+number2}") def subtraction(client): - @MathGroup.command(name= "subtract",guild_ids=[...],description="subtraction!") - async def sub(ctx:Context, - number1:Option(int,"first integer"), # refer to slashOption.py - number2:Option(int,"second integer") # refer to slashOption.py - ): + @MathGroup.command(name="subtract", guild_ids=[...], description="subtraction!") + async def sub( + ctx: Context, + number1: Option(int, "first integer"), # refer to slashOption.py + number2: Option(int, "second integer"), # refer to slashOption.py + ): await ctx.respond(f"{number1}-{number2}={number1-number2}") - - client.add_application_command(MathGroup) \ No newline at end of file + client.add_application_command(MathGroup) diff --git a/examples/interactionsBot/cogs/button_cog.py b/examples/interactionsBot/cogs/button_cog.py index 683a8ebf46..92d160930e 100644 --- a/examples/interactionsBot/cogs/button_cog.py +++ b/examples/interactionsBot/cogs/button_cog.py @@ -1,34 +1,42 @@ import discord from discord.ext import commands from discord.ext.commands.context import Context - from discord.commands import slash_command + class ButtonView(discord.ui.View): def __init__(self): # making None is important if you want the button work after restart! super().__init__(timeout=None) - #custom_id is required and should be unique for + # custom_id is required and should be unique for # attribute emoji can be used to include emojis which can be default str emoji or str(<:emojiName:int(ID)>) # timeout can be used if there is a timeout on the button interaction. Default timeout is set to 180. - @discord.ui.button(style=discord.ButtonStyle.blurple,custom_id="counter:firstButton") - async def leftButton(self,button,interaction): + @discord.ui.button( + style=discord.ButtonStyle.blurple, custom_id="counter:firstButton" + ) + async def leftButton(self, button, interaction): await interaction.response.edit_message("button was pressed!") + class ButtonExample(commands.Cog): - def __init__(self,client): - self.client = client + def __init__(self, bot): + self.bot = bot - @slash_command(guild_ids=[...],name="slash_command_name",description="command description!") - async def CommandName(self,ctx): - navigator = ButtonView() # button View - await ctx.respond("press the button.",view=navigator) + @slash_command( + guild_ids=[...], name="slash_command_name", description="command description!" + ) + async def CommandName(self, ctx): + navigator = ButtonView() # button View + await ctx.respond("press the button.", view=navigator) # for error handling @CommandName.error - async def CommandName_error(self, ctx:Context ,error): - return await ctx.respond(error,ephemeral=True) # ephemeral makes "Only you can see this" message + async def CommandName_error(self, ctx: Context, error): + return await ctx.respond( + error, ephemeral=True + ) # ephemeral makes "Only you can see this" message + -def setup(client): - client.add_cog(ButtonExample(client)) +def setup(bot): + bot.add_cog(ButtonExample(bot)) diff --git a/examples/interactionsBot/cogs/dropdown_cog.py b/examples/interactionsBot/cogs/dropdown_cog.py index a74b5cc361..c06da7acaf 100644 --- a/examples/interactionsBot/cogs/dropdown_cog.py +++ b/examples/interactionsBot/cogs/dropdown_cog.py @@ -37,7 +37,10 @@ async def callback(self, interaction: discord.Interaction): # the user's favourite colour or choice. The self object refers to the # Select object, and the values attribute gets a list of the user's # selected options. We only want the first one. - await interaction.response.send_message(f"Your favourite colour is {self.values[0]}") + await interaction.response.send_message( + f"Your favourite colour is {self.values[0]}" + ) + class DropdownView(discord.ui.View): def __init__(self): @@ -46,13 +49,16 @@ def __init__(self): # Adds the dropdown to our view object. self.add_item(Dropdown()) + class DropdownExample(commands.Cog): - def __init__(self,client): - self.client = client + def __init__(self, bot): + self.bot = bot - @slash_command(guild_ids=[...],name="color",description="tell me your favourite color!") - async def whatcolor(self,ctx): - await ctx.respond("what is your favrouite color?",view=DropdownView()) + @slash_command( + guild_ids=[...], name="color", description="tell me your favourite color!" + ) + async def whatcolor(self, ctx): + await ctx.respond("what is your favrouite color?", view=DropdownView()) # ephemeral makes "Only you can see this" message """ @@ -60,8 +66,11 @@ async def whatcolor(self,ctx): """ @whatcolor.error - async def color_error(self, ctx:Context ,error): - return await ctx.respond(error,ephemeral=True) # ephemeral makes "Only you can see this" message + async def color_error(self, ctx: Context, error): + return await ctx.respond( + error, ephemeral=True + ) # ephemeral makes "Only you can see this" message + -def setup(client): - client.add_cog(DropdownExample(client)) \ No newline at end of file +def setup(bot): + bot.add_cog(DropdownExample(bot)) diff --git a/examples/interactionsBot/cogs/slashGroup_cog.py b/examples/interactionsBot/cogs/slashGroup_cog.py index 2c2c19f778..b42076bb0c 100644 --- a/examples/interactionsBot/cogs/slashGroup_cog.py +++ b/examples/interactionsBot/cogs/slashGroup_cog.py @@ -3,19 +3,22 @@ from discord.ext import commands from discord.ext.commands.context import Context + class SlashGroupExample(commands.Cog): - def __init__(self, client): - self.client = client + def __init__(self, bot): + self.bot = bot # moderation = SlashCommandGroup("moderation", "Commands related to moderation.") - @moderation.command(guild_ids=[...],description="kick some people") - async def kick(self, ctx:Context, - member:Option(discord.Member), - reason:Option(str,description="reason") - ): - + @moderation.command(guild_ids=[...], description="kick some people") + async def kick( + self, + ctx: Context, + member: Option(discord.Member), + reason: Option(str, description="reason"), + ): + # check kick members permission for the author if ctx.author.guild_permissions.kick_members == True: # https://docs.pycord.dev/en/master/api.html#discord.Member.kick @@ -23,13 +26,17 @@ async def kick(self, ctx:Context, await ctx.respond("hello") else: - await ctx.respond("you dont have the permission to do so!",ephemeral=True) - - @moderation.command(guild_ids=[...],description="ban some people") - async def ban(self, ctx:Context, - member:Option(discord.Member), - reason:Option(str,description="reason") - ): + await ctx.respond( + "you dont have the permission to do so!", ephemeral=True + ) + + @moderation.command(guild_ids=[...], description="ban some people") + async def ban( + self, + ctx: Context, + member: Option(discord.Member), + reason: Option(str, description="reason"), + ): # check ban members permission for the author if ctx.author.guild_permissions.ban_members == True: @@ -37,10 +44,13 @@ async def ban(self, ctx:Context, await member.ban(reason=reason) await ctx.respond("done") else: - await ctx.respond("you dont have the permission to do so!",ephemeral=True) - - # adds - client.add_application_command(moderation) + await ctx.respond( + "you dont have the permission to do so!", ephemeral=True + ) + + # Adds the application command + bot.add_application_command(moderation) + -def setup(client): - client.add_cog(SlashGroupExample(client)) +def setup(bot): + bot.add_cog(SlashGroupExample(bot)) diff --git a/examples/interactionsBot/cogs/slashOption_cog.py b/examples/interactionsBot/cogs/slashOption_cog.py index cd3120d373..0444f95a1a 100644 --- a/examples/interactionsBot/cogs/slashOption_cog.py +++ b/examples/interactionsBot/cogs/slashOption_cog.py @@ -4,16 +4,19 @@ from discord.commands import slash_command from discord.commands import Option + class SlashOptionExample(commands.Cog): - def __init__(self,client): - self.client = client + def __init__(self, bot): + self.bot = bot # slash commands with options - @slash_command(guild_ids=[...],name="avatar",description="check someones avatar!") - async def av(self,ctx, - # - member: Option(discord.Member,description="the user you want the avatar of.") - ): + @slash_command(guild_ids=[...], name="avatar", description="check someones avatar!") + async def av( + self, + ctx, + # + member: Option(discord.Member, description="the user you want the avatar of."), + ): """ ephemeral makes "Only you can see this" message @@ -22,11 +25,16 @@ async def av(self,ctx, embed docs - https://docs.pycord.dev/en/master/api.html#embed member docs - https://docs.pycord.dev/en/master/api.html#discord.Member """ - return await ctx.respond(embed=discord.Embed().set_image(url=str(member.avatar.url))) + return await ctx.respond( + embed=discord.Embed().set_image(url=str(member.avatar.url)) + ) @av.error - async def av_error(self, ctx:Context ,error): - return await ctx.respond(error,ephemeral=True) # ephemeral makes "Only you can see this" message + async def av_error(self, ctx: Context, error): + return await ctx.respond( + error, ephemeral=True + ) # ephemeral makes "Only you can see this" message + -def setup(client): - client.add_cog(SlashOptionExample(client)) \ No newline at end of file +def setup(bot): + bot.add_cog(SlashOptionExample(bot)) diff --git a/examples/interactionsBot/cogs/slash_cog.py b/examples/interactionsBot/cogs/slash_cog.py index 4be5673cfb..4607bcc46f 100644 --- a/examples/interactionsBot/cogs/slash_cog.py +++ b/examples/interactionsBot/cogs/slash_cog.py @@ -4,27 +4,28 @@ from discord.commands import slash_command from discord.commands import Option + class SlashExample(commands.Cog): - def __init__(self,client): - self.client = client + def __init__(self, bot): + self.bot = bot @slash_command( - guild_ids=[...], - name="ping", - description="check the latency of the bot!" - ) - async def ping(self,ctx): + guild_ids=[...], name="ping", description="check the latency of the bot!" + ) + async def ping(self, ctx): """ ephemeral makes "Only you can see this" message - + `await ctx.respond(f"{round(self.client.latency * 1000)}ms",ephemeral=True)` """ return await ctx.respond(f"{round(self.client.latency * 1000)}ms") - @ping.error - async def ping_error(self, ctx:Context ,error): - return await ctx.respond(error,ephemeral=True) # ephemeral makes "Only you can see this" message - -def setup(client): - client.add_cog(SlashExample(client)) \ No newline at end of file + async def ping_error(self, ctx: Context, error): + return await ctx.respond( + error, ephemeral=True + ) # ephemeral makes "Only you can see this" message + + +def setup(bot): + bot.add_cog(SlashExample(bot)) From 0896e71d4cf08d0aac0442c704ac82235bf76648 Mon Sep 17 00:00:00 2001 From: Vincent Date: Fri, 3 Dec 2021 11:20:42 +0800 Subject: [PATCH 079/180] Fixes --- .github/CONTRIBUTING.md | 2 +- .github/SECURITY.md | 6 +++--- discord/types/__init__.py | 2 -- examples/background_task_asyncio.py | 4 ++-- 4 files changed, 6 insertions(+), 8 deletions(-) diff --git a/.github/CONTRIBUTING.md b/.github/CONTRIBUTING.md index 174ef5db38..cd4a40e758 100644 --- a/.github/CONTRIBUTING.md +++ b/.github/CONTRIBUTING.md @@ -10,7 +10,7 @@ Generally speaking questions are better suited in our resources below. - The official support server: https://discord.gg/UCXwPR7Pew - The Discord API server under #python_discord-py: https://discord.gg/discord-api -- [The FAQ in the documentation](https://pycord.readthedocs.io/en/latest/faq.html) +- [The FAQ in the documentation](https://docs.pycord.dev/en/latest/faq.html) - [StackOverflow's `discord.py` tag](https://stackoverflow.com/questions/tagged/discord.py) Please try your best not to ask questions in our issue tracker. Most of them don't belong there unless they provide value to a larger audience. diff --git a/.github/SECURITY.md b/.github/SECURITY.md index 96e694cbb9..2d6e825ba5 100644 --- a/.github/SECURITY.md +++ b/.github/SECURITY.md @@ -4,9 +4,9 @@ | Version | Supported | | ------- | ------------------ | -| 2.0.0 | :white_check_mark: | -| 1.7.x | :white_check_mark: | -| < 1.7.3 | :x: | +| <2.0.0 | :white_check_mark: | +| 1.7.3 | :x: | +| >1.7.x | :x: | ## Reporting a Vulnerability diff --git a/discord/types/__init__.py b/discord/types/__init__.py index 7088d50a9d..79e1e68bb7 100644 --- a/discord/types/__init__.py +++ b/discord/types/__init__.py @@ -2,8 +2,6 @@ discord.types ~~~~~~~~~~~~~~ -# TODO: Look For Typos - Typings for the Discord API :copyright: (c) 2015-2021 Rapptz & (c) 2021-present Pycord Development diff --git a/examples/background_task_asyncio.py b/examples/background_task_asyncio.py index abc0d1dccc..3b6e614468 100644 --- a/examples/background_task_asyncio.py +++ b/examples/background_task_asyncio.py @@ -16,11 +16,11 @@ async def on_ready(self): async def my_background_task(self): await self.wait_until_ready() counter = 0 - channel = self.get_channel(1234567) # channel ID goes here + channel = self.get_channel(1234567) # The Channel ID You Want Go's Here while not self.is_closed(): counter += 1 await channel.send(counter) - await asyncio.sleep(60) # task runs every 60 seconds + await asyncio.sleep(60) # this asyncio task runs every 60 seconds client = MyClient() From d168f8212c1f469fb7f4d8b94f31f69f7aaba15c Mon Sep 17 00:00:00 2001 From: Vincent Date: Fri, 3 Dec 2021 11:23:50 +0800 Subject: [PATCH 080/180] Fixes --- examples/background_task.py | 4 ++-- examples/background_task_asyncio.py | 2 +- examples/basic_voice.py | 4 ++-- examples/converters.py | 4 ++-- setup.py | 2 +- 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/examples/background_task.py b/examples/background_task.py index dfe683a397..cad6ad9d3b 100644 --- a/examples/background_task.py +++ b/examples/background_task.py @@ -17,9 +17,9 @@ async def on_ready(self): print(f"Logged in as {self.user} (ID: {self.user.id})") print("------") - @tasks.loop(seconds=60) # task runs every 60 seconds + @tasks.loop(seconds=60) # task that runs every 60 seconds async def my_background_task(self): - channel = self.get_channel(1234567) # channel ID goes here + channel = self.get_channel(1234567) # your channel ID goes here self.counter += 1 await channel.send(self.counter) diff --git a/examples/background_task_asyncio.py b/examples/background_task_asyncio.py index 3b6e614468..185b436cf6 100644 --- a/examples/background_task_asyncio.py +++ b/examples/background_task_asyncio.py @@ -16,7 +16,7 @@ async def on_ready(self): async def my_background_task(self): await self.wait_until_ready() counter = 0 - channel = self.get_channel(1234567) # The Channel ID You Want Go's Here + channel = self.get_channel(1234567) # you channel ID go's here while not self.is_closed(): counter += 1 await channel.send(counter) diff --git a/examples/basic_voice.py b/examples/basic_voice.py index f5e43b434b..c55f8e3482 100644 --- a/examples/basic_voice.py +++ b/examples/basic_voice.py @@ -20,7 +20,7 @@ "quiet": True, "no_warnings": True, "default_search": "auto", - "source_address": "0.0.0.0", # bind to ipv4 since ipv6 addresses cause issues sometimes + "source_address": "0.0.0.0", # bind to ipv4 since ipv6 addresses cause issues at certain times } ffmpeg_options = {"options": "-vn"} @@ -45,7 +45,7 @@ async def from_url(cls, url, *, loop=None, stream=False): ) if "entries" in data: - # take first item from a playlist + # takes the first item from a playlist data = data["entries"][0] filename = data["url"] if stream else ytdl.prepare_filename(data) diff --git a/examples/converters.py b/examples/converters.py index 902d4ebeb1..1517af9249 100644 --- a/examples/converters.py +++ b/examples/converters.py @@ -95,7 +95,7 @@ async def ignore( # The `commands` framework attempts a conversion of each type in this Union *in order*. # So, it will attempt to convert whatever is passed to `target` to a `discord.Member` instance. # If that fails, it will attempt to convert it to a `discord.TextChannel` instance. - # See: https://pycord.readthedocs.io/en/latest/ext/commands/commands.html#typing-union + # See: https://docs.pycord.dev/en/latest/ext/commands/commands.html#typing-union # NOTE: If a Union typehint converter fails it will raise `commands.BadUnionArgument` # instead of `commands.BadArgument`. @@ -117,7 +117,7 @@ async def ignore( async def multiply(ctx: commands.Context, number: int, maybe: bool): # We want an `int` and a `bool` parameter here. # `bool` is a slightly special case, as shown here: - # See: https://pycord.readthedocs.io/en/latest/ext/commands/commands.html#bool + # See: https://docs.pycord.dev/en/latest/ext/commands/commands.html#bool if maybe is True: return await ctx.send(number * 2) diff --git a/setup.py b/setup.py index 5baff33360..9843d1e02a 100644 --- a/setup.py +++ b/setup.py @@ -70,7 +70,7 @@ author="Pycord Development", url="https://github.com/Pycord-Development/pycord", project_urls={ - "Documentation": "https://pycord.readthedocs.io/en/latest/", + "Documentation": "https://docs.pycord.dev/en/latest/", "Issue tracker": "https://github.com/Pycord-Development/pycord/issues", }, version=version, From aa480ff8045bb91c503bb379a92c5aff89035991 Mon Sep 17 00:00:00 2001 From: Vincent Date: Fri, 3 Dec 2021 11:27:22 +0800 Subject: [PATCH 081/180] Advance Documentation Here --- requirements.txt | 2 +- setup.py | 9 ++++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/requirements.txt b/requirements.txt index 0b4731987f..9ad0580346 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1 @@ -aiohttp>=3.6.0,<3.9.0 +aiohttp>=3.6.0,<3.9.0 \ No newline at end of file diff --git a/setup.py b/setup.py index 9843d1e02a..d4f975cb87 100644 --- a/setup.py +++ b/setup.py @@ -1,10 +1,12 @@ import re from setuptools import setup +# Requirements requirements = [] with open("requirements.txt") as f: requirements = f.read().splitlines() +# Version Info version = "" with open("discord/__init__.py") as f: @@ -35,10 +37,13 @@ except Exception: pass +# README readme = "" with open("README.rst") as f: readme = f.read() +# Extra Requirements +# Ex: pip install pycord[voice] or [speed] extras_require = { "voice": ["PyNaCl>=1.3.0,<1.5"], "docs": [ @@ -54,6 +59,7 @@ ], } +# Folders And Such Included packages = [ "discord", "discord.types", @@ -70,6 +76,7 @@ author="Pycord Development", url="https://github.com/Pycord-Development/pycord", project_urls={ + "Website": "https://pycord.dev", "Documentation": "https://docs.pycord.dev/en/latest/", "Issue tracker": "https://github.com/Pycord-Development/pycord/issues", }, @@ -97,5 +104,5 @@ "Topic :: Utilities", "Typing :: Typed", ], - test_suite="tests", + test_suite="tests", # Test Folder For Workflows ) From a454bba8f29393e3751d5e5e8d874e57564b7f5a Mon Sep 17 00:00:00 2001 From: Vincent Date: Fri, 3 Dec 2021 11:28:57 +0800 Subject: [PATCH 082/180] Fixes --- README.rst | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.rst b/README.rst index 6f7022beb8..ce7b004f1b 100644 --- a/README.rst +++ b/README.rst @@ -14,7 +14,7 @@ pycord :target: https://pypi.python.org/pypi/py-cord :alt: PyPI downloads -A fork of discord.py. PyCord is a modern, easy to use, feature-rich, and async ready API wrapper for Discord written in Python. +A fork of discord.py. Pycord is a modern, easy to use, feature-rich, and async ready API wrapper for Discord written in Python. Key Features ------------- @@ -22,7 +22,7 @@ Key Features - Modern Pythonic API using ``async`` and ``await``. - Proper rate limit handling. - Optimised for both speed and memory usage. -- Supports Slash Commands, Context Menus and Message Components. +- Full Application Command Support Installing ---------- @@ -78,7 +78,7 @@ Optional Packages Please note that while installing voice support on Linux, you must install the following packages via your preferred package manager (e.g. ``apt``, ``dnf``, etc) BEFORE running the above commands: * libffi-dev (or ``libffi-devel`` on some systems) -* python-dev (e.g. ``python3.6-dev`` for Python 3.6) +* python-dev (e.g. ``python3.10-dev`` for Python 3.10) Quick Example -------------- From 0e6d574996099fa588429348d344c7af6923cc25 Mon Sep 17 00:00:00 2001 From: Vincent Date: Fri, 3 Dec 2021 12:27:44 +0800 Subject: [PATCH 083/180] Fix --- examples/background_task_asyncio.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/background_task_asyncio.py b/examples/background_task_asyncio.py index 185b436cf6..d6af904c13 100644 --- a/examples/background_task_asyncio.py +++ b/examples/background_task_asyncio.py @@ -16,7 +16,7 @@ async def on_ready(self): async def my_background_task(self): await self.wait_until_ready() counter = 0 - channel = self.get_channel(1234567) # you channel ID go's here + channel = self.get_channel(1234567) # your channel ID goes here while not self.is_closed(): counter += 1 await channel.send(counter) From 975c5aff46efd9bc73875aeb73fde9aff6746279 Mon Sep 17 00:00:00 2001 From: Empathy <84625385+EmpathyYT@users.noreply.github.com> Date: Sat, 4 Dec 2021 16:44:45 +0200 Subject: [PATCH 084/180] Update Info.py --- examples/app_commands/Info.py | 28 ++++++++++++---------------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/examples/app_commands/Info.py b/examples/app_commands/Info.py index 2bffe5ce58..42e521df07 100644 --- a/examples/app_commands/Info.py +++ b/examples/app_commands/Info.py @@ -1,36 +1,32 @@ import discord from discord.ext import commands +# imports intents = discord.Intents( guilds=True, members=True, messages=True, ) -bot = commands.Bot(command_prefix=".", description="An example to showcase how to extract info about users",intents=intents) - +bot = commands.Bot(command_prefix=".", description="An example to showcase how to extract info about users",intents=intents) @bot.slash_command(name="userinfo", description="gets the info of a user") async def info(ctx, user: discord.Member = None): - user = user or ctx.author + user = user or ctx.author #if no user is provided it'll use the the author of the message e = discord.Embed() e.set_author(name=user.name) - e.add_field(name='ID', value=user.id, inline=False) + e.add_field(name='ID', value=user.id, inline=False) # user ID e.add_field(name='Joined', - value=f"", inline=False) + value=f"", inline=False) # When the user joined the server e.add_field(name='Created', - value=f"", inline=False) + value=f"", inline=False) # When the user's account was created colour = user.colour - if colour.value: - - e.colour = colour - - if isinstance(user, discord.User): - e.set_footer(text='This member is not in this server.') - - await ctx.respond(embed=e) - + if colour.value: # if user has a role with a color + e.colour = colour -bot.run("urtoken") + if isinstance(user, discord.User): # checks if the user in the server + e.set_footer(text='This member is not in this server.') + await ctx.respond(embed=e) # sends the embed +bot.run("urtoken") From b8137994acf86a60ef137f6bf25f2a5a72f9a43b Mon Sep 17 00:00:00 2001 From: Vincent <82736662+RPSMain@users.noreply.github.com> Date: Sun, 5 Dec 2021 11:42:52 +0800 Subject: [PATCH 085/180] Should be the final translation thing? --- docs/conf.py | 1 - 1 file changed, 1 deletion(-) diff --git a/docs/conf.py b/docs/conf.py index a9cfaac42a..e7b8be34a6 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -107,7 +107,6 @@ # Usually you set "language" from the command line for these cases. language = None -locale_dirs = ["locale/"] gettext_compact = False # There are two options for replacing |today|: either, you set today to some From 9fa456dd7c4b85bbd314369cf7f215e2b11686ff Mon Sep 17 00:00:00 2001 From: Vincent <82736662+RPSMain@users.noreply.github.com> Date: Tue, 7 Dec 2021 10:21:36 +0800 Subject: [PATCH 086/180] Start Working On The Guide --- docs/conf.py | 23 ++++++++++++++++++++++- docs/guide/application_commands.md | 2 ++ docs/guide/index.md | 10 ++++++++++ docs/guide/views.md | 2 ++ docs/guide/webhooks.md | 2 ++ docs/index.rst | 2 +- setup.py | 1 + 7 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 docs/guide/application_commands.md create mode 100644 docs/guide/index.md create mode 100644 docs/guide/views.md create mode 100644 docs/guide/webhooks.md diff --git a/docs/conf.py b/docs/conf.py index e7b8be34a6..6da5f038ef 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -41,6 +41,7 @@ "attributetable", "resourcelinks", "nitpick_file_ignorer", + "myst_parser", ] autodoc_member_order = "bysource" @@ -70,7 +71,27 @@ templates_path = ["_templates"] # The suffix of source filenames. -source_suffix = ".rst" +source_suffix = { + '.rst': 'restructuredtext', # Used For The Other Docs + '.md': 'markdown', # Used ONLY In the Guide For Faster Making Time +} + +# MyST Parser Extensions For Custom MarkDown Syntax +# https://myst-parser.readthedocs.io/en/latest/syntax/optional.html +myst_enable_extensions = [ + "amsmath", + "colon_fence", + "deflist", + "dollarmath", + "fieldlist", + "html_admonition", + "html_image", + "linkify", + "replacements", + "smartquotes", + "substitution", + "tasklist", +] # The encoding of source files. # source_encoding = 'utf-8-sig' diff --git a/docs/guide/application_commands.md b/docs/guide/application_commands.md new file mode 100644 index 0000000000..a6330b0fc5 --- /dev/null +++ b/docs/guide/application_commands.md @@ -0,0 +1,2 @@ +# Application Commands +The Application Command Guide! \ No newline at end of file diff --git a/docs/guide/index.md b/docs/guide/index.md new file mode 100644 index 0000000000..19018bd6b1 --- /dev/null +++ b/docs/guide/index.md @@ -0,0 +1,10 @@ +# Guide +The Official Guide For Pycord + +# Guide List + +Application Guide :ref:`application_commands` + +Views Guide :ref:`views` + +Webhook Guide :ref:`webhooks` \ No newline at end of file diff --git a/docs/guide/views.md b/docs/guide/views.md new file mode 100644 index 0000000000..16f844fad4 --- /dev/null +++ b/docs/guide/views.md @@ -0,0 +1,2 @@ +# Views +The Guide To Using Views! \ No newline at end of file diff --git a/docs/guide/webhooks.md b/docs/guide/webhooks.md new file mode 100644 index 0000000000..a9bb9d0cea --- /dev/null +++ b/docs/guide/webhooks.md @@ -0,0 +1,2 @@ +# Webhooks +The Guide To Using Webhooks In Pycord \ No newline at end of file diff --git a/docs/index.rst b/docs/index.rst index 96c09be23f..c1cd889b30 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -25,7 +25,7 @@ Getting started Is this your first time using the library? This is the place to get started! -- **First steps:** :doc:`intro` | :doc:`quickstart` | :doc:`logging` +- **First steps:** :doc:`intro` | :doc:`quickstart` | :doc:`logging` | :doc:`guide/index` - **Working with Discord:** :doc:`discord` | :doc:`intents` - **Examples:** Many examples are available in the :resource:`repository `. diff --git a/setup.py b/setup.py index d4f975cb87..9ee8f36a0d 100644 --- a/setup.py +++ b/setup.py @@ -50,6 +50,7 @@ "sphinx==4.3.0", "sphinxcontrib_trio==1.1.2", "sphinxcontrib-websupport", + "myst-parser", ], "speed": [ "orjson>=3.5.4", From 1d5d6ada9e372fa7ff03b2256b4bb17713aa3169 Mon Sep 17 00:00:00 2001 From: Vincent <82736662+RPSMain@users.noreply.github.com> Date: Tue, 7 Dec 2021 10:25:59 +0800 Subject: [PATCH 087/180] Fix --- docs/guide/index.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/guide/index.md b/docs/guide/index.md index 19018bd6b1..98d91dbc41 100644 --- a/docs/guide/index.md +++ b/docs/guide/index.md @@ -3,8 +3,10 @@ The Official Guide For Pycord # Guide List +```{eval-rst} Application Guide :ref:`application_commands` Views Guide :ref:`views` -Webhook Guide :ref:`webhooks` \ No newline at end of file +Webhook Guide :ref:`webhooks` +``` \ No newline at end of file From 6c7e7a6fd7c4cc4f509c38cdb5ff1aa2f2a79ba0 Mon Sep 17 00:00:00 2001 From: Vincent <82736662+RPSMain@users.noreply.github.com> Date: Tue, 7 Dec 2021 10:28:25 +0800 Subject: [PATCH 088/180] Fixes Again --- docs/guide/index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/guide/index.md b/docs/guide/index.md index 98d91dbc41..7a68a8b086 100644 --- a/docs/guide/index.md +++ b/docs/guide/index.md @@ -4,9 +4,9 @@ The Official Guide For Pycord # Guide List ```{eval-rst} -Application Guide :ref:`application_commands` +Application Guide :doc:`application_commands` -Views Guide :ref:`views` +Views Guide :doc:`views` -Webhook Guide :ref:`webhooks` +Webhook Guide :doc:`webhooks` ``` \ No newline at end of file From 75f17d0991ff70ecd889b59afe1cab5afbbd7dc6 Mon Sep 17 00:00:00 2001 From: Vincent <82736662+RPSMain@users.noreply.github.com> Date: Tue, 7 Dec 2021 11:42:25 +0800 Subject: [PATCH 089/180] Mega Guide Commit --- docs/guide/application_commands.md | 68 +++++++++++++++++++++++++++++- docs/guide/index.md | 6 +-- docs/guide/views.md | 36 +++++++++++++++- 3 files changed, 105 insertions(+), 5 deletions(-) diff --git a/docs/guide/application_commands.md b/docs/guide/application_commands.md index a6330b0fc5..5bd8c02203 100644 --- a/docs/guide/application_commands.md +++ b/docs/guide/application_commands.md @@ -1,2 +1,68 @@ # Application Commands -The Application Command Guide! \ No newline at end of file +The Application Command Guide! + +## Slash Commands +A Primer to Slash Commands for advanced & new users + +### Basic Slash Command +Slash Commands are very close to Legacy commands + +Instead of using `@bot.command` you will want to use `@bot.slash_command` + +Most Of Context's message methods were stripped to `ctx.respond("message", view=None)` + +But it is very easy to make them: + +```py +@bot.slash_command(guild_ids=[...]) # limits Guild ID's available +"""Example Description""" +async def example(ctx): + await ctx.respond("message", view=None) # Send Message +``` + +### Autocompleted Command +Autocompleted messages are implemented into Pycord! + +They are very easy to make +you would first want to make a list of autocompleted words +```py +my_list = [ + "..." + "..." +] +``` + +Then make a function which would search for results in the list: + +```py +async def list_search(ctx: discord.AutocompleteContext): + """Return's A List Of Autocomplete Results""" + return [ + color for color in LOTS_OF_COLORS if ctx.interaction.user.id in BASIC_ALLOWED + ] +``` + +## Context Menu's +Context Menu commands are very simular to slash commands with the only real difference in code being that they return `member` or `message` + +### User Commands +User Commands are very simular to Slash commands and the same as message commands + +Only difference being you have to return the user in some way: + +```py +@bot.user_command(guild_ids=[...]) # Limits The Guilds With this Menu +async def mention(ctx, member: discord.Member): # User Commands return the member + await ctx.respond(f"{ctx.author.name} just mentioned {member.mention}!") +``` + + + +### Message Commands +Message Commands are again Simular to slash & user commands and you would make them like so: + +```py +@bot.message_command(name="Show Message ID") # Creates a global message command +async def message_id(ctx, message: discord.Message): # Message commands return the message + await ctx.respond(f"{ctx.author.name}, here's the message id: {message.id}!") +``` \ No newline at end of file diff --git a/docs/guide/index.md b/docs/guide/index.md index 7a68a8b086..37109b7fad 100644 --- a/docs/guide/index.md +++ b/docs/guide/index.md @@ -4,9 +4,9 @@ The Official Guide For Pycord # Guide List ```{eval-rst} -Application Guide :doc:`application_commands` +:doc:`application_commands` Guide -Views Guide :doc:`views` +:doc:`views` Guide -Webhook Guide :doc:`webhooks` +:doc:`webhooks` Guide ``` \ No newline at end of file diff --git a/docs/guide/views.md b/docs/guide/views.md index 16f844fad4..eecfb59cc8 100644 --- a/docs/guide/views.md +++ b/docs/guide/views.md @@ -1,2 +1,36 @@ # Views -The Guide To Using Views! \ No newline at end of file +The Guide To Using Views In Pycord! + +## Select Menus +A Primer On Select Menus For Beginners & Advanced Users Of Pycord + +## Button Menus +A Primer For Beginners & Advanced Users To Buttons In Pycord + +### Basic Reply Button +First you will want to A Class with your view +like so: + +```py +class My_View_Name(discord.ui.View): + def __init__(self): + super().__init__(timeout=None) + + @discord.ui.button( + label="Green", + style=discord.ButtonStyle.green, + custom_id="persistent_view:green", + ) + async def green(self, button: discord.ui.Button, interaction: discord.Interaction): + await interaction.response.send_message("Press Me!", ephemeral=True) +``` + +Then you would want to make a command and send your message with the view like: +```py +ctx.send("Your_Message", view=My_View_Name()) +``` + +And that's it! you have made your first button with Pycord +## Ext.Menus Guide + +Coming *Soon* \ No newline at end of file From 8014cc47d9a98608cb795b57e985216f232a686c Mon Sep 17 00:00:00 2001 From: Vincent <82736662+RPSMain@users.noreply.github.com> Date: Tue, 7 Dec 2021 12:06:03 +0800 Subject: [PATCH 090/180] Finish Autcomplete & Add Images --- docs/guide/application_commands.md | 36 +++++++++++++++++++++++++++--- 1 file changed, 33 insertions(+), 3 deletions(-) diff --git a/docs/guide/application_commands.md b/docs/guide/application_commands.md index 5bd8c02203..3b654d8595 100644 --- a/docs/guide/application_commands.md +++ b/docs/guide/application_commands.md @@ -32,16 +32,36 @@ my_list = [ ] ``` +Then make a list of User id's which can use this: + +```py +allowed_users_list = [ + "..." + "..." +] +``` + Then make a function which would search for results in the list: ```py async def list_search(ctx: discord.AutocompleteContext): """Return's A List Of Autocomplete Results""" return [ - color for color in LOTS_OF_COLORS if ctx.interaction.user.id in BASIC_ALLOWED + color for color in my_list if ctx.interaction.user.id in allowed_users_list ] ``` +Now you can make your command + +```py +@bot.slash_command(name="ac_example") +async def autocomplete_example( + ctx: discord.ApplicationContext, + choice: Option(str, "what will be your choice!", autocomplete=list_search), +): + await ctx.respond(f"You picked {choice}!") +``` + ## Context Menu's Context Menu commands are very simular to slash commands with the only real difference in code being that they return `member` or `message` @@ -56,7 +76,11 @@ async def mention(ctx, member: discord.Member): # User Commands return the memb await ctx.respond(f"{ctx.author.name} just mentioned {member.mention}!") ``` - +And it should return the following: +```{eval-rst} +.. image:: /images/guide/user_command.png + :alt: User Command Image +``` ### Message Commands Message Commands are again Simular to slash & user commands and you would make them like so: @@ -65,4 +89,10 @@ Message Commands are again Simular to slash & user commands and you would make t @bot.message_command(name="Show Message ID") # Creates a global message command async def message_id(ctx, message: discord.Message): # Message commands return the message await ctx.respond(f"{ctx.author.name}, here's the message id: {message.id}!") -``` \ No newline at end of file +``` + +And it should return with the following: +```{eval-rst} +.. image:: /images/guide/message_command.png + :alt: Message Command Image +``` From f2a91fcd9e151f81dfe0065009c320e4fb02f9a9 Mon Sep 17 00:00:00 2001 From: Vincent <82736662+RPSMain@users.noreply.github.com> Date: Tue, 7 Dec 2021 12:20:36 +0800 Subject: [PATCH 091/180] Fix --- docs/guide/application_commands.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/guide/application_commands.md b/docs/guide/application_commands.md index 3b654d8595..44a4b4becf 100644 --- a/docs/guide/application_commands.md +++ b/docs/guide/application_commands.md @@ -78,7 +78,7 @@ async def mention(ctx, member: discord.Member): # User Commands return the memb And it should return the following: ```{eval-rst} -.. image:: /images/guide/user_command.png +.. image:: /images/user_command.png :alt: User Command Image ``` @@ -93,6 +93,6 @@ async def message_id(ctx, message: discord.Message): # Message commands return t And it should return with the following: ```{eval-rst} -.. image:: /images/guide/message_command.png +.. image:: /images/message_command.png :alt: Message Command Image ``` From f9336f8f92664b7c3233ae9ca207baab8d3d378f Mon Sep 17 00:00:00 2001 From: Vincent <82736662+RPSMain@users.noreply.github.com> Date: Tue, 7 Dec 2021 12:26:13 +0800 Subject: [PATCH 092/180] Fix Images --- .gitignore | 1 - docs/guide/images/message_command.png | Bin 0 -> 15384 bytes docs/guide/images/user_command.png | Bin 0 -> 12096 bytes 3 files changed, 1 deletion(-) create mode 100644 docs/guide/images/message_command.png create mode 100644 docs/guide/images/user_command.png diff --git a/.gitignore b/.gitignore index 232160887a..2b642e1369 100644 --- a/.gitignore +++ b/.gitignore @@ -10,7 +10,6 @@ docs/crowdin.py *.mp3 *.m4a *.wav -*.png *.jpg *.flac *.mo diff --git a/docs/guide/images/message_command.png b/docs/guide/images/message_command.png new file mode 100644 index 0000000000000000000000000000000000000000..34798ef998bce64e75fd1235a571ee2323421626 GIT binary patch literal 15384 zcmcJ$Wl&vR&@M=DC)mN=f< z&-~bX_o~{pqlP5?|e4*|5A4&bIsw>rhQaNeSku2q>q$(l}N|FAQiUQ+-dNa2d2O%K^V)d5e z+S!IA0p8meL(JP3qcwLjk3U`OOz{7!?v*nEsHf=JVjHp&FT#z@2E&zzvv>cFJ;vLK zE=0WYyYeM5!T*Nb*-tP|Ku@bctF%SKMwuWGBI_I13S)@Nl(6}q!4v!C$we{Ge z+LP$Ub{;N+&x_BvU-FtCFIEj6_a*7APWX}67~^9)11Wd5guAgs;rBlY!|uN%51 z?!AiA#2*N#Qoa#L_2_L)R2aR)5yQ2koM0w|^SII$vbRzPr#)xL8lSx1Lp*zPBa6c< zO8=|>pCcW)wcP}eZSt92)t#>hR->UZ635+K$vLG4KS*9!vo(l$>*^oP+9Dn5;*~($R@p8G{2f7S9jd>mSFHiF)27dxkA9jvE_*@6e>$O+rDm5mt0>%wU06=&MumBCaVA@ff_Pz;L9O}oW6JGNqCvg|4egWO|X~q|sKQ?&$2%pks$v@W2vlUij9g<8P?_b0>I@+;YnQ8V8lk~>G zn?Xa^QOGwIBEEiq@fWNQ$YO2UT}N&xz{=*r!Q&^5*oWBL8RUx1xdonr-*ShR<$@cr zU;Qd`OK#($$;BVuI0b^|dNvv7Tx&Gtm=|nLsP9RNkCvS5X~geVogzG|x0f|{9lX)7 z!8h#T=Qn1Wk@q`hel=Tm+c?b8hOvi1X3Falh_&KCGKp4XJn&fnYd0U6MYNFWLCk0f zib`9P0DueipXkA`+E}L_UWV4}-u>!eo6FVL`5F@O`!lFEe_x?%ZlLndZjlhQv^3>t;p8n81Q!(PQk+;ng?!rj!23cF}w^!n=_p>Vq=KZwqcMofr6RrPKw zVI+KoIs~W>zs=BrFN&k@73MZwbMnj`cLW?bM7`8wzqCoYqpQ`rCv#>`_gskGa&)s` z$!)Ep*kRAj+$#k?B#;g9*frphNB<0P=cR?t4o(KR1c%HpS@`PKK#d;qI_c|~Ja>e% zGz&^D>!{-vHlvO1e#h-zU;nP3r>W!wtnAlh@`f}d;$HpNC4S9*GZblGSW@F?z4)b? z&sCx`c9R4l)h+Y=4(HKg3ClK*4|Cm8sXv25&e3}tc7vw@+e48^d}J|dh^NR%AR;@9 zCgI}-p~zr8Y#pa}a25w`XQr90&3`XaqbIsJf5~A1k{LxOkS^#z#j90`;e!gFr757;o9SY@aS~r~3xGH*u=tX?XRJKImLG>$}4V*nK8VbKvQE|yy z(SZ`T^m)0c(}4W47-{Wh$b=g$Qa>^Nkq0^~#xVE(aQ(dKV25u$I{cirD*=q0;;o7| z_o8!#k3Qw!9c)ZeY=C-H#x0IFf&`hQ`k+NV6iu-5YikEw1j}wFszKC59wXq%`LXhi z2Ht5QSP4DeA=oB8PUlvK`)4Phvf*du+ zyK&vBYxT~>WVd0gVI`7#;Y;tPbzA!6{*CR^l8xy`J%GMr5Li#ei;G&~Xvtj$uxs4G zUJ*8_`I#PcK}cDJ8WhHT9zCZ)fX>k{htE9GJ#|T5F;NH%8B>3^ML^Kq^_XVRWWZoX zi&1A_C$>V)q7M!j)OppGW_L0r^J4ub8{VW1zt|H;UcqEIaI)tm-EGzQ&Bm$uI|r6X zEIQ=$QjH)n5>*rr5_*(k^Ojk%t1B8e)3Qi7K2fhCcx-uiG;_=*DDXL!spQLiR$ep) zP)F&`*75aM?8IB;`a;fp8BofrXBSf*vK!JZs~H_UM*gJxaYY_|vv>dZRb2NcS8QcO zlT~3t6tcmAyo`8j8B4@p>%S402HiWnoh`$oF({fbg5+SJma&#Tc)=nzbrnS zG_IP#>25wp+fDqc-0$eUgll2{kVaJ;@3_x%S7Hq4OHAmmwhQ&HCflLf++T%4y=;J! zsi!V^G`kWX#S307^^t{)MW!k>YyN@BP5Eo>=viYP4XJm5K z5K^KOo7r5h6NwxZNZrA}kojn}yV&`h75sa)@otQK^4t`Vqy-y-fTVy~+1eGBHGi_p zYxPv8-C#c9RcBSteVtvC3KxY|Y7$_kvOjFH_H%n#2n8DoDz~?0e@Wu+Amq$)rH9Q; zqzSQc7nn;!zqS}Deec=}pagKMwzoBJxV&+rzsigdiKMO=m?-wqDQo8K=4TiEtI}J4 zXKDNCBPGt?h(|DWCUf-L9sFeCj)RIK2kflGVpYNCglD|Lk(nPb=&vRRyAWX3f$1^o z6GYlF8Za|P(ZE8iH}zgK%i($7A;Y*BhR}Xo845HJWtnN=9#ne}X+7Z61*f&PfRAR^ z1FL_`99GXzpbSKz8w}L1f0NfCj6>0LCpFRGhHblfGE8rv#=8O`q4OBc5<)i|HH6sG z*13n*gj$5uTh)1D(R6GapTY#1)c??;iy|ax?9;qL!vRm|8A9KJ!zDbI3z-c`>rLsk zb)^6tm)S;p)wrV=JfI!n-;97@B&OxE4R$Ut&(JoYD(BAy0OmCJ0#(| zdlU(0oqICswOpUx9dmy@bcoKB3Iu_R$$??Lgn*E~#= z)k9lHtLZr0(0`tv$<6I4nW(FW=V#yQ{U&f$x{b+e&SFNHXj@svmTaDp3#RZ!y?Csx)zE%pB51Y(^>(OPJ_NuOD@N$mP5!5YiFJpY5(%= zNuSIBaOrwp?|7{p`1Q;o>}cs|2ylyUa&B+p4|jbLiDGlj^bV(g1ziw3YjDK$G+LSP%>vc$Y4(@?dN1G#3Cm^- zUQWb3?Gj0(-gDI<;3zu=tUa*n;7URfocX7B$+E$bwRd^#Xx$jFsewyTr6tAf88ZmJ z<8wXVH#`FB)&FBjWLWtoA?>N?AxDT%X}#D$-w_-=XzWB7u0z0Sx+J`KZM%^m&bxXb zO85SrQZ1gFwXfJMNi!_FA8QzlL($Q!>yEL@?=TUluE$`i8>j`Vs#ggtLm*>j#~2Vh z)M0<}{sSCJV3eH(ADAgldTIN$>Mi<9n()tLO&lm$v+wRn==#L)vlyRdZFYilRX19@ z!w??0qR#np^Ad$ozb^N8ofA}qGcD#x#8>Mn4nEa$2{Q+0+GN5(^Y>2Y8CXM3d%55- zfEf;aawkCtzjr{3gK4_SBdGVjNy?_n|~) zNS5th9P$?r(bq?asytT28=A|5;`Q*tMAd%+n8{Xiqsn!%V0OwiuS&3kb}wQ<3HAgrE=!OWmCIU;DS?m>Zf*rU-!0;x zEXP?W$|(!I6**x2tASztRAAq^`c)y)LPBGkRbI#EibtM}aV9*IB6wsYc89as6@~Y5 zN>Y^ej7{5YmC*4|-A~^r7rB`h9IkH)Z?}yt?WG2o0{DASTLzx^3$-H$#d+U3m}-&$ zBg;cIj;P+1FOICs(}z3)Xx~?cr-75eQM-{Klon^5G9ISZ%6k+>Bx;hZ>m@+mDs6`@ zZ)k1Uq^X=1rh9}qkW`|T@My6>0DycPu`kjc&rgplwMSlW@kr`(HjgD2>L1x1HRxz& zNqGKh31we2vU_-edAV;nV!uybfLhOQzhm|38-;wYS?#9J@gmxM zX8beu+5txQ)q?>;-)?VI0JqYV`vC{K79LKFtuv5Yhr{X@t*NuQ;;IRsP{Z=s_2f4* z-0cv2?aX7x!&hq#H2DFI{TY_9L=>P4tC4wE5J5>h8udiOv6AY@e3RmlBLJgT-3B>2R+b~YitzIkjV z1*jg)MQ)<$KNE&rCkqMIgl9rvjIa+Am}tMJZNJQ~h8v~$a-Qyk#3%|V2(W=0Y@o}| z|3+!Q7C8+{iW!ufM)vWhAZT-e-woXzQ4bEWK}fS!$N6snYo0~GmxMy3%ts|jK8*F2 z&hI-td`NcE#_LH(E!#O{!3#k%&D#p#ioqZ&DbdRQQJ)@01V#%I3Q1N?N?tgv-Be#3*z<*0pI}5mL6zfd)iX zV9Q7f`g^l3{iD?qQP*L1J|RXEYdf3&PY++QgTgxJc!uM8F6wfdoVvyEhZITN;$iSg zu1+_s<+aseuO90hsp0WAKG3EUrgU$5jK+e+pkDu z9@hb0UA=6|XuSt{h(!8_2S0DCKAEb31c#)Tu|Y=#Pi z4GNrp_GyyTgff6i7u|kc+Y?(`c=IW}%D7~42|2KJf^|PwPzoKA!T^VUfH z5L3w|@t;J;-!q%DW0Lnd1l&m-82tkZ)tCl(c+&i?Fs<_qP9LQ%EBw_CChq|4NHPj> zEzGslqia-{!jBC{3m(YG~evG*Q5% zZA~cGPpH`*5qNkYCmsMgZ^mxNIAJRrU?mg}M!l7!sAN&P{o8W3zWU2}ehf)aU(!M8 z=H`<+D=1e6xgFs{v}!Ex_B?&jrApGapB9rFNErfYY+7my>)B6>$VKjn>ZRHJsJEv^ z-^z}1&uRo^hIq(P51TZkw2}9~7Auu>!MFZJZlftx({1oHt5qQi#a*hNy4sE;k;ZI{ z6Q>=$QTlDZ>{^vDG?5)@mW8@2ct*xdAoMSTYyk3`Ja@^>yyNKv_N$|mo0@~Eil#)` zzlAvIP5ak2Ysq|ILk&`l+bLA4LWP7I3%syUbZ39|^!iNg@Z) zMA@Hyfxmo^n)RcwL&QHU?X`D0L*c1{S-T@ZF+#MNAB!03Wb=Ux+Fc)?rbEM=_GNKg z`G$;uC~B$D#zEMH1wug-e&x9T_fryJht17 z2g*4MBK!=%u5ryBo=*w>V=l*(-Fg6o(QC|d1_eRiM_uStU8s2ibX5gw^qj4XLLO*i zcqX1wDd!pCM^m(}R8Ft+_K4DcWeqVCj2_q=Qtz$nxzg=H1CI9)K^pJpd2?0T19EOM zr8&YyN+v!np=n_^J#-!FBh?GvZj}d9oCDalu}VN@l;PB%Hzu64i!UCE771>XK)v6X zl?;1_JG_XFo(1RnIuSLon%zOH`Hczr-2DYQ1Z^$OTv%XO1@(fTR}t+;oRlICTd3#H zuBgdrg^d}-qsJ&PTi*n7Y<7u)3w(LiG7g@w1^~r$9Va|&1xqJ8`N7RcJdwc*i&)Fh zDC9m;$iF-Bm4wL!7q;PMo;`WFnS~sFRw_w*dh5Op{vu9}#)T%q-$-w5G$nfYr{JX( zTq;cNHBp8OvI7T}M8yGDOW+)-=$FmasIz6nbH<&Ui`q%U#!B{VxfAMIRir16vB#=a4GZT(D3w-dIxXDj`XfJ;kF%WhOgXa9f z5U2qtr_Y$JVsa(10cQD9A$)n}?@>7j@?Wu^q_Q_t)SA9r4V6vVXjR57pwHA zJ`WZ_i0DV97LLCL@%+tALXnV`3h;DCa%t-u^dpLB+}8Ug0Wq|Lhb6}bUiGgS@xD5f z%VPrgUXvf?*1-Ni4j(MoTLRLmDTs#iV0hl9FfN_It?H)NrNM8(y!KV`6=#IQvQrgg6gw9j*Cc~ zr9`g?ne7k5@nnKlB|@`KdUV#hR)MBQq+ph;egITSC-WG~8&;Xl#A z3)YxA!vu|U_LIK0Pdp^s+v8Gm1#ng^JZQ05H@j0nn?Uhp2ut89b*$d+1NENCXIFMY z{_(mR^S~3?mZwr9Wpg>o;U{*&bUUXl@u%=}ON0<0FDDfV56{y|r?5diKd%~my-Yp_ zowV!f8Ba3wfDSeq9NNA%JglB?2MZbTFS%(-Zbhp+Z}p zSQH&G8=oiepbECy@;SvW*AR(-_gzrjwiPl8r3$vmKSR`!ct1g_!N83kxL?j~C?IS* z^UO&%sY5c#gR^YJJxA||d+VT?_YkN!i_Jimx-4%{AX9?0tin@NjSU?4@JF!4sq`zx z%}x^&i9!SaI1*LzAmW6^p9FUf-)Iy_N~A`^HWk!Aik&JAk&sRS*R3 zifF(#_--#_Y@L-7hndB;PzR^&9vqxD*Z{v)Vl>{*@aDs$CIYmfj+ZZ-xx_2b&Y9Vw zm>!%GUq(>SO_D|_;vSTwFm7XVV7(~UcKsK6cV^Y}ZNmLI46sS=1c01nGIiRR!#>}H z&95~g_33yJ&a!{UU8}9^C#RLj$41iEiRTDDv2DqZl+ZE|9~R~Ni)pyBSTo1#{x7nJ z;uSQbGWm&cl416lI#5O#BnF3G94YG;trF9NMj}>+=Yy?M<6|@<(CSW{0W*SQqbYDO zD=vI!P#&8BH@pp=%So3Qiop~JohpKo+|)&dphG#7(^us(q%vDy;v!#3S9*=N5IQ|_ zylWy)MDCYcSq8pEZqG*Q>6!!OiKQ+?WU^^9L6-DnXhK;|YyYjUk8S~SR- zfmN8BlDR?Sh{O;cmc#RGvsu-`4YwPsL^j=J;k0zVPmxT+XBa;SThaFkxDf?(PphwXt#j0N(v@yh;Q8O6d-z$wqh=VT9&p_+@kLrV8grA_P|l3oQTDmRe|?H z2g*5#w~JE@kdYxNXuXN&xU9Zw-t_%2nMgc3KCqkCE@z0J;0}-$Y@tmIknZ}HO0~C? zKq;PB%+K?S9#vmP?a+%})s=*}umdY3;Rx~Jf(1ip5&Lw7XYNNgg2zu|qqb|pGBKpK z2V(QgKW=B((E$bvU4%0FVd;mPWoD$I$YeINM>lxDvRlzE+ak4ZlCHEuwT5|p8rsSB zR-mXyyfSc+Dc)(45R6lG$BoYI_;?q>a(DF+P z*cc^<_URSYC08Et-oD_YEDQEYMd(mEds(H&e^S-0ONoRcd(AqI`dKpTwz6WWPNJ|S zxl;oXoiJ^(n&)>fl;4K7NL#g5V0}eVP7Qe% zuqTFJ{}w)4a51Bd0*~9iCER8POylV2xcTF8IU1`ROFYOtotcY)-d6BtHX&sQCHt9; z*&!ie^J7{(BXD$lWm6r$cKS;JJz9G%H6&U^PJ1p3Z^T~5@$XN?$hqeE9Zc|a!?R+^ z|8NyH{p--!+(@;K!Zu*_sQC1m!e;oD*-^d(9!ofK&-VkUD?%X z3!D2eni^x|SGl*?8lg)r)o|vc=kY(KfM2XWW1N)xG##i4pdVX0+(Y|dGmPQ5<-djf zYmjR+Rv&vDUYguPNmTfGA=FoRR=Bg)*E>CAM7yPI(yljGMi_d4O`D-rBbWNiF{rlT z;=Mb?Cy;8qVe)YHbGp0@Yq-S(?L%sLiKe>WZ@O$_qALSWO>J_D{T(tmeN%xJH(jAzw;; z>Ctv0q+st1iHGkImrFM7mkNHrB`Fu~mVWFGdeTK*KZcXlx6b5EQk5~Glo1ndo9q+$ zD3355j1mF*BkMfdqeox1pLqtGCn0XBDp!{$Dn3_RVngYMc&lNWNm=9dmy?>A0k}$M zWd}FnGx`OioG3I+OFb2Tw^-Vl(aJv{uSuvOquCLU*2elbU20UL*?|;q$}Y+dtq6+V z1GAF^d3L?5fDR|TN7B@jH5O-#c%Kql~CvG+QM&*h8?(EK2 z7(#ni-in(4g|A~j^`R>U0Nz(HEa;{vfV0G2+Nn>zx}lUc(xGu^9TrkYG^uSE1pCx7 z<#*)8MNzg`I$SYRWA9YZb>W1gEH_+@r*@V#J_|;;QJ<&@-qDiiEwCjhDQB=|l<}|( zT;hKQmp>^3xd{bV8^yIaT~?m5JB6D31Fo)G!sY1t=@+b0MS0i`hiB}1EjFh}==*tr z@I0CyEAxxuX*lXc?MZPFaOZ{N6`f@-3Y;RT4KQx<@ne}|Vs?V9`~)1M=d4|@|3d;y z{AbvQgO9)m&ARx+ef*@b2d#K)IlZ%$Y*A2kV|LXBwspEQDbe;eZ68n0&Uc2k%p=2s zy&Dgtcvmtc-(>+|D2zE?^%BWy?5DuYu43nAGq%*jf~5_D&}Gt3sD&Y;qiPR)IiF|f z>SPED=0dw*oYlCurjKRx)DqTYy841ps-()B$Yh?B4~ZkA&0M~8E`gza@ZDd~H81$V zu&2&PX`8O^wwuRFG1big1H`MYX$Pb}W77})>U*~md4xP@6aQZ%zledB3*<}l=_ynT zV;fLx>7+)rrsCv3U;FUR1er}i$!~d((2P%Xi-Ui~GOR^W)>xkZ-Fe*P|Mx^iGHQ<# z?zL5E&C@0d_KsL_qaqR*U#pgTT8yRcr`j@-HC6PY!(HC(E?)KYABXzC8WaM>bVcBU zbOJr3SJLr8$a#Bvgyx-;NEZpkIuyJl7fH(Q26?e}TFy?f5@}U>faO0wrfa${AvVE& z;+02vmrw8VJ|0{~P6DL~RPsRY%wVqp4?HVL;M*2he}XG+tk?&SNshL*4i)jj`N`$o z#uMegIgyY|wNKr_F>*e*9`#+>*9lO;JTB>mA+Xgm{UYZngyWFJt!X3=I0m{pZCDLM z$@9j?CjHno><|n5g~P2B*tu8g<0{)0=7D3mlM}-8XeGg0LZmp#8Y=~y9GIlfNUA-| zA6;Ab47>I10=LvP?yZ|C#qm%^s-dYmBv} z{RrW}JT;U>Y44DD*)0?Ja6s-xAIusS>mr@)G7g@Sd~oxq3ktru&hgPF6EUBOm*Csi zMitb~jrfTqQ&jj}ISK4xloq?N4zpt<^8?f^y>#x>5KHq)gW{H^=7n@!=3|OJXwLfV zTQMk#u^mF$@kWkPEAk&jmDo`9xh147J9YuwNE{^VwGX~Nc?!rX_R!r}`5pgU1w z9{NoWFB;uArVOP@JV5JohsDJz@lIcl1WM_cOcM5J0_>>sCqA#o^Dub^p)6E~iKyWxH;m0?X>FsdJUMGTIxS%!UoAxK^khFl z;{`BRO>fZV8<7F4=`*CbBmje$7mIi%^$M0k948F#!%L|xeOSe*wCx6?&U#(ZRxZ5Y z6_#L>jhqy=yfkt8gH|*I3>#}=VLjdR@ABR4&fitIt=!>Pd5iLMI01qn8q(~% zj||Km%SPmVJi4l&XZfeKff4T_@Vq~y>N|CGBIuYL!NS(m_*if{CdHImWYTJ#HrnQe25Tx$V*#`qmAosjnh zvzgS}hBtnb07!0|xFrwe)Sb5HO+YeK?GgG>H`^cgb3=T}gYRNJ#xTrD3R@<3QE{`+ z9q97G#t;EWd_wrtAIAOTgk;&ve$#+drp|Qc_#NUlwcmbv->($aISn)9G@ZqnDiSU^ zW5x#(*>t$aHJSQ*wcU0NnN;on8o##UJz9+$bP2`-9zs<{!T&Axb*0Ytzg zB7s7?u6Q4VK?&h}&InQu37?rC=UZ`wmQ1??PlM8g%ThSZkn2pj!~L7GUCF*Qj?etV ze9bs2K}aNur3niePS0ZANH>L^>lQXoSYpbMv4$H@(!;bqaEtzW$NqQpj)vdC7WZ62 zAGrF8QF%X8OYw1>`P<5sK#d`er|1evzoA!JYCdpNFRzuanVz zkaw%qQ!L&Xpr=%1vyGGy+h0DZPM^N&{PO3`40)0`$GTVyVGB!WuwzEe1$zQ6s@g{6 zxP4EmU~XsbRl%OYBlA0Aw0k?mXC2>A1U@XzmIVm2%JP&a3O#{_G^a?Q`8ArNpWcu*I4A%LJbfa)_N(>^=pC17>jVyZ|x9iAu9*q$7+2_ zqw(SBpyQ*w?2x!LRepfH>#BkeDQ}tl)ctD7sZ@n8E*Kr9caR$Sg-Y|8t@9=uU=f+k!fVf1^Xb& zKEylURSbJjeUhV{da%uUmoXGQ9j?=hG`Ccyo;-yqBkx9nYm5}eSF1>~m_J3hLkdR@ znmuY4Fw$gXG8v`%INt5R2NeO2qmcBqjNp&k;lXgw9fIHn>}b+gVC%q!Sc0_gRDXIu z*puI29ppP6j);PJIQ^2F5Kbn-lgTckrD@{NzE!~(X-$8~B0d`0FXf;6QoZRa^uVC} z;hpLGpw<8W%p-9=4D+*bphgkKkein5jJ^3w@l2WHmDn&dCklsS z?Aq5_@rz+DR2M%V5edU9j1BYO-JxnoLh4<8UrxApy^Dgy38SlBV5g^zJ!eI{l~#c( zvsy=mi!{H^P=wZ)YIQv+QB2yV*u&6E_@ff+{TmkvjXf0H`C;M3h_|PmCVnxQjfWz@ zFmkFtYDkW0EiZ(%_JvCA?@*Gn*;yetzFN55SiWFUpnpgFcWX;2w$;SdY?~5GluxhDd z&H?G$Qw{v~2&C|Uxl8_uq&Z&pgKnVu8{hL+qPmP$n%}4GBr2L8E?FnCLFa$;2ILQi z+-eb)hE=|v6(K5{@aa4V5Z_3bO~Jn4%jzq%VgIwHCvaR(KkxN@NQ;wG6?)@XACc^> zD1|=z7>Zz0v%BQ-G;xQeOB#Lw|MOALl>o{GYI#`%)QP@%Y~rLIPq?&S>U=<;00jC@ zZyIHA|ERbv`Ko7Rgy7IB?CZ44>aO)jYyLC`7wb@tQEo6NiXW5XH5G5^X}6B7<0MGC>L_w1iZ>QQ@Vqv9 z?1-$+d3+_RoK0O{GU6X_D>b_9SgiWm6%Rk4Ehe(lTg?_4@~-f72iG?0!2eO{Nj`kI z#Euo$PIes-z_!R^IpcjG?J~LH%i=Swuk^xM8bt$;mI5E2RaG6-?|*RmGUz7P^$QHQc&UaZ;0B%jIaO>vvvmyieg8JZnd{ zT5*+b6@<$w4`QY&Ki8OU(f#rYE-!41HCwn3iH==r?hJjA4j!ehbW;#zA7;fguphNU zfX4}vLK^CB1hGbn92$!2x(?ijpC3V=Br7bX2L37f(O_5>#8@8AA_>&9Ep-ql*+u1A z+?LOuLSG_uyQWw$b5bamW5{J21`1{N&6dA+xouvQt>O^#Da z{H`1%eqS7}&o2djRcf%JPw3MmSHYf|Dz;+AhCi(~P3 zCnm!K)IO0YyxwX71XT}^wi!Y;4 zEX@VE^N&+n5worCi=bKjgdBNb4$-KI^qe@yq}1m_Cu;xAyYZGxg9d@fr>BD2nG8_+ zZPW)XZdds0XjAO<@+?XMw{v4g&5vP%n6M-^Hts@P{Yd%oijXkkZ@+d>J3#=($8Eq5 zm9#Nwj0AyXqb7+`raHjpke65rOJ_}GksHM$Z=9MA+zj~W99mqZ2ebiLz@r*beJ@2d z`{P{k0RBP9?~hPE*__~cWgfvPSXgrCgLx0$A+A=V?J;Nz0yjfCMJ?Xy*Rm~mSy9}J zuu2Q~1866YiJws=#;&`;tLUdlEetBWiKO`ZYS|0H@X?njlH9F$hbrPyHng5=yinD? zAHI!pcFX(3$uDb7w19^#lM;v6n(bP6VN4$Wn$felCHmF_B{HRZn;P4;D!#odU|13V0#D zZitUu5iso-jq@=#&g_YDtPAu+ z{xynW(`WDkMx+cGp}CsA>qvYW`dsDhPvVCp<*t%| zVl=8{1w554?->&A2+L6&laEtGBklR59!KKqbaW`Y;G=U-Da{j-tyN+`10-@CH~dwK z((oo;SA33&Bk1%LR%2R8lN7^3+VcKRjhf@fhU9CjZQU?F7zi(OlJ*<2^n!`H;tv?oxeu ze{jW6bwY&%O#3U&YLV`0+>bwFk9JX2rb0jDQC3WNZ8@hiZL-_t!SH0YtR^#`skMJ( z-$Q)hy9A&7HPv1Ylk&PuS)4qP<;N#_(TyDwr;#&R8}$7lq#EgZ*WPdT0~%v^LZnb5 zmb303vc?cpm4JN3B+ak*CybY?e`{;q!pF)(Wq(A~;X&>3%?FiohkKO_M=ZqssFG7( ze(lgIgy*DonuOVmx}|j4LmQQ99NMjB(1t5&$Ji+8h~k!^6ru<{(TQ|kmePZhlC_JD zco|I)w5L8Icz-_VXp_>!bITY>nbwEMO+z-`KYRvogt6>4(Xy;6rQ9l2+MyK4PPb%T z;Rh}Ig6AUuOzQK>TdXEjC)@OP{p2X=$U-nCr-^HeYZRse50#9l^WHJI?^Ci(XNTw$ z#%rQ&!L7d~)?MGaluQ$4o$gXoIvO5~MR9!uyi%MYRogaWX(*WlDv(YI}Nrk2+ z)ht5iW%jS-aL1+`LkHx0N#f>jba({iDpS@lnTOeVXLcW0_2g4d-DtHTz7oa`3>z9( zD z<~K)4{Ei~EoQE^+Y3zs*k+-FAG&kS8APSzn} z&^`{19`sOjHtHPv&zI-(oibQB)$Ijar4@Pnw!v8Qwzo5;0|o*+gYomZ8fpI>yM z=V2tzz*RoX-YhcAL#cN^qd@!@WeBHu4GgAkQQfvW<-^K;K$`%^(IhJ3pFF~hvaZ-@ z0Z!@Q?~M9gWurT9E+wd4;(?WZ63+iu(7h$EM5^3dI z?`*Fw|4{hFOrIViek3T8*5^oz^0h4YE;Y&&rQCgKLvqkY}?$sjZsMiQG)eA3j1o4ZxM%0#DgfwD8te`&TJCPLPstZHdEJ z+ke`I*Br?sSKAZhnc%8SA*tws7&SI!X*-H-;P%_=rj~&5QM)3Rs(Q&aL&t0x22TH+`-9dR29_nF@gCy7NN9sg7v@Slw||R^GYLJtMxE z@}anW)p}$|&aaOCdQo`xC8zqu#{bQBhtP1yxZo>mv)cSUGYy^o=P_#sbvesi3(lx* zyjpgGd7Omasio}mUrJ9dO^gy!ni)32-Jz^f^dKFCg zdOAt3Ueaq~FhRVBx)#B!d}Y#hT(U;dVe$ioitP1f06UoJjbexpEe2W!dvG^|7Nn8t{Q27W!`S`>U@KJG!aLw9L5?D8)bttIm;s- zrFwe@d>ONsYH?kCWAOXF@Je$BIn4a;pLo%D^|TF4nb?NeVRlVNpW;VV8?piULFzQa z&at}DyG8-Iej@TmSAn*O0#WW0klSVIG=Ddg#e{a%5Sm)k=8tz;L)+yIqx&D4%;_uI z^R+(_KgzAPMAqYY;Y9o{!-STVF@2$XhkTS$h8 zUOg<&Ji{=Ekf+$(t0mr|il4E@;Q-`jTWWfJ+U`Aqx19}X?Y&Qm+4(U*=0BT{VtZq_ zqk3bhzT_zX7D^a?kwU?cJ3zxsKFf;`QW(R2&6ufY`AE3`;7%Z|Ol|cib$X+?qOl-H zV7ZzaVtDl(Vx_C(KXhbdJH#pJuAkozPdd;7=!+=U1d@8wDp*QwV z4S~o#f@zn3VIiW?Mm5qbP zH-`s`8QbPM9^$02O!S-liAm;}buR;|3Ia7<5LF~oCH+V(ZT76jS~@TJ^qZb-XFQ7| zocu01qZ`Kh0q90#xpH9=g`zBo`&Teu&O0uvi~)~Q4jJ>;2-a%aqoA+vw=(o$r!GFV zi?!d5>oK~{f3POG(VPI6*r?NM4E%-Kh@!lD-qf|)_BUG4LxJ=M_%Q3uLD!=W<>V!%0{pPU0`u-H}c2Ou0BcPTD6U z$8D=k2g4^B4;mfEjNxi^Kk*)KW^ zqvtO+N^iFpVc)c>*NJaxX(6riC-SbXy=c$;SCo~{to^TI32xcY1}QKNN(?Eqy0+Y4 z-|?Ms{0Z}7K9mBV_%Qwm`564(#{8gYq3oIBPN{VXx9z{^of-a!o*lgq_hj-@+U+g8 z+>TKi%p3g(Tp8<4#FVeJCA!f@^!JJ+AXAnt)%B)~Ec@%GW^>X)gr=Kd}<~KH5 zT@{0W0VBEE}q7qyD2pJwXRrPGuTIxGI2EMGr^MMgtuili->0LVsLgZgZ1HZ zl=Yah>_@wwOyD!NP7CEg?@OfkL!~@#T7Zy`M09&xFZA|^P-vb=^GwpWIQLMm4^1b0 z!bo%pM#p%5sygqC-n6bFpPO!lr&*?dhHUNJ@mr; zAJ0bf1V8Y4X?D%)-~N JBWfJ@e*h@@34s6r literal 0 HcmV?d00001 diff --git a/docs/guide/images/user_command.png b/docs/guide/images/user_command.png new file mode 100644 index 0000000000000000000000000000000000000000..f623fef747c018b522dde41895dd72b7a2de80e9 GIT binary patch literal 12096 zcmZv?WmFtI@GjmKT8g_nEN+G3T4aI6-Q8tzDNb<~cbDQWi$jrOOVQ#iuEn*u-@f-R z=iGaKACf2YVUkHQ$$4hZKva}u&{0TG-n@B(4w98pd-LWk@4vCi#}EJdWGh|0fAH2# zO-ABP?F8AuKLOENTv7bZ8)!W0lj-|^GP1L*uG^b882$gXw?j_l7H{6L&w-@GHN1>Y za*+)1tY2OO>s~p&g4o;FSO2)S%X43|aTLxasw~gQQPaLxRC-Mfd^8N=A|2Lp=RmbC}J)q0Xj|lKTY}4cn>xBFb zHdM(MjT;4q!CP!aI%O~u!7Q}2<^mQ_-N=d%gTz)Znm8weZ!AKE&TfHZmC7aC4~Zvj zUR0=uEM=;0Cjj=`rLei6baTHnM)s_O@eC|!5s2QEC^oCWC6_%H^)SG%K* zOjvG%O_|yAMtaW{Znj$Og*37CVG2WKt%x0U?0<@#?M*-M{&pZ6#O^> zNY*&o1>7QJJ(Mdkq!H?>E{E1D?8Cr0C+{}DT^R$`m8cWd=ueK{i!AbEYT4JnZ%;zV zazFSM>E{R3pIkRD3g)BdeWOtFKb(U$pN4aEU+f&ZQ{1unEG`nIwthq?Gw~P@j!9#- zr-Q@YW$M=ElPtMvD0RV@L5&_?W87S%H|k#^a|O`^3W{6+R@f88fUT>v=C&N-X!~~k z0)b{sp0Z1qBQKKLJb2{MRfmu_`aAy!bDKch_GjNKgU-8Wj80+oAkRj%^S;|mFAu$U z9YR02b@r~ANT>RzGFhxWbhFcU!TqD3TfVOzb9Y{>e$ZLgBYv>K7M3hf32h;PdYoSk zF_@Q;lKUr-b0-YmVEG-H#XIM#!nxg8TM*-VC(bWq4L*^Q21{J% z2e3EMy)WnYM7&2nN+hC)loSJQJ`Inz870LftzP`nmNH!wK1fLc9i?Ut?;re(uFG~4 z>*RWt={&;4_+ey7QhoUns!}__koUGJKlD_|zulE!+{1<3!e-s9i3{4bO*uj>I^U&C z>3$$q|7V>g6G?(#S@M%d0xCfq@i%mJk;G;{W)z%Y)ttmg_4fNV-@p7#gcILy{sN!0 z+~3eWes;N^Rnk}+8#+P#p`z76nwlQadl1r|)>NX3Avr z%1$uv*@gB8GXlSx7>?N==|pyzetR%FVz6PS-!nE*Now%e=qht%`vuJE(c-#44$3GA z5g{i>W1<#<(J)GPr7WxL{%ppj+d(!8 zn5ML@56~gi%5P4tq@D2-<}y1{sPF4Xk8$O&**F>K!?<}$K~#(cj2q2m97my)hj z7+(1KWUi=9Gbx&7P{`%^Dqw{gs%g-rQfK@jd0xJ8hUuMt*w?Q9wv>j|Y7M_XyQUfu z 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 literal 0 HcmV?d00001 From 38a9dbab4a31fc8d6815884d7fcb2e0bf783e75c Mon Sep 17 00:00:00 2001 From: Vincent <82736662+RPSMain@users.noreply.github.com> Date: Tue, 7 Dec 2021 12:38:10 +0800 Subject: [PATCH 093/180] Expand Webhooks Guide --- docs/guide/image_load.rst | 8 ++++++++ docs/guide/webhooks.md | 16 +++++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 docs/guide/image_load.rst diff --git a/docs/guide/image_load.rst b/docs/guide/image_load.rst new file mode 100644 index 0000000000..d03b8e50b4 --- /dev/null +++ b/docs/guide/image_load.rst @@ -0,0 +1,8 @@ +Used To Load images +=================== + +.. image:: /images/message_command.png + :alt: Message Command Image + +.. image:: /images/user_command.png + :alt: User Command Image \ No newline at end of file diff --git a/docs/guide/webhooks.md b/docs/guide/webhooks.md index a9bb9d0cea..cbcf2fa1cf 100644 --- a/docs/guide/webhooks.md +++ b/docs/guide/webhooks.md @@ -1,2 +1,16 @@ # Webhooks -The Guide To Using Webhooks In Pycord \ No newline at end of file +The Guide To Using Webhooks In Pycord + + +## A Basic Webhook + +Down below is a example of a simple webhook +```py +from discord import Webhook, AsyncWebhookAdapter +import aiohttp + +async def example_message(): + async with aiohttp.ClientSession() as session: + webhook = Webhook.from_url('url-here', adapter=AsyncWebhookAdapter(session)) + await webhook.send('Hello!', username='example_webhook') +``` \ No newline at end of file From 2cfe2386938535e75e022ede78f2617af0b93d03 Mon Sep 17 00:00:00 2001 From: Vincent <82736662+RPSMain@users.noreply.github.com> Date: Tue, 7 Dec 2021 12:42:00 +0800 Subject: [PATCH 094/180] Fixed? --- docs/guide/application_commands.md | 4 ++-- docs/guide/image_load.rst | 4 ++-- .../images => images/guide}/message_command.png | Bin .../{guide/images => images/guide}/user_command.png | Bin 4 files changed, 4 insertions(+), 4 deletions(-) rename docs/{guide/images => images/guide}/message_command.png (100%) rename docs/{guide/images => images/guide}/user_command.png (100%) diff --git a/docs/guide/application_commands.md b/docs/guide/application_commands.md index 44a4b4becf..3b654d8595 100644 --- a/docs/guide/application_commands.md +++ b/docs/guide/application_commands.md @@ -78,7 +78,7 @@ async def mention(ctx, member: discord.Member): # User Commands return the memb And it should return the following: ```{eval-rst} -.. image:: /images/user_command.png +.. image:: /images/guide/user_command.png :alt: User Command Image ``` @@ -93,6 +93,6 @@ async def message_id(ctx, message: discord.Message): # Message commands return t And it should return with the following: ```{eval-rst} -.. image:: /images/message_command.png +.. image:: /images/guide/message_command.png :alt: Message Command Image ``` diff --git a/docs/guide/image_load.rst b/docs/guide/image_load.rst index d03b8e50b4..7b9abc5c9d 100644 --- a/docs/guide/image_load.rst +++ b/docs/guide/image_load.rst @@ -1,8 +1,8 @@ Used To Load images =================== -.. image:: /images/message_command.png +.. image:: /images/guide/message_command.png :alt: Message Command Image -.. image:: /images/user_command.png +.. image:: /images/guide/user_command.png :alt: User Command Image \ No newline at end of file diff --git a/docs/guide/images/message_command.png b/docs/images/guide/message_command.png similarity index 100% rename from docs/guide/images/message_command.png rename to docs/images/guide/message_command.png diff --git a/docs/guide/images/user_command.png b/docs/images/guide/user_command.png similarity index 100% rename from docs/guide/images/user_command.png rename to docs/images/guide/user_command.png From bcec84c33a3e8727b57f679205dfe160885238ad Mon Sep 17 00:00:00 2001 From: Vincent <82736662+RPSMain@users.noreply.github.com> Date: Tue, 7 Dec 2021 16:14:21 +0800 Subject: [PATCH 095/180] Expand Docs and Change file positions --- docs/guide/index.md | 25 ++++++++++++++++--- .../application_commands.md | 8 ++++++ docs/guide/{ => interactions}/views.md | 0 docs/guide/{ => misc}/image_load.rst | 0 docs/{intents.rst => guide/misc/intents.md} | 2 ++ docs/guide/{ => misc}/webhooks.md | 1 + docs/index.rst | 2 +- 7 files changed, 33 insertions(+), 5 deletions(-) rename docs/guide/{ => interactions}/application_commands.md (95%) rename docs/guide/{ => interactions}/views.md (100%) rename docs/guide/{ => misc}/image_load.rst (100%) rename docs/{intents.rst => guide/misc/intents.md} (99%) rename docs/guide/{ => misc}/webhooks.md (95%) diff --git a/docs/guide/index.md b/docs/guide/index.md index 37109b7fad..7377d29637 100644 --- a/docs/guide/index.md +++ b/docs/guide/index.md @@ -1,12 +1,29 @@ # Guide The Official Guide For Pycord -# Guide List +## Before you begin... +Pycord has a lot of features which would be too advanced for a person just starting out with python, +We would suggest you get the basic knowledge of Python before starting there is a lot of tutorials to follow and we would suggest you start off with small projects then get bigger as you progress. + +### How much python do i need to know? + +- The difference between instances and class attributes. + - e.g. `guild.name` vs `discord.Guild.name` or any variation of these. +- How to use data structures in the language. + - `dict`/`tuple`/`list`/`str`/`...` +- How to solve `NameError` or `SyntaxError` exceptions. +- How to read and understand tracebacks. + +This list **doesn't** fully cover everything you should know before using Pycord + +## Guide List ```{eval-rst} -:doc:`application_commands` Guide +:doc:`interactions/application_commands` Guide + +:doc:`interactions/views` Guide -:doc:`views` Guide +:doc:`misc/webhooks` Guide -:doc:`webhooks` Guide +:doc:`misc/intents` ``` \ No newline at end of file diff --git a/docs/guide/application_commands.md b/docs/guide/interactions/application_commands.md similarity index 95% rename from docs/guide/application_commands.md rename to docs/guide/interactions/application_commands.md index 3b654d8595..b05cd9d5e6 100644 --- a/docs/guide/application_commands.md +++ b/docs/guide/interactions/application_commands.md @@ -1,3 +1,4 @@ + # Application Commands The Application Command Guide! @@ -85,6 +86,13 @@ And it should return the following: ### Message Commands Message Commands are again Simular to slash & user commands and you would make them like so: +```{eval-rst} + +.. warning:: + + Message Commands have to take in message + +``` ```py @bot.message_command(name="Show Message ID") # Creates a global message command async def message_id(ctx, message: discord.Message): # Message commands return the message diff --git a/docs/guide/views.md b/docs/guide/interactions/views.md similarity index 100% rename from docs/guide/views.md rename to docs/guide/interactions/views.md diff --git a/docs/guide/image_load.rst b/docs/guide/misc/image_load.rst similarity index 100% rename from docs/guide/image_load.rst rename to docs/guide/misc/image_load.rst diff --git a/docs/intents.rst b/docs/guide/misc/intents.md similarity index 99% rename from docs/intents.rst rename to docs/guide/misc/intents.md index f0e8ab79b4..17367c639d 100644 --- a/docs/intents.rst +++ b/docs/guide/misc/intents.md @@ -1,3 +1,4 @@ +```{eval-rst} :orphan: .. currentmodule:: discord @@ -203,3 +204,4 @@ Under the original system this would result in 2 requests to fetch the member li Unfortunately due to this change being required from Discord there is nothing that the library can do to mitigate this. If you truly dislike the direction Discord is going with their API, you can contact them via `support `_. +``` \ No newline at end of file diff --git a/docs/guide/webhooks.md b/docs/guide/misc/webhooks.md similarity index 95% rename from docs/guide/webhooks.md rename to docs/guide/misc/webhooks.md index cbcf2fa1cf..b961091931 100644 --- a/docs/guide/webhooks.md +++ b/docs/guide/misc/webhooks.md @@ -1,6 +1,7 @@ # Webhooks The Guide To Using Webhooks In Pycord + ## A Basic Webhook diff --git a/docs/index.rst b/docs/index.rst index c1cd889b30..b71f9e9ce7 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -26,7 +26,7 @@ Getting started Is this your first time using the library? This is the place to get started! - **First steps:** :doc:`intro` | :doc:`quickstart` | :doc:`logging` | :doc:`guide/index` -- **Working with Discord:** :doc:`discord` | :doc:`intents` +- **Working with Discord:** :doc:`discord` | :doc:`guide/misc/intents` - **Examples:** Many examples are available in the :resource:`repository `. Getting help From 05bf68ff2cd1efc35863482dd742572c5d2bcff8 Mon Sep 17 00:00:00 2001 From: Vincent <82736662+RPSMain@users.noreply.github.com> Date: Tue, 7 Dec 2021 16:34:39 +0800 Subject: [PATCH 096/180] Moving Guide like Files To Guide --- docs/guide/index.md | 8 +++++-- docs/guide/misc/image_load.rst | 23 ++++++++++++++++++- docs/{logging.rst => guide/misc/logging.md} | 2 ++ .../starting-out/installing.md} | 3 ++- .../starting-out/making-a-bot.md} | 2 ++ 5 files changed, 34 insertions(+), 4 deletions(-) rename docs/{logging.rst => guide/misc/logging.md} (98%) rename docs/{intro.rst => guide/starting-out/installing.md} (99%) rename docs/{discord.rst => guide/starting-out/making-a-bot.md} (99%) diff --git a/docs/guide/index.md b/docs/guide/index.md index 7377d29637..af448cb27e 100644 --- a/docs/guide/index.md +++ b/docs/guide/index.md @@ -19,11 +19,15 @@ This list **doesn't** fully cover everything you should know before using Pycord ## Guide List ```{eval-rst} +:doc:`misc/making-a-bot` + +:doc:`misc/intents` + +:doc:`misc/logging` + :doc:`interactions/application_commands` Guide :doc:`interactions/views` Guide :doc:`misc/webhooks` Guide - -:doc:`misc/intents` ``` \ No newline at end of file diff --git a/docs/guide/misc/image_load.rst b/docs/guide/misc/image_load.rst index 7b9abc5c9d..41be32569e 100644 --- a/docs/guide/misc/image_load.rst +++ b/docs/guide/misc/image_load.rst @@ -5,4 +5,25 @@ Used To Load images :alt: Message Command Image .. image:: /images/guide/user_command.png - :alt: User Command Image \ No newline at end of file + :alt: User Command Image + +.. image:: /images/discord_oauth2_scope.png + :alt: The scopes checkbox with "bot" ticked. + +.. image:: /images/discord_oauth2_perms.png + :alt: The permission checkboxes with some permissions checked. + +.. image:: /images/discord_bot_user_options.png + :alt: How the Bot User options should look like for most people. + +.. image:: /images/discord_create_app_form.png + :alt: The new application form filled in. + +.. image:: /images/discord_create_bot_user.png + :alt: The Add Bot button. + +.. image:: /images/discord_create_app_form.png + :alt: The new application form filled in. + +.. image:: /images/discord_create_app_button.png + :alt: The new application button. \ No newline at end of file diff --git a/docs/logging.rst b/docs/guide/misc/logging.md similarity index 98% rename from docs/logging.rst rename to docs/guide/misc/logging.md index dfb95dd644..896918a70a 100644 --- a/docs/logging.rst +++ b/docs/guide/misc/logging.md @@ -1,3 +1,4 @@ +```{eval-rst} :orphan: .. versionadded:: 0.6.0 @@ -44,3 +45,4 @@ stdout of your program. For more information, check the documentation and tutorial of the :mod:`logging` module. +``` \ No newline at end of file diff --git a/docs/intro.rst b/docs/guide/starting-out/installing.md similarity index 99% rename from docs/intro.rst rename to docs/guide/starting-out/installing.md index 2862a4ffaa..72143c7dea 100644 --- a/docs/intro.rst +++ b/docs/guide/starting-out/installing.md @@ -1,3 +1,4 @@ +```{eval-rst} :orphan: .. currentmodule:: discord @@ -120,4 +121,4 @@ A quick example to showcase how events work: client = MyClient() client.run('my token goes here') - +``` \ No newline at end of file diff --git a/docs/discord.rst b/docs/guide/starting-out/making-a-bot.md similarity index 99% rename from docs/discord.rst rename to docs/guide/starting-out/making-a-bot.md index ac12417f0f..aeed20fbad 100644 --- a/docs/discord.rst +++ b/docs/guide/starting-out/making-a-bot.md @@ -1,3 +1,4 @@ +```{eval-rst} :orphan: .. _discord-intro: @@ -94,3 +95,4 @@ If you want to invite your bot you must create an invite URL for it. If you want to generate this URL dynamically at run-time inside your bot and using the :class:`discord.Permissions` interface, you can use :func:`discord.utils.oauth_url`. +``` \ No newline at end of file From 9059169ff84b2c7afe542c527a0b731603a98775 Mon Sep 17 00:00:00 2001 From: Vincent <82736662+RPSMain@users.noreply.github.com> Date: Tue, 7 Dec 2021 16:37:53 +0800 Subject: [PATCH 097/180] Fix Links --- docs/index.rst | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/index.rst b/docs/index.rst index b71f9e9ce7..0632ca5591 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -25,8 +25,8 @@ Getting started Is this your first time using the library? This is the place to get started! -- **First steps:** :doc:`intro` | :doc:`quickstart` | :doc:`logging` | :doc:`guide/index` -- **Working with Discord:** :doc:`discord` | :doc:`guide/misc/intents` +- **First steps:** :doc:`guide/starting-out/installing` | :doc:`quickstart` | :doc:`guide/misc/logging` | :doc:`guide/index` +- **Working with Discord:** :doc:`guide/starting-out/make-a-bot` | :doc:`guide/misc/intents` - **Examples:** Many examples are available in the :resource:`repository `. Getting help From a345362deedf88f07f08a976cc03a52811b11389 Mon Sep 17 00:00:00 2001 From: Vincent <82736662+RPSMain@users.noreply.github.com> Date: Tue, 7 Dec 2021 16:40:37 +0800 Subject: [PATCH 098/180] Quick Fix --- docs/index.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/index.rst b/docs/index.rst index 0632ca5591..40e11d1bef 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -26,7 +26,7 @@ Getting started Is this your first time using the library? This is the place to get started! - **First steps:** :doc:`guide/starting-out/installing` | :doc:`quickstart` | :doc:`guide/misc/logging` | :doc:`guide/index` -- **Working with Discord:** :doc:`guide/starting-out/make-a-bot` | :doc:`guide/misc/intents` +- **Working with Discord:** :doc:`guide/starting-out/making-a-bot` | :doc:`guide/misc/intents` - **Examples:** Many examples are available in the :resource:`repository `. Getting help From cb3ff96b6be34f82608a8fe2616f4c3f87e30b13 Mon Sep 17 00:00:00 2001 From: Vincent <82736662+RPSMain@users.noreply.github.com> Date: Wed, 8 Dec 2021 11:30:10 +0800 Subject: [PATCH 099/180] Move Location Of TODO --- docs/guide/misc/webhooks.md | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/guide/misc/webhooks.md b/docs/guide/misc/webhooks.md index b961091931..4607b2a586 100644 --- a/docs/guide/misc/webhooks.md +++ b/docs/guide/misc/webhooks.md @@ -1,7 +1,5 @@ # Webhooks -The Guide To Using Webhooks In Pycord - - +The Guide To Using Webhooks In Pycord ## A Basic Webhook From 29d87a85232b0a90cc0419d3b4a54aa86e0669dd Mon Sep 17 00:00:00 2001 From: Vincent <82736662+RPSMain@users.noreply.github.com> Date: Wed, 8 Dec 2021 11:31:30 +0800 Subject: [PATCH 100/180] Remove Guide For ext.menus --- docs/guide/interactions/views.md | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/docs/guide/interactions/views.md b/docs/guide/interactions/views.md index eecfb59cc8..3faee8a1ef 100644 --- a/docs/guide/interactions/views.md +++ b/docs/guide/interactions/views.md @@ -30,7 +30,4 @@ Then you would want to make a command and send your message with the view like: ctx.send("Your_Message", view=My_View_Name()) ``` -And that's it! you have made your first button with Pycord -## Ext.Menus Guide - -Coming *Soon* \ No newline at end of file +And that's it! you have made your first button with Pycord \ No newline at end of file From 55106605d630b11beb109da0d426588522bb6114 Mon Sep 17 00:00:00 2001 From: Vincent <82736662+RPSMain@users.noreply.github.com> Date: Wed, 8 Dec 2021 15:38:40 +0800 Subject: [PATCH 101/180] Mega Commit --- docs/guide/index.md | 4 +- .../interactions/application_commands.md | 106 ------------------ .../{views.md => button_views.md} | 8 +- docs/guide/interactions/context_menus.md | 41 +++++++ docs/guide/interactions/select_views.md | 52 +++++++++ docs/guide/interactions/slash_commands.md | 60 ++++++++++ docs/guide/misc/image_load.rst | 1 + 7 files changed, 158 insertions(+), 114 deletions(-) delete mode 100644 docs/guide/interactions/application_commands.md rename docs/guide/interactions/{views.md => button_views.md} (83%) create mode 100644 docs/guide/interactions/context_menus.md create mode 100644 docs/guide/interactions/select_views.md create mode 100644 docs/guide/interactions/slash_commands.md diff --git a/docs/guide/index.md b/docs/guide/index.md index af448cb27e..2105b493fd 100644 --- a/docs/guide/index.md +++ b/docs/guide/index.md @@ -25,7 +25,9 @@ This list **doesn't** fully cover everything you should know before using Pycord :doc:`misc/logging` -:doc:`interactions/application_commands` Guide +:doc:`interactions/slash_commands` Guide + +:doc:`interactions/context_menus` Guide :doc:`interactions/views` Guide diff --git a/docs/guide/interactions/application_commands.md b/docs/guide/interactions/application_commands.md deleted file mode 100644 index b05cd9d5e6..0000000000 --- a/docs/guide/interactions/application_commands.md +++ /dev/null @@ -1,106 +0,0 @@ - -# Application Commands -The Application Command Guide! - -## Slash Commands -A Primer to Slash Commands for advanced & new users - -### Basic Slash Command -Slash Commands are very close to Legacy commands - -Instead of using `@bot.command` you will want to use `@bot.slash_command` - -Most Of Context's message methods were stripped to `ctx.respond("message", view=None)` - -But it is very easy to make them: - -```py -@bot.slash_command(guild_ids=[...]) # limits Guild ID's available -"""Example Description""" -async def example(ctx): - await ctx.respond("message", view=None) # Send Message -``` - -### Autocompleted Command -Autocompleted messages are implemented into Pycord! - -They are very easy to make -you would first want to make a list of autocompleted words -```py -my_list = [ - "..." - "..." -] -``` - -Then make a list of User id's which can use this: - -```py -allowed_users_list = [ - "..." - "..." -] -``` - -Then make a function which would search for results in the list: - -```py -async def list_search(ctx: discord.AutocompleteContext): - """Return's A List Of Autocomplete Results""" - return [ - color for color in my_list if ctx.interaction.user.id in allowed_users_list - ] -``` - -Now you can make your command - -```py -@bot.slash_command(name="ac_example") -async def autocomplete_example( - ctx: discord.ApplicationContext, - choice: Option(str, "what will be your choice!", autocomplete=list_search), -): - await ctx.respond(f"You picked {choice}!") -``` - -## Context Menu's -Context Menu commands are very simular to slash commands with the only real difference in code being that they return `member` or `message` - -### User Commands -User Commands are very simular to Slash commands and the same as message commands - -Only difference being you have to return the user in some way: - -```py -@bot.user_command(guild_ids=[...]) # Limits The Guilds With this Menu -async def mention(ctx, member: discord.Member): # User Commands return the member - await ctx.respond(f"{ctx.author.name} just mentioned {member.mention}!") -``` - -And it should return the following: -```{eval-rst} -.. image:: /images/guide/user_command.png - :alt: User Command Image -``` - -### Message Commands -Message Commands are again Simular to slash & user commands and you would make them like so: - -```{eval-rst} - -.. warning:: - - Message Commands have to take in message - -``` -```py -@bot.message_command(name="Show Message ID") # Creates a global message command -async def message_id(ctx, message: discord.Message): # Message commands return the message - await ctx.respond(f"{ctx.author.name}, here's the message id: {message.id}!") -``` - -And it should return with the following: -```{eval-rst} -.. image:: /images/guide/message_command.png - :alt: Message Command Image -``` diff --git a/docs/guide/interactions/views.md b/docs/guide/interactions/button_views.md similarity index 83% rename from docs/guide/interactions/views.md rename to docs/guide/interactions/button_views.md index 3faee8a1ef..7cc5eb33da 100644 --- a/docs/guide/interactions/views.md +++ b/docs/guide/interactions/button_views.md @@ -1,10 +1,4 @@ -# Views -The Guide To Using Views In Pycord! - -## Select Menus -A Primer On Select Menus For Beginners & Advanced Users Of Pycord - -## Button Menus +# Button Menus A Primer For Beginners & Advanced Users To Buttons In Pycord ### Basic Reply Button diff --git a/docs/guide/interactions/context_menus.md b/docs/guide/interactions/context_menus.md new file mode 100644 index 0000000000..ca78cf81d4 --- /dev/null +++ b/docs/guide/interactions/context_menus.md @@ -0,0 +1,41 @@ +# Context Menus +Context Menu commands are very simular to slash commands with the only real difference in code being that they return `member` or `message` + +### User Commands +User Commands are very simular to Slash commands and the same as message commands + +Only difference being you have to return the user in some way: + +```py +@bot.user_command(guild_ids=[...]) # Limits The Guilds With this Menu +async def mention(ctx, member: discord.Member): # User Commands return the member + await ctx.respond(f"{ctx.author.name} just mentioned {member.mention}!") +``` + +And it should return the following: +```{eval-rst} +.. image:: /images/guide/user_command.png + :alt: User Command Image +``` + +### Message Commands +Message Commands are again Simular to slash & user commands and you would make them like so: + +```{eval-rst} + +.. warning:: + + Message Commands have to take in message + +``` +```py +@bot.message_command(name="Show Message ID") # Creates a global message command +async def message_id(ctx, message: discord.Message): # Message commands return the message + await ctx.respond(f"{ctx.author.name}, here's the message id: {message.id}!") +``` + +And it should return with the following: +```{eval-rst} +.. image:: /images/guide/message_command.png + :alt: Message Command Image +``` \ No newline at end of file diff --git a/docs/guide/interactions/select_views.md b/docs/guide/interactions/select_views.md new file mode 100644 index 0000000000..393c08a274 --- /dev/null +++ b/docs/guide/interactions/select_views.md @@ -0,0 +1,52 @@ +# Select Menus +A Primer On Select Menus For Beginners & Advanced Users Of Pycord + +Select Menus are class based like how buttons are, So you would want to first make a class with your select view +```py +class my_view_name(discord.ui.Select): + def __init__(self) +``` + +Then make a list of your Select Options + +This list should hold anything from the label to Emoji. +```py +options = [ + discord.SelectOption( + label="my_label_name", description="my_option_description", emoji="your_emoji" + ), +] +``` +And you can add more. + +The limit you can put is 25. + +Then you can make an interaction callback in the same class + +```py +async def callback(self, interaction) + await interaction.response.send_message(f"your_message") +``` + +Then make another class which subclasses View. + +Then add your Select View as a item. +```py +class my_view_name_View(discord.ui.View): + def __init__(self): + super().__init__() + + self.add_item(my_view_name()) +``` + +Now you can make your command With your view + +```py +@bot.slash_command(guild_ids=[...]) # Limits Number Of Guilds With The Command +async def my_command_name(ctx): + await ctx.respond(f"your_message", view=my_view_name_View()) +``` + +And thats it that is all of selects in Pycord! + +We hope you learn't how to make selects or advanced your knowledge to with this. \ No newline at end of file diff --git a/docs/guide/interactions/slash_commands.md b/docs/guide/interactions/slash_commands.md new file mode 100644 index 0000000000..d4cf00da6a --- /dev/null +++ b/docs/guide/interactions/slash_commands.md @@ -0,0 +1,60 @@ +# Slash Commands +A Primer to Slash Commands for advanced & new users + +### Basic Slash Command +Slash Commands are very close to Legacy commands + +Instead of using `@bot.command` you will want to use `@bot.slash_command` + +Most Of Context's message methods were stripped to `ctx.respond("message", view=None)` + +But it is very easy to make them: + +```py +@bot.slash_command(guild_ids=[...]) # limits Guild ID's available +"""Example Description""" +async def example(ctx): + await ctx.respond("message", view=None) # Send Message +``` + +### Autocompleted Command +Autocompleted messages are implemented into Pycord! + +They are very easy to make +you would first want to make a list of autocompleted words +```py +my_list = [ + "..." + "..." +] +``` + +Then make a list of User id's which can use this: + +```py +allowed_users_list = [ + "..." + "..." +] +``` + +Then make a function which would search for results in the list: + +```py +async def list_search(ctx: discord.AutocompleteContext): + """Return's A List Of Autocomplete Results""" + return [ + color for color in my_list if ctx.interaction.user.id in allowed_users_list + ] +``` + +Now you can make your command + +```py +@bot.slash_command(name="ac_example") +async def autocomplete_example( + ctx: discord.ApplicationContext, + choice: Option(str, "what will be your choice!", autocomplete=list_search), +): + await ctx.respond(f"You picked {choice}!") +``` diff --git a/docs/guide/misc/image_load.rst b/docs/guide/misc/image_load.rst index 41be32569e..f4d0b6cbda 100644 --- a/docs/guide/misc/image_load.rst +++ b/docs/guide/misc/image_load.rst @@ -1,5 +1,6 @@ Used To Load images =================== +In Markdown .. image:: /images/guide/message_command.png :alt: Message Command Image From 1b0dfe2e4f6a95c0e143acda8558d5ba05219ecb Mon Sep 17 00:00:00 2001 From: Vincent <82736662+RPSMain@users.noreply.github.com> Date: Wed, 8 Dec 2021 15:41:15 +0800 Subject: [PATCH 102/180] Fix Index Names --- docs/guide/index.md | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/docs/guide/index.md b/docs/guide/index.md index 2105b493fd..8e5c57de5b 100644 --- a/docs/guide/index.md +++ b/docs/guide/index.md @@ -19,17 +19,21 @@ This list **doesn't** fully cover everything you should know before using Pycord ## Guide List ```{eval-rst} -:doc:`misc/making-a-bot` +:doc:`starting-out/installing` -:doc:`misc/intents` - -:doc:`misc/logging` +:doc:`starting-out/making-a-bot` :doc:`interactions/slash_commands` Guide :doc:`interactions/context_menus` Guide -:doc:`interactions/views` Guide +:doc:`interactions/button_views` Guide + +:doc:`interactions/select_views` Guide + +:doc:`misc/intents` + +:doc:`misc/logging` :doc:`misc/webhooks` Guide ``` \ No newline at end of file From 87399352d3ea2e2039a35bff8a3736fb2a85466a Mon Sep 17 00:00:00 2001 From: Vincent <82736662+RPSMain@users.noreply.github.com> Date: Wed, 8 Dec 2021 16:09:10 +0800 Subject: [PATCH 103/180] Mega Commit and expands button & select Views starts guide for sub commands --- docs/guide/index.md | 7 +++--- docs/guide/interactions/button_views.md | 30 +++++++++++++++++++++-- docs/guide/interactions/select_views.md | 5 +++- docs/guide/interactions/slash_commands.md | 2 ++ docs/guide/interactions/sub_commands.md | 2 ++ 5 files changed, 39 insertions(+), 7 deletions(-) create mode 100644 docs/guide/interactions/sub_commands.md diff --git a/docs/guide/index.md b/docs/guide/index.md index 8e5c57de5b..9edab6d39d 100644 --- a/docs/guide/index.md +++ b/docs/guide/index.md @@ -14,7 +14,7 @@ We would suggest you get the basic knowledge of Python before starting there is - How to solve `NameError` or `SyntaxError` exceptions. - How to read and understand tracebacks. -This list **doesn't** fully cover everything you should know before using Pycord +This list **doesn't** fully cover everything you should know before using Pycord, We would suggest you atleast know these before atempting to make a bot in Pycord. ## Guide List @@ -34,6 +34,5 @@ This list **doesn't** fully cover everything you should know before using Pycord :doc:`misc/intents` :doc:`misc/logging` - -:doc:`misc/webhooks` Guide -``` \ No newline at end of file +``` + \ No newline at end of file diff --git a/docs/guide/interactions/button_views.md b/docs/guide/interactions/button_views.md index 7cc5eb33da..4fd18c8239 100644 --- a/docs/guide/interactions/button_views.md +++ b/docs/guide/interactions/button_views.md @@ -16,7 +16,7 @@ class My_View_Name(discord.ui.View): custom_id="persistent_view:green", ) async def green(self, button: discord.ui.Button, interaction: discord.Interaction): - await interaction.response.send_message("Press Me!", ephemeral=True) + await interaction.response.send_message("Press Me!", ephemeral=True) # Makes The Message Ephemeral. ``` Then you would want to make a command and send your message with the view like: @@ -24,4 +24,30 @@ Then you would want to make a command and send your message with the view like: ctx.send("Your_Message", view=My_View_Name()) ``` -And that's it! you have made your first button with Pycord \ No newline at end of file +And that's it! you have made your first button with Pycord + +### How to disable a button + +You will first want to make your Button. + +```py +@discord.ui.button(label="button_name", style=discord.ButtonStyle.green) +async def disable(self, button: discord.ui.Button, interaction: discord.Interaction): +``` + +Then make this function which would disable the button after a certain number of seconds. + +```py +number = int(button.label) if button.label else 0 +if number + 1 >= 5: + button.style = discord.ButtonStyle.green + button.disabled = True +button.label = str(number + 1) + +# Make sure to update the message with our updated selves +await interaction.response.edit_message(view=self) +``` + +And send your message +```py +ctx.send("your_message", view=my_view_name()) \ No newline at end of file diff --git a/docs/guide/interactions/select_views.md b/docs/guide/interactions/select_views.md index 393c08a274..923512df7f 100644 --- a/docs/guide/interactions/select_views.md +++ b/docs/guide/interactions/select_views.md @@ -49,4 +49,7 @@ async def my_command_name(ctx): And thats it that is all of selects in Pycord! -We hope you learn't how to make selects or advanced your knowledge to with this. \ No newline at end of file +We hope you learn't how to make selects or advanced your knowledge to with this. + + +### How to disable a select diff --git a/docs/guide/interactions/slash_commands.md b/docs/guide/interactions/slash_commands.md index d4cf00da6a..d48d2de28f 100644 --- a/docs/guide/interactions/slash_commands.md +++ b/docs/guide/interactions/slash_commands.md @@ -58,3 +58,5 @@ async def autocomplete_example( ): await ctx.respond(f"You picked {choice}!") ``` + +### Managing Slash Command Permissions diff --git a/docs/guide/interactions/sub_commands.md b/docs/guide/interactions/sub_commands.md new file mode 100644 index 0000000000..66460c1f54 --- /dev/null +++ b/docs/guide/interactions/sub_commands.md @@ -0,0 +1,2 @@ +# Sub Commands +A Primer On Subcommands. \ No newline at end of file From ad75915a0b4cfcd9f6d56c6fcc2d4db3ed240f47 Mon Sep 17 00:00:00 2001 From: Vincent <82736662+RPSMain@users.noreply.github.com> Date: Wed, 8 Dec 2021 16:11:47 +0800 Subject: [PATCH 104/180] Finish Permissions Guide --- docs/guide/interactions/slash_commands.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/docs/guide/interactions/slash_commands.md b/docs/guide/interactions/slash_commands.md index d48d2de28f..ad010b003c 100644 --- a/docs/guide/interactions/slash_commands.md +++ b/docs/guide/interactions/slash_commands.md @@ -60,3 +60,14 @@ async def autocomplete_example( ``` ### Managing Slash Command Permissions + +You will first want to make a slash command +```py +@bot.slash_command(guild_ids=[...]) # Limits guilds with this command +``` + +Then in the bottom add + +```py +@permissions.foo() # Replace foo with has_role or is_user etc. +``` From 157ef202afc8da3f7ab3f146a0948913e7fbfcef Mon Sep 17 00:00:00 2001 From: Vincent <82736662+RPSMain@users.noreply.github.com> Date: Wed, 8 Dec 2021 16:12:34 +0800 Subject: [PATCH 105/180] Fix Capitalization --- docs/guide/interactions/slash_commands.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/interactions/slash_commands.md b/docs/guide/interactions/slash_commands.md index ad010b003c..ec6b1f3fe1 100644 --- a/docs/guide/interactions/slash_commands.md +++ b/docs/guide/interactions/slash_commands.md @@ -29,7 +29,7 @@ my_list = [ ] ``` -Then make a list of User id's which can use this: +Then make a list of User ID's which can use this: ```py allowed_users_list = [ From 2d5c77bfadd825b2915a5399acc85acc0a08f8e4 Mon Sep 17 00:00:00 2001 From: Vincent <82736662+RPSMain@users.noreply.github.com> Date: Wed, 8 Dec 2021 16:16:05 +0800 Subject: [PATCH 106/180] Remove Sub Command Guide --- docs/guide/interactions/sub_commands.md | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 docs/guide/interactions/sub_commands.md diff --git a/docs/guide/interactions/sub_commands.md b/docs/guide/interactions/sub_commands.md deleted file mode 100644 index 66460c1f54..0000000000 --- a/docs/guide/interactions/sub_commands.md +++ /dev/null @@ -1,2 +0,0 @@ -# Sub Commands -A Primer On Subcommands. \ No newline at end of file From 8f42662b616eed4301aa7c72f020961837213a8a Mon Sep 17 00:00:00 2001 From: Vincent <82736662+RPSMain@users.noreply.github.com> Date: Wed, 8 Dec 2021 16:18:04 +0800 Subject: [PATCH 107/180] Fix Spelling Errors --- docs/guide/index.md | 2 +- docs/guide/interactions/select_views.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/guide/index.md b/docs/guide/index.md index 9edab6d39d..d924e3b97d 100644 --- a/docs/guide/index.md +++ b/docs/guide/index.md @@ -14,7 +14,7 @@ We would suggest you get the basic knowledge of Python before starting there is - How to solve `NameError` or `SyntaxError` exceptions. - How to read and understand tracebacks. -This list **doesn't** fully cover everything you should know before using Pycord, We would suggest you atleast know these before atempting to make a bot in Pycord. +This list **doesn't** fully cover everything you should know before using Pycord, We would suggest you at least know these before attempting to make a bot in Pycord. ## Guide List diff --git a/docs/guide/interactions/select_views.md b/docs/guide/interactions/select_views.md index 923512df7f..48b2562c4b 100644 --- a/docs/guide/interactions/select_views.md +++ b/docs/guide/interactions/select_views.md @@ -47,7 +47,7 @@ async def my_command_name(ctx): await ctx.respond(f"your_message", view=my_view_name_View()) ``` -And thats it that is all of selects in Pycord! +And that's it that is all of selects in Pycord! We hope you learn't how to make selects or advanced your knowledge to with this. From 1483e5fb66172f93a9749848f5c16af594068158 Mon Sep 17 00:00:00 2001 From: RPS Date: Wed, 8 Dec 2021 00:19:06 -0800 Subject: [PATCH 108/180] Adding MyST Parser --- .github/workflows/docs.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index fd9fc9498a..034e3fba66 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -16,8 +16,8 @@ jobs: python-version: ${{ matrix.python-version }} - name: Install dependencies run: | - python -m pip install --upgrade pip - pip install sphinx sphinxcontrib-trio aiohttp sphinxcontrib-websupport + python -m pip install -U pip + pip install -U sphinx sphinxcontrib-trio aiohttp sphinxcontrib-websupport myst-parser - name: Compile to html run: | cd docs From 46162c0a3e676bdb908409a48f1acf109c705f7b Mon Sep 17 00:00:00 2001 From: Vincent <82736662+RPSMain@users.noreply.github.com> Date: Wed, 8 Dec 2021 16:32:15 +0800 Subject: [PATCH 109/180] Remove TODO --- docs/guide/misc/webhooks.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/guide/misc/webhooks.md b/docs/guide/misc/webhooks.md index 4607b2a586..29cb5b208b 100644 --- a/docs/guide/misc/webhooks.md +++ b/docs/guide/misc/webhooks.md @@ -1,5 +1,5 @@ # Webhooks -The Guide To Using Webhooks In Pycord +The Guide To Using Webhooks In Pycord ## A Basic Webhook From 8c4bf5a3c3a42f64d0b698b9592c0ab6a77c0dbd Mon Sep 17 00:00:00 2001 From: Vincent <82736662+RPSMain@users.noreply.github.com> Date: Wed, 8 Dec 2021 16:36:03 +0800 Subject: [PATCH 110/180] Fix Up Version Guarantees --- docs/version_guarantees.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/version_guarantees.rst b/docs/version_guarantees.rst index 2216579c82..076d8f26eb 100644 --- a/docs/version_guarantees.rst +++ b/docs/version_guarantees.rst @@ -1,9 +1,9 @@ .. _version_guarantees: Version Guarantees -===================== +================== -The library follows a `semantic versioning principle `_ which means that the major version is updated every time there is an incompatible API change. However due to the lack of guarantees on the Discord side when it comes to breaking changes along with the fairly dynamic nature of Python it can be hard to discern what can be considered a breaking change and what isn't. +The library follows the `semantic versioning principle `_ which means that the major version is updated every time there is an incompatible API change. However due to the lack of guarantees on the Discord side when it comes to breaking changes along with the fairly dynamic nature of Python it can be hard to discern what can be considered a breaking change and what isn't. The first thing to keep in mind is that breaking changes only apply to **publicly documented functions and classes**. If it's not listed in the documentation here then it is not part of the public API and is thus bound to change. This includes attributes that start with an underscore or functions without an underscore that are not documented. @@ -12,14 +12,14 @@ The first thing to keep in mind is that breaking changes only apply to **publicl The examples below are non-exhaustive. Examples of Breaking Changes ------------------------------- +---------------------------- - Changing the default parameter value to something else. - Renaming a function without an alias to an old function. - Adding or removing parameters to an event. Examples of Non-Breaking Changes ----------------------------------- +-------------------------------- - Adding or removing private underscored attributes. - Adding an element into the ``__slots__`` of a data class. From fa2ae8f0b22bde73003bd7e916fc15f23cc961f3 Mon Sep 17 00:00:00 2001 From: Vincent <82736662+RPSMain@users.noreply.github.com> Date: Wed, 8 Dec 2021 16:37:20 +0800 Subject: [PATCH 111/180] Title Card Chananigans --- docs/whats_new.rst | 40 ++++++++++++++++++++-------------------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/docs/whats_new.rst b/docs/whats_new.rst index c6107b5c81..342dcaaf98 100644 --- a/docs/whats_new.rst +++ b/docs/whats_new.rst @@ -6,7 +6,7 @@ .. _whats_new: Changelog -============ +========= This page keeps a detailed human friendly rendering of what's new and changed in specific versions. @@ -23,10 +23,10 @@ see :ref:`the migrating page `. .. _vp1p7p3: v1.7.3 --------- +------ Bug Fixes -~~~~~~~~~~ +~~~~~~~~~ - Fix a crash involving guild uploaded stickers - Fix :meth:`DMChannel.permissions_for` not having :attr:`Permissions.read_messages` set. @@ -49,14 +49,14 @@ v1.7.1 ------- Bug Fixes -~~~~~~~~~~~ +~~~~~~~~~ - |commands| Fix :meth:`Cog.has_error_handler ` not working as intended. .. _vp1p7p0: v1.7.0 --------- +------ This version is mainly for improvements and bug fixes. This is more than likely the last major version in the 1.x series. Work after this will be spent on v2.0. As a result, **this is the last version to support Python 3.5**. @@ -65,7 +65,7 @@ Likewise, **this is the last version to support user bots**. Development of v2.0 will have breaking changes and support for newer API features. New Features -~~~~~~~~~~~~~~ +~~~~~~~~~~~~ - Add support for stage channels via :class:`StageChannel` (:issue:`6602`, :issue:`6608`) - Add support for :attr:`MessageReference.fail_if_not_exists` (:issue:`6484`) @@ -108,7 +108,7 @@ New Features - |commands| Allow relative paths when loading extensions via a ``package`` keyword argument (:issue:`2465`, :issue:`6445`) Bug Fixes -~~~~~~~~~~ +~~~~~~~~~ - Fix mentions not working if ``mention_author`` is passed in :meth:`abc.Messageable.send` without :attr:`Client.allowed_mentions` set (:issue:`6192`, :issue:`6458`) - Fix user created instances of :class:`CustomActivity` triggering an error (:issue:`4049`) @@ -130,7 +130,7 @@ Bug Fixes - |commands| Group signatures now properly show up in :attr:`Command.signature ` (:issue:`6529`, :issue:`6530`) Miscellaneous -~~~~~~~~~~~~~~ +~~~~~~~~~~~~~ - User endpoints and all userbot related functionality has been deprecated and will be removed in the next major version of the library. - :class:`Permission` class methods were updated to match the UI of the Discord client (:issue:`6476`) @@ -139,12 +139,12 @@ Miscellaneous .. _vp1p6p0: v1.6.0 --------- +------ This version comes with support for replies and stickers. New Features -~~~~~~~~~~~~~~ +~~~~~~~~~~~~ - An entirely redesigned documentation. This was the cumulation of multiple months of effort. - There's now a dark theme, feel free to navigate to the cog on the screen to change your setting, though this should be automatic. @@ -181,7 +181,7 @@ New Features Bug Fixes -~~~~~~~~~~~ +~~~~~~~~~ - Raise :exc:`DiscordServerError` when reaching 503s repeatedly (:issue:`6044`) - Fix :exc:`AttributeError` when :meth:`Client.fetch_template` is called (:issue:`5986`) @@ -197,7 +197,7 @@ Bug Fixes - |commands| Properly cleanup lingering commands when a conflicting alias is found when adding commands (:issue:`6217`) Miscellaneous -~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~ - ``ffmpeg`` spawned processes no longer open a window in Windows (:issue:`6038`) - Update dependencies to allow the library to work on Python 3.9+ without requiring build tools. (:issue:`5984`, :issue:`5970`) @@ -214,7 +214,7 @@ v1.5.1 ------- Bug Fixes -~~~~~~~~~~~ +~~~~~~~~~ - Fix :func:`utils.escape_markdown` not escaping quotes properly (:issue:`5897`) - Fix :class:`Message` not being hashable (:issue:`5901`, :issue:`5866`) @@ -226,7 +226,7 @@ Bug Fixes - Ensure that the bot's own member is not evicted from the cache (:issue:`5949`) Miscellaneous -~~~~~~~~~~~~~~ +~~~~~~~~~~~~~ - Members are now loaded during ``GUILD_MEMBER_UPDATE`` events if :attr:`MemberCacheFlags.joined` is set. (:issue:`5930`) - |commands| :class:`MemberConverter ` now properly lazily fetches members if not available from cache. @@ -236,18 +236,18 @@ Miscellaneous .. _vp1p5p0: v1.5.0 --------- +------ This version came with forced breaking changes that Discord is requiring all bots to go through on October 7th. It is highly recommended to read the documentation on intents, :ref:`intents_primer`. API Changes -~~~~~~~~~~~~~ +~~~~~~~~~~~ - Members and presences will no longer be retrieved due to an API change. See :ref:`privileged_intents` for more info. - As a consequence, fetching offline members is disabled if the members intent is not enabled. New Features -~~~~~~~~~~~~~~ +~~~~~~~~~~~~ - Support for gateway intents, passed via ``intents`` in :class:`Client` using :class:`Intents`. - Add :attr:`VoiceRegion.south_korea` (:issue:`5233`) @@ -267,7 +267,7 @@ New Features - |commands| Add support for ``require_var_positional`` for :class:`Command` (:issue:`5793`) Bug Fixes -~~~~~~~~~~ +~~~~~~~~~ - Fix issue with :meth:`Guild.by_category` not showing certain channels. - Fix :attr:`abc.GuildChannel.permissions_synced` always being ``False`` (:issue:`5772`) @@ -282,7 +282,7 @@ Bug Fixes - |tasks| Fix tasks extending the next iteration on handled exceptions (:issue:`5762`, :issue:`5763`) Miscellaneous -~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~ - Webhook requests are now logged (:issue:`5798`) - Remove caching layer from :attr:`AutoShardedClient.shards`. This was causing issues if queried before launching shards. @@ -296,7 +296,7 @@ Miscellaneous .. _vp1p4p2: v1.4.2 --------- +------ This is a maintenance release with backports from :ref:`vp1p5p0`. From 9afad5e06d5f01580e3523bec4154b45717f8c43 Mon Sep 17 00:00:00 2001 From: Vincent <82736662+RPSMain@users.noreply.github.com> Date: Wed, 8 Dec 2021 16:39:52 +0800 Subject: [PATCH 112/180] More Fixes To Title Cards --- docs/whats_new.rst | 66 +++++++++++++++++++++++----------------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/docs/whats_new.rst b/docs/whats_new.rst index 342dcaaf98..0233b30f64 100644 --- a/docs/whats_new.rst +++ b/docs/whats_new.rst @@ -301,7 +301,7 @@ v1.4.2 This is a maintenance release with backports from :ref:`vp1p5p0`. Bug Fixes -~~~~~~~~~~~ +~~~~~~~~~ - Fix issue with :meth:`Guild.by_category` not showing certain channels. - Fix :attr:`abc.GuildChannel.permissions_synced` always being ``False`` (:issue:`5772`) @@ -316,7 +316,7 @@ Bug Fixes - |tasks| Fix tasks extending the next iteration on handled exceptions (:issue:`5762`, :issue:`5763`) Miscellaneous -~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~ - Remove caching layer from :attr:`AutoShardedClient.shards`. This was causing issues if queried before launching shards. - |tasks| Lazily fetch the event loop to prevent surprises when changing event loop policy (:issue:`5808`) @@ -324,10 +324,10 @@ Miscellaneous .. _vp1p4p1: v1.4.1 --------- +------ Bug Fixes -~~~~~~~~~~~ +~~~~~~~~~ - Properly terminate the connection when :meth:`Client.close` is called (:issue:`5207`) - Fix error being raised when clearing embed author or image when it was already cleared (:issue:`5210`, :issue:`5212`) @@ -336,12 +336,12 @@ Bug Fixes .. _vp1p4p0: v1.4.0 --------- +------ Another version with a long development time. Features like Intents are slated to be released in a v1.5 release. Thank you for your patience! New Features -~~~~~~~~~~~~~~ +~~~~~~~~~~~~ - Add support for :class:`AllowedMentions` to have more control over what gets mentioned. - This can be set globally through :attr:`Client.allowed_mentions` @@ -398,7 +398,7 @@ New Features Bug Fixes -~~~~~~~~~~~~ +~~~~~~~~~ - Fix issue with :attr:`PartialEmoji.url` reads leading to a failure (:issue:`4015`, :issue:`4016`) - Allow :meth:`abc.Messageable.history` to take a limit of ``1`` even if ``around`` is passed (:issue:`4019`) @@ -426,7 +426,7 @@ Bug Fixes Miscellaneous -~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~ - The :attr:`Member.roles` cache introduced in v1.3 was reverted due to issues caused (:issue:`4087`, :issue:`4157`) - :class:`Webhook` objects are now comparable and hashable (:issue:`4182`) @@ -446,20 +446,20 @@ Miscellaneous .. _vp1p3p4: v1.3.4 --------- +------ Bug Fixes -~~~~~~~~~~~ +~~~~~~~~~ - Fix an issue with channel overwrites causing multiple issues including crashes (:issue:`5109`) .. _vp1p3p3: v1.3.3 --------- +------ Bug Fixes -~~~~~~~~~~~~ +~~~~~~~~~ - Change default WS close to 4000 instead of 1000. - The previous close code caused sessions to be invalidated at a higher frequency than desired. @@ -469,12 +469,12 @@ Bug Fixes .. _vp1p3p2: v1.3.2 ---------- +------ Another minor bug fix release. Bug Fixes -~~~~~~~~~~~ +~~~~~~~~~ - Higher the wait time during the ``GUILD_CREATE`` stream before ``on_ready`` is fired for :class:`AutoShardedClient`. - :func:`on_voice_state_update` now uses the inner ``member`` payload which should make it more reliable. @@ -487,18 +487,18 @@ Bug Fixes .. _vp1p3p1: v1.3.1 --------- +------ Minor bug fix release. Bug Fixes -~~~~~~~~~~~ +~~~~~~~~~ - Fix fetching invites in guilds that the user is not in. - Fix the channel returned from :meth:`Client.fetch_channel` raising when sending messages. (:issue:`2531`) Miscellaneous -~~~~~~~~~~~~~~ +~~~~~~~~~~~~~ - Fix compatibility warnings when using the Python 3.9 alpha. - Change the unknown event logging from WARNING to DEBUG to reduce noise. @@ -506,12 +506,12 @@ Miscellaneous .. _vp1p3p0: v1.3.0 --------- +------ This version comes with a lot of bug fixes and new features. It's been in development for a lot longer than was anticipated! New Features -~~~~~~~~~~~~~~ +~~~~~~~~~~~~ - Add :meth:`Guild.fetch_members` to fetch members from the HTTP API. (:issue:`2204`) - Add :meth:`Guild.fetch_roles` to fetch roles from the HTTP API. (:issue:`2208`) @@ -577,7 +577,7 @@ New Features - |tasks| Add :attr:`Loop.next_iteration <.ext.tasks.Loop.next_iteration>` property. (:issue:`2305`) Bug Fixes -~~~~~~~~~~ +~~~~~~~~~ - Fix issue with permission resolution sometimes failing for guilds with no owner. - Tokens are now stripped upon use. (:issue:`2135`) @@ -601,7 +601,7 @@ Bug Fixes - |commands| :meth:`Context.send_help <.ext.commands.Context.send_help>` now properly propagates to the :meth:`HelpCommand.on_help_command_error <.ext.commands.HelpCommand.on_help_command_error>` handler. Miscellaneous -~~~~~~~~~~~~~~~ +~~~~~~~~~~~~~ - The library now fully supports Python 3.8 without warnings. - Bump the dependency of ``websockets`` to 8.0 for those who can use it. (:issue:`2453`) @@ -625,20 +625,20 @@ Miscellaneous .. _vp1p2p5: v1.2.5 --------- +------ Bug Fixes -~~~~~~~~~~~ +~~~~~~~~~ - Fix a bug that caused crashes due to missing ``animated`` field in Emoji structures in reactions. .. _vp1p2p4: v1.2.4 --------- +------ Bug Fixes -~~~~~~~~~~~ +~~~~~~~~~ - Fix a regression when :attr:`Message.channel` would be ``None``. - Fix a regression where :attr:`Message.edited_at` would not update during edits. @@ -650,10 +650,10 @@ Bug Fixes .. _vp1p2p3: v1.2.3 -------- +------ Bug Fixes -~~~~~~~~~~~ +~~~~~~~~~ - Fix an AttributeError when accessing :attr:`Member.premium_since` in :func:`on_member_update`. (:issue:`2213`) - Handle :exc:`asyncio.CancelledError` in :meth:`abc.Messageable.typing` context manager. (:issue:`2218`) @@ -664,20 +664,20 @@ Bug Fixes .. _vp1p2p2: v1.2.2 -------- +------ Bug Fixes -~~~~~~~~~~~ +~~~~~~~~~ - Audit log related attribute access have been fixed to not error out when they shouldn't have. .. _vp1p2p1: v1.2.1 -------- +------ Bug Fixes -~~~~~~~~~~~ +~~~~~~~~~ - :attr:`User.avatar_url` and related attributes no longer raise an error. - More compatibility shims with the ``enum.Enum`` code. @@ -685,12 +685,12 @@ Bug Fixes .. _vp1p2p0: v1.2.0 --------- +------ This update mainly brings performance improvements and various nitro boosting attributes (referred to in the API as "premium guilds"). New Features -~~~~~~~~~~~~~~ +~~~~~~~~~~~~ - Add :attr:`Guild.premium_tier` to query the guild's current nitro boost level. - Add :attr:`Guild.emoji_limit`, :attr:`Guild.bitrate_limit`, :attr:`Guild.filesize_limit` to query the new limits of a guild when taking into consideration boosting. From 871abb48720de1510d2a2dc50f100a26c80857cc Mon Sep 17 00:00:00 2001 From: Vincent <82736662+RPSMain@users.noreply.github.com> Date: Wed, 8 Dec 2021 16:44:49 +0800 Subject: [PATCH 113/180] Fix Capitalization --- examples/background_task.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/examples/background_task.py b/examples/background_task.py index cad6ad9d3b..57f88595c7 100644 --- a/examples/background_task.py +++ b/examples/background_task.py @@ -7,25 +7,25 @@ class MyClient(discord.Client): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - # an attribute we can access from our task + # An attribute we can access from our task self.counter = 0 - # start the task to run in the background + # Start the task to run in the background self.my_background_task.start() async def on_ready(self): print(f"Logged in as {self.user} (ID: {self.user.id})") print("------") - @tasks.loop(seconds=60) # task that runs every 60 seconds + @tasks.loop(seconds=60) # Task that runs every 60 seconds async def my_background_task(self): - channel = self.get_channel(1234567) # your channel ID goes here + channel = self.get_channel(1234567) # your Channel ID goes here self.counter += 1 await channel.send(self.counter) @my_background_task.before_loop async def before_my_task(self): - await self.wait_until_ready() # wait until the bot logs in + await self.wait_until_ready() # Wait until the bot logs in client = MyClient() From 5ba221e916816f926ecb7d8f1ea72c4d163fe58f Mon Sep 17 00:00:00 2001 From: Vincent <82736662+RPSMain@users.noreply.github.com> Date: Wed, 8 Dec 2021 16:45:10 +0800 Subject: [PATCH 114/180] Fix Capitalization --- examples/background_task_asyncio.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/background_task_asyncio.py b/examples/background_task_asyncio.py index d6af904c13..865c8c1d75 100644 --- a/examples/background_task_asyncio.py +++ b/examples/background_task_asyncio.py @@ -6,7 +6,7 @@ class MyClient(discord.Client): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - # create the background task and run it in the background + # Create the background task and run it in the background self.bg_task = self.loop.create_task(self.my_background_task()) async def on_ready(self): @@ -16,11 +16,11 @@ async def on_ready(self): async def my_background_task(self): await self.wait_until_ready() counter = 0 - channel = self.get_channel(1234567) # your channel ID goes here + channel = self.get_channel(1234567) # Your channel ID goes here while not self.is_closed(): counter += 1 await channel.send(counter) - await asyncio.sleep(60) # this asyncio task runs every 60 seconds + await asyncio.sleep(60) # This asyncio task runs every 60 seconds client = MyClient() From f5ca1793d6b5580235b5db046068216094593edd Mon Sep 17 00:00:00 2001 From: Vincent <82736662+RPSMain@users.noreply.github.com> Date: Wed, 8 Dec 2021 16:46:13 +0800 Subject: [PATCH 115/180] Fix Capitalization --- examples/basic_voice.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/basic_voice.py b/examples/basic_voice.py index c55f8e3482..3b9b641a2e 100644 --- a/examples/basic_voice.py +++ b/examples/basic_voice.py @@ -20,7 +20,7 @@ "quiet": True, "no_warnings": True, "default_search": "auto", - "source_address": "0.0.0.0", # bind to ipv4 since ipv6 addresses cause issues at certain times + "source_address": "0.0.0.0", # Bind to ipv4 since ipv6 addresses cause issues at certain times } ffmpeg_options = {"options": "-vn"} @@ -45,7 +45,7 @@ async def from_url(cls, url, *, loop=None, stream=False): ) if "entries" in data: - # takes the first item from a playlist + # Takes the first item from a playlist data = data["entries"][0] filename = data["url"] if stream else ytdl.prepare_filename(data) From c5d41c3c46318df8aef11a950f18ecd54d259c5c Mon Sep 17 00:00:00 2001 From: Vincent <82736662+RPSMain@users.noreply.github.com> Date: Wed, 8 Dec 2021 16:47:13 +0800 Subject: [PATCH 116/180] Fix Capitalization --- examples/converters.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/examples/converters.py b/examples/converters.py index 1517af9249..5e6bf3c6bb 100644 --- a/examples/converters.py +++ b/examples/converters.py @@ -25,7 +25,7 @@ async def userinfo(ctx: commands.Context, user: discord.User): # In standard Python, it is use for documentation and IDE assistance purposes. # If the conversion is successful, we will have a `discord.User` instance - # and can do the following: + # And can do the following: user_id = user.id username = user.name avatar = user.avatar.url @@ -34,8 +34,8 @@ async def userinfo(ctx: commands.Context, user: discord.User): @userinfo.error async def userinfo_error(ctx: commands.Context, error: commands.CommandError): - # if the conversion above fails for any reason, it will raise `commands.BadArgument` - # so we handle this in this error handler: + # If the conversion above fails for any reason, it will raise `commands.BadArgument` + # So we handle this in this error handler: if isinstance(error, commands.BadArgument): return await ctx.send("Couldn't find that user.") @@ -46,8 +46,8 @@ async def convert(self, ctx: commands.Context, argument: str): # In this example we have made a custom converter. # This checks if an input is convertible to a # `discord.Member` or `discord.TextChannel` instance from the - # input the user has given us using the pre-existing converters - # that the library provides. + # Input the user has given us using the pre-existing converters + # That the library provides. member_converter = commands.MemberConverter() try: @@ -70,7 +70,7 @@ async def convert(self, ctx: commands.Context, argument: str): return channel # If the value could not be converted we can raise an error - # so our error handlers can deal with it in one place. + # So our error handlers can deal with it in one place. # The error has to be CommandError derived, so BadArgument works fine here. raise commands.BadArgument( f'No Member or TextChannel could be converted from "{argument}"' @@ -81,8 +81,8 @@ async def convert(self, ctx: commands.Context, argument: str): async def notify(ctx: commands.Context, target: ChannelOrMemberConverter): # This command signature utilises the custom converter written above # What will happen during command invocation is that the `target` above will be passed to - # the `argument` parameter of the `ChannelOrMemberConverter.convert` method and - # the conversion will go through the process defined there. + # The `argument` parameter of the `ChannelOrMemberConverter.convert` method and + # The conversion will go through the process defined there. await target.send(f"Hello, {target.name}!") @@ -97,7 +97,7 @@ async def ignore( # If that fails, it will attempt to convert it to a `discord.TextChannel` instance. # See: https://docs.pycord.dev/en/latest/ext/commands/commands.html#typing-union # NOTE: If a Union typehint converter fails it will raise `commands.BadUnionArgument` - # instead of `commands.BadArgument`. + # Instead of `commands.BadArgument`. # To check the resulting type, `isinstance` is used if isinstance(target, discord.Member): @@ -106,7 +106,7 @@ async def ignore( ) elif isinstance( target, discord.TextChannel - ): # this could be an `else` but for completeness' sake. + ): # This could be an `else` but for completeness' sake. await ctx.send( f"Channel found: {target.mention}, adding it to the ignore list." ) From 67657a5c8e3c47d8267f02f6358fa5138f502021 Mon Sep 17 00:00:00 2001 From: Vincent <82736662+RPSMain@users.noreply.github.com> Date: Wed, 8 Dec 2021 16:47:31 +0800 Subject: [PATCH 117/180] Fix Capitalization --- examples/converters.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/converters.py b/examples/converters.py index 5e6bf3c6bb..c121ef275c 100644 --- a/examples/converters.py +++ b/examples/converters.py @@ -14,11 +14,11 @@ @bot.command() async def userinfo(ctx: commands.Context, user: discord.User): # In the command signature above, you can see that the `user` - # parameter is typehinted to `discord.User`. This means that - # during command invocation we will attempt to convert - # the value passed as `user` to a `discord.User` instance. + # Parameter is typehinted to `discord.User`. This means that + # During command invocation we will attempt to convert + # The value passed as `user` to a `discord.User` instance. # The documentation notes what can be converted, in the case of `discord.User` - # you pass an ID, mention or username (discrim optional) + # You pass an ID, mention or username (discrim optional) # E.g. 80088516616269824, @Danny or Danny#0007 # NOTE: typehinting acts as a converter within the `commands` framework only. From 2c722b4c645389f16c2638b71b78b55e6c87b2c3 Mon Sep 17 00:00:00 2001 From: Vincent <82736662+RPSMain@users.noreply.github.com> Date: Wed, 8 Dec 2021 16:49:18 +0800 Subject: [PATCH 118/180] Fix Capitalization --- examples/custom_context.py | 36 ++++++++++++++++++------------------ examples/reply.py | 2 +- examples/secret.py | 8 ++++---- 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/examples/custom_context.py b/examples/custom_context.py index 7ce2d789f4..6dddc7bb25 100644 --- a/examples/custom_context.py +++ b/examples/custom_context.py @@ -6,26 +6,26 @@ class MyContext(commands.Context): async def tick(self, value): - # reacts to the message with an emoji - # depending on whether value is True or False - # if its True, it'll add a green check mark - # otherwise, it'll add a red cross mark + # Reacts to the message with an emoji + # Depending on whether value is True or False + # If its True, it'll add a green check mark + # Otherwise, it'll add a red cross mark emoji = "\N{WHITE HEAVY CHECK MARK}" if value else "\N{CROSS MARK}" try: - # this will react to the command author's message + # This will react to the command author's message await self.message.add_reaction(emoji) except discord.HTTPException: - # sometimes errors occur during this, for example - # maybe you don't have permission to do that - # we don't mind, so we can just ignore them + # Sometimes errors occur during this, for example + # Maybe you don't have permission to do that + # We don't mind, so we can just ignore them pass class MyBot(commands.Bot): async def get_context(self, message, *, cls=MyContext): - # when you override this method, you pass your new Context - # subclass to the super() method, which tells the bot to - # use the new MyContext class + # When you override this method, you pass your new Context + # Subclass to the super() method, which tells the bot to + # Use the new MyContext class return await super().get_context(message, cls=cls) @@ -35,19 +35,19 @@ async def get_context(self, message, *, cls=MyContext): @bot.command() async def guess(ctx, number: int): """ Guess a random number from 1 to 6. """ - # explained in a previous example, this gives you - # a random number from 1-6 + # Explained in a previous example, this gives you + # A random number from 1-6 value = random.randint(1, 6) - # with your new helper function, you can add a - # green check mark if the guess was correct, - # or a red cross mark if it wasn't + # With your new helper function, you can add a + # Green check mark if the guess was correct, + # Or a red cross mark if it wasn't await ctx.tick(number == value) # IMPORTANT: You shouldn't hard code your token -# these are very important, and leaking them can +# These are very important, and leaking them can # let people do very malicious things with your # bot. Try to use a file or something to keep -# them private, and don't commit it to GitHub +# Them private, and don't commit it to GitHub token = "your token here" bot.run(token) diff --git a/examples/reply.py b/examples/reply.py index 614b8fa77e..113747959d 100644 --- a/examples/reply.py +++ b/examples/reply.py @@ -7,7 +7,7 @@ async def on_ready(self): print("------") async def on_message(self, message): - # we do not want the bot to reply to itself + # We do not want the bot to reply to itself if message.author.id == self.user.id: return diff --git a/examples/secret.py b/examples/secret.py index 7fe600e97d..a2861aa9d8 100644 --- a/examples/secret.py +++ b/examples/secret.py @@ -23,17 +23,17 @@ def create_overwrites(ctx, *objects): of an object, whether it be a `discord.Role` or a `discord.Member`. In this case, the `view_channel` permission is being used to hide the channel - from being viewed by whoever does not meet the criteria, thus creating a + From being viewed by whoever does not meet the criteria, thus creating a secret channel. """ - # a dict comprehension is being utilised here to set the same permission overwrites - # for each `discord.Role` or `discord.Member`. + # A dict comprehension is being utilised here to set the same permission overwrites + # For each `discord.Role` or `discord.Member`. overwrites = { obj: discord.PermissionOverwrite(view_channel=True) for obj in objects } - # prevents the default role (@everyone) from viewing the channel + # Prevents the default role (@everyone) from viewing the channel # if it isn't already allowed to view the channel. overwrites.setdefault( ctx.guild.default_role, discord.PermissionOverwrite(view_channel=False) From 6cec05ce1c0afc5535e70dfb65447da11c8c0272 Mon Sep 17 00:00:00 2001 From: Vincent <82736662+RPSMain@users.noreply.github.com> Date: Wed, 8 Dec 2021 16:49:44 +0800 Subject: [PATCH 119/180] Fix Capitalization --- examples/secret.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/examples/secret.py b/examples/secret.py index a2861aa9d8..48ba2c2392 100644 --- a/examples/secret.py +++ b/examples/secret.py @@ -39,14 +39,14 @@ def create_overwrites(ctx, *objects): ctx.guild.default_role, discord.PermissionOverwrite(view_channel=False) ) - # makes sure the client is always allowed to view the channel. + # Makes sure the client is always allowed to view the channel. overwrites[ctx.guild.me] = discord.PermissionOverwrite(view_channel=True) return overwrites -# since these commands rely on guild related features, -# it is best to lock it to be guild-only. +# Since these commands rely on guild related features, +# It is best to lock it to be guild-only. @secret.command() @commands.guild_only() async def text( @@ -95,11 +95,11 @@ async def emoji( are allowed to use. """ - # fetch the emoji asset and read it as bytes. + # Fetch the emoji asset and read it as bytes. emoji_bytes = await emoji.read() - # the key parameter here is `roles`, which controls - # what roles are able to use the emoji. + # The key parameter here is `roles`, which controls + # What roles are able to use the emoji. await ctx.guild.create_custom_emoji( name=emoji.name, image=emoji_bytes, roles=roles, reason="Very secret business." ) From 1e9f8256201a21a8393004e4986145a10b867d10 Mon Sep 17 00:00:00 2001 From: Vincent <82736662+RPSMain@users.noreply.github.com> Date: Wed, 8 Dec 2021 16:50:29 +0800 Subject: [PATCH 120/180] Fix Capitalization --- examples/views/button_roles.py | 22 +++++++++++----------- 1 file changed, 11 insertions(+), 11 deletions(-) diff --git a/examples/views/button_roles.py b/examples/views/button_roles.py index 309fdc8719..180ad0fc24 100644 --- a/examples/views/button_roles.py +++ b/examples/views/button_roles.py @@ -11,7 +11,7 @@ Make sure to load this cog when your bot starts! """ -# this is the list of role IDs that will be added as buttons. +# This is the list of role IDs that will be added as buttons. role_ids = [...] @@ -32,24 +32,24 @@ async def callback(self, interaction: discord.Interaction): The interaction object that was created when the user clicked on the button """ - # figure out who clicked the button + # Figure out who clicked the button user = interaction.user - # get the role this button is for (stored in the custom ID) + # Get the role this button is for (stored in the custom ID) role = interaction.guild.get_role(int(self.custom_id)) if role is None: - # if this role doesn't exist, ignore - # you can do some error handling here + # If this role doesn't exist, ignore + # You can do some error handling here return - # passed all checks - # add the role and send a response to the uesr ephemerally (hidden to other users) + # Passed all checks + # Add the role and send a response to the uesr ephemerally (hidden to other users) if role not in user.roles: - # give the user the role if they don't already have it + # Give the user the role if they don't already have it await user.add_roles(role) await interaction.response.send_message(f"🎉 You have been given the role {role.mention}", ephemeral=True) else: - # else, take the role from the user + # Else, Take the role from the user await user.remove_roles(role) await interaction.response.send_message(f"❌ The {role.mention} role has been taken from you", ephemeral=True) @@ -62,13 +62,13 @@ class ButtonRoleCog(commands.Cog): def __init__(self, bot): self.bot = bot - # make sure to set the guild ID here to whatever server you want the buttons in + # Make sure to set the guild ID here to whatever server you want the buttons in @slash_command(guild_ids=[...], description="Post the button role message") async def post(self, ctx: commands.Context): """Slash command to post a new view with a button for each role """ - # timeout is None because we want this view to be persistent + # Timeout is None because we want this view to be persistent view = discord.ui.View(timeout=None) # loop through the list of roles and add a new button to the view for each role From 2a1b760cd9439bb139a44136886a46b71a6c7216 Mon Sep 17 00:00:00 2001 From: Vincent <82736662+RPSMain@users.noreply.github.com> Date: Wed, 8 Dec 2021 16:51:04 +0800 Subject: [PATCH 121/180] Fix Capitalization --- examples/views/button_roles.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/views/button_roles.py b/examples/views/button_roles.py index 180ad0fc24..5e8eba0e25 100644 --- a/examples/views/button_roles.py +++ b/examples/views/button_roles.py @@ -73,7 +73,7 @@ async def post(self, ctx: commands.Context): # loop through the list of roles and add a new button to the view for each role for role_id in role_ids: - # get the role the guild by ID + # Get the role the guild by ID role = ctx.guild.get_role(role_id) view.add_item(RoleButton(role)) @@ -86,15 +86,15 @@ async def on_ready(self): it will be loaded and the bot will start watching for button clicks again. """ - # we recreate the view as we did in the /post command + # We recreate the view as we did in the /post command view = discord.ui.View(timeout=None) - # make sure to set the guild ID here to whatever server you want the buttons in + # Make sure to set the guild ID here to whatever server you want the buttons in guild = self.bot.get_guild(...) for role_id in role_ids: role = guild.get_role(role_id) view.add_item(RoleButton(role)) - # add the view to the bot so it will watch for button interactions + # Add the view to the bot so it will watch for button interactions self.bot.add_view(view) From 788130f581ba582d3a47679e01903a342bf7d4ed Mon Sep 17 00:00:00 2001 From: Vincent <82736662+RPSMain@users.noreply.github.com> Date: Wed, 8 Dec 2021 16:51:26 +0800 Subject: [PATCH 122/180] Fix Capitalization --- examples/views/confirm.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/views/confirm.py b/examples/views/confirm.py index fb2df2f28f..19a2c171db 100644 --- a/examples/views/confirm.py +++ b/examples/views/confirm.py @@ -19,7 +19,7 @@ def __init__(self): self.value = None # When the confirm button is pressed, set the inner value to `True` and - # stop the View from listening to more input. + # Stop the View from listening to more input. # We also send the user an ephemeral message that we're confirming their choice. @discord.ui.button(label="Confirm", style=discord.ButtonStyle.green) async def confirm( From 64f6a3598bc2eaebad42d085c0a5c90a06805786 Mon Sep 17 00:00:00 2001 From: Vincent <82736662+RPSMain@users.noreply.github.com> Date: Wed, 8 Dec 2021 16:51:52 +0800 Subject: [PATCH 123/180] Fix NOTE Capitalization --- examples/views/counter.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/views/counter.py b/examples/views/counter.py index ed6707374c..bec8794041 100644 --- a/examples/views/counter.py +++ b/examples/views/counter.py @@ -18,7 +18,7 @@ class Counter(discord.ui.View): # Define the actual button # When pressed, this increments the number displayed until it hits 5. # When it hits 5, the counter button is disabled and it turns green. - # note: The name of the function does not matter to the library + # NOTE: The name of the function does not matter to the library @discord.ui.button(label="0", style=discord.ButtonStyle.red) async def count(self, button: discord.ui.Button, interaction: discord.Interaction): number = int(button.label) if button.label else 0 From 55883c6d487c8ebd74281447de4de1102741f0a1 Mon Sep 17 00:00:00 2001 From: Vincent <82736662+RPSMain@users.noreply.github.com> Date: Wed, 8 Dec 2021 16:52:23 +0800 Subject: [PATCH 124/180] Fix Capitalization --- examples/views/dropdown.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/views/dropdown.py b/examples/views/dropdown.py index 212485daa5..bd5c462d78 100644 --- a/examples/views/dropdown.py +++ b/examples/views/dropdown.py @@ -4,8 +4,8 @@ from discord.ext import commands # Defines a custom Select containing colour options -# that the user can choose. The callback function -# of this class is called when the user changes their choice +# That the user can choose. The callback function +# Of this class is called when the user changes their choice class Dropdown(discord.ui.Select): def __init__(self): @@ -34,7 +34,7 @@ def __init__(self): async def callback(self, interaction: discord.Interaction): # Use the interaction object to send a response message containing - # the user's favourite colour or choice. The self object refers to the + # The user's favourite colour or choice. The self object refers to the # Select object, and the values attribute gets a list of the user's # selected options. We only want the first one. await interaction.response.send_message( From 3743bb1596f424365d255aed3606459aea036f2b Mon Sep 17 00:00:00 2001 From: Vincent <82736662+RPSMain@users.noreply.github.com> Date: Wed, 8 Dec 2021 16:52:44 +0800 Subject: [PATCH 125/180] Fix Capitalization --- examples/views/ephemeral.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/views/ephemeral.py b/examples/views/ephemeral.py index 003888694a..665d11ab6e 100644 --- a/examples/views/ephemeral.py +++ b/examples/views/ephemeral.py @@ -18,7 +18,7 @@ class Counter(discord.ui.View): # Define the actual button # When pressed, this increments the number displayed until it hits 5. # When it hits 5, the counter button is disabled and it turns green. - # note: The name of the function does not matter to the library + # NOTE: The name of the function does not matter to the library @discord.ui.button(label="0", style=discord.ButtonStyle.red) async def count(self, button: discord.ui.Button, interaction: discord.Interaction): number = int(button.label) if button.label else 0 From 1bcdb1839579f99dac4b2c65b105eb6c49c70185 Mon Sep 17 00:00:00 2001 From: Vincent <82736662+RPSMain@users.noreply.github.com> Date: Wed, 8 Dec 2021 16:56:39 +0800 Subject: [PATCH 126/180] Remove Image Load --- docs/conf.py | 10 +++++----- docs/guide/misc/image_load.rst | 30 ------------------------------ 2 files changed, 5 insertions(+), 35 deletions(-) delete mode 100644 docs/guide/misc/image_load.rst diff --git a/docs/conf.py b/docs/conf.py index 6da5f038ef..b167f2a100 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -306,7 +306,7 @@ # (source start file, target name, title, # author, documentclass [howto, manual, or own class]). latex_documents = [ - ("index", "pycord.tex", "pycord Documentation", "Pycord Development", "manual"), + ("index", "Pycord.tex", "Pycord Documentation", "Pycord Development", "manual"), ] # The name of an image file (relative to this directory) to place at the top of @@ -334,7 +334,7 @@ # One entry per manual page. List of tuples # (source start file, name, description, authors, manual section). -man_pages = [("index", "pycord", "pycord Documentation", ["Pycord Development"], 1)] +man_pages = [("index", "Pycord", "Pycord Documentation", ["Pycord Development"], 1)] # If true, show URL addresses after external links. # man_show_urls = False @@ -348,10 +348,10 @@ texinfo_documents = [ ( "index", - "pycord", - "pycord Documentation", + "Pycord", + "Pycord Documentation", "Pycord Development", - "pycord", + "Pycord", "One line description of project.", "Miscellaneous", ), diff --git a/docs/guide/misc/image_load.rst b/docs/guide/misc/image_load.rst deleted file mode 100644 index f4d0b6cbda..0000000000 --- a/docs/guide/misc/image_load.rst +++ /dev/null @@ -1,30 +0,0 @@ -Used To Load images -=================== -In Markdown - -.. image:: /images/guide/message_command.png - :alt: Message Command Image - -.. image:: /images/guide/user_command.png - :alt: User Command Image - -.. image:: /images/discord_oauth2_scope.png - :alt: The scopes checkbox with "bot" ticked. - -.. image:: /images/discord_oauth2_perms.png - :alt: The permission checkboxes with some permissions checked. - -.. image:: /images/discord_bot_user_options.png - :alt: How the Bot User options should look like for most people. - -.. image:: /images/discord_create_app_form.png - :alt: The new application form filled in. - -.. image:: /images/discord_create_bot_user.png - :alt: The Add Bot button. - -.. image:: /images/discord_create_app_form.png - :alt: The new application form filled in. - -.. image:: /images/discord_create_app_button.png - :alt: The new application button. \ No newline at end of file From a988c9f025e3831a098304b558fb3f12cf4635f2 Mon Sep 17 00:00:00 2001 From: Vincent <82736662+RPSMain@users.noreply.github.com> Date: Wed, 8 Dec 2021 17:01:25 +0800 Subject: [PATCH 127/180] Typo --- docs/whats_new.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/whats_new.rst b/docs/whats_new.rst index 0233b30f64..c05e5c37c8 100644 --- a/docs/whats_new.rst +++ b/docs/whats_new.rst @@ -16,7 +16,7 @@ in specific versions. v2.0.0 ------ -The changeset for this version are too big to be listed here, for more information please +The changeset for this version is too big to be listed here, for more information please see :ref:`the migrating page `. From c89997e9f1df4877a8f36a3ef0f346abdacb4277 Mon Sep 17 00:00:00 2001 From: Vincent <82736662+RPSMain@users.noreply.github.com> Date: Wed, 8 Dec 2021 17:06:45 +0800 Subject: [PATCH 128/180] Adding Tips To Guide --- docs/guide/index.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/docs/guide/index.md b/docs/guide/index.md index d924e3b97d..4fc025c0a1 100644 --- a/docs/guide/index.md +++ b/docs/guide/index.md @@ -1,6 +1,11 @@ # Guide The Official Guide For Pycord +# Quick Tip +Pycord comes with automatic generation of files using your command prompt. + +Example some commands you can use: + ## Before you begin... Pycord has a lot of features which would be too advanced for a person just starting out with python, We would suggest you get the basic knowledge of Python before starting there is a lot of tutorials to follow and we would suggest you start off with small projects then get bigger as you progress. From 07881bfda9db9e85957b7a2005e71176bdb38a3d Mon Sep 17 00:00:00 2001 From: Vincent <82736662+RPSMain@users.noreply.github.com> Date: Wed, 8 Dec 2021 17:18:59 +0800 Subject: [PATCH 129/180] Document CMD Prompt Stuff --- docs/guide/index.md | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) diff --git a/docs/guide/index.md b/docs/guide/index.md index 4fc025c0a1..46aef18b8d 100644 --- a/docs/guide/index.md +++ b/docs/guide/index.md @@ -6,6 +6,32 @@ Pycord comes with automatic generation of files using your command prompt. Example some commands you can use: +``python -m py-cord newbot (args)`` + +#### Args: + +- name + - Your Project Name +- --sharded + - If your bot should be sharded or not +- --prefix + - Your Bot Prefix + +``python -m py-cord newcog (args)`` + +#### Args: + +- name + - The name of your Cog +- --full + - Get Full Features Of Cogs + +- directory + - Cogs Directory + +- --class-name + - Name of Your Cog Class + ## Before you begin... Pycord has a lot of features which would be too advanced for a person just starting out with python, We would suggest you get the basic knowledge of Python before starting there is a lot of tutorials to follow and we would suggest you start off with small projects then get bigger as you progress. From 9f2cc5eb050edbec68ce3069c8223fdb0c32042d Mon Sep 17 00:00:00 2001 From: Vincent <82736662+RPSMain@users.noreply.github.com> Date: Wed, 8 Dec 2021 17:19:58 +0800 Subject: [PATCH 130/180] Looks Better --- docs/guide/index.md | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/guide/index.md b/docs/guide/index.md index 46aef18b8d..9010fcb65c 100644 --- a/docs/guide/index.md +++ b/docs/guide/index.md @@ -23,11 +23,12 @@ Example some commands you can use: - name - The name of your Cog -- --full - - Get Full Features Of Cogs - directory - - Cogs Directory + - Cogs Directory + +- --full + - Get Full Features Of Cogs - --class-name - Name of Your Cog Class From 1029b9fec4d80648b6ed9561e012b3a8058b19cb Mon Sep 17 00:00:00 2001 From: RPS <82736662+RPSMain@users.noreply.github.com> Date: Fri, 10 Dec 2021 02:30:22 -0800 Subject: [PATCH 131/180] Fix --- docs/guide/interactions/select_views.md | 3 --- 1 file changed, 3 deletions(-) diff --git a/docs/guide/interactions/select_views.md b/docs/guide/interactions/select_views.md index 48b2562c4b..990bb09ebc 100644 --- a/docs/guide/interactions/select_views.md +++ b/docs/guide/interactions/select_views.md @@ -50,6 +50,3 @@ async def my_command_name(ctx): And that's it that is all of selects in Pycord! We hope you learn't how to make selects or advanced your knowledge to with this. - - -### How to disable a select From eeb9a488f04430bd66f2ef2987b1e1ad0dd5189f Mon Sep 17 00:00:00 2001 From: Lala Sabathil Date: Mon, 13 Dec 2021 06:35:53 +0100 Subject: [PATCH 132/180] Apply suggestions from code review Co-authored-by: Vincent Co-authored-by: krittick --- examples/app_commands/Info.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/examples/app_commands/Info.py b/examples/app_commands/Info.py index 42e521df07..0d5a9161c0 100644 --- a/examples/app_commands/Info.py +++ b/examples/app_commands/Info.py @@ -8,18 +8,17 @@ messages=True, ) -bot = commands.Bot(command_prefix=".", description="An example to showcase how to extract info about users",intents=intents) +bot = commands.Bot(command_prefix="/", description="An example to showcase how to extract info about users",intents=intents) @bot.slash_command(name="userinfo", description="gets the info of a user") async def info(ctx, user: discord.Member = None): user = user or ctx.author #if no user is provided it'll use the the author of the message e = discord.Embed() e.set_author(name=user.name) - e.add_field(name='ID', value=user.id, inline=False) # user ID + e.add_field(name="ID", value=user.id, inline=False) # user ID e.add_field(name='Joined', value=f"", inline=False) # When the user joined the server - e.add_field(name='Created', - value=f"", inline=False) # When the user's account was created + e.add_field(name="Created", value=discord.utils.format_dt(round(user.created_at.timestamp()), "F"), inline=False) # When the user's account was created colour = user.colour if colour.value: # if user has a role with a color e.colour = colour @@ -29,4 +28,4 @@ async def info(ctx, user: discord.Member = None): await ctx.respond(embed=e) # sends the embed -bot.run("urtoken") +bot.run("your token") From c99dbcffda7ece9a92624b8030da0656ab540eb9 Mon Sep 17 00:00:00 2001 From: Lala Sabathil Date: Mon, 13 Dec 2021 06:35:58 +0100 Subject: [PATCH 133/180] Update examples/app_commands/Info.py Co-authored-by: krittick --- examples/app_commands/Info.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/examples/app_commands/Info.py b/examples/app_commands/Info.py index 0d5a9161c0..1724a39010 100644 --- a/examples/app_commands/Info.py +++ b/examples/app_commands/Info.py @@ -16,8 +16,7 @@ async def info(ctx, user: discord.Member = None): e = discord.Embed() e.set_author(name=user.name) e.add_field(name="ID", value=user.id, inline=False) # user ID - e.add_field(name='Joined', - value=f"", inline=False) # When the user joined the server + e.add_field(name="Joined", value=discord.utils.format_dt(round(user.joined_at.timestamp()), "F"), inline=False) # When the user joined the server e.add_field(name="Created", value=discord.utils.format_dt(round(user.created_at.timestamp()), "F"), inline=False) # When the user's account was created colour = user.colour if colour.value: # if user has a role with a color From 1ba9ff44f8691b469d1c6cac55891c71c8c56da8 Mon Sep 17 00:00:00 2001 From: Vincent Date: Sun, 12 Dec 2021 22:46:15 -0800 Subject: [PATCH 134/180] make this easier to see --- docs/guide/index.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/guide/index.md b/docs/guide/index.md index 9010fcb65c..67b2edf736 100644 --- a/docs/guide/index.md +++ b/docs/guide/index.md @@ -6,7 +6,7 @@ Pycord comes with automatic generation of files using your command prompt. Example some commands you can use: -``python -m py-cord newbot (args)`` +## ``python -m py-cord newbot (args)`` #### Args: @@ -17,7 +17,7 @@ Example some commands you can use: - --prefix - Your Bot Prefix -``python -m py-cord newcog (args)`` +## ``python -m py-cord newcog (args)`` #### Args: @@ -67,4 +67,4 @@ This list **doesn't** fully cover everything you should know before using Pycord :doc:`misc/logging` ``` - \ No newline at end of file + From 9ac90f63c3e185e8b4dcd78a7b0960d88dca0836 Mon Sep 17 00:00:00 2001 From: Vincent Date: Sun, 12 Dec 2021 22:48:45 -0800 Subject: [PATCH 135/180] wut --- docs/conf.py | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/docs/conf.py b/docs/conf.py index b167f2a100..e7017bf440 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -76,23 +76,6 @@ '.md': 'markdown', # Used ONLY In the Guide For Faster Making Time } -# MyST Parser Extensions For Custom MarkDown Syntax -# https://myst-parser.readthedocs.io/en/latest/syntax/optional.html -myst_enable_extensions = [ - "amsmath", - "colon_fence", - "deflist", - "dollarmath", - "fieldlist", - "html_admonition", - "html_image", - "linkify", - "replacements", - "smartquotes", - "substitution", - "tasklist", -] - # The encoding of source files. # source_encoding = 'utf-8-sig' From a9559c4da61df7acd4eac878aac5cfd36a2b52c7 Mon Sep 17 00:00:00 2001 From: Empathy <84625385+EmpathyYT@users.noreply.github.com> Date: Tue, 14 Dec 2021 11:16:49 +0200 Subject: [PATCH 136/180] Update and rename Info.py to info.py --- examples/app_commands/{Info.py => info.py} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename examples/app_commands/{Info.py => info.py} (94%) diff --git a/examples/app_commands/Info.py b/examples/app_commands/info.py similarity index 94% rename from examples/app_commands/Info.py rename to examples/app_commands/info.py index 1724a39010..6c109995fb 100644 --- a/examples/app_commands/Info.py +++ b/examples/app_commands/info.py @@ -23,7 +23,7 @@ async def info(ctx, user: discord.Member = None): e.colour = colour if isinstance(user, discord.User): # checks if the user in the server - e.set_footer(text='This member is not in this server.') + e.set_footer(text="This member is not in this server.") await ctx.respond(embed=e) # sends the embed From 0395fba6987a536408ba47bfc63880ace8000cb4 Mon Sep 17 00:00:00 2001 From: Vincent Date: Wed, 15 Dec 2021 15:25:17 +0800 Subject: [PATCH 137/180] Document Slash Groups --- .gitignore | 1 + docs/application_commands.rst | 26 ++++++++++++++++++++++++++ 2 files changed, 27 insertions(+) diff --git a/.gitignore b/.gitignore index 76b61944ff..358d667051 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,4 @@ docs/crowdin.py .idea/ .vs/slnx.sqlite env/ +.vs/ diff --git a/docs/application_commands.rst b/docs/application_commands.rst index 33800738bc..782e8b7f3b 100644 --- a/docs/application_commands.rst +++ b/docs/application_commands.rst @@ -94,3 +94,29 @@ All option fields can be set using :class:`.Option` as the type of the argument. color: Option(str, "Your color choice", choices=["red", "green"], required=False) ): # command code + +Slash Command Groups +-------------------- + +To get started with slash command groups you should firstly define your command group! + +.. code-block:: python3 + + py_list = bot.command_group() + +We are defining the ``py_list`` phrase to bot.command_group, Once you have done this make sure to then make the group +inside your defined phrase: + +.. code-block:: python3 + + "python_versions_list", "A List of commands showing python versions" + +Now that you have defined your command group you can actually make the commands, This isn't too hard in anyway shape or form. + +.. code-block:: python3 + + @py_list.command(guild_ids=[]) + +The example shown above is what every command should look like ``my_list_name.command()`` + +and everything from here should be self explanitory and the same as normal application commands. \ No newline at end of file From 65b427662e86a9efdb3a082a88708150b47641cc Mon Sep 17 00:00:00 2001 From: Vincent Date: Wed, 15 Dec 2021 15:26:23 +0800 Subject: [PATCH 138/180] Fix --- .gitignore | 1 - 1 file changed, 1 deletion(-) diff --git a/.gitignore b/.gitignore index 358d667051..76fc61303a 100644 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,5 @@ docs/crowdin.py *.flac *.mo .idea/ -.vs/slnx.sqlite env/ .vs/ From 6e58d07cdd4dae4d7ca6ab7e2a64d04f5ea8bcc1 Mon Sep 17 00:00:00 2001 From: Vincent Date: Wed, 15 Dec 2021 17:04:49 +0800 Subject: [PATCH 139/180] Grammar --- docs/application_commands.rst | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/docs/application_commands.rst b/docs/application_commands.rst index 782e8b7f3b..78c7e104c6 100644 --- a/docs/application_commands.rst +++ b/docs/application_commands.rst @@ -5,7 +5,7 @@ .. _application_commands: Application Commands -===================== +==================== Application commands are commands that an application can register to Discord. They provide users a way of interacting directly with your application that feels deeply integrated into Discord. @@ -30,6 +30,11 @@ Application commands can be used with either :class:`.Bot` or :class:`.ext.comma async def foo(ctx, arg): await ctx.respond(arg) +How to use Application Commands in a Cog +---------------------------------------- + +This is gonna be a short + Application Command Types ------------------------- @@ -98,7 +103,7 @@ All option fields can be set using :class:`.Option` as the type of the argument. Slash Command Groups -------------------- -To get started with slash command groups you should firstly define your command group! +To get started with using slash command groups you should firstly define your command group. .. code-block:: python3 From c782b857e7ae71ef831dfedb524bf505f23b2651 Mon Sep 17 00:00:00 2001 From: Vincent Date: Sat, 18 Dec 2021 14:19:04 +0800 Subject: [PATCH 140/180] Make less of a guide --- docs/application_commands.rst | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/docs/application_commands.rst b/docs/application_commands.rst index 78c7e104c6..d665ab5825 100644 --- a/docs/application_commands.rst +++ b/docs/application_commands.rst @@ -103,25 +103,22 @@ All option fields can be set using :class:`.Option` as the type of the argument. Slash Command Groups -------------------- -To get started with using slash command groups you should firstly define your command group. +Slash Command groups allow for the creation of multiple commands under the same command. + +All available options are listed at :class:`.Bot.create_group`. .. code-block:: python3 - py_list = bot.command_group() + foo = bot.create_group() -We are defining the ``py_list`` phrase to bot.command_group, Once you have done this make sure to then make the group -inside your defined phrase: +Only 2 options are allowed to be parsed in, your name and description. .. code-block:: python3 - "python_versions_list", "A List of commands showing python versions" + "foo", "bar" -Now that you have defined your command group you can actually make the commands, This isn't too hard in anyway shape or form. +Now your will want to use :class:`.command` with your list name, Full list of options and type hints are on :class:`Bot.slash_command`. .. code-block:: python3 - @py_list.command(guild_ids=[]) - -The example shown above is what every command should look like ``my_list_name.command()`` - -and everything from here should be self explanitory and the same as normal application commands. \ No newline at end of file + @foo.command(guild_ids=[]) \ No newline at end of file From 3463f1ea1375c196a7ab14f2c2ca8d024359dd86 Mon Sep 17 00:00:00 2001 From: Vincent Date: Sat, 18 Dec 2021 14:23:12 +0800 Subject: [PATCH 141/180] Some Stuff i am not confident to say adding a type hint thingy lmao --- docs/application_commands.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/application_commands.rst b/docs/application_commands.rst index d665ab5825..9c3d4a4038 100644 --- a/docs/application_commands.rst +++ b/docs/application_commands.rst @@ -121,4 +121,4 @@ Now your will want to use :class:`.command` with your list name, Full list of op .. code-block:: python3 - @foo.command(guild_ids=[]) \ No newline at end of file + @foo.command(guild_ids=[], foo: int, bar) \ No newline at end of file From 3e5ff39ba3d1b7961740f505bb047c13798289c4 Mon Sep 17 00:00:00 2001 From: QiCuiHub Date: Tue, 21 Dec 2021 18:21:52 -0500 Subject: [PATCH 142/180] update Inviting Your Bot instructions --- docs/discord.rst | 4 ++-- docs/images/discord_oauth2.png | Bin 29649 -> 5032 bytes docs/images/discord_oauth2_perms.png | Bin 52706 -> 95390 bytes docs/images/discord_oauth2_scope.png | Bin 31714 -> 39469 bytes 4 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/discord.rst b/docs/discord.rst index ac12417f0f..06640b7c80 100644 --- a/docs/discord.rst +++ b/docs/discord.rst @@ -66,10 +66,10 @@ If you want to invite your bot you must create an invite URL for it. 1. Make sure you're logged on to the `Discord website `_. 2. Navigate to the `application page `_ 3. Click on your bot's page. -4. Go to the "OAuth2" tab. +4. Expand the "OAuth2" tab and click on "URL Generator". .. image:: /images/discord_oauth2.png - :alt: How the OAuth2 page should look like. + :alt: How the OAuth2 tab should look like. 5. Tick the "bot" checkbox under "scopes". diff --git a/docs/images/discord_oauth2.png b/docs/images/discord_oauth2.png index f32fcc7b0ec8bf83d87a830e8dcf04968e36bfa7..be30caf5cc5a5e507447e54bbf39ea2ac901fa41 100644 GIT binary patch literal 5032 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 oeC4-Q9Pd_uJb4wzifkV5T@V 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 )9dT=4! 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
_w8vkErOG2 zK?EzZOFh;ZN0+4l?>!`}iPv&{Yp_A*{q=cXGn&}?iz1W8j(zf7@aUulQ;h3NSlX1@ zdRikmh%(Ouy|G~Lw~{ZK^Y0(o%lWnncPcT*JG0ybQ_Ev9dSVgnknA4UQ zR;!xJ>=Ez1h_~>bP)mvf%5FaLEt*aE!^b| zk5J}QWf0}JGtbY0OFV&pRc<|d=$@qIHV_|mnm3^xvr&8-!RN=7+_FD%!fSKL$GhT? zNfZi7>5~T|YQh*FhK(^}&Z|QxI*Y66Dse-s!jlj`?Mi0^B*mm!q|}5_?L#Z_Gof-n zkS|S%7NbC<7z=1>X(m zF+%Kr_EM&d0Pseyyjo~0Qx{>z?C|V4&W>IZK;K{AXE_ai!*h__R6j?QiMeU+=+-V2 zHYCDVg<+LkSe%)qym)`ZjitR+)?F~s^)&&4;MSpLF{nU@pJDx5U|}~x3C&`+W{sWM z)PJGY5%Or~S!16AEbqtTZTPE!W}SzG`}B&)yO+k=wr#%}*sKyL*({Ez3{2=?G-SZ= zOou9aD$>tA%e~$_0lT+bhW*~=@en4vbU=v2QJppZ^;;1)CEi4x1}(KfsEY+=;)LI1 z4~le&ps2-!NZfIKVu)a4MUbwcgMz0bYd8UuLnQhpw4U9A#8+2Q5=BD61G+Z3cSN)D zzJWOPHK|XH2(n0kk5-g!F8E|D(e2jQOz`#8mUkQZJ>g`JSV9&#dArD{lav`>Ypx`?G4T%y4hXkd@pHq;$o~AgUehb31ZnuNk*-=zV@qQi z=DK*J((mTqO~x@4C(=g1(ctcDE`vFp7q9!~F5D?5r7C7@%QStTOio18rj$$WaSq^e zgCg=u!t^I9&1NV@El~EA?ONNTUu7o8aP$%`cj|B43cDEYUiY6+a}KnuFi2IWCxaKv zzevwH&@#&S7p@p+DUOQPqm!C*0@%f{ov|6L=j&%|R^aq6Ql4_g#@pRJbgSiZ9_w?- zc7I`&0R@Be?TU_Zc7IsriUtSBn3@etke4Qzc?Yi54WUJ6N291+obhq;=g$zAO9KIe z!AKw5*E?8u;I@~)^bdfzHn##-&i`lH3S_BY`bN&U(eA&rYQyIXFzEe(bpi1g{sH{! Bt)~D0 literal 52706 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 diff --git a/docs/images/discord_oauth2_scope.png b/docs/images/discord_oauth2_scope.png index 9e2cdeff0760f6f498a0743e5acf0b4aad9860c4..4368e9cf5ab56c05ffdd3f863f221eda48dbf957 100644 GIT binary patch literal 39469 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 SfqTvv7(8A5T-G@yGywnzh9RK< literal 31714 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

cgG~wgRF%?yCr@?ZyF>(gyDD69 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 Date: Wed, 22 Dec 2021 15:12:22 +0100 Subject: [PATCH 143/180] Fix docs --- docs/application_commands.rst | 10 ++++------ docs/discord.rst | 4 ++-- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/docs/application_commands.rst b/docs/application_commands.rst index 9c3d4a4038..d5166d6718 100644 --- a/docs/application_commands.rst +++ b/docs/application_commands.rst @@ -33,8 +33,6 @@ Application commands can be used with either :class:`.Bot` or :class:`.ext.comma How to use Application Commands in a Cog ---------------------------------------- -This is gonna be a short - Application Command Types ------------------------- @@ -87,7 +85,7 @@ Typehints can be used to set option types. All option types are listed under :cl async def foo(ctx, number: int, member: discord.Member): # command code -All option fields can be set using :class:`.Option` as the type of the argument. +Option fields can be set using :class:`.Option` as the type of the argument. .. code-block:: python3 @@ -103,7 +101,7 @@ All option fields can be set using :class:`.Option` as the type of the argument. Slash Command Groups -------------------- -Slash Command groups allow for the creation of multiple commands under the same command. +Slash Command Groups allows for the creation of multiple subcommands grouped under the same command. All available options are listed at :class:`.Bot.create_group`. @@ -111,13 +109,13 @@ All available options are listed at :class:`.Bot.create_group`. foo = bot.create_group() -Only 2 options are allowed to be parsed in, your name and description. +Options take two arguments, which are name and description. .. code-block:: python3 "foo", "bar" -Now your will want to use :class:`.command` with your list name, Full list of options and type hints are on :class:`Bot.slash_command`. +Now your will want to use :class:`.command` with your list name, Full list of options and type hints are on :class:`.Bot.slash_command`. .. code-block:: python3 diff --git a/docs/discord.rst b/docs/discord.rst index ac12417f0f..b7955ae0e2 100644 --- a/docs/discord.rst +++ b/docs/discord.rst @@ -3,7 +3,7 @@ .. _discord-intro: Creating a Bot Account -======================== +====================== In order to work with the library and the Discord API in general, we must first create a Discord Bot account. @@ -57,7 +57,7 @@ And that's it. You now have a bot account and you can login with that token. .. _discord_invite_bot: Inviting Your Bot -------------------- +----------------- So you've made a Bot User but it's not actually in any server. From 3e628b30987e0508a4d27db6109f924e22690994 Mon Sep 17 00:00:00 2001 From: Lala Sabathil Date: Wed, 22 Dec 2021 15:36:56 +0100 Subject: [PATCH 144/180] fix scope --- docs/discord.rst | 4 ++-- docs/images/discord_oauth2_scope.png | Bin 39469 -> 36715 bytes 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/discord.rst b/docs/discord.rst index 50dcddacce..4784806bec 100644 --- a/docs/discord.rst +++ b/docs/discord.rst @@ -71,10 +71,10 @@ If you want to invite your bot you must create an invite URL for it. .. image:: /images/discord_oauth2.png :alt: How the OAuth2 tab should look like. -5. Tick the "bot" checkbox under "scopes". +5. Tick the "bot" and "applications.commands" checkboxes under "scopes". .. image:: /images/discord_oauth2_scope.png - :alt: The scopes checkbox with "bot" ticked. + :alt: The scopes checkbox with "bot" and "applications.commands" ticked. 6. Tick the permissions required for your bot to function under "Bot Permissions". diff --git a/docs/images/discord_oauth2_scope.png b/docs/images/discord_oauth2_scope.png index 4368e9cf5ab56c05ffdd3f863f221eda48dbf957..3ce1e6261858f5186a898f4e90be0379ae403c8a 100644 GIT binary patch literal 36715 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 SfqTvv7(8A5T-G@yGywnzh9RK< From 237cfd415e4654e19feff587e2f23f52bacb8a75 Mon Sep 17 00:00:00 2001 From: Lala Sabathil Date: Wed, 22 Dec 2021 15:44:28 +0100 Subject: [PATCH 145/180] Added note that activity bots won't be verified --- docs/api.rst | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/api.rst b/docs/api.rst index 0cb83fa430..19bdacd3c6 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -2747,7 +2747,9 @@ of :class:`enum.Enum`. .. attribute:: embedded_application - A stream invite that targets an embedded application. + A invite that targets an embedded application. + + Note that your bot wont be verified if you provide users access to this .. class:: VideoQualityMode From c4bd0cbdc619a63aa33eb31e7e4fa2cc1db8ce0d Mon Sep 17 00:00:00 2001 From: Lala Sabathil Date: Wed, 22 Dec 2021 15:54:31 +0100 Subject: [PATCH 146/180] Fix spelling --- docs/api.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/api.rst b/docs/api.rst index 19bdacd3c6..430d2a2771 100644 --- a/docs/api.rst +++ b/docs/api.rst @@ -2749,7 +2749,7 @@ of :class:`enum.Enum`. A invite that targets an embedded application. - Note that your bot wont be verified if you provide users access to this + Note that your bot won't be verified if you provide users access to this .. class:: VideoQualityMode From 8efafe7182049404ad476edde0a4e28aa9fcec7f Mon Sep 17 00:00:00 2001 From: Lala Sabathil Date: Wed, 22 Dec 2021 16:08:44 +0100 Subject: [PATCH 147/180] Add locale and guild locale --- discord/commands/context.py | 8 ++++++++ discord/interactions.py | 8 ++++++++ discord/types/interactions.py | 2 ++ 3 files changed, 18 insertions(+) diff --git a/discord/commands/context.py b/discord/commands/context.py index 0402df33e8..778547f958 100644 --- a/discord/commands/context.py +++ b/discord/commands/context.py @@ -97,6 +97,14 @@ def guild(self) -> Optional[Guild]: def guild_id(self) -> Optional[int]: return self.interaction.guild_id + @cached_property + def locale(self) -> Optional[str]: + return self.interaction.locale + + @cached_property + 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 diff --git a/discord/interactions.py b/discord/interactions.py index fd1c7cbdee..5e7db356b0 100644 --- a/discord/interactions.py +++ b/discord/interactions.py @@ -100,6 +100,10 @@ class Interaction: for 15 minutes. data: :class:`dict` The raw interaction data. + locale: :class:`str` + The users locale. + guild_locale: :class:`str` + The guilds preferred locale, if invoked in a guild. """ __slots__: Tuple[str, ...] = ( @@ -111,6 +115,8 @@ class Interaction: 'application_id', 'message', 'user', + 'locale', + 'guild_locale', 'token', 'version', '_permissions', @@ -137,6 +143,8 @@ def _from_data(self, data: InteractionPayload): self.channel_id: Optional[int] = utils._get_as_snowflake(data, 'channel_id') self.guild_id: Optional[int] = utils._get_as_snowflake(data, 'guild_id') self.application_id: int = int(data['application_id']) + self.locale: Optional[str] = data['locale'] + self.guild_locale: Optional[str] = data['guild_locale'] self.message: Optional[Message] try: diff --git a/discord/types/interactions.py b/discord/types/interactions.py index 1c252d148b..0b117f3b61 100644 --- a/discord/types/interactions.py +++ b/discord/types/interactions.py @@ -186,6 +186,8 @@ class _InteractionOptional(TypedDict, total=False): member: Member user: User message: Message + locale: str + guild_locale: str class Interaction(_InteractionOptional): From 0446ef23a8b42aef97a7f0f25858fa2d7afe9244 Mon Sep 17 00:00:00 2001 From: Lala Sabathil Date: Wed, 22 Dec 2021 16:37:07 +0100 Subject: [PATCH 148/180] change urls --- README.rst | 2 +- setup.py | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/README.rst b/README.rst index 0d815dd67b..7ec730062a 100644 --- a/README.rst +++ b/README.rst @@ -123,7 +123,7 @@ Note: Make sure you do not reveal your bot token to anyone, it can grant access Links ----- -- `Documentation `_ +- `Documentation `_ - `Our Official Discord Server `_ - `Official Discord Developers Server `_ - `Unofficial Discord API Server `_ diff --git a/setup.py b/setup.py index a52f7dca51..992dd6e317 100644 --- a/setup.py +++ b/setup.py @@ -70,9 +70,9 @@ setup( name="py-cord", author="Pycord Development", - url="https://github.com/Pycord-Development/pycord", + url="https://pycord.dev/github", project_urls={ - "Documentation": "https://pycord.readthedocs.io/en/latest/", + "Documentation": "https://docs.pycord.dev/en/latest/", "Issue tracker": "https://github.com/Pycord-Development/pycord/issues", }, version=version, From c2cbade90485b18433cddacd2b2aeb80c3e499bf Mon Sep 17 00:00:00 2001 From: Dorukyum Date: Wed, 22 Dec 2021 18:39:54 +0300 Subject: [PATCH 149/180] Move cogs section to the bottom --- docs/application_commands.rst | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/docs/application_commands.rst b/docs/application_commands.rst index d5166d6718..a872dcc4b1 100644 --- a/docs/application_commands.rst +++ b/docs/application_commands.rst @@ -30,9 +30,6 @@ Application commands can be used with either :class:`.Bot` or :class:`.ext.comma async def foo(ctx, arg): await ctx.respond(arg) -How to use Application Commands in a Cog ----------------------------------------- - Application Command Types ------------------------- @@ -119,4 +116,7 @@ Now your will want to use :class:`.command` with your list name, Full list of op .. code-block:: python3 - @foo.command(guild_ids=[], foo: int, bar) \ No newline at end of file + @foo.command(guild_ids=[], foo: int, bar) + +Using Cogs +---------- \ No newline at end of file From 3ebb6d8fdad201717dc153c127b28c96696c05d0 Mon Sep 17 00:00:00 2001 From: Dorukyum Date: Wed, 22 Dec 2021 18:43:08 +0300 Subject: [PATCH 150/180] Explain group parameters better --- docs/application_commands.rst | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/docs/application_commands.rst b/docs/application_commands.rst index a872dcc4b1..5bedc8cddf 100644 --- a/docs/application_commands.rst +++ b/docs/application_commands.rst @@ -104,13 +104,7 @@ All available options are listed at :class:`.Bot.create_group`. .. code-block:: python3 - foo = bot.create_group() - -Options take two arguments, which are name and description. - -.. code-block:: python3 - - "foo", "bar" + foo = bot.create_group("name", "description") Now your will want to use :class:`.command` with your list name, Full list of options and type hints are on :class:`.Bot.slash_command`. From 45beb87599cfaa58fc16d82ecb215122d0794020 Mon Sep 17 00:00:00 2001 From: Dorukyum Date: Wed, 22 Dec 2021 18:47:00 +0300 Subject: [PATCH 151/180] Explain subcommands better --- docs/application_commands.rst | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/docs/application_commands.rst b/docs/application_commands.rst index 5bedc8cddf..9f94093ad4 100644 --- a/docs/application_commands.rst +++ b/docs/application_commands.rst @@ -106,11 +106,12 @@ All available options are listed at :class:`.Bot.create_group`. foo = bot.create_group("name", "description") -Now your will want to use :class:`.command` with your list name, Full list of options and type hints are on :class:`.Bot.slash_command`. +To create a subcommand, use :meth:`.SlashCommandGroup.command`. .. code-block:: python3 - - @foo.command(guild_ids=[], foo: int, bar) + + @foo.command() + async def bar(ctx): # this will show up as "/foo bar" Using Cogs ---------- \ No newline at end of file From 26c693c3e61bb21f5f919c0bc375a81eef4ea3b5 Mon Sep 17 00:00:00 2001 From: Dorukyum Date: Thu, 23 Dec 2021 12:00:50 +0300 Subject: [PATCH 152/180] Minor changes --- docs/application_commands.rst | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/docs/application_commands.rst b/docs/application_commands.rst index 9f94093ad4..c13ba038ae 100644 --- a/docs/application_commands.rst +++ b/docs/application_commands.rst @@ -91,22 +91,20 @@ Option fields can be set using :class:`.Option` as the type of the argument. @bot.slash_command() async def show_color( ctx, - color: Option(str, "Your color choice", choices=["red", "green"], required=False) + color: Option(str, "Your color choice", choices=["red", "green"]), ): # command code Slash Command Groups -------------------- -Slash Command Groups allows for the creation of multiple subcommands grouped under the same command. - -All available options are listed at :class:`.Bot.create_group`. +Slash command groups allows grouping multiple subcommands under the same parent. .. code-block:: python3 foo = bot.create_group("name", "description") -To create a subcommand, use :meth:`.SlashCommandGroup.command`. +To create a subcommand, use the :meth:`.SlashCommandGroup.command` decorator. .. code-block:: python3 From b48844254d44a52b918d238a4f0ee902c3c2c6fb Mon Sep 17 00:00:00 2001 From: Dorukyum Date: Thu, 23 Dec 2021 12:07:53 +0300 Subject: [PATCH 153/180] Document slash command groups using classes --- docs/application_commands.rst | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/docs/application_commands.rst b/docs/application_commands.rst index c13ba038ae..9f611f7619 100644 --- a/docs/application_commands.rst +++ b/docs/application_commands.rst @@ -102,7 +102,7 @@ Slash command groups allows grouping multiple subcommands under the same parent. .. code-block:: python3 - foo = bot.create_group("name", "description") + my_group = bot.create_group("name", "description") To create a subcommand, use the :meth:`.SlashCommandGroup.command` decorator. @@ -111,5 +111,26 @@ To create a subcommand, use the :meth:`.SlashCommandGroup.command` decorator. @foo.command() async def bar(ctx): # this will show up as "/foo bar" +Slash command groups can also be created by subclassing :class:`.SlashCommandGroup`. + +.. code-block:: python3 + + from discord import SlashCommandGroup, slash_command + + class Foo(SlashCommandGroup): + @slash_command() + async def bar(self, ctx): + ... + + bot.add_application_command(Foo()) + + # or + + @bot.slash_group() + class foo(SlashCommandGroup): + @slash_command() + async def bar(self, ctx): + ... + Using Cogs ---------- \ No newline at end of file From 8c425958b70bfd5f1b711a57d890de45a8328f83 Mon Sep 17 00:00:00 2001 From: Dorukyum Date: Thu, 23 Dec 2021 12:13:13 +0300 Subject: [PATCH 154/180] Document custom converters for options --- docs/application_commands.rst | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/docs/application_commands.rst b/docs/application_commands.rst index 9f611f7619..5a1723602d 100644 --- a/docs/application_commands.rst +++ b/docs/application_commands.rst @@ -95,6 +95,25 @@ Option fields can be set using :class:`.Option` as the type of the argument. ): # command code +Options can also be used with custom converters. + +.. code-block:: python3 + + from discord.ext.commands import Converter + + class ColorConverter(Converter): + async def convert(self, ctx, arg): + if arg == "0": + return "Black" + return arg + + @bot.slash_command() + async def show_color( + ctx, + color: Option(ColorConverter, "Your color choice"), + ): + # command code + Slash Command Groups -------------------- From ccf21a99aa7e199c968766fa9ec885c8236ec677 Mon Sep 17 00:00:00 2001 From: Vincent Date: Mon, 27 Dec 2021 13:29:24 +0800 Subject: [PATCH 155/180] Expand The Guide Way More --- docs/guide/en/databases/index.md | 2 ++ docs/guide/en/ext/commands/checks.md | 3 +++ docs/guide/en/ext/commands/cogs.md | 2 ++ docs/guide/en/ext/commands/index.md | 9 +++++++++ docs/guide/en/ext/pages/index.md | 2 ++ docs/guide/en/ext/tasks/index.md | 1 + docs/guide/{ => en}/index.md | 18 +++++++++++------- .../{ => en}/interactions/button_views.md | 0 .../{ => en}/interactions/context_menus.md | 0 .../{ => en}/interactions/select_views.md | 0 .../{ => en}/interactions/slash_commands.md | 0 docs/guide/{ => en}/misc/intents.md | 0 docs/guide/{ => en}/misc/logging.md | 0 docs/guide/{ => en}/misc/webhooks.md | 0 docs/guide/en/starting-out/initial-files.md | 0 docs/guide/{ => en}/starting-out/installing.md | 1 + .../{ => en}/starting-out/making-a-bot.md | 0 docs/guide/index.rst | 7 +++++++ docs/index.rst | 4 ++-- 19 files changed, 40 insertions(+), 9 deletions(-) create mode 100644 docs/guide/en/databases/index.md create mode 100644 docs/guide/en/ext/commands/checks.md create mode 100644 docs/guide/en/ext/commands/cogs.md create mode 100644 docs/guide/en/ext/commands/index.md create mode 100644 docs/guide/en/ext/pages/index.md create mode 100644 docs/guide/en/ext/tasks/index.md rename docs/guide/{ => en}/index.md (71%) rename docs/guide/{ => en}/interactions/button_views.md (100%) rename docs/guide/{ => en}/interactions/context_menus.md (100%) rename docs/guide/{ => en}/interactions/select_views.md (100%) rename docs/guide/{ => en}/interactions/slash_commands.md (100%) rename docs/guide/{ => en}/misc/intents.md (100%) rename docs/guide/{ => en}/misc/logging.md (100%) rename docs/guide/{ => en}/misc/webhooks.md (100%) create mode 100644 docs/guide/en/starting-out/initial-files.md rename docs/guide/{ => en}/starting-out/installing.md (99%) rename docs/guide/{ => en}/starting-out/making-a-bot.md (100%) create mode 100644 docs/guide/index.rst diff --git a/docs/guide/en/databases/index.md b/docs/guide/en/databases/index.md new file mode 100644 index 0000000000..1d27257bf4 --- /dev/null +++ b/docs/guide/en/databases/index.md @@ -0,0 +1,2 @@ +# A Primer to Database management +This will teach you the basics \ No newline at end of file diff --git a/docs/guide/en/ext/commands/checks.md b/docs/guide/en/ext/commands/checks.md new file mode 100644 index 0000000000..6a62d89386 --- /dev/null +++ b/docs/guide/en/ext/commands/checks.md @@ -0,0 +1,3 @@ +# Using checks in Pycord +Pycord's ``ext.commands`` module provides a checking system to check the info or roles, etc of a member. +This will be a full primer of how to use this system and how to make good use of it. \ No newline at end of file diff --git a/docs/guide/en/ext/commands/cogs.md b/docs/guide/en/ext/commands/cogs.md new file mode 100644 index 0000000000..b1b6fb4a1c --- /dev/null +++ b/docs/guide/en/ext/commands/cogs.md @@ -0,0 +1,2 @@ +# Using Cogs in Pycord +The ``ext.commands`` module provided by Pycord introduces a `Cog` system allowing you to make commands of any kind or even events in another file. \ No newline at end of file diff --git a/docs/guide/en/ext/commands/index.md b/docs/guide/en/ext/commands/index.md new file mode 100644 index 0000000000..cb3b88d048 --- /dev/null +++ b/docs/guide/en/ext/commands/index.md @@ -0,0 +1,9 @@ +# Using the ``ext.commands`` module in Pycord + +This page here is just to sort the many pages in the folder. + +```{eval-rst} +ext.commands bolsters features for many things, one thing you might want to look at is :ref:`how to use cogs ` + +another feature ext.commands has implemented are :ref:`checks ` +``` \ No newline at end of file diff --git a/docs/guide/en/ext/pages/index.md b/docs/guide/en/ext/pages/index.md new file mode 100644 index 0000000000..4bf1f56d24 --- /dev/null +++ b/docs/guide/en/ext/pages/index.md @@ -0,0 +1,2 @@ +# Using the ``ext.pages`` module in Pycord +This here is a primer to using all that ``ext.pages`` offers you. \ No newline at end of file diff --git a/docs/guide/en/ext/tasks/index.md b/docs/guide/en/ext/tasks/index.md new file mode 100644 index 0000000000..897788ed1c --- /dev/null +++ b/docs/guide/en/ext/tasks/index.md @@ -0,0 +1 @@ +# Using the ``ext.tasks`` module in Pycord \ No newline at end of file diff --git a/docs/guide/index.md b/docs/guide/en/index.md similarity index 71% rename from docs/guide/index.md rename to docs/guide/en/index.md index 67b2edf736..223bce3d62 100644 --- a/docs/guide/index.md +++ b/docs/guide/en/index.md @@ -55,16 +55,20 @@ This list **doesn't** fully cover everything you should know before using Pycord :doc:`starting-out/making-a-bot` -:doc:`interactions/slash_commands` Guide +:doc:`starting-out/initial-files` -:doc:`interactions/context_menus` Guide +The Pycord :ref:`slash commands ` Guide. -:doc:`interactions/button_views` Guide +The Pycord :ref:`Context Menus ` Guide. -:doc:`interactions/select_views` Guide +The Pycord :ref:`Button Menus ` Guide. -:doc:`misc/intents` +The Pycord :ref:`Select Menus ` Guide. -:doc:`misc/logging` +A thing you might wanna look at is :ref:`how to use ``ext.commands`` ` + +A primer to :ref:`gateway intents ` + +You may wanna try :doc:`misc/logging` in Pycord. ``` - + diff --git a/docs/guide/interactions/button_views.md b/docs/guide/en/interactions/button_views.md similarity index 100% rename from docs/guide/interactions/button_views.md rename to docs/guide/en/interactions/button_views.md diff --git a/docs/guide/interactions/context_menus.md b/docs/guide/en/interactions/context_menus.md similarity index 100% rename from docs/guide/interactions/context_menus.md rename to docs/guide/en/interactions/context_menus.md diff --git a/docs/guide/interactions/select_views.md b/docs/guide/en/interactions/select_views.md similarity index 100% rename from docs/guide/interactions/select_views.md rename to docs/guide/en/interactions/select_views.md diff --git a/docs/guide/interactions/slash_commands.md b/docs/guide/en/interactions/slash_commands.md similarity index 100% rename from docs/guide/interactions/slash_commands.md rename to docs/guide/en/interactions/slash_commands.md diff --git a/docs/guide/misc/intents.md b/docs/guide/en/misc/intents.md similarity index 100% rename from docs/guide/misc/intents.md rename to docs/guide/en/misc/intents.md diff --git a/docs/guide/misc/logging.md b/docs/guide/en/misc/logging.md similarity index 100% rename from docs/guide/misc/logging.md rename to docs/guide/en/misc/logging.md diff --git a/docs/guide/misc/webhooks.md b/docs/guide/en/misc/webhooks.md similarity index 100% rename from docs/guide/misc/webhooks.md rename to docs/guide/en/misc/webhooks.md diff --git a/docs/guide/en/starting-out/initial-files.md b/docs/guide/en/starting-out/initial-files.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/guide/starting-out/installing.md b/docs/guide/en/starting-out/installing.md similarity index 99% rename from docs/guide/starting-out/installing.md rename to docs/guide/en/starting-out/installing.md index 72143c7dea..fff6636732 100644 --- a/docs/guide/starting-out/installing.md +++ b/docs/guide/en/starting-out/installing.md @@ -38,6 +38,7 @@ To install additional packages for speedup, you should use ``py-cord[speed]`` i # Linux/macOS python3 -m pip install -U "py-cord[speed]" + # Windows py -3 -m pip install -U py-cord[speed] diff --git a/docs/guide/starting-out/making-a-bot.md b/docs/guide/en/starting-out/making-a-bot.md similarity index 100% rename from docs/guide/starting-out/making-a-bot.md rename to docs/guide/en/starting-out/making-a-bot.md diff --git a/docs/guide/index.rst b/docs/guide/index.rst new file mode 100644 index 0000000000..eed194a5d5 --- /dev/null +++ b/docs/guide/index.rst @@ -0,0 +1,7 @@ +Welcome to the pycord guide! +============================ +These bellow are the current translations to pick from. + +:doc:`en/index` EN/US Guide + +Hey! if you don't see your language here we suggest you help us translate the docs to it, just `make a pull request `_ \ No newline at end of file diff --git a/docs/index.rst b/docs/index.rst index 57ce9e8e64..4fe462b1d3 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -25,8 +25,8 @@ Getting started Is this your first time using the library? This is the place to get started! -- **First steps:** :doc:`guide/starting-out/installing` | :doc:`quickstart` | :doc:`guide/misc/logging` | :doc:`guide/index` -- **Working with Discord:** :doc:`guide/starting-out/making-a-bot` | :doc:`guide/misc/intents` +- **First steps:** :doc:`guide/index` | :doc:`guide/en/starting-out/installing` | :doc:`quickstart` | :doc:`guide/en/misc/logging` +- **Working with Discord:** :doc:`guide/en/starting-out/making-a-bot` | :doc:`guide/en/misc/intents` - **Examples:** Many examples are available in the :resource:`repository `. Getting help From 7a668ea2165a70f58ce096888b11d45d4f576eed Mon Sep 17 00:00:00 2001 From: Vincent Date: Mon, 27 Dec 2021 13:40:36 +0800 Subject: [PATCH 156/180] Expand the guide more --- docs/guide/en/databases/index.md | 2 +- docs/guide/en/ext/commands/index.md | 4 ++-- docs/guide/en/ext/tasks/index.md | 3 ++- docs/guide/en/index.md | 6 +++--- docs/guide/en/interactions/select_views.md | 2 -- docs/guide/en/interactions/slash_commands.md | 6 +++--- docs/guide/en/starting-out/initial-files.md | 12 ++++++++++++ 7 files changed, 23 insertions(+), 12 deletions(-) diff --git a/docs/guide/en/databases/index.md b/docs/guide/en/databases/index.md index 1d27257bf4..7a6797fad6 100644 --- a/docs/guide/en/databases/index.md +++ b/docs/guide/en/databases/index.md @@ -1,2 +1,2 @@ # A Primer to Database management -This will teach you the basics \ No newline at end of file +This will teach you the basics of using multiple databases and how use cases in Pycord. \ No newline at end of file diff --git a/docs/guide/en/ext/commands/index.md b/docs/guide/en/ext/commands/index.md index cb3b88d048..4468f4019d 100644 --- a/docs/guide/en/ext/commands/index.md +++ b/docs/guide/en/ext/commands/index.md @@ -3,7 +3,7 @@ This page here is just to sort the many pages in the folder. ```{eval-rst} -ext.commands bolsters features for many things, one thing you might want to look at is :ref:`how to use cogs ` +``ext.commands`` bolsters features for many things, one thing you might want to look at is :ref:`how to use cogs ` -another feature ext.commands has implemented are :ref:`checks ` +another feature ``ext.commands`` has implemented are :ref:`checks ` ``` \ No newline at end of file diff --git a/docs/guide/en/ext/tasks/index.md b/docs/guide/en/ext/tasks/index.md index 897788ed1c..2873017c91 100644 --- a/docs/guide/en/ext/tasks/index.md +++ b/docs/guide/en/ext/tasks/index.md @@ -1 +1,2 @@ -# Using the ``ext.tasks`` module in Pycord \ No newline at end of file +# Using the ``ext.tasks`` module in Pycord +Pycord's ``ext.tasks`` module provides a toolkit for more advanced `asyncio.tasks` functions in Pycord. \ No newline at end of file diff --git a/docs/guide/en/index.md b/docs/guide/en/index.md index 223bce3d62..2d67461e28 100644 --- a/docs/guide/en/index.md +++ b/docs/guide/en/index.md @@ -51,11 +51,11 @@ This list **doesn't** fully cover everything you should know before using Pycord ## Guide List ```{eval-rst} -:doc:`starting-out/installing` +The guide on how to :ref:`install Pycord ` -:doc:`starting-out/making-a-bot` +If you don't know how to make a bot in discord :ref:`this guide would be handy ` -:doc:`starting-out/initial-files` +And if you don't know which files or what files to chose when starting we suggest you look at :ref:`best files to start with ` The Pycord :ref:`slash commands ` Guide. diff --git a/docs/guide/en/interactions/select_views.md b/docs/guide/en/interactions/select_views.md index 990bb09ebc..8bdd1e4573 100644 --- a/docs/guide/en/interactions/select_views.md +++ b/docs/guide/en/interactions/select_views.md @@ -48,5 +48,3 @@ async def my_command_name(ctx): ``` And that's it that is all of selects in Pycord! - -We hope you learn't how to make selects or advanced your knowledge to with this. diff --git a/docs/guide/en/interactions/slash_commands.md b/docs/guide/en/interactions/slash_commands.md index ec6b1f3fe1..ddb2ef20a5 100644 --- a/docs/guide/en/interactions/slash_commands.md +++ b/docs/guide/en/interactions/slash_commands.md @@ -12,8 +12,8 @@ But it is very easy to make them: ```py @bot.slash_command(guild_ids=[...]) # limits Guild ID's available -"""Example Description""" async def example(ctx): + """Example Description""" await ctx.respond("message", view=None) # Send Message ``` @@ -44,7 +44,7 @@ Then make a function which would search for results in the list: async def list_search(ctx: discord.AutocompleteContext): """Return's A List Of Autocomplete Results""" return [ - color for color in my_list if ctx.interaction.user.id in allowed_users_list + thing for thing in my_list if ctx.interaction.user.id in allowed_users_list ] ``` @@ -69,5 +69,5 @@ You will first want to make a slash command Then in the bottom add ```py -@permissions.foo() # Replace foo with has_role or is_user etc. +@Permissions.foo() # Replace foo with has_role or is_user etc. ``` diff --git a/docs/guide/en/starting-out/initial-files.md b/docs/guide/en/starting-out/initial-files.md index e69de29bb2..d164dfb623 100644 --- a/docs/guide/en/starting-out/initial-files.md +++ b/docs/guide/en/starting-out/initial-files.md @@ -0,0 +1,12 @@ +# Initial Files +This is gonna teaching you the initial files to start with. + +# Users Starting-out +It would be recommended for Users starting out to just use a `main.py` file and put there `Cogs` in a `Cogs` folder. + +# Advanced Users +For advanced users it would be recommended to have your bot split into modules, + +Like `moderation_module` or `fun_module`, etc + +it's also for these users were it's recommened to subclass `Bot` or `Client` instead of doing `=` to add more features. \ No newline at end of file From d3939b74b43f6ae291860af565e91920bc1a005b Mon Sep 17 00:00:00 2001 From: Vincent Date: Mon, 27 Dec 2021 14:05:16 +0800 Subject: [PATCH 157/180] Create German Translations --- docs/guide/de/databases/index.md | 2 + docs/guide/de/ext/commands/checks.md | 0 docs/guide/de/ext/commands/cogs.md | 2 + docs/guide/de/ext/commands/index.md | 9 + docs/guide/de/ext/pages/index.md | 2 + docs/guide/de/ext/tasks/index.md | 2 + docs/guide/de/index.md | 74 +++++++ docs/guide/de/interactions/button_views.md | 54 +++++ docs/guide/de/interactions/context_menus.md | 41 ++++ docs/guide/de/interactions/select_views.md | 50 +++++ docs/guide/de/interactions/slash_commands.md | 73 +++++++ docs/guide/de/misc/intents.md | 207 +++++++++++++++++++ docs/guide/de/misc/logging.md | 48 +++++ docs/guide/de/misc/webhooks.md | 16 ++ docs/guide/de/starting-out/initial-files.md | 12 ++ docs/guide/de/starting-out/installing.md | 125 +++++++++++ docs/guide/de/starting-out/making-a-bot.md | 98 +++++++++ docs/guide/index.rst | 1 + 18 files changed, 816 insertions(+) create mode 100644 docs/guide/de/databases/index.md create mode 100644 docs/guide/de/ext/commands/checks.md create mode 100644 docs/guide/de/ext/commands/cogs.md create mode 100644 docs/guide/de/ext/commands/index.md create mode 100644 docs/guide/de/ext/pages/index.md create mode 100644 docs/guide/de/ext/tasks/index.md create mode 100644 docs/guide/de/index.md create mode 100644 docs/guide/de/interactions/button_views.md create mode 100644 docs/guide/de/interactions/context_menus.md create mode 100644 docs/guide/de/interactions/select_views.md create mode 100644 docs/guide/de/interactions/slash_commands.md create mode 100644 docs/guide/de/misc/intents.md create mode 100644 docs/guide/de/misc/logging.md create mode 100644 docs/guide/de/misc/webhooks.md create mode 100644 docs/guide/de/starting-out/initial-files.md create mode 100644 docs/guide/de/starting-out/installing.md create mode 100644 docs/guide/de/starting-out/making-a-bot.md diff --git a/docs/guide/de/databases/index.md b/docs/guide/de/databases/index.md new file mode 100644 index 0000000000..1b3ea5bfda --- /dev/null +++ b/docs/guide/de/databases/index.md @@ -0,0 +1,2 @@ +# A Primer to Database management +Hier lernen Sie die Grundlagen der Verwendung mehrerer Datenbanken und die Anwendungsfälle in Pycord kennen. \ No newline at end of file diff --git a/docs/guide/de/ext/commands/checks.md b/docs/guide/de/ext/commands/checks.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/docs/guide/de/ext/commands/cogs.md b/docs/guide/de/ext/commands/cogs.md new file mode 100644 index 0000000000..9fbec3817d --- /dev/null +++ b/docs/guide/de/ext/commands/cogs.md @@ -0,0 +1,2 @@ +# Verwendung von Cogs in Pycord +Das Modul ``ext.commands``, das von Pycord zur Verfügung gestellt wird, führt ein `Cog`-System ein, das es erlaubt, Befehle jeglicher Art oder sogar Ereignisse in einer anderen Datei zu erzeugen. \ No newline at end of file diff --git a/docs/guide/de/ext/commands/index.md b/docs/guide/de/ext/commands/index.md new file mode 100644 index 0000000000..452e951eae --- /dev/null +++ b/docs/guide/de/ext/commands/index.md @@ -0,0 +1,9 @@ +# Verwendung des Moduls ``ext.commands`` in Pycord + +Diese Seite hier dient nur zum Sortieren der vielen Seiten im Ordner. + +``{eval-rst} +``ext.commands`` erweitert die Funktionen für viele Dinge, eine Sache, die Sie sich vielleicht ansehen wollen, ist :ref:`how to use cogs ` + +Eine weitere Funktion, die ``ext.commands`` implementiert hat, sind :ref:`checks ` +``` \ No newline at end of file diff --git a/docs/guide/de/ext/pages/index.md b/docs/guide/de/ext/pages/index.md new file mode 100644 index 0000000000..ade5c39f24 --- /dev/null +++ b/docs/guide/de/ext/pages/index.md @@ -0,0 +1,2 @@ +# Verwendung des Moduls ``ext.pages`` in Pycord +Dies ist eine Einführung in die Nutzung der Möglichkeiten von ``ext.pages``. \ No newline at end of file diff --git a/docs/guide/de/ext/tasks/index.md b/docs/guide/de/ext/tasks/index.md new file mode 100644 index 0000000000..5494804d37 --- /dev/null +++ b/docs/guide/de/ext/tasks/index.md @@ -0,0 +1,2 @@ +# Verwendung des Moduls ``ext.tasks`` in Pycord +Das Modul ``ext.tasks`` von Pycord bietet ein Toolkit für fortgeschrittene `asyncio.tasks`-Funktionen in Pycord. \ No newline at end of file diff --git a/docs/guide/de/index.md b/docs/guide/de/index.md new file mode 100644 index 0000000000..d28e62f198 --- /dev/null +++ b/docs/guide/de/index.md @@ -0,0 +1,74 @@ +# Leitfaden +Der offizielle Leitfaden für Pycord + +# Kurzer Tipp +Pycord wird mit automatischer Dateierzeugung über die Eingabeaufforderung geliefert. + +Beispiel für einige Befehle, die Sie verwenden können: + +## ``python -m py-cord newbot (args)`` + +#### Args: + +- name + - Ihr Projektname +--gesharded + - Ob Ihr Bot sharded sein soll oder nicht +--präfix + - Dein Bot-Präfix + +## ``python -m py-cord newcog (args)`` + +#### Args: + +- Name + - Der Name deines Cogs + +- Verzeichnis + - Cogs Verzeichnis + +--voll + - Alle Funktionen von Cogs abrufen + +--class-name + - Name Ihrer Cogs-Klasse + +## Bevor Sie beginnen... +Pycord hat viele Funktionen, die für eine Person, die gerade erst mit Python anfängt, zu fortgeschritten sind, +Wir würden vorschlagen, dass Sie sich die Grundkenntnisse von Python aneignen, bevor Sie beginnen. Es gibt eine Menge Tutorials, denen Sie folgen können, und wir würden vorschlagen, dass Sie mit kleinen Projekten beginnen und dann nach und nach größer werden. + +### Wie viel Python muss ich wissen? + +- Der Unterschied zwischen Instanzen und Klassenattributen. + - z.B. `Gildenname` vs. `Discord.Gildenname` oder jede Variation davon. +- Wie man Datenstrukturen in der Sprache verwendet. + - `dict`/`tuple`/`list`/`str`/`...` +- Wie man Ausnahmen wie `NameError` oder `SyntaxError` löst. +- Wie man Tracebacks liest und versteht. + +Diese Liste deckt **nicht** alles ab, was Sie wissen sollten, bevor Sie Pycord benutzen. Wir empfehlen, dass Sie zumindest diese Punkte kennen, bevor Sie versuchen, einen Bot in Pycord zu erstellen. + +## Leitfaden-Liste + +```{eval-rst} +Die Anleitung zur :ref:`Installation von Pycord ` + +Wenn du nicht weißt, wie man einen Bot in Discord erstellt, wäre :ref:`diese Anleitung nützlich ` + +Und wenn du nicht weißt, welche Dateien du für den Anfang auswählen sollst, empfehlen wir dir :ref:`die besten Dateien für den Anfang ` + +Der Pycord :ref:`Slash-Befehle ` Guide. + +Der Pycord :ref:`Kontextmenüs ` Leitfaden. + +Der Pycord :ref:`Schaltflächenmenüs ` Leitfaden. + +Der Pycord :ref:`Auswahlmenüs ` Leitfaden. + +Eine Sache, die Sie sich ansehen sollten, ist :ref:`Wie man ``ext.commands`` ` benutzt. + +Eine Fibel zu :ref:`Gateway-Intents ` + +Sie sollten :doc:`misc/logging` in Pycord ausprobieren. +``` + \ No newline at end of file diff --git a/docs/guide/de/interactions/button_views.md b/docs/guide/de/interactions/button_views.md new file mode 100644 index 0000000000..a8249336be --- /dev/null +++ b/docs/guide/de/interactions/button_views.md @@ -0,0 +1,54 @@ +# Schaltflächen-Menüs +Eine Fibel für Anfänger und Fortgeschrittene zu Schaltflächen in Pycord + +### Grundlegende Antwort-Schaltfläche +Zuerst werden Sie eine Klasse mit Ihrer Ansicht erstellen wollen +etwa so: + +```py +class My_View_Name(discord.ui.View): + def __init__(self): + super().__init__(timeout=None) + + @discord.ui.button( + label="Grün", + style=discord.ButtonStyle.green, + custom_id="persistent_view:green", + ) + async def green(self, button: discord.ui.Button, interaction: discord.Interaction): + await interaction.response.send_message("Press Me!", ephemeral=True) # Macht die Nachricht flüchtig. +``` + +Dann würden Sie einen Befehl erstellen und Ihre Nachricht mit der Ansicht wie folgt senden wollen: +```py +ctx.send("Ihre_Mitteilung", view=Mein_View_Name()) +``` + +Und das war's! Sie haben Ihren ersten Button mit Pycord erstellt + +### Wie man einen Button deaktivieren kann + +Sie werden zuerst Ihren Button erstellen wollen. + +```py +@discord.ui.button(label="button_name", style=discord.ButtonStyle.green) +async def disable(self, button: discord.ui.Button, interaction: discord.Interaction): +``` + +Dann mache diese Funktion, die den Button nach einer bestimmten Anzahl von Sekunden deaktiviert. + +```py +number = int(button.label) if button.label else 0 +wenn Zahl + 1 >= 5: + button.style = discord.ButtonStyle.green + button.disabled = Wahr +button.label = str(number + 1) + +# Stellen Sie sicher, dass die Nachricht mit unserem aktualisierten Selbst aktualisiert wird +await interaction.response.edit_message(view=self) +``` + +Und sende deine Nachricht +```py +ctx.send("ihre_nachricht", view=meine_ansicht_name()) +``` \ No newline at end of file diff --git a/docs/guide/de/interactions/context_menus.md b/docs/guide/de/interactions/context_menus.md new file mode 100644 index 0000000000..091aef946e --- /dev/null +++ b/docs/guide/de/interactions/context_menus.md @@ -0,0 +1,41 @@ +# Kontextmenüs +Kontextmenü-Befehle sind den Schrägstrich-Befehlen sehr ähnlich. Der einzige wirkliche Unterschied im Code besteht darin, dass sie "Mitglied" oder "Nachricht" zurückgeben. + +### Benutzer-Befehle +Benutzerbefehle sind den Schrägstrich-Befehlen sehr ähnlich und entsprechen den Nachrichtenbefehlen. + +Der einzige Unterschied besteht darin, dass man den Benutzer auf irgendeine Weise zurückgeben muss: + +```py +@bot.user_command(guild_ids=[...]) # Begrenzt die Gilden mit diesem Menü +async def mention(ctx, member: discord.Member): # Benutzerkommandos geben das Mitglied zurück + await ctx.respond(f"{ctx.author.name} hat gerade {member.mention} erwähnt!") +``` + +Und es sollte das Folgende zurückgeben: +```{eval-rst} +...image:: /images/guide/user_command.png + :alt: Benutzerbefehl Bild +``` + +### Nachrichten-Befehle +Nachrichtenbefehle sind wiederum ähnlich wie Schrägstrich- und Benutzerkommandos, und Sie würden sie wie folgt erstellen: + +```{eval-rst} + +...Warnung:: + + Message Commands muessen eine Nachricht enthalten + +``` +```py +@bot.message_command(name="Show Message ID") # Erzeugt einen globalen Nachrichtenbefehl +async def message_id(ctx, message: discord.Message): # Nachrichtenbefehle geben die Nachricht zurück + await ctx.respond(f"{ctx.author.name}, hier ist die Nachrichten-ID: {message.id}!") +``` + +Und es sollte mit folgendem Ergebnis zurückkommen: +```{eval-rst} +...image:: /images/guide/message_command.png + :alt: Message Command Image +``` \ No newline at end of file diff --git a/docs/guide/de/interactions/select_views.md b/docs/guide/de/interactions/select_views.md new file mode 100644 index 0000000000..ac3e86c693 --- /dev/null +++ b/docs/guide/de/interactions/select_views.md @@ -0,0 +1,50 @@ +# Auswahlmenüs +Eine Einführung in Auswahlmenüs für Anfänger und fortgeschrittene Benutzer von Pycord + +Auswahlmenüs sind klassenbasiert, ähnlich wie Buttons. Sie sollten also zuerst eine Klasse mit Ihrer Auswahlansicht erstellen +```py +class my_view_name(discord.ui.Select): + def __init__(self) +``` + +Dann erstellen Sie eine Liste mit Ihren Select Optionen + +Diese Liste sollte alles vom Label bis zum Emoji enthalten. +````py +options = [ + discord.SelectOption( + label="mein_label_name", description="meine_option_description", emoji="dein_emoji" + ), +] +``` +Und Sie können noch mehr hinzufügen. + +Sie können maximal 25 hinzufügen. + +Dann können Sie einen Interaktions-Callback in der gleichen Klasse erstellen + +```py +async def callback(self, interaction) + await interaction.response.send_message(f "ihre_nachricht") +``` + +Erstellen Sie dann eine weitere Klasse, die View untergeordnet ist. + +Dann fügen Sie Ihre Select View als Element hinzu. +```py +class my_view_name_View(discord.ui.View): + def __init__(self): + super().__init__() + + self.add_item(mein_ansicht_name()) +``` + +Jetzt kannst du deinen Befehl mit deiner Ansicht machen + +```py +@bot.slash_command(guild_ids=[...]) # Begrenzt die Anzahl der Gilden mit dem Befehl +async def mein_befehl_name(ctx): + await ctx.respond(f "your_message", view=my_view_name_View()) +``` + +Und das war's, das ist alles an Selects in Pycord! \ No newline at end of file diff --git a/docs/guide/de/interactions/slash_commands.md b/docs/guide/de/interactions/slash_commands.md new file mode 100644 index 0000000000..2d6b5eaa64 --- /dev/null +++ b/docs/guide/de/interactions/slash_commands.md @@ -0,0 +1,73 @@ +# Slash-Befehle +Eine Einführung in die Slash-Befehle für Fortgeschrittene und neue Benutzer + +### Grundlegende Slash-Befehle +Slash-Befehle sind den Legacy-Befehlen sehr ähnlich + +Anstelle von `@bot.command` sollten Sie `@bot.slash_command` verwenden. + +Die meisten Nachrichtenmethoden von Context wurden zu `ctx.respond("message", view=None)` umgewandelt. + +Aber es ist sehr einfach, sie zu erstellen: + +``py +@bot.slash_command(guild_ids=[...]) # begrenzt die verfügbaren Gilden-IDs +async def example(ctx): + """Beispiel Beschreibung""" + await ctx.respond("Nachricht", view=None) # Nachricht senden +``` + +### Autocompleted Command +Autovervollständigte Nachrichten sind in Pycord implementiert! + +Sie sind sehr einfach zu erstellen +Sie müssen zuerst eine Liste von autovervollständigten Wörtern erstellen +````py +meine_liste = [ + "..." + "..." +] +``` + +Erstellen Sie dann eine Liste von Benutzer-IDs, die dies verwenden können: + +```py +allowed_users_list = [ + "..." + "..." +] +``` + +Dann erstellen Sie eine Funktion, die nach Ergebnissen in der Liste sucht: + +```py +async def list_search(ctx: discord.AutocompleteContext): + """Return's A List Of Autocomplete Results""" + return [ + thing for thing in my_list if ctx.interaction.user.id in allowed_users_list + ] +``` + +Jetzt können Sie Ihren Befehl + +```py +@bot.slash_command(name="ac_example") +async def autocomplete_example( + ctx: discord.ApplicationContext, + choice: Option(str, "was wird deine Wahl sein!", autocomplete=list_search), +): + await ctx.respond(f "Du hast {Wahl} gewählt!") +``` + +### Verwaltung von Slash-Befehlsberechtigungen + +Zuerst müssen Sie einen Slash-Befehl erstellen +```py +@bot.slash_command(guild_ids=[...]) # Begrenzt Gilden mit diesem Befehl +``` + +Dann fügen Sie im unteren Bereich hinzu + +```py +@Permissions.foo() # Ersetze foo durch has_role oder is_user etc. +``` \ No newline at end of file diff --git a/docs/guide/de/misc/intents.md b/docs/guide/de/misc/intents.md new file mode 100644 index 0000000000..415f81ce01 --- /dev/null +++ b/docs/guide/de/misc/intents.md @@ -0,0 +1,207 @@ +```{eval-rst} +:orphan: + +.. currentmodule:: discord +.. versionadded:: 1.5 +.. _intents_primer: + +Eine Fibel für Gateway-Intents +============================= + +In Version 1.5 wird die :class:`Intents` eingeführt. Dies ist eine radikale Veränderung in der Art, wie Bots geschrieben werden. Ein Intent ermöglicht es einem Bot, sich für bestimmte Bereiche von Ereignissen zu registrieren. Die Ereignisse, die den einzelnen Intents entsprechen, werden im individuellen Attribut der :class:`Intents`-Dokumentation dokumentiert. + +Diese Intents werden dem Konstruktor von :class:`Client` oder seinen Unterklassen (:class:`AutoShardedClient`, :class:`~.AutoShardedBot`, :class:`~.Bot`) mit dem Argument ``Intents`` übergeben. + +Wenn keine Intents übergeben werden, dann werden standardmäßig alle Intents aktiviert, außer den privilegierten Intents, derzeit :attr:`Intents.members`, :attr:`Intents.presences`, und :attr:`Intents.guild_messages`. + +Welche Intents werden benötigt? +-------------------------- + +Die Intents, die für deinen Bot notwendig sind, kannst du nur selbst bestimmen. Jedes Attribut in der Klasse :class:`Intents` dokumentiert, welchen :ref:`Events ` es entspricht und welche Art von Cache es ermöglicht. + +Wenn du zum Beispiel einen Bot haben willst, der ohne spammige Ereignisse wie Anwesenheit oder Tippen funktioniert, dann könnten wir folgendes tun: + +.. code-block:: python3 + :emphasize-lines: 7,9,10 + + importiere diskord + intents = discord.Intents.default() + intents.typing = False + intents.presences = False + + # Irgendwo anders: + # client = discord.Client(intents=intents) + # oder + # from discord.ext import commands + # bot = commands.Bot(command_prefix='!', intents=intents) + +Beachte, dass dies nicht :attr:`Intents.members` oder :attr:`Intents.guild_messages` aktiviert, da sie privilegierte Intents sind. + +Ein weiteres Beispiel, das einen Bot zeigt, der sich nur mit Nachrichten und Gildeninformationen beschäftigt: + +.. code-block:: python3 + :emphasize-lines: 7,9,10 + + importiere diskord + intents = discord.Intents(messages=True, guilds=True) + # Wenn Sie auch Reaktionsereignisse wünschen, aktivieren Sie Folgendes: + # intents.reactions = True + + # irgendwo anders: + # client = discord.Client(intents=intents) + # oder + # from discord.ext import commands + # bot = commands.Bot(command_prefix='!', intents=intents) + +.. _privileged_intents: + +Privilegierte Intents +--------------------- + +Mit der API-Änderung, bei der Bot-Besitzer Intents angeben müssen, wurden einige Intents weiter eingeschränkt und erfordern mehr manuelle Schritte. Diese Intentionen werden **privilegierte Intentionen** genannt. + +Eine privilegierte Absicht erfordert, dass Sie zum Entwicklerportal gehen und sie manuell aktivieren. Um privilegierte Intents zu aktivieren, gehen Sie wie folgt vor: + +1. Vergewissern Sie sich, dass Sie auf der `Discord-Website `_ angemeldet sind. +2. Navigieren Sie zur "Anwendungsseite" `_. +3. Klicken Sie auf den Bot, für den Sie privilegierte Intents aktivieren möchten. +4. Navigieren Sie zur Registerkarte Bot auf der linken Seite des Bildschirms. + + ...Bild:: /images/discord_bot_tab.png + :alt: Die Bot-Registerkarte auf der Anwendungsseite. + +5. Scrollen Sie zum Abschnitt "Privilegierte Gateway-Intentionen" und aktivieren Sie die gewünschten Intentionen. + + ... Bild:: /images/discord_privileged_intents.png + :alt: Der Selektor für privilegierte Gateway-Intentionen. + +.. warning:: + + Das Aktivieren von privilegierten Intents, wenn dein Bot in mehr als 100 Gilden ist, erfordert eine `Bot-Verifizierung `_. + +.. note:: + + Auch wenn Sie Intents über das Entwicklerportal aktivieren, müssen Sie die Intents + auch durch Code aktivieren. + +Brauche ich privilegierte Intents? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Dies ist eine schnelle Checkliste, um festzustellen, ob Sie bestimmte privilegierte Intents benötigen. + +.. _Bedarf_Anwesenheit_Intent: + +Anwesenheits-Intent ++++++++++++++++ + +- Ob Sie :attr:`Member.status` überhaupt verwenden, um den Status der Mitglieder zu verfolgen. +- Ob Sie :attr:`Member.activity` oder :attr:`Member.activities` verwenden, um die Aktivitäten der Mitglieder zu überprüfen. + +.. _need_members_intent: + +Mitglied Intent ++++++++++++++ + +- Ob Sie den Beitritt oder den Austritt eines Mitglieds verfolgen, entspricht den Ereignissen :func:`on_member_join` und :func:`on_member_remove`. +- Ob Sie Mitgliederaktualisierungen wie z.B. Nickname oder Rollenänderungen verfolgen wollen. +- Ob Sie Benutzeraktualisierungen wie Benutzernamen, Avatare, Unterscheidungsmerkmale usw. verfolgen wollen. +- Ob Sie die Gildenmitgliederliste über :meth:`Guild.chunk` oder :meth:`Guild.fetch_members` abfragen wollen. +- Ob du einen hochgenauen Mitglieder-Cache unter :attr:`Guild.members` haben möchtest. + +.. _need_message_content_intent: + +Nachricht Inhalt Intent +++++++++++++++++++++++ + +- Ob Sie ein nachrichtenbasiertes Befehlssystem mit ext.commands haben +- Ob Sie das :func:`on_message`-Ereignis für irgendetwas verwenden, z.B. für die automatische Moderation. +- Ob Sie Änderungen oder Löschungen von Nachrichten mit :func:`on_message_edit`, :func:`on_message_delete`, :func:`on_raw_message_edit`, :func:`on_raw_message_delete` verfolgen. +- Ob Sie irgendwelche reaktionsbezogenen Ereignisse verwenden, wie :func:`on_reaction_add`, :func:`on_reaction_remove`, und :func:`on_reaction_clear` + +...Hinweis:: + Dies gilt nur für :attr:`Intents.guild_messages`, nicht für :attr:`Intents.dm_messages`. Der Bot kann weiterhin Nachrichteninhalte in DMs empfangen, wenn sie in Gildennachrichten erwähnt werden, und für seine eigenen Gildennachrichten. + +.. _intents_member_cache: + +Mitglieder-Cache +------------- + +Zusammen mit den Intents schränkt Discord nun die Möglichkeit, Mitglieder zu cachen, weiter ein und erwartet, dass Bot-Autoren nur so wenig wie nötig cachen. Um jedoch einen Cache richtig zu pflegen, wird der :attr:`Intents.members` Intent benötigt, um die Mitglieder zu verfolgen, die gegangen sind und sie richtig zu entfernen. + +Um den Mitglieder-Cache zu unterstützen, wenn wir keine Mitglieder im Cache benötigen, hat die Bibliothek jetzt ein :class:`MemberCacheFlags` Flag, um den Mitglieder-Cache zu kontrollieren. Die Dokumentationsseite für die Klasse geht auf die spezifischen Richtlinien ein, die möglich sind. + +Es sollte beachtet werden, dass bestimmte Dinge keinen Mitglieder-Cache benötigen, da Discord, wenn möglich, vollständige Mitgliederinformationen bereitstellt. Zum Beispiel: + +- :func:`on_message` wird :attr:`Message.author` als Mitglied haben, auch wenn der Cache deaktiviert ist. +- Bei :func:`on_voice_state_update` wird der Parameter ``member`` ein Mitglied sein, auch wenn der Cache deaktiviert ist. +- :func:`on_reaction_add` lässt den ``user`` Parameter ein Mitglied sein, wenn er in einer Gilde ist, auch wenn der Cache deaktiviert ist. +- Bei :func:`on_raw_reaction_add` wird :attr:`RawReactionActionEvent.member` in einer Gilde ein Mitglied sein, auch wenn der Cache deaktiviert ist. +- Die Ereignisse zum Hinzufügen von Reaktionen enthalten keine zusätzlichen Informationen, wenn sie in direkten Nachrichten enthalten sind. Dies ist eine Einschränkung von Discord. +- Die Reaktionsentfernungsereignisse enthalten keine Mitgliederinformationen. Dies ist eine Einschränkung von Discord. + +Andere Ereignisse, die ein :class:`Member` annehmen, erfordern die Verwendung des Mitglieder-Caches. Wenn absolute Genauigkeit über den Mitglieder-Cache erwünscht ist, dann ist es ratsam, die Absicht :attr:`Intents.members` aktiviert zu haben. + +.. _retrieving_members: + +Abrufen von Mitgliedern +----------------------- + +Wenn der Cache deaktiviert ist oder Sie das Chunking von Gilden beim Start deaktivieren, brauchen wir vielleicht immer noch eine Möglichkeit, Mitglieder zu laden. Die Bibliothek bietet einige Möglichkeiten, dies zu tun: + +- :meth:`Guild.query_members` + - Wird verwendet, um Mitglieder nach einem Präfix abzufragen, das dem Nickname oder Benutzernamen entspricht. + - Dies kann auch verwendet werden, um Mitglieder nach ihrer Benutzer-ID abzufragen. + - Dies verwendet das Gateway und nicht HTTP. +- :meth:`Guild.chunk` + - Dies kann verwendet werden, um die gesamte Mitgliederliste über das Gateway abzurufen. +- :meth:`Guild.fetch_member` + - Wird verwendet, um ein Mitglied nach ID über die HTTP-API abzurufen. +- :meth:`Guild.fetch_members` + - wird verwendet, um eine große Anzahl von Mitgliedern über die HTTP-API abzurufen. + +Es ist zu beachten, dass das Gateway eine strikte Ratenbegrenzung von 120 Anfragen pro 60 Sekunden hat. + +Fehlersuche +--------------- + +Einige häufige Probleme im Zusammenhang mit der obligatorischen Absichtsänderung. + +Wo sind meine Mitglieder hin? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Aufgrund einer :ref:`API-Änderung ` zwingt Discord nun Entwickler, die das Zwischenspeichern von Mitgliedern wünschen, sich ausdrücklich dafür zu entscheiden. Dies ist eine von Discord vorgeschriebene Änderung, die nicht umgangen werden kann. Um Mitglieder zurückzubekommen, müssen Sie explizit den :ref:`members privileged intent ` aktivieren und das Attribut :attr:`Intents.members` auf true ändern. + +Zum Beispiel: + +.. code-block:: python3 + :emphasize-lines: 3,6,8,9 + + importieren diskord + intents = discord.Intents.default() + intents.members = True + + # Irgendwo anders: + # client = discord.Client(intents=intents) + # oder + # from discord.ext import commands + # bot = commands.Bot(command_prefix='!', intents=intents) + +Warum braucht ``on_ready`` so lange zum Feuern? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Als Teil der API-Änderung bezüglich der Intents hat Discord auch die Art und Weise geändert, wie Mitglieder zu Beginn geladen werden. Ursprünglich konnte die Bibliothek 75 Gilden auf einmal anfordern und nur Mitglieder von Gilden anfordern, die das Attribut :attr:`Guild.large` auf ``True`` gesetzt haben. Mit der neuen Absichtsänderung schreibt Discord vor, dass wir nur 1 Gilde pro Anfrage senden können. Dies führt zu einer 75-fachen Verlangsamung, die durch die Tatsache, dass *alle* Gilden, nicht nur große Gilden, angefragt werden, noch verstärkt wird. + +Es gibt einige Lösungen, um dieses Problem zu beheben. + +Die erste Lösung besteht darin, die Absicht der privilegierten Anwesenheit zusammen mit der Absicht der privilegierten Mitglieder anzufordern und beide zu aktivieren. Dadurch kann die anfängliche Mitgliederliste Online-Mitglieder enthalten, genau wie beim alten Gateway. Beachten Sie, dass wir immer noch auf 1 Gilde pro Anfrage beschränkt sind, aber die Anzahl der Gilden, die wir anfordern, ist deutlich reduziert. + +Die zweite Lösung ist, das Chunking der Mitglieder zu deaktivieren, indem man ``chunk_guilds_at_startup`` auf ``False`` setzt, wenn man einen Client erstellt. Dann, wenn das Chunking für eine Gilde notwendig ist, kann man die verschiedenen Techniken zum :ref:`Abrufen von Mitgliedern ` verwenden. + +Um die durch die API-Änderung verursachte Verlangsamung zu veranschaulichen, nehmen wir einen Bot, der in 840 Gilden ist und 95 dieser Gilden sind "groß" (über 250 Mitglieder). + +Nach dem ursprünglichen System würde dies dazu führen, dass 2 Anfragen zum Abrufen der Mitgliederliste (75 Gilden, 20 Gilden) ungefähr 60 Sekunden dauern würden. Mit :attr:`Intents.members`, aber nicht mit :attr:`Intents.presences`, erfordert dies 840 Anfragen, was bei einem Ratenlimit von 120 Anfragen pro 60 Sekunden bedeutet, dass durch das Warten auf das Ratenlimit insgesamt etwa 7 Minuten Wartezeit anfallen, um alle Mitglieder abzurufen. Mit :attr:`Intents.members` und :attr:`Intents.presences` erhalten wir größtenteils das alte Verhalten, so dass wir nur für die 95 Gilden, die groß sind, Anfragen stellen müssen, das ist etwas weniger als unser Ratenlimit, so dass es nahe an der ursprünglichen Zeit für das Abrufen der Mitgliederliste liegt. + +Da diese Änderung von Discord verlangt wird, gibt es leider nichts, was die Bibliothek tun kann, um dies abzumildern. + +Wenn Ihnen die Richtung, die Discord mit seiner API einschlägt, wirklich nicht gefällt, können Sie sie über `Support `_ kontaktieren. +``` \ No newline at end of file diff --git a/docs/guide/de/misc/logging.md b/docs/guide/de/misc/logging.md new file mode 100644 index 0000000000..8f1cdf9957 --- /dev/null +++ b/docs/guide/de/misc/logging.md @@ -0,0 +1,48 @@ +```{eval-rst} +:orphan: + +.. versionadded:: 0.6.0 +.. _logging_setup: + +Einrichten der Protokollierung +================== + +*Pycord* protokolliert Fehler und Debug-Informationen über das :mod:`logging` python +Modul. Es wird dringend empfohlen, dass das Logging-Modul +konfiguriert ist, da keine Fehler oder Warnungen ausgegeben werden, wenn es nicht konfiguriert ist. +Die Konfiguration des ``logging``-Moduls kann so einfach sein wie:: + + import logging + + logging.basicConfig(level=logging.INFO) + +Wird am Anfang der Anwendung platziert. Dies wird die Logs von +discord sowie andere Bibliotheken, die das ``logging`` Modul benutzen +verwenden, direkt auf der Konsole aus. + +Das optionale ``Level`` Argument spezifiziert, welches Level von Ereignissen protokolliert werden soll +ausgeben soll und kann einer der Werte ``CRITICAL``, ``ERROR``, ``WARNING``, ``INFO``, und +``DEBUG`` sein und ist, wenn nicht angegeben, auf ``WARNING`` voreingestellt. + +Weitergehende Einstellungen sind mit dem Modul :mod:`logging` möglich. Für +zum Beispiel, um die Logs in eine Datei namens ``discord.log`` zu schreiben, anstatt +in eine Datei namens ``discord.log`` zu schreiben, anstatt sie auf der Konsole auszugeben, kann das folgende Snippet verwendet werden:: + + import discord + importiere logging + + logger = logging.getLogger('discord') + logger.setLevel(logging.DEBUG) + handler = logging.FileHandler(filename='discord.log', encoding='utf-8', mode='w') + handler.setFormatter(logging.Formatter('%(asctime)s:%(levelname)s:%(name)s: %(message)s')) + logger.addHandler(handler) + +Dies wird empfohlen, besonders auf ausführlichen Ebenen wie ``INFO`` +und ``DEBUG``, da eine Menge Ereignisse protokolliert werden und es die +stdout Ihres Programms verstopfen würde. + + + +Für weitere Informationen lesen Sie bitte die Dokumentation und das Tutorial des +:mod:`Logging`-Moduls. +``` \ No newline at end of file diff --git a/docs/guide/de/misc/webhooks.md b/docs/guide/de/misc/webhooks.md new file mode 100644 index 0000000000..7b5896e97d --- /dev/null +++ b/docs/guide/de/misc/webhooks.md @@ -0,0 +1,16 @@ +# Webhooks +Die Anleitung zur Verwendung von Webhooks in Pycord + +## Ein einfacher Webhook + +Nachfolgend ein Beispiel für einen einfachen Webhook +Pycord +```py +from discord importieren Webhook, AsyncWebhookAdapter +import aiohttp + +async def beispiel_nachricht(): + async with aiohttp.ClientSession() as session: + webhook = Webhook.from_url('url-here', adapter=AsyncWebhookAdapter(session)) + await webhook.send('Hallo!', username='example_webhook') +``` \ No newline at end of file diff --git a/docs/guide/de/starting-out/initial-files.md b/docs/guide/de/starting-out/initial-files.md new file mode 100644 index 0000000000..922d567b0a --- /dev/null +++ b/docs/guide/de/starting-out/initial-files.md @@ -0,0 +1,12 @@ +# Initiale Dateien +Hier lernen Sie die Anfangsdateien, mit denen Sie beginnen. + +# Users Starting-out +Anfängern wird empfohlen, nur eine "main.py"-Datei zu verwenden und ihre "Cogs" in einen "Cogs"-Ordner zu legen. + +# Fortgeschrittene Benutzer +Für fortgeschrittene Benutzer wäre es empfehlenswert, den Bot in Module aufzuteilen, + +Wie `moderation_module` oder `fun_module`, etc + +für diese Benutzer ist es auch empfehlenswert, `Bot` oder `Client` zu subclassen, anstatt `=` zu verwenden, um mehr Funktionen hinzuzufügen. \ No newline at end of file diff --git a/docs/guide/de/starting-out/installing.md b/docs/guide/de/starting-out/installing.md new file mode 100644 index 0000000000..d172b584a8 --- /dev/null +++ b/docs/guide/de/starting-out/installing.md @@ -0,0 +1,125 @@ +```{eval-rst} +:orphan: + +.. currentmodule:: discord + +.. _intro: + +Einführung +============ + +Dies ist die Dokumentation für Pycord, eine Bibliothek für Python zur Unterstützung +zur Erstellung von Anwendungen, die die Discord-API nutzen. + +Voraussetzungen +------------- + +Pycord funktioniert mit Python 3.8 oder höher. Unterstützung für frühere Versionen von Python +ist nicht vorgesehen. Python 2.7 oder niedriger wird nicht unterstützt. Python 3.7 oder niedriger wird nicht unterstützt. + + +.. _installieren: + +Installation von +----------- + +Sie können die Bibliothek direkt von PyPI beziehen: :: + + python3 -m pip install -U py-cord + +Wenn Sie Windows verwenden, sollten Sie stattdessen folgendes verwenden: :: + + py -3 -m pip install -U py-cord + + +Um zusätzliche Pakete für die Beschleunigung zu installieren, sollten Sie ``py-cord[speed]`` anstelle von ``py-cord`` verwenden, z.B. :: + +.. code:: sh + + # Linux/macOS + python3 -m pip install -U "py-cord[speed]" + + # Windows + py -3 -m pip install -U py-cord[Geschwindigkeit] + + +Um Sprachunterstützung zu erhalten, sollten Sie ``py-cord[voice]`` anstelle von ``py-cord`` verwenden, z.B.:: + + python3 -m pip install -U py-cord[voice] + +In Linux-Umgebungen erfordert die Installation von voice die Beschaffung der folgenden Abhängigkeiten: + +- `libffi `_ +- `libnacl `_ +- `python3-dev `_ + +Für ein Debian-basiertes System, wird der folgende Befehl diese Abhängigkeiten erhalten: + +.. code-block:: shell + + $ apt install libffi-dev libnacl-dev python3-dev + +Denken Sie daran, Ihre Berechtigungen zu überprüfen! + +Virtuelle Umgebungen +~~~~~~~~~~~~~~~~~~~~ + +Manchmal möchte man verhindern, dass Bibliotheken die Systeminstallationen verunreinigen oder eine andere Version von +als die auf dem System installierten Bibliotheken. Es kann auch sein, dass Sie keine Berechtigung haben, Bibliotheken systemweit zu installieren. +Zu diesem Zweck verfügt die Standardbibliothek ab Python 3.3 über ein Konzept namens "Virtual Environment", das +diese getrennten Versionen zu verwalten. + +Ein ausführlicheres Tutorial findet sich unter :doc:`py:tutorial/venv`. + +Aber für die schnelle und schmutzige Seite: + +1. Wechseln Sie in das Arbeitsverzeichnis Ihres Projekts: + + .. code-block:: shell + + $ cd your-bot-source + $ python3 -m venv bot-env + +2. Aktivieren Sie die virtuelle Umgebung: + + .. code-block:: shell + + $ source bot-env/bin/activate + + Unter Windows aktivieren Sie sie mit: + + .. code-block:: shell + + $ bot-env\Scripts\activate.bat + +3. Verwenden Sie pip wie gewohnt: + + .. code-block:: shell + + $ pip install -U py-cord + +Glückwunsch! Sie haben nun eine virtuelle Umgebung eingerichtet. + +Grundlegende Konzepte +-------------- + +Pycord dreht sich um das Konzept von :ref:`Events `. +Ein Ereignis ist etwas, auf das Sie hören und auf das Sie dann reagieren. Zum Beispiel, wenn eine Nachricht +geschieht, erhalten Sie ein Ereignis, auf das Sie reagieren können. + +Ein kurzes Beispiel, um zu zeigen, wie Ereignisse funktionieren: + +.. code-block:: python3 + + import discord + + class MyClient(discord.Client): + async def on_ready(self): + print(f'Angemeldet als {self.user}!') + + async def on_message(self, message): + print(f'Nachricht von {message.author}: {message.content}') + + client = MyClient() + client.run('mein Token kommt hier hin') +``` \ No newline at end of file diff --git a/docs/guide/de/starting-out/making-a-bot.md b/docs/guide/de/starting-out/making-a-bot.md new file mode 100644 index 0000000000..f40e008db7 --- /dev/null +++ b/docs/guide/de/starting-out/making-a-bot.md @@ -0,0 +1,98 @@ +```{eval-rst} +:orphan: + +.. _discord-intro: + +Erstellen eines Bot-Kontos +======================== + +Um mit der Bibliothek und der Discord-API im Allgemeinen arbeiten zu können, müssen wir zunächst ein Discord-Bot-Konto erstellen. + +Das Erstellen eines Bot-Kontos ist ein ziemlich unkomplizierter Prozess. + +1. Vergewissern Sie sich, dass Sie auf der Discord-Website `_ angemeldet sind. +2. Navigieren Sie zur `Anwendungsseite `_. +3. Klicken Sie auf die Schaltfläche "Neue Anwendung". + + ...Bild:: /images/discord_create_app_button.png + :alt: Die Schaltfläche "Neue Anwendung". + +4. Geben Sie der Anwendung einen Namen und klicken Sie auf "Erstellen". + + ... Bild:: /images/discord_create_app_form.png + :alt: Das neu ausgefüllte Antragsformular. + +5. Erstellen Sie einen Bot-Benutzer, indem Sie zur Registerkarte "Bot" navigieren und auf "Bot hinzufügen" klicken. + + - Klicken Sie auf "Yes, do it!", um fortzufahren. + + .. image:: /images/discord_create_bot_user.png + :alt: Die Schaltfläche "Bot hinzufügen". +6. Vergewissern Sie sich, dass **Public Bot** angekreuzt ist, wenn Sie möchten, dass andere Personen Ihren Bot einladen können. + + - Vergewissern Sie sich auch, dass **OAuth2 Code Grant** nicht angekreuzt ist, es sei denn, Sie + wenn Sie nicht gerade einen Dienst entwickeln, der dies erfordert. Wenn Sie sich nicht sicher sind, lassen Sie es **unangekreuzt**. + + ...Bild:: /images/discord_bot_user_options.png + :alt: So sollten die Bot-Benutzeroptionen für die meisten Menschen aussehen. + +7. Kopieren Sie das Token über die Schaltfläche "Kopieren". + + - Dies ist nicht das Client-Geheimnis auf der Seite "Allgemeine Informationen". + + ...Warnung:: + + Beachten Sie, dass dieses Token im Wesentlichen das Passwort Ihres Bots ist. + Passwort ist. Sie sollten es **niemals** an eine andere Person weitergeben. Wenn Sie das tun, + kann sich jemand in Ihren Bot einloggen und bösartige Dinge tun, wie z.B. + Server zu verlassen, alle Mitglieder innerhalb eines Servers zu sperren oder böswillige Pings an alle zu senden. + + Die Möglichkeiten sind endlos, also **geben Sie dieses Token nicht weiter**. + + Wenn Sie Ihren Token versehentlich weitergegeben haben, klicken Sie so schnell wie möglich auf die Schaltfläche "Neu generieren". + so schnell wie möglich. Dadurch wird Ihr alter Token widerrufen und ein neuer Token generiert. + Nun müssen Sie sich mit dem neuen Token anmelden. + +Und das war's. Sie haben jetzt ein Bot-Konto und können sich mit diesem Token anmelden. + +.. _discord_invite_bot: + +Ihren Bot einladen +------------------- + +Sie haben also einen Bot-Benutzer erstellt, aber er befindet sich nicht auf einem Server. + +Wenn Sie Ihren Bot einladen möchten, müssen Sie eine Einladungs-URL für ihn erstellen. + +1. Stellen Sie sicher, dass Sie auf der `Discord-Website `_ angemeldet sind. +2. Navigieren Sie zur `Anwendungsseite `_. +3. Klicke auf die Seite deines Bots. +4. Erweitern Sie den Reiter "OAuth2" und klicken Sie auf "URL Generator". + + ...Bild:: /images/discord_oauth2.png + :alt: So sollte die OAuth2-Registerkarte aussehen. + +5. Aktivieren Sie die Kontrollkästchen "bot" und "applications.commands" unter "scopes". + + .. image:: /images/discord_oauth2_scope.png + :alt: Das Kontrollkästchen für den Geltungsbereich, wenn "bot" und "applications.commands" angekreuzt sind. + +6. Aktivieren Sie unter "Bot Permissions" die für die Funktion Ihres Bots erforderlichen Berechtigungen. + + - Bitte beachten Sie die Konsequenzen, wenn Sie für Ihren Bot die Berechtigung "Administrator" benötigen. + + - Bot-Besitzer müssen für bestimmte Aktionen und Berechtigungen 2FA aktiviert haben, wenn sie auf Servern hinzugefügt werden, auf denen Server-weite 2FA aktiviert ist. Weitere Informationen finden Sie auf der `2FA-Supportseite `_. + + ...Bild:: /images/discord_oauth2_perms.png + :alt: Die Kontrollkästchen für die Berechtigungen mit einigen aktivierten Berechtigungen. + +7. Nun kann die resultierende URL verwendet werden, um Ihren Bot zu einem Server hinzuzufügen. Kopieren Sie die URL und fügen Sie sie in Ihren Browser ein, wählen Sie einen Server aus, zu dem Sie den Bot einladen möchten, und klicken Sie auf "Autorisieren". + + +...Hinweis:: + + Die Person, die den Bot hinzufügt, muss über die Berechtigung "Server verwalten" verfügen, um dies zu tun. + +Wenn Sie diese URL dynamisch zur Laufzeit innerhalb Ihres Bots generieren möchten und die +Schnittstelle :class:`discord.Permissions` verwenden, können Sie :func:`discord.utils.oauth_url` verwenden. +``` \ No newline at end of file diff --git a/docs/guide/index.rst b/docs/guide/index.rst index eed194a5d5..6c54137d46 100644 --- a/docs/guide/index.rst +++ b/docs/guide/index.rst @@ -3,5 +3,6 @@ Welcome to the pycord guide! These bellow are the current translations to pick from. :doc:`en/index` EN/US Guide +:doc:`de/index` DE/GERMAN Guide Hey! if you don't see your language here we suggest you help us translate the docs to it, just `make a pull request `_ \ No newline at end of file From 93ad905bf8ea49c039b4fa51437f867661bab051 Mon Sep 17 00:00:00 2001 From: Vincent Date: Mon, 27 Dec 2021 14:12:53 +0800 Subject: [PATCH 158/180] Fix Translation Error --- docs/guide/de/ext/commands/checks.md | 3 +++ docs/guide/de/index.md | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/docs/guide/de/ext/commands/checks.md b/docs/guide/de/ext/commands/checks.md index e69de29bb2..4733ad9de2 100644 --- a/docs/guide/de/ext/commands/checks.md +++ b/docs/guide/de/ext/commands/checks.md @@ -0,0 +1,3 @@ +# Verwendung von Checks in Pycord +Pycord's ``ext.commands`` Modul bietet ein Prüfsystem, um die Informationen oder Rollen, etc. eines Mitglieds zu überprüfen. +Dies wird eine vollständige Anleitung sein, wie man dieses System benutzt und wie man es sinnvoll einsetzt. \ No newline at end of file diff --git a/docs/guide/de/index.md b/docs/guide/de/index.md index d28e62f198..0d03508edf 100644 --- a/docs/guide/de/index.md +++ b/docs/guide/de/index.md @@ -40,7 +40,7 @@ Wir würden vorschlagen, dass Sie sich die Grundkenntnisse von Python aneignen, ### Wie viel Python muss ich wissen? - Der Unterschied zwischen Instanzen und Klassenattributen. - - z.B. `Gildenname` vs. `Discord.Gildenname` oder jede Variation davon. + - z.B. `guild.name` vs. `discord.Guild.name` oder jede Variation davon. - Wie man Datenstrukturen in der Sprache verwendet. - `dict`/`tuple`/`list`/`str`/`...` - Wie man Ausnahmen wie `NameError` oder `SyntaxError` löst. From 227129eafd5a707746355edca06117afd4456f19 Mon Sep 17 00:00:00 2001 From: Vincent Date: Mon, 27 Dec 2021 20:35:17 +0800 Subject: [PATCH 159/180] quick fix --- docs/guide/de/index.md | 26 ++++++++++++------------ docs/guide/de/starting-out/installing.md | 4 ++-- docs/guide/en/index.md | 18 ++++++++-------- docs/guide/en/starting-out/installing.md | 4 ++-- 4 files changed, 26 insertions(+), 26 deletions(-) diff --git a/docs/guide/de/index.md b/docs/guide/de/index.md index 0d03508edf..5eb2caa1fa 100644 --- a/docs/guide/de/index.md +++ b/docs/guide/de/index.md @@ -10,11 +10,11 @@ Beispiel für einige Befehle, die Sie verwenden können: #### Args: -- name +- Name - Ihr Projektname --gesharded - Ob Ihr Bot sharded sein soll oder nicht ---präfix +--prefix - Dein Bot-Präfix ## ``python -m py-cord newcog (args)`` @@ -40,7 +40,7 @@ Wir würden vorschlagen, dass Sie sich die Grundkenntnisse von Python aneignen, ### Wie viel Python muss ich wissen? - Der Unterschied zwischen Instanzen und Klassenattributen. - - z.B. `guild.name` vs. `discord.Guild.name` oder jede Variation davon. + - z.B. `Gildenname` vs. `Discord.Gildenname` oder jede Variation davon. - Wie man Datenstrukturen in der Sprache verwendet. - `dict`/`tuple`/`list`/`str`/`...` - Wie man Ausnahmen wie `NameError` oder `SyntaxError` löst. @@ -51,24 +51,24 @@ Diese Liste deckt **nicht** alles ab, was Sie wissen sollten, bevor Sie Pycord b ## Leitfaden-Liste ```{eval-rst} -Die Anleitung zur :ref:`Installation von Pycord ` +Der Leitfaden, wie Sie es versuchen können :doc:`Start/Installation>` -Wenn du nicht weißt, wie man einen Bot in Discord erstellt, wäre :ref:`diese Anleitung nützlich ` +Wenn Sie nicht wissen, wie Sie einen Bot in Discord erstellen können -> :doc:`starting-out/making-a-bot` -Und wenn du nicht weißt, welche Dateien du für den Anfang auswählen sollst, empfehlen wir dir :ref:`die besten Dateien für den Anfang ` +Und wenn du nicht weißt, welche Dateien du beim Start auswählen sollst, empfehlen wir dir :doc:`starting-out/initial-files` -Der Pycord :ref:`Slash-Befehle ` Guide. +Der Pycord :doc:`interactions/slash_commands` Guide. -Der Pycord :ref:`Kontextmenüs ` Leitfaden. +Der Pycord :doc:`interactions/context_menus` Leitfaden. -Der Pycord :ref:`Schaltflächenmenüs ` Leitfaden. +Der Pycord :doc:`interactions/button_views` Leitfaden. -Der Pycord :ref:`Auswahlmenüs ` Leitfaden. +Der Pycord :doc:`interactions/select_views` Leitfaden. -Eine Sache, die Sie sich ansehen sollten, ist :ref:`Wie man ``ext.commands`` ` benutzt. +Eine Sache, die Sie sich vielleicht ansehen sollten, ist :doc:`ext/commands/index`. -Eine Fibel zu :ref:`Gateway-Intents ` +:doc:`misc/intents` Sie sollten :doc:`misc/logging` in Pycord ausprobieren. ``` - \ No newline at end of file + \ No newline at end of file diff --git a/docs/guide/de/starting-out/installing.md b/docs/guide/de/starting-out/installing.md index d172b584a8..da8a9d0daa 100644 --- a/docs/guide/de/starting-out/installing.md +++ b/docs/guide/de/starting-out/installing.md @@ -5,8 +5,8 @@ .. _intro: -Einführung -============ +Installation von Pycord +======================= Dies ist die Dokumentation für Pycord, eine Bibliothek für Python zur Unterstützung zur Erstellung von Anwendungen, die die Discord-API nutzen. diff --git a/docs/guide/en/index.md b/docs/guide/en/index.md index 2d67461e28..1b5897a1f9 100644 --- a/docs/guide/en/index.md +++ b/docs/guide/en/index.md @@ -51,23 +51,23 @@ This list **doesn't** fully cover everything you should know before using Pycord ## Guide List ```{eval-rst} -The guide on how to :ref:`install Pycord ` +The guide on how you can try :doc:`starting-out/installing>` -If you don't know how to make a bot in discord :ref:`this guide would be handy ` +If you don't know how to make a bot in discord -> :doc:`starting-out/making-a-bot` -And if you don't know which files or what files to chose when starting we suggest you look at :ref:`best files to start with ` +And if you don't know which files or what files to chose when starting we suggest you look at :doc:`starting-out/initial-files` -The Pycord :ref:`slash commands ` Guide. +The Pycord :doc:`interactions/slash_commands` Guide. -The Pycord :ref:`Context Menus ` Guide. +The Pycord :doc:`interactions/context_menus` Guide. -The Pycord :ref:`Button Menus ` Guide. +The Pycord :doc:`interactions/button_views` Guide. -The Pycord :ref:`Select Menus ` Guide. +The Pycord :doc:`interactions/select_views` Guide. -A thing you might wanna look at is :ref:`how to use ``ext.commands`` ` +A thing you might wanna look at is :doc:`ext/commands/index`. -A primer to :ref:`gateway intents ` +:doc:`misc/intents` You may wanna try :doc:`misc/logging` in Pycord. ``` diff --git a/docs/guide/en/starting-out/installing.md b/docs/guide/en/starting-out/installing.md index fff6636732..5e01e97860 100644 --- a/docs/guide/en/starting-out/installing.md +++ b/docs/guide/en/starting-out/installing.md @@ -5,8 +5,8 @@ .. _intro: -Introduction -============ +Installing Pycord +================= This is the documentation for Pycord, a library for Python to aid in creating applications that utilise the Discord API. From 0283d496a895949b4efa84c414fb3e38b06113b5 Mon Sep 17 00:00:00 2001 From: Vincent Date: Fri, 31 Dec 2021 15:38:20 +0800 Subject: [PATCH 160/180] undo translations --- docs/guide/{en => }/databases/index.md | 0 docs/guide/de/databases/index.md | 2 - docs/guide/de/ext/commands/checks.md | 3 - docs/guide/de/ext/commands/cogs.md | 2 - docs/guide/de/ext/commands/index.md | 9 - docs/guide/de/ext/pages/index.md | 2 - docs/guide/de/ext/tasks/index.md | 2 - docs/guide/de/index.md | 74 ------- docs/guide/de/interactions/button_views.md | 54 ----- docs/guide/de/interactions/context_menus.md | 41 ---- docs/guide/de/interactions/select_views.md | 50 ----- docs/guide/de/interactions/slash_commands.md | 73 ------ docs/guide/de/misc/intents.md | 207 ------------------ docs/guide/de/misc/logging.md | 48 ---- docs/guide/de/misc/webhooks.md | 16 -- docs/guide/de/starting-out/initial-files.md | 12 - docs/guide/de/starting-out/installing.md | 125 ----------- docs/guide/de/starting-out/making-a-bot.md | 98 --------- docs/guide/{en => }/ext/commands/checks.md | 0 docs/guide/{en => }/ext/commands/cogs.md | 0 docs/guide/{en => }/ext/commands/index.md | 0 docs/guide/{en => }/ext/pages/index.md | 0 docs/guide/{en => }/ext/tasks/index.md | 0 docs/guide/{en => }/index.md | 0 docs/guide/index.rst | 8 - .../{en => }/interactions/button_views.md | 0 .../{en => }/interactions/context_menus.md | 0 .../{en => }/interactions/select_views.md | 0 .../{en => }/interactions/slash_commands.md | 0 docs/guide/{en => }/misc/intents.md | 0 docs/guide/{en => }/misc/logging.md | 0 docs/guide/{en => }/misc/webhooks.md | 0 .../{en => }/starting-out/initial-files.md | 0 .../guide/{en => }/starting-out/installing.md | 0 .../{en => }/starting-out/making-a-bot.md | 0 setup.py | 1 - 36 files changed, 827 deletions(-) rename docs/guide/{en => }/databases/index.md (100%) delete mode 100644 docs/guide/de/databases/index.md delete mode 100644 docs/guide/de/ext/commands/checks.md delete mode 100644 docs/guide/de/ext/commands/cogs.md delete mode 100644 docs/guide/de/ext/commands/index.md delete mode 100644 docs/guide/de/ext/pages/index.md delete mode 100644 docs/guide/de/ext/tasks/index.md delete mode 100644 docs/guide/de/index.md delete mode 100644 docs/guide/de/interactions/button_views.md delete mode 100644 docs/guide/de/interactions/context_menus.md delete mode 100644 docs/guide/de/interactions/select_views.md delete mode 100644 docs/guide/de/interactions/slash_commands.md delete mode 100644 docs/guide/de/misc/intents.md delete mode 100644 docs/guide/de/misc/logging.md delete mode 100644 docs/guide/de/misc/webhooks.md delete mode 100644 docs/guide/de/starting-out/initial-files.md delete mode 100644 docs/guide/de/starting-out/installing.md delete mode 100644 docs/guide/de/starting-out/making-a-bot.md rename docs/guide/{en => }/ext/commands/checks.md (100%) rename docs/guide/{en => }/ext/commands/cogs.md (100%) rename docs/guide/{en => }/ext/commands/index.md (100%) rename docs/guide/{en => }/ext/pages/index.md (100%) rename docs/guide/{en => }/ext/tasks/index.md (100%) rename docs/guide/{en => }/index.md (100%) delete mode 100644 docs/guide/index.rst rename docs/guide/{en => }/interactions/button_views.md (100%) rename docs/guide/{en => }/interactions/context_menus.md (100%) rename docs/guide/{en => }/interactions/select_views.md (100%) rename docs/guide/{en => }/interactions/slash_commands.md (100%) rename docs/guide/{en => }/misc/intents.md (100%) rename docs/guide/{en => }/misc/logging.md (100%) rename docs/guide/{en => }/misc/webhooks.md (100%) rename docs/guide/{en => }/starting-out/initial-files.md (100%) rename docs/guide/{en => }/starting-out/installing.md (100%) rename docs/guide/{en => }/starting-out/making-a-bot.md (100%) diff --git a/docs/guide/en/databases/index.md b/docs/guide/databases/index.md similarity index 100% rename from docs/guide/en/databases/index.md rename to docs/guide/databases/index.md diff --git a/docs/guide/de/databases/index.md b/docs/guide/de/databases/index.md deleted file mode 100644 index 1b3ea5bfda..0000000000 --- a/docs/guide/de/databases/index.md +++ /dev/null @@ -1,2 +0,0 @@ -# A Primer to Database management -Hier lernen Sie die Grundlagen der Verwendung mehrerer Datenbanken und die Anwendungsfälle in Pycord kennen. \ No newline at end of file diff --git a/docs/guide/de/ext/commands/checks.md b/docs/guide/de/ext/commands/checks.md deleted file mode 100644 index 4733ad9de2..0000000000 --- a/docs/guide/de/ext/commands/checks.md +++ /dev/null @@ -1,3 +0,0 @@ -# Verwendung von Checks in Pycord -Pycord's ``ext.commands`` Modul bietet ein Prüfsystem, um die Informationen oder Rollen, etc. eines Mitglieds zu überprüfen. -Dies wird eine vollständige Anleitung sein, wie man dieses System benutzt und wie man es sinnvoll einsetzt. \ No newline at end of file diff --git a/docs/guide/de/ext/commands/cogs.md b/docs/guide/de/ext/commands/cogs.md deleted file mode 100644 index 9fbec3817d..0000000000 --- a/docs/guide/de/ext/commands/cogs.md +++ /dev/null @@ -1,2 +0,0 @@ -# Verwendung von Cogs in Pycord -Das Modul ``ext.commands``, das von Pycord zur Verfügung gestellt wird, führt ein `Cog`-System ein, das es erlaubt, Befehle jeglicher Art oder sogar Ereignisse in einer anderen Datei zu erzeugen. \ No newline at end of file diff --git a/docs/guide/de/ext/commands/index.md b/docs/guide/de/ext/commands/index.md deleted file mode 100644 index 452e951eae..0000000000 --- a/docs/guide/de/ext/commands/index.md +++ /dev/null @@ -1,9 +0,0 @@ -# Verwendung des Moduls ``ext.commands`` in Pycord - -Diese Seite hier dient nur zum Sortieren der vielen Seiten im Ordner. - -``{eval-rst} -``ext.commands`` erweitert die Funktionen für viele Dinge, eine Sache, die Sie sich vielleicht ansehen wollen, ist :ref:`how to use cogs ` - -Eine weitere Funktion, die ``ext.commands`` implementiert hat, sind :ref:`checks ` -``` \ No newline at end of file diff --git a/docs/guide/de/ext/pages/index.md b/docs/guide/de/ext/pages/index.md deleted file mode 100644 index ade5c39f24..0000000000 --- a/docs/guide/de/ext/pages/index.md +++ /dev/null @@ -1,2 +0,0 @@ -# Verwendung des Moduls ``ext.pages`` in Pycord -Dies ist eine Einführung in die Nutzung der Möglichkeiten von ``ext.pages``. \ No newline at end of file diff --git a/docs/guide/de/ext/tasks/index.md b/docs/guide/de/ext/tasks/index.md deleted file mode 100644 index 5494804d37..0000000000 --- a/docs/guide/de/ext/tasks/index.md +++ /dev/null @@ -1,2 +0,0 @@ -# Verwendung des Moduls ``ext.tasks`` in Pycord -Das Modul ``ext.tasks`` von Pycord bietet ein Toolkit für fortgeschrittene `asyncio.tasks`-Funktionen in Pycord. \ No newline at end of file diff --git a/docs/guide/de/index.md b/docs/guide/de/index.md deleted file mode 100644 index 5eb2caa1fa..0000000000 --- a/docs/guide/de/index.md +++ /dev/null @@ -1,74 +0,0 @@ -# Leitfaden -Der offizielle Leitfaden für Pycord - -# Kurzer Tipp -Pycord wird mit automatischer Dateierzeugung über die Eingabeaufforderung geliefert. - -Beispiel für einige Befehle, die Sie verwenden können: - -## ``python -m py-cord newbot (args)`` - -#### Args: - -- Name - - Ihr Projektname ---gesharded - - Ob Ihr Bot sharded sein soll oder nicht ---prefix - - Dein Bot-Präfix - -## ``python -m py-cord newcog (args)`` - -#### Args: - -- Name - - Der Name deines Cogs - -- Verzeichnis - - Cogs Verzeichnis - ---voll - - Alle Funktionen von Cogs abrufen - ---class-name - - Name Ihrer Cogs-Klasse - -## Bevor Sie beginnen... -Pycord hat viele Funktionen, die für eine Person, die gerade erst mit Python anfängt, zu fortgeschritten sind, -Wir würden vorschlagen, dass Sie sich die Grundkenntnisse von Python aneignen, bevor Sie beginnen. Es gibt eine Menge Tutorials, denen Sie folgen können, und wir würden vorschlagen, dass Sie mit kleinen Projekten beginnen und dann nach und nach größer werden. - -### Wie viel Python muss ich wissen? - -- Der Unterschied zwischen Instanzen und Klassenattributen. - - z.B. `Gildenname` vs. `Discord.Gildenname` oder jede Variation davon. -- Wie man Datenstrukturen in der Sprache verwendet. - - `dict`/`tuple`/`list`/`str`/`...` -- Wie man Ausnahmen wie `NameError` oder `SyntaxError` löst. -- Wie man Tracebacks liest und versteht. - -Diese Liste deckt **nicht** alles ab, was Sie wissen sollten, bevor Sie Pycord benutzen. Wir empfehlen, dass Sie zumindest diese Punkte kennen, bevor Sie versuchen, einen Bot in Pycord zu erstellen. - -## Leitfaden-Liste - -```{eval-rst} -Der Leitfaden, wie Sie es versuchen können :doc:`Start/Installation>` - -Wenn Sie nicht wissen, wie Sie einen Bot in Discord erstellen können -> :doc:`starting-out/making-a-bot` - -Und wenn du nicht weißt, welche Dateien du beim Start auswählen sollst, empfehlen wir dir :doc:`starting-out/initial-files` - -Der Pycord :doc:`interactions/slash_commands` Guide. - -Der Pycord :doc:`interactions/context_menus` Leitfaden. - -Der Pycord :doc:`interactions/button_views` Leitfaden. - -Der Pycord :doc:`interactions/select_views` Leitfaden. - -Eine Sache, die Sie sich vielleicht ansehen sollten, ist :doc:`ext/commands/index`. - -:doc:`misc/intents` - -Sie sollten :doc:`misc/logging` in Pycord ausprobieren. -``` - \ No newline at end of file diff --git a/docs/guide/de/interactions/button_views.md b/docs/guide/de/interactions/button_views.md deleted file mode 100644 index a8249336be..0000000000 --- a/docs/guide/de/interactions/button_views.md +++ /dev/null @@ -1,54 +0,0 @@ -# Schaltflächen-Menüs -Eine Fibel für Anfänger und Fortgeschrittene zu Schaltflächen in Pycord - -### Grundlegende Antwort-Schaltfläche -Zuerst werden Sie eine Klasse mit Ihrer Ansicht erstellen wollen -etwa so: - -```py -class My_View_Name(discord.ui.View): - def __init__(self): - super().__init__(timeout=None) - - @discord.ui.button( - label="Grün", - style=discord.ButtonStyle.green, - custom_id="persistent_view:green", - ) - async def green(self, button: discord.ui.Button, interaction: discord.Interaction): - await interaction.response.send_message("Press Me!", ephemeral=True) # Macht die Nachricht flüchtig. -``` - -Dann würden Sie einen Befehl erstellen und Ihre Nachricht mit der Ansicht wie folgt senden wollen: -```py -ctx.send("Ihre_Mitteilung", view=Mein_View_Name()) -``` - -Und das war's! Sie haben Ihren ersten Button mit Pycord erstellt - -### Wie man einen Button deaktivieren kann - -Sie werden zuerst Ihren Button erstellen wollen. - -```py -@discord.ui.button(label="button_name", style=discord.ButtonStyle.green) -async def disable(self, button: discord.ui.Button, interaction: discord.Interaction): -``` - -Dann mache diese Funktion, die den Button nach einer bestimmten Anzahl von Sekunden deaktiviert. - -```py -number = int(button.label) if button.label else 0 -wenn Zahl + 1 >= 5: - button.style = discord.ButtonStyle.green - button.disabled = Wahr -button.label = str(number + 1) - -# Stellen Sie sicher, dass die Nachricht mit unserem aktualisierten Selbst aktualisiert wird -await interaction.response.edit_message(view=self) -``` - -Und sende deine Nachricht -```py -ctx.send("ihre_nachricht", view=meine_ansicht_name()) -``` \ No newline at end of file diff --git a/docs/guide/de/interactions/context_menus.md b/docs/guide/de/interactions/context_menus.md deleted file mode 100644 index 091aef946e..0000000000 --- a/docs/guide/de/interactions/context_menus.md +++ /dev/null @@ -1,41 +0,0 @@ -# Kontextmenüs -Kontextmenü-Befehle sind den Schrägstrich-Befehlen sehr ähnlich. Der einzige wirkliche Unterschied im Code besteht darin, dass sie "Mitglied" oder "Nachricht" zurückgeben. - -### Benutzer-Befehle -Benutzerbefehle sind den Schrägstrich-Befehlen sehr ähnlich und entsprechen den Nachrichtenbefehlen. - -Der einzige Unterschied besteht darin, dass man den Benutzer auf irgendeine Weise zurückgeben muss: - -```py -@bot.user_command(guild_ids=[...]) # Begrenzt die Gilden mit diesem Menü -async def mention(ctx, member: discord.Member): # Benutzerkommandos geben das Mitglied zurück - await ctx.respond(f"{ctx.author.name} hat gerade {member.mention} erwähnt!") -``` - -Und es sollte das Folgende zurückgeben: -```{eval-rst} -...image:: /images/guide/user_command.png - :alt: Benutzerbefehl Bild -``` - -### Nachrichten-Befehle -Nachrichtenbefehle sind wiederum ähnlich wie Schrägstrich- und Benutzerkommandos, und Sie würden sie wie folgt erstellen: - -```{eval-rst} - -...Warnung:: - - Message Commands muessen eine Nachricht enthalten - -``` -```py -@bot.message_command(name="Show Message ID") # Erzeugt einen globalen Nachrichtenbefehl -async def message_id(ctx, message: discord.Message): # Nachrichtenbefehle geben die Nachricht zurück - await ctx.respond(f"{ctx.author.name}, hier ist die Nachrichten-ID: {message.id}!") -``` - -Und es sollte mit folgendem Ergebnis zurückkommen: -```{eval-rst} -...image:: /images/guide/message_command.png - :alt: Message Command Image -``` \ No newline at end of file diff --git a/docs/guide/de/interactions/select_views.md b/docs/guide/de/interactions/select_views.md deleted file mode 100644 index ac3e86c693..0000000000 --- a/docs/guide/de/interactions/select_views.md +++ /dev/null @@ -1,50 +0,0 @@ -# Auswahlmenüs -Eine Einführung in Auswahlmenüs für Anfänger und fortgeschrittene Benutzer von Pycord - -Auswahlmenüs sind klassenbasiert, ähnlich wie Buttons. Sie sollten also zuerst eine Klasse mit Ihrer Auswahlansicht erstellen -```py -class my_view_name(discord.ui.Select): - def __init__(self) -``` - -Dann erstellen Sie eine Liste mit Ihren Select Optionen - -Diese Liste sollte alles vom Label bis zum Emoji enthalten. -````py -options = [ - discord.SelectOption( - label="mein_label_name", description="meine_option_description", emoji="dein_emoji" - ), -] -``` -Und Sie können noch mehr hinzufügen. - -Sie können maximal 25 hinzufügen. - -Dann können Sie einen Interaktions-Callback in der gleichen Klasse erstellen - -```py -async def callback(self, interaction) - await interaction.response.send_message(f "ihre_nachricht") -``` - -Erstellen Sie dann eine weitere Klasse, die View untergeordnet ist. - -Dann fügen Sie Ihre Select View als Element hinzu. -```py -class my_view_name_View(discord.ui.View): - def __init__(self): - super().__init__() - - self.add_item(mein_ansicht_name()) -``` - -Jetzt kannst du deinen Befehl mit deiner Ansicht machen - -```py -@bot.slash_command(guild_ids=[...]) # Begrenzt die Anzahl der Gilden mit dem Befehl -async def mein_befehl_name(ctx): - await ctx.respond(f "your_message", view=my_view_name_View()) -``` - -Und das war's, das ist alles an Selects in Pycord! \ No newline at end of file diff --git a/docs/guide/de/interactions/slash_commands.md b/docs/guide/de/interactions/slash_commands.md deleted file mode 100644 index 2d6b5eaa64..0000000000 --- a/docs/guide/de/interactions/slash_commands.md +++ /dev/null @@ -1,73 +0,0 @@ -# Slash-Befehle -Eine Einführung in die Slash-Befehle für Fortgeschrittene und neue Benutzer - -### Grundlegende Slash-Befehle -Slash-Befehle sind den Legacy-Befehlen sehr ähnlich - -Anstelle von `@bot.command` sollten Sie `@bot.slash_command` verwenden. - -Die meisten Nachrichtenmethoden von Context wurden zu `ctx.respond("message", view=None)` umgewandelt. - -Aber es ist sehr einfach, sie zu erstellen: - -``py -@bot.slash_command(guild_ids=[...]) # begrenzt die verfügbaren Gilden-IDs -async def example(ctx): - """Beispiel Beschreibung""" - await ctx.respond("Nachricht", view=None) # Nachricht senden -``` - -### Autocompleted Command -Autovervollständigte Nachrichten sind in Pycord implementiert! - -Sie sind sehr einfach zu erstellen -Sie müssen zuerst eine Liste von autovervollständigten Wörtern erstellen -````py -meine_liste = [ - "..." - "..." -] -``` - -Erstellen Sie dann eine Liste von Benutzer-IDs, die dies verwenden können: - -```py -allowed_users_list = [ - "..." - "..." -] -``` - -Dann erstellen Sie eine Funktion, die nach Ergebnissen in der Liste sucht: - -```py -async def list_search(ctx: discord.AutocompleteContext): - """Return's A List Of Autocomplete Results""" - return [ - thing for thing in my_list if ctx.interaction.user.id in allowed_users_list - ] -``` - -Jetzt können Sie Ihren Befehl - -```py -@bot.slash_command(name="ac_example") -async def autocomplete_example( - ctx: discord.ApplicationContext, - choice: Option(str, "was wird deine Wahl sein!", autocomplete=list_search), -): - await ctx.respond(f "Du hast {Wahl} gewählt!") -``` - -### Verwaltung von Slash-Befehlsberechtigungen - -Zuerst müssen Sie einen Slash-Befehl erstellen -```py -@bot.slash_command(guild_ids=[...]) # Begrenzt Gilden mit diesem Befehl -``` - -Dann fügen Sie im unteren Bereich hinzu - -```py -@Permissions.foo() # Ersetze foo durch has_role oder is_user etc. -``` \ No newline at end of file diff --git a/docs/guide/de/misc/intents.md b/docs/guide/de/misc/intents.md deleted file mode 100644 index 415f81ce01..0000000000 --- a/docs/guide/de/misc/intents.md +++ /dev/null @@ -1,207 +0,0 @@ -```{eval-rst} -:orphan: - -.. currentmodule:: discord -.. versionadded:: 1.5 -.. _intents_primer: - -Eine Fibel für Gateway-Intents -============================= - -In Version 1.5 wird die :class:`Intents` eingeführt. Dies ist eine radikale Veränderung in der Art, wie Bots geschrieben werden. Ein Intent ermöglicht es einem Bot, sich für bestimmte Bereiche von Ereignissen zu registrieren. Die Ereignisse, die den einzelnen Intents entsprechen, werden im individuellen Attribut der :class:`Intents`-Dokumentation dokumentiert. - -Diese Intents werden dem Konstruktor von :class:`Client` oder seinen Unterklassen (:class:`AutoShardedClient`, :class:`~.AutoShardedBot`, :class:`~.Bot`) mit dem Argument ``Intents`` übergeben. - -Wenn keine Intents übergeben werden, dann werden standardmäßig alle Intents aktiviert, außer den privilegierten Intents, derzeit :attr:`Intents.members`, :attr:`Intents.presences`, und :attr:`Intents.guild_messages`. - -Welche Intents werden benötigt? --------------------------- - -Die Intents, die für deinen Bot notwendig sind, kannst du nur selbst bestimmen. Jedes Attribut in der Klasse :class:`Intents` dokumentiert, welchen :ref:`Events ` es entspricht und welche Art von Cache es ermöglicht. - -Wenn du zum Beispiel einen Bot haben willst, der ohne spammige Ereignisse wie Anwesenheit oder Tippen funktioniert, dann könnten wir folgendes tun: - -.. code-block:: python3 - :emphasize-lines: 7,9,10 - - importiere diskord - intents = discord.Intents.default() - intents.typing = False - intents.presences = False - - # Irgendwo anders: - # client = discord.Client(intents=intents) - # oder - # from discord.ext import commands - # bot = commands.Bot(command_prefix='!', intents=intents) - -Beachte, dass dies nicht :attr:`Intents.members` oder :attr:`Intents.guild_messages` aktiviert, da sie privilegierte Intents sind. - -Ein weiteres Beispiel, das einen Bot zeigt, der sich nur mit Nachrichten und Gildeninformationen beschäftigt: - -.. code-block:: python3 - :emphasize-lines: 7,9,10 - - importiere diskord - intents = discord.Intents(messages=True, guilds=True) - # Wenn Sie auch Reaktionsereignisse wünschen, aktivieren Sie Folgendes: - # intents.reactions = True - - # irgendwo anders: - # client = discord.Client(intents=intents) - # oder - # from discord.ext import commands - # bot = commands.Bot(command_prefix='!', intents=intents) - -.. _privileged_intents: - -Privilegierte Intents ---------------------- - -Mit der API-Änderung, bei der Bot-Besitzer Intents angeben müssen, wurden einige Intents weiter eingeschränkt und erfordern mehr manuelle Schritte. Diese Intentionen werden **privilegierte Intentionen** genannt. - -Eine privilegierte Absicht erfordert, dass Sie zum Entwicklerportal gehen und sie manuell aktivieren. Um privilegierte Intents zu aktivieren, gehen Sie wie folgt vor: - -1. Vergewissern Sie sich, dass Sie auf der `Discord-Website `_ angemeldet sind. -2. Navigieren Sie zur "Anwendungsseite" `_. -3. Klicken Sie auf den Bot, für den Sie privilegierte Intents aktivieren möchten. -4. Navigieren Sie zur Registerkarte Bot auf der linken Seite des Bildschirms. - - ...Bild:: /images/discord_bot_tab.png - :alt: Die Bot-Registerkarte auf der Anwendungsseite. - -5. Scrollen Sie zum Abschnitt "Privilegierte Gateway-Intentionen" und aktivieren Sie die gewünschten Intentionen. - - ... Bild:: /images/discord_privileged_intents.png - :alt: Der Selektor für privilegierte Gateway-Intentionen. - -.. warning:: - - Das Aktivieren von privilegierten Intents, wenn dein Bot in mehr als 100 Gilden ist, erfordert eine `Bot-Verifizierung `_. - -.. note:: - - Auch wenn Sie Intents über das Entwicklerportal aktivieren, müssen Sie die Intents - auch durch Code aktivieren. - -Brauche ich privilegierte Intents? -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Dies ist eine schnelle Checkliste, um festzustellen, ob Sie bestimmte privilegierte Intents benötigen. - -.. _Bedarf_Anwesenheit_Intent: - -Anwesenheits-Intent -+++++++++++++++ - -- Ob Sie :attr:`Member.status` überhaupt verwenden, um den Status der Mitglieder zu verfolgen. -- Ob Sie :attr:`Member.activity` oder :attr:`Member.activities` verwenden, um die Aktivitäten der Mitglieder zu überprüfen. - -.. _need_members_intent: - -Mitglied Intent -+++++++++++++ - -- Ob Sie den Beitritt oder den Austritt eines Mitglieds verfolgen, entspricht den Ereignissen :func:`on_member_join` und :func:`on_member_remove`. -- Ob Sie Mitgliederaktualisierungen wie z.B. Nickname oder Rollenänderungen verfolgen wollen. -- Ob Sie Benutzeraktualisierungen wie Benutzernamen, Avatare, Unterscheidungsmerkmale usw. verfolgen wollen. -- Ob Sie die Gildenmitgliederliste über :meth:`Guild.chunk` oder :meth:`Guild.fetch_members` abfragen wollen. -- Ob du einen hochgenauen Mitglieder-Cache unter :attr:`Guild.members` haben möchtest. - -.. _need_message_content_intent: - -Nachricht Inhalt Intent -++++++++++++++++++++++ - -- Ob Sie ein nachrichtenbasiertes Befehlssystem mit ext.commands haben -- Ob Sie das :func:`on_message`-Ereignis für irgendetwas verwenden, z.B. für die automatische Moderation. -- Ob Sie Änderungen oder Löschungen von Nachrichten mit :func:`on_message_edit`, :func:`on_message_delete`, :func:`on_raw_message_edit`, :func:`on_raw_message_delete` verfolgen. -- Ob Sie irgendwelche reaktionsbezogenen Ereignisse verwenden, wie :func:`on_reaction_add`, :func:`on_reaction_remove`, und :func:`on_reaction_clear` - -...Hinweis:: - Dies gilt nur für :attr:`Intents.guild_messages`, nicht für :attr:`Intents.dm_messages`. Der Bot kann weiterhin Nachrichteninhalte in DMs empfangen, wenn sie in Gildennachrichten erwähnt werden, und für seine eigenen Gildennachrichten. - -.. _intents_member_cache: - -Mitglieder-Cache -------------- - -Zusammen mit den Intents schränkt Discord nun die Möglichkeit, Mitglieder zu cachen, weiter ein und erwartet, dass Bot-Autoren nur so wenig wie nötig cachen. Um jedoch einen Cache richtig zu pflegen, wird der :attr:`Intents.members` Intent benötigt, um die Mitglieder zu verfolgen, die gegangen sind und sie richtig zu entfernen. - -Um den Mitglieder-Cache zu unterstützen, wenn wir keine Mitglieder im Cache benötigen, hat die Bibliothek jetzt ein :class:`MemberCacheFlags` Flag, um den Mitglieder-Cache zu kontrollieren. Die Dokumentationsseite für die Klasse geht auf die spezifischen Richtlinien ein, die möglich sind. - -Es sollte beachtet werden, dass bestimmte Dinge keinen Mitglieder-Cache benötigen, da Discord, wenn möglich, vollständige Mitgliederinformationen bereitstellt. Zum Beispiel: - -- :func:`on_message` wird :attr:`Message.author` als Mitglied haben, auch wenn der Cache deaktiviert ist. -- Bei :func:`on_voice_state_update` wird der Parameter ``member`` ein Mitglied sein, auch wenn der Cache deaktiviert ist. -- :func:`on_reaction_add` lässt den ``user`` Parameter ein Mitglied sein, wenn er in einer Gilde ist, auch wenn der Cache deaktiviert ist. -- Bei :func:`on_raw_reaction_add` wird :attr:`RawReactionActionEvent.member` in einer Gilde ein Mitglied sein, auch wenn der Cache deaktiviert ist. -- Die Ereignisse zum Hinzufügen von Reaktionen enthalten keine zusätzlichen Informationen, wenn sie in direkten Nachrichten enthalten sind. Dies ist eine Einschränkung von Discord. -- Die Reaktionsentfernungsereignisse enthalten keine Mitgliederinformationen. Dies ist eine Einschränkung von Discord. - -Andere Ereignisse, die ein :class:`Member` annehmen, erfordern die Verwendung des Mitglieder-Caches. Wenn absolute Genauigkeit über den Mitglieder-Cache erwünscht ist, dann ist es ratsam, die Absicht :attr:`Intents.members` aktiviert zu haben. - -.. _retrieving_members: - -Abrufen von Mitgliedern ------------------------ - -Wenn der Cache deaktiviert ist oder Sie das Chunking von Gilden beim Start deaktivieren, brauchen wir vielleicht immer noch eine Möglichkeit, Mitglieder zu laden. Die Bibliothek bietet einige Möglichkeiten, dies zu tun: - -- :meth:`Guild.query_members` - - Wird verwendet, um Mitglieder nach einem Präfix abzufragen, das dem Nickname oder Benutzernamen entspricht. - - Dies kann auch verwendet werden, um Mitglieder nach ihrer Benutzer-ID abzufragen. - - Dies verwendet das Gateway und nicht HTTP. -- :meth:`Guild.chunk` - - Dies kann verwendet werden, um die gesamte Mitgliederliste über das Gateway abzurufen. -- :meth:`Guild.fetch_member` - - Wird verwendet, um ein Mitglied nach ID über die HTTP-API abzurufen. -- :meth:`Guild.fetch_members` - - wird verwendet, um eine große Anzahl von Mitgliedern über die HTTP-API abzurufen. - -Es ist zu beachten, dass das Gateway eine strikte Ratenbegrenzung von 120 Anfragen pro 60 Sekunden hat. - -Fehlersuche ---------------- - -Einige häufige Probleme im Zusammenhang mit der obligatorischen Absichtsänderung. - -Wo sind meine Mitglieder hin? -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Aufgrund einer :ref:`API-Änderung ` zwingt Discord nun Entwickler, die das Zwischenspeichern von Mitgliedern wünschen, sich ausdrücklich dafür zu entscheiden. Dies ist eine von Discord vorgeschriebene Änderung, die nicht umgangen werden kann. Um Mitglieder zurückzubekommen, müssen Sie explizit den :ref:`members privileged intent ` aktivieren und das Attribut :attr:`Intents.members` auf true ändern. - -Zum Beispiel: - -.. code-block:: python3 - :emphasize-lines: 3,6,8,9 - - importieren diskord - intents = discord.Intents.default() - intents.members = True - - # Irgendwo anders: - # client = discord.Client(intents=intents) - # oder - # from discord.ext import commands - # bot = commands.Bot(command_prefix='!', intents=intents) - -Warum braucht ``on_ready`` so lange zum Feuern? -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -Als Teil der API-Änderung bezüglich der Intents hat Discord auch die Art und Weise geändert, wie Mitglieder zu Beginn geladen werden. Ursprünglich konnte die Bibliothek 75 Gilden auf einmal anfordern und nur Mitglieder von Gilden anfordern, die das Attribut :attr:`Guild.large` auf ``True`` gesetzt haben. Mit der neuen Absichtsänderung schreibt Discord vor, dass wir nur 1 Gilde pro Anfrage senden können. Dies führt zu einer 75-fachen Verlangsamung, die durch die Tatsache, dass *alle* Gilden, nicht nur große Gilden, angefragt werden, noch verstärkt wird. - -Es gibt einige Lösungen, um dieses Problem zu beheben. - -Die erste Lösung besteht darin, die Absicht der privilegierten Anwesenheit zusammen mit der Absicht der privilegierten Mitglieder anzufordern und beide zu aktivieren. Dadurch kann die anfängliche Mitgliederliste Online-Mitglieder enthalten, genau wie beim alten Gateway. Beachten Sie, dass wir immer noch auf 1 Gilde pro Anfrage beschränkt sind, aber die Anzahl der Gilden, die wir anfordern, ist deutlich reduziert. - -Die zweite Lösung ist, das Chunking der Mitglieder zu deaktivieren, indem man ``chunk_guilds_at_startup`` auf ``False`` setzt, wenn man einen Client erstellt. Dann, wenn das Chunking für eine Gilde notwendig ist, kann man die verschiedenen Techniken zum :ref:`Abrufen von Mitgliedern ` verwenden. - -Um die durch die API-Änderung verursachte Verlangsamung zu veranschaulichen, nehmen wir einen Bot, der in 840 Gilden ist und 95 dieser Gilden sind "groß" (über 250 Mitglieder). - -Nach dem ursprünglichen System würde dies dazu führen, dass 2 Anfragen zum Abrufen der Mitgliederliste (75 Gilden, 20 Gilden) ungefähr 60 Sekunden dauern würden. Mit :attr:`Intents.members`, aber nicht mit :attr:`Intents.presences`, erfordert dies 840 Anfragen, was bei einem Ratenlimit von 120 Anfragen pro 60 Sekunden bedeutet, dass durch das Warten auf das Ratenlimit insgesamt etwa 7 Minuten Wartezeit anfallen, um alle Mitglieder abzurufen. Mit :attr:`Intents.members` und :attr:`Intents.presences` erhalten wir größtenteils das alte Verhalten, so dass wir nur für die 95 Gilden, die groß sind, Anfragen stellen müssen, das ist etwas weniger als unser Ratenlimit, so dass es nahe an der ursprünglichen Zeit für das Abrufen der Mitgliederliste liegt. - -Da diese Änderung von Discord verlangt wird, gibt es leider nichts, was die Bibliothek tun kann, um dies abzumildern. - -Wenn Ihnen die Richtung, die Discord mit seiner API einschlägt, wirklich nicht gefällt, können Sie sie über `Support `_ kontaktieren. -``` \ No newline at end of file diff --git a/docs/guide/de/misc/logging.md b/docs/guide/de/misc/logging.md deleted file mode 100644 index 8f1cdf9957..0000000000 --- a/docs/guide/de/misc/logging.md +++ /dev/null @@ -1,48 +0,0 @@ -```{eval-rst} -:orphan: - -.. versionadded:: 0.6.0 -.. _logging_setup: - -Einrichten der Protokollierung -================== - -*Pycord* protokolliert Fehler und Debug-Informationen über das :mod:`logging` python -Modul. Es wird dringend empfohlen, dass das Logging-Modul -konfiguriert ist, da keine Fehler oder Warnungen ausgegeben werden, wenn es nicht konfiguriert ist. -Die Konfiguration des ``logging``-Moduls kann so einfach sein wie:: - - import logging - - logging.basicConfig(level=logging.INFO) - -Wird am Anfang der Anwendung platziert. Dies wird die Logs von -discord sowie andere Bibliotheken, die das ``logging`` Modul benutzen -verwenden, direkt auf der Konsole aus. - -Das optionale ``Level`` Argument spezifiziert, welches Level von Ereignissen protokolliert werden soll -ausgeben soll und kann einer der Werte ``CRITICAL``, ``ERROR``, ``WARNING``, ``INFO``, und -``DEBUG`` sein und ist, wenn nicht angegeben, auf ``WARNING`` voreingestellt. - -Weitergehende Einstellungen sind mit dem Modul :mod:`logging` möglich. Für -zum Beispiel, um die Logs in eine Datei namens ``discord.log`` zu schreiben, anstatt -in eine Datei namens ``discord.log`` zu schreiben, anstatt sie auf der Konsole auszugeben, kann das folgende Snippet verwendet werden:: - - import discord - importiere logging - - logger = logging.getLogger('discord') - logger.setLevel(logging.DEBUG) - handler = logging.FileHandler(filename='discord.log', encoding='utf-8', mode='w') - handler.setFormatter(logging.Formatter('%(asctime)s:%(levelname)s:%(name)s: %(message)s')) - logger.addHandler(handler) - -Dies wird empfohlen, besonders auf ausführlichen Ebenen wie ``INFO`` -und ``DEBUG``, da eine Menge Ereignisse protokolliert werden und es die -stdout Ihres Programms verstopfen würde. - - - -Für weitere Informationen lesen Sie bitte die Dokumentation und das Tutorial des -:mod:`Logging`-Moduls. -``` \ No newline at end of file diff --git a/docs/guide/de/misc/webhooks.md b/docs/guide/de/misc/webhooks.md deleted file mode 100644 index 7b5896e97d..0000000000 --- a/docs/guide/de/misc/webhooks.md +++ /dev/null @@ -1,16 +0,0 @@ -# Webhooks -Die Anleitung zur Verwendung von Webhooks in Pycord - -## Ein einfacher Webhook - -Nachfolgend ein Beispiel für einen einfachen Webhook -Pycord -```py -from discord importieren Webhook, AsyncWebhookAdapter -import aiohttp - -async def beispiel_nachricht(): - async with aiohttp.ClientSession() as session: - webhook = Webhook.from_url('url-here', adapter=AsyncWebhookAdapter(session)) - await webhook.send('Hallo!', username='example_webhook') -``` \ No newline at end of file diff --git a/docs/guide/de/starting-out/initial-files.md b/docs/guide/de/starting-out/initial-files.md deleted file mode 100644 index 922d567b0a..0000000000 --- a/docs/guide/de/starting-out/initial-files.md +++ /dev/null @@ -1,12 +0,0 @@ -# Initiale Dateien -Hier lernen Sie die Anfangsdateien, mit denen Sie beginnen. - -# Users Starting-out -Anfängern wird empfohlen, nur eine "main.py"-Datei zu verwenden und ihre "Cogs" in einen "Cogs"-Ordner zu legen. - -# Fortgeschrittene Benutzer -Für fortgeschrittene Benutzer wäre es empfehlenswert, den Bot in Module aufzuteilen, - -Wie `moderation_module` oder `fun_module`, etc - -für diese Benutzer ist es auch empfehlenswert, `Bot` oder `Client` zu subclassen, anstatt `=` zu verwenden, um mehr Funktionen hinzuzufügen. \ No newline at end of file diff --git a/docs/guide/de/starting-out/installing.md b/docs/guide/de/starting-out/installing.md deleted file mode 100644 index da8a9d0daa..0000000000 --- a/docs/guide/de/starting-out/installing.md +++ /dev/null @@ -1,125 +0,0 @@ -```{eval-rst} -:orphan: - -.. currentmodule:: discord - -.. _intro: - -Installation von Pycord -======================= - -Dies ist die Dokumentation für Pycord, eine Bibliothek für Python zur Unterstützung -zur Erstellung von Anwendungen, die die Discord-API nutzen. - -Voraussetzungen -------------- - -Pycord funktioniert mit Python 3.8 oder höher. Unterstützung für frühere Versionen von Python -ist nicht vorgesehen. Python 2.7 oder niedriger wird nicht unterstützt. Python 3.7 oder niedriger wird nicht unterstützt. - - -.. _installieren: - -Installation von ------------ - -Sie können die Bibliothek direkt von PyPI beziehen: :: - - python3 -m pip install -U py-cord - -Wenn Sie Windows verwenden, sollten Sie stattdessen folgendes verwenden: :: - - py -3 -m pip install -U py-cord - - -Um zusätzliche Pakete für die Beschleunigung zu installieren, sollten Sie ``py-cord[speed]`` anstelle von ``py-cord`` verwenden, z.B. :: - -.. code:: sh - - # Linux/macOS - python3 -m pip install -U "py-cord[speed]" - - # Windows - py -3 -m pip install -U py-cord[Geschwindigkeit] - - -Um Sprachunterstützung zu erhalten, sollten Sie ``py-cord[voice]`` anstelle von ``py-cord`` verwenden, z.B.:: - - python3 -m pip install -U py-cord[voice] - -In Linux-Umgebungen erfordert die Installation von voice die Beschaffung der folgenden Abhängigkeiten: - -- `libffi `_ -- `libnacl `_ -- `python3-dev `_ - -Für ein Debian-basiertes System, wird der folgende Befehl diese Abhängigkeiten erhalten: - -.. code-block:: shell - - $ apt install libffi-dev libnacl-dev python3-dev - -Denken Sie daran, Ihre Berechtigungen zu überprüfen! - -Virtuelle Umgebungen -~~~~~~~~~~~~~~~~~~~~ - -Manchmal möchte man verhindern, dass Bibliotheken die Systeminstallationen verunreinigen oder eine andere Version von -als die auf dem System installierten Bibliotheken. Es kann auch sein, dass Sie keine Berechtigung haben, Bibliotheken systemweit zu installieren. -Zu diesem Zweck verfügt die Standardbibliothek ab Python 3.3 über ein Konzept namens "Virtual Environment", das -diese getrennten Versionen zu verwalten. - -Ein ausführlicheres Tutorial findet sich unter :doc:`py:tutorial/venv`. - -Aber für die schnelle und schmutzige Seite: - -1. Wechseln Sie in das Arbeitsverzeichnis Ihres Projekts: - - .. code-block:: shell - - $ cd your-bot-source - $ python3 -m venv bot-env - -2. Aktivieren Sie die virtuelle Umgebung: - - .. code-block:: shell - - $ source bot-env/bin/activate - - Unter Windows aktivieren Sie sie mit: - - .. code-block:: shell - - $ bot-env\Scripts\activate.bat - -3. Verwenden Sie pip wie gewohnt: - - .. code-block:: shell - - $ pip install -U py-cord - -Glückwunsch! Sie haben nun eine virtuelle Umgebung eingerichtet. - -Grundlegende Konzepte --------------- - -Pycord dreht sich um das Konzept von :ref:`Events `. -Ein Ereignis ist etwas, auf das Sie hören und auf das Sie dann reagieren. Zum Beispiel, wenn eine Nachricht -geschieht, erhalten Sie ein Ereignis, auf das Sie reagieren können. - -Ein kurzes Beispiel, um zu zeigen, wie Ereignisse funktionieren: - -.. code-block:: python3 - - import discord - - class MyClient(discord.Client): - async def on_ready(self): - print(f'Angemeldet als {self.user}!') - - async def on_message(self, message): - print(f'Nachricht von {message.author}: {message.content}') - - client = MyClient() - client.run('mein Token kommt hier hin') -``` \ No newline at end of file diff --git a/docs/guide/de/starting-out/making-a-bot.md b/docs/guide/de/starting-out/making-a-bot.md deleted file mode 100644 index f40e008db7..0000000000 --- a/docs/guide/de/starting-out/making-a-bot.md +++ /dev/null @@ -1,98 +0,0 @@ -```{eval-rst} -:orphan: - -.. _discord-intro: - -Erstellen eines Bot-Kontos -======================== - -Um mit der Bibliothek und der Discord-API im Allgemeinen arbeiten zu können, müssen wir zunächst ein Discord-Bot-Konto erstellen. - -Das Erstellen eines Bot-Kontos ist ein ziemlich unkomplizierter Prozess. - -1. Vergewissern Sie sich, dass Sie auf der Discord-Website `_ angemeldet sind. -2. Navigieren Sie zur `Anwendungsseite `_. -3. Klicken Sie auf die Schaltfläche "Neue Anwendung". - - ...Bild:: /images/discord_create_app_button.png - :alt: Die Schaltfläche "Neue Anwendung". - -4. Geben Sie der Anwendung einen Namen und klicken Sie auf "Erstellen". - - ... Bild:: /images/discord_create_app_form.png - :alt: Das neu ausgefüllte Antragsformular. - -5. Erstellen Sie einen Bot-Benutzer, indem Sie zur Registerkarte "Bot" navigieren und auf "Bot hinzufügen" klicken. - - - Klicken Sie auf "Yes, do it!", um fortzufahren. - - .. image:: /images/discord_create_bot_user.png - :alt: Die Schaltfläche "Bot hinzufügen". -6. Vergewissern Sie sich, dass **Public Bot** angekreuzt ist, wenn Sie möchten, dass andere Personen Ihren Bot einladen können. - - - Vergewissern Sie sich auch, dass **OAuth2 Code Grant** nicht angekreuzt ist, es sei denn, Sie - wenn Sie nicht gerade einen Dienst entwickeln, der dies erfordert. Wenn Sie sich nicht sicher sind, lassen Sie es **unangekreuzt**. - - ...Bild:: /images/discord_bot_user_options.png - :alt: So sollten die Bot-Benutzeroptionen für die meisten Menschen aussehen. - -7. Kopieren Sie das Token über die Schaltfläche "Kopieren". - - - Dies ist nicht das Client-Geheimnis auf der Seite "Allgemeine Informationen". - - ...Warnung:: - - Beachten Sie, dass dieses Token im Wesentlichen das Passwort Ihres Bots ist. - Passwort ist. Sie sollten es **niemals** an eine andere Person weitergeben. Wenn Sie das tun, - kann sich jemand in Ihren Bot einloggen und bösartige Dinge tun, wie z.B. - Server zu verlassen, alle Mitglieder innerhalb eines Servers zu sperren oder böswillige Pings an alle zu senden. - - Die Möglichkeiten sind endlos, also **geben Sie dieses Token nicht weiter**. - - Wenn Sie Ihren Token versehentlich weitergegeben haben, klicken Sie so schnell wie möglich auf die Schaltfläche "Neu generieren". - so schnell wie möglich. Dadurch wird Ihr alter Token widerrufen und ein neuer Token generiert. - Nun müssen Sie sich mit dem neuen Token anmelden. - -Und das war's. Sie haben jetzt ein Bot-Konto und können sich mit diesem Token anmelden. - -.. _discord_invite_bot: - -Ihren Bot einladen -------------------- - -Sie haben also einen Bot-Benutzer erstellt, aber er befindet sich nicht auf einem Server. - -Wenn Sie Ihren Bot einladen möchten, müssen Sie eine Einladungs-URL für ihn erstellen. - -1. Stellen Sie sicher, dass Sie auf der `Discord-Website `_ angemeldet sind. -2. Navigieren Sie zur `Anwendungsseite `_. -3. Klicke auf die Seite deines Bots. -4. Erweitern Sie den Reiter "OAuth2" und klicken Sie auf "URL Generator". - - ...Bild:: /images/discord_oauth2.png - :alt: So sollte die OAuth2-Registerkarte aussehen. - -5. Aktivieren Sie die Kontrollkästchen "bot" und "applications.commands" unter "scopes". - - .. image:: /images/discord_oauth2_scope.png - :alt: Das Kontrollkästchen für den Geltungsbereich, wenn "bot" und "applications.commands" angekreuzt sind. - -6. Aktivieren Sie unter "Bot Permissions" die für die Funktion Ihres Bots erforderlichen Berechtigungen. - - - Bitte beachten Sie die Konsequenzen, wenn Sie für Ihren Bot die Berechtigung "Administrator" benötigen. - - - Bot-Besitzer müssen für bestimmte Aktionen und Berechtigungen 2FA aktiviert haben, wenn sie auf Servern hinzugefügt werden, auf denen Server-weite 2FA aktiviert ist. Weitere Informationen finden Sie auf der `2FA-Supportseite `_. - - ...Bild:: /images/discord_oauth2_perms.png - :alt: Die Kontrollkästchen für die Berechtigungen mit einigen aktivierten Berechtigungen. - -7. Nun kann die resultierende URL verwendet werden, um Ihren Bot zu einem Server hinzuzufügen. Kopieren Sie die URL und fügen Sie sie in Ihren Browser ein, wählen Sie einen Server aus, zu dem Sie den Bot einladen möchten, und klicken Sie auf "Autorisieren". - - -...Hinweis:: - - Die Person, die den Bot hinzufügt, muss über die Berechtigung "Server verwalten" verfügen, um dies zu tun. - -Wenn Sie diese URL dynamisch zur Laufzeit innerhalb Ihres Bots generieren möchten und die -Schnittstelle :class:`discord.Permissions` verwenden, können Sie :func:`discord.utils.oauth_url` verwenden. -``` \ No newline at end of file diff --git a/docs/guide/en/ext/commands/checks.md b/docs/guide/ext/commands/checks.md similarity index 100% rename from docs/guide/en/ext/commands/checks.md rename to docs/guide/ext/commands/checks.md diff --git a/docs/guide/en/ext/commands/cogs.md b/docs/guide/ext/commands/cogs.md similarity index 100% rename from docs/guide/en/ext/commands/cogs.md rename to docs/guide/ext/commands/cogs.md diff --git a/docs/guide/en/ext/commands/index.md b/docs/guide/ext/commands/index.md similarity index 100% rename from docs/guide/en/ext/commands/index.md rename to docs/guide/ext/commands/index.md diff --git a/docs/guide/en/ext/pages/index.md b/docs/guide/ext/pages/index.md similarity index 100% rename from docs/guide/en/ext/pages/index.md rename to docs/guide/ext/pages/index.md diff --git a/docs/guide/en/ext/tasks/index.md b/docs/guide/ext/tasks/index.md similarity index 100% rename from docs/guide/en/ext/tasks/index.md rename to docs/guide/ext/tasks/index.md diff --git a/docs/guide/en/index.md b/docs/guide/index.md similarity index 100% rename from docs/guide/en/index.md rename to docs/guide/index.md diff --git a/docs/guide/index.rst b/docs/guide/index.rst deleted file mode 100644 index 6c54137d46..0000000000 --- a/docs/guide/index.rst +++ /dev/null @@ -1,8 +0,0 @@ -Welcome to the pycord guide! -============================ -These bellow are the current translations to pick from. - -:doc:`en/index` EN/US Guide -:doc:`de/index` DE/GERMAN Guide - -Hey! if you don't see your language here we suggest you help us translate the docs to it, just `make a pull request `_ \ No newline at end of file diff --git a/docs/guide/en/interactions/button_views.md b/docs/guide/interactions/button_views.md similarity index 100% rename from docs/guide/en/interactions/button_views.md rename to docs/guide/interactions/button_views.md diff --git a/docs/guide/en/interactions/context_menus.md b/docs/guide/interactions/context_menus.md similarity index 100% rename from docs/guide/en/interactions/context_menus.md rename to docs/guide/interactions/context_menus.md diff --git a/docs/guide/en/interactions/select_views.md b/docs/guide/interactions/select_views.md similarity index 100% rename from docs/guide/en/interactions/select_views.md rename to docs/guide/interactions/select_views.md diff --git a/docs/guide/en/interactions/slash_commands.md b/docs/guide/interactions/slash_commands.md similarity index 100% rename from docs/guide/en/interactions/slash_commands.md rename to docs/guide/interactions/slash_commands.md diff --git a/docs/guide/en/misc/intents.md b/docs/guide/misc/intents.md similarity index 100% rename from docs/guide/en/misc/intents.md rename to docs/guide/misc/intents.md diff --git a/docs/guide/en/misc/logging.md b/docs/guide/misc/logging.md similarity index 100% rename from docs/guide/en/misc/logging.md rename to docs/guide/misc/logging.md diff --git a/docs/guide/en/misc/webhooks.md b/docs/guide/misc/webhooks.md similarity index 100% rename from docs/guide/en/misc/webhooks.md rename to docs/guide/misc/webhooks.md diff --git a/docs/guide/en/starting-out/initial-files.md b/docs/guide/starting-out/initial-files.md similarity index 100% rename from docs/guide/en/starting-out/initial-files.md rename to docs/guide/starting-out/initial-files.md diff --git a/docs/guide/en/starting-out/installing.md b/docs/guide/starting-out/installing.md similarity index 100% rename from docs/guide/en/starting-out/installing.md rename to docs/guide/starting-out/installing.md diff --git a/docs/guide/en/starting-out/making-a-bot.md b/docs/guide/starting-out/making-a-bot.md similarity index 100% rename from docs/guide/en/starting-out/making-a-bot.md rename to docs/guide/starting-out/making-a-bot.md diff --git a/setup.py b/setup.py index 2dc43aed7e..eb664adf1d 100644 --- a/setup.py +++ b/setup.py @@ -1,5 +1,4 @@ import re - from setuptools import setup # Requirements From 477bfb6dd970e7369421ffa04e43c3fc6419ff7d Mon Sep 17 00:00:00 2001 From: Vincent Date: Wed, 12 Jan 2022 15:00:39 +0800 Subject: [PATCH 161/180] some progress --- docs/guide/ext/commands/cogs.md | 30 +++++++++++++++++++++++++++++- docs/guide/ext/pages/index.md | 25 ++++++++++++++++++++++++- 2 files changed, 53 insertions(+), 2 deletions(-) diff --git a/docs/guide/ext/commands/cogs.md b/docs/guide/ext/commands/cogs.md index b1b6fb4a1c..54bcfd7e28 100644 --- a/docs/guide/ext/commands/cogs.md +++ b/docs/guide/ext/commands/cogs.md @@ -1,2 +1,30 @@ # Using Cogs in Pycord -The ``ext.commands`` module provided by Pycord introduces a `Cog` system allowing you to make commands of any kind or even events in another file. \ No newline at end of file +The ``ext.commands`` module provided by Pycord introduces a `Cog` system allowing you to make commands of any kind or even events in another file. +# Basics +A basic `Cog` would just be subclassing the `commands.Cog` class, like so: +```py +from discord.ext import commands + +class MyCog(commands.Cog): + def __init__(self, bot): + self.bot = bot +``` +Then to add it as a `Cog` make the function! +```py +def setup(bot): + bot.add_cog(MyCog(bot)) +``` +Then finally just add it to your load_extensions: +```py +bot.load_extension("my_cog") +``` +Then thats it, You now have a `Cog`! + +# How to make a command +Making commands are as-easy as normal, +only difference is using `@commands.command` instead of `@bot.command` inside your `Cog` like so: +```py +@commands.command() +async def my_command(self, ctx): + ... +``` diff --git a/docs/guide/ext/pages/index.md b/docs/guide/ext/pages/index.md index 4bf1f56d24..6fda6cff93 100644 --- a/docs/guide/ext/pages/index.md +++ b/docs/guide/ext/pages/index.md @@ -1,2 +1,25 @@ # Using the ``ext.pages`` module in Pycord -This here is a primer to using all that ``ext.pages`` offers you. \ No newline at end of file +This is a primer to using all that ``ext.pages`` offers you. + +# Basics + +# Messages +First you will want to tell pages your embeds, like so: +```py +my_pages = [ + "Hey! This is page1", + "And, this is page2" +] +``` +Then define the pages in the `Paginator`, like so: +```py +from discord.ext import pages +scroll = pages.Paginator(pages=my_pages(), show_disabled=False, show_indicator=True) +``` +Then customize the buttons to your liking +```py +paginator.customize_button("next", button_label=">", button_style=discord.ButtonStyle.green) +paginator.customize_button("prev", button_label="<", button_style=discord.ButtonStyle.green) +paginator.customize_button("first", button_label="<<", button_style=discord.ButtonStyle.blurple) +paginator.customize_button("last", button_label=">>", button_style=discord.ButtonStyle.blurple) +``` \ No newline at end of file From 825a8eb289bcf7bf8bd8afd5fa6d48e1e41a18f5 Mon Sep 17 00:00:00 2001 From: Vincent Date: Wed, 12 Jan 2022 15:05:21 +0800 Subject: [PATCH 162/180] fix typos --- docs/guide/ext/commands/cogs.md | 2 +- docs/guide/starting-out/initial-files.md | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/docs/guide/ext/commands/cogs.md b/docs/guide/ext/commands/cogs.md index 54bcfd7e28..4bf92e437a 100644 --- a/docs/guide/ext/commands/cogs.md +++ b/docs/guide/ext/commands/cogs.md @@ -18,7 +18,7 @@ Then finally just add it to your load_extensions: ```py bot.load_extension("my_cog") ``` -Then thats it, You now have a `Cog`! +Then that's it, You now have a `Cog`! # How to make a command Making commands are as-easy as normal, diff --git a/docs/guide/starting-out/initial-files.md b/docs/guide/starting-out/initial-files.md index d164dfb623..1d74c41342 100644 --- a/docs/guide/starting-out/initial-files.md +++ b/docs/guide/starting-out/initial-files.md @@ -9,4 +9,4 @@ For advanced users it would be recommended to have your bot split into modules, Like `moderation_module` or `fun_module`, etc -it's also for these users were it's recommened to subclass `Bot` or `Client` instead of doing `=` to add more features. \ No newline at end of file +it's also for these users were it's recommended to subclass `Bot` or `Client` instead of doing `=` to add more features. \ No newline at end of file From 6898b5174adc361683664ef0b69405aa27803a72 Mon Sep 17 00:00:00 2001 From: Vincent Date: Thu, 13 Jan 2022 10:11:11 +0800 Subject: [PATCH 163/180] separate branch from bob's fork --- docs/guide/databases/index.md | 2 - docs/index.rst | 1 - docs/migrating.rst | 295 ---------------------------------- docs/whats_new.rst | 9 -- 4 files changed, 307 deletions(-) delete mode 100644 docs/guide/databases/index.md delete mode 100644 docs/migrating.rst diff --git a/docs/guide/databases/index.md b/docs/guide/databases/index.md deleted file mode 100644 index 7a6797fad6..0000000000 --- a/docs/guide/databases/index.md +++ /dev/null @@ -1,2 +0,0 @@ -# A Primer to Database management -This will teach you the basics of using multiple databases and how use cases in Pycord. \ No newline at end of file diff --git a/docs/index.rst b/docs/index.rst index 4fe462b1d3..d481bd9a06 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -75,5 +75,4 @@ If you're looking for something related to the project itself, it's here. whats_new version_guarantees - migrating migrating_to_v1 diff --git a/docs/migrating.rst b/docs/migrating.rst deleted file mode 100644 index df27857310..0000000000 --- a/docs/migrating.rst +++ /dev/null @@ -1,295 +0,0 @@ -.. currentmodule:: discord - -.. _migrating_2_0: - -Migrating to v2.0 -================= - -v2.0 includes many breaking changes and added features. - -This update adds new features from the discord API such as application commands (slash, user, and message), as well as -message components and much more. - -Since Pycord is still relatively new, we have attempted to make the migration from discord.py and v1 to pycord and v2 as -smooth as possible. - -Python Version Change ---------------------- - -In order to make development easier and also to allow for our dependencies to upgrade to allow usage of 3.10 or higher, -the library had to remove support for Python versions lower than 3.8, which essentially means that **support for Python -3.7 is dropped**. - -Migration to Pycord -------------------- - -We have tried to make the migration as smooth as possible. The only breaking changes that we have made are improvements, -not deletions in favor of a new style. We're going to provide as much backwards support as possible, though there will -be some changes to the API as is to be expected in major releases. - -New Package Name -~~~~~~~~~~~~~~~~ -The package name has been changed from ``discord.py`` to ``py-cord``, because our package is a fork of the original -discord.py package. - -Breaking Changes ----------------- -The following changes are breaking changes, and will cause your code to stop working if you use any of these features. - -User Account Support Removed -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -User account ("userbot") is no longer supported. Thus, many features that were only applicable to them have been -removed. Please note, this means that detection of Nitro is no longer possible. - -**Removed** - -The following features have been removed due to being solely related to user account support - -- The ``bot`` parameter of :meth:`Client.start`/:meth:`Client.run` -- The ``afk`` parameter of :meth:`Client.change_presence` -- All of the following classes and types: - - ``Profile`` - - ``Relationship`` - - ``CallMessage`` - - ``GroupCall`` - - ``RelationshipType`` - - ``HypeSquadHouse`` - - ``PremiumType`` - - ``UserContentFilter`` - - ``FriendFlags`` - - ``Theme`` - - ``RelationshipType`` -- The following methods of :class:`GroupChannel`: - - ``add_recipients`` - - ``remove_recipients`` - - ``edit`` -- The ``ack`` method of :class:`Guild` -- The ``call`` and ``ack`` methods of :class:`Message` -- The ``fetch_user_profile`` method of :class:`Client` - -Use of timezone-aware datetime -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Datetime objects are now required to be timezone-aware by the library internals. This means that you will need to -convert your datetime objects to a timezone-aware datetime object (or make them timezone-aware from the beginning) -before passing them to the library. Instead of ``datetime.datetime.utcnow``, you should use -``datetime.datetime.now(datetime.timezone.utc)``. If you are constructing a datetime object yourself, you should pass -``datetime.timezone.utc`` to the ``tzinfo`` parameter. - -.. code-block:: python - - embed = discord.Embed( - title = "Pi Day 2021 in UTC", - timestamp = datetime(2021, 3, 14, 15, 9, 2, tzinfo=timezone.utc) - ) - - -Methods of :class:`Client` -~~~~~~~~~~~~~~~~~~~~~~~~~~ -- ``request_offline_members`` - This has been depreciated since v1.5. -- ``logout`` - This was an alias for :meth:`Client.close`, which is now the preferred method. - -Embed __bool__ method changed -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The ``__bool__`` method of :class:`Embed` has been changed (affects ``bool(Embed)``). It will now always return truthy -values. Previously it only considered text fields. - -Duplicate registration of cogs -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -:meth:`Bot.add_cog` now raises when a cog with the same name is already registered. The ``override`` argument can be -used to bring back the 1.x behavior. - -ExtensionNotFound.original removed -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The ``original`` attribute of :class:`ExtensionNotFound` has been removed. This previously returned ``None`` for -compatibility. - -MemberCacheFlags.online removed -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Due to a Discord limitation, the ``online`` attribute of :class:`MemberCacheFlags` has been removed. - -Message.type for replies changed -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -:attr:`Message.type` has been changed for replies. It now returns :attr:`MessageType.reply` instead of -:attr:`MessageType.default`. - -Private channel events removed -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -``private_channel_create`` and ``private_channel_delete`` events will no longer be dispatched due to Discord -limitations. - -Command clean_params type changed -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The :attr:`~.ext.commands.Command.clean_params` attribute of :class:`ext.commands.Command` has been changed to return a -:class:`dict` instead of an ``OrderedDict``. - -DMChannel recipient changed -~~~~~~~~~~~~~~~~~~~~~~~~~~~ -:attr:`DMChannel.recipient` is now optional, and will return ``None`` in many cases. - -User and Member permissions_in -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Use :meth:`abc.GuildChannel.permissions_for` instead. - -GuildChannel permissions_for changed -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The :meth:`abc.GuildChannel.permissions_for` method's first argument is now positional only. - -Client guild_subscriptions removed -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The ``guild_subscriptions`` attribute of :class:`Client` has been removed, as it has been replaced by the -:ref:`intents ` system. - -Webhook changes -~~~~~~~~~~~~~~~ - -:class:`Webhook` was overhauled. - -- :class:`Webhook` and :class:`WebhookMessage` are now always asynchronous. For synchronous usage (requests), use :class:`SyncWebhook` and :class:`SyncWebhookMessage`. -- ``WebhookAdapter``, ``AsyncWebhookAdapter``, and ``RequestsWebhookAdapter`` have been removed as they are unnecessary. -- ``adapter`` arguments of :meth:`Webhook.partial` and :meth:`Webhook.from_url` have been removed. Sessions are now passed directly to these methods. - -.. code-block:: python - - webhook = discord.SyncWebhook.from_url( - f"https://discord.com/api/webhooks/{id}/{token}" - ) - webhook.send("Hello from pycord 2.0") - - -.. code-block:: python - - async with aiohttp.ClientSession() as session: - webhook = discord.Webhook.partial( - id, - token, - session=session - ) - await webhook.send("Hello from pycord 2.0") - - -HelpCommand clean_prefix removed -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The ``clean_prefix`` attribute of :class:`HelpCommand` has been removed. This was moved to -:attr:`ext.commands.Context.clean_prefix` - - -Sticker preview image removed -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The ``preview_image`` attribute of :class:`Sticker` has been removed, as Discord no longer provides the data needed for -this. - - -Asset Changes -~~~~~~~~~~~~~ -Assets have been changed. - -- Asset-related attributes that previously returned hash strings (e.g. :attr:`User.avatar`) now return :class:`Asset`. - :attr:`Asset.key` returns the hash from now on. -- ``Class.x_url`` and ``Class.x_url_as`` (e.g. ``User.avatar_url`` and ``Guild.icon_url_as``) have been removed. - :meth:`Asset.replace` or :class:`Asset`.with_x (e.g. :meth:`Asset.with_size`) methods can be used to get specific - asset sizes or types. -- :attr:`Emoji.url` and :attr:`PartialEmoji.url` are now :class:`str`. :meth:`Emoji.save` and :meth:`Emoji.read` are - added to save or read emojis. -- :meth:`Emoji.url_as` and :meth:`PartialEmoji.url_as` have been removed. -- The :attr:`~.AuditLogDiff.splash`, :attr:`~.AuditLogDiff.icon`, and :attr:`~.AuditLogDiff.avatar` attributes of - :class:`AuditLogDiff` now return :class:`Asset` instead of :class:`str`. -- :attr:`User.avatar` now returns ``None`` if the avatar is not set and is instead the default avatar; - use :attr:`User.display_avatar` for pre-2.0 behavior. - - -.. code-block:: python - - avatar_url = user.display_avatar.url # previously str(avatar_url) - avatar_128x128_url = user.display_avatar.with_size(128).url # previously str(avatar_url_as(size=128)) - avatar_128x128_png_url = user.display_avatar.replace(size=128, static_format="png").url - # previously str(avatar_url_as(size=128, static_format="png")) - # The code above can also be written as: - avatar_128x128_png_url = user.display_avatar.with_size(128).with_static_format("png").url - - avatar_bytes = await user.display_avatar.read() # previously avatar_url.read - - # Emoji and Sticker are special case: - emoji_url = emoji.url # previously str(emoji.url) - emoji_32x32_url = emoji.with_size(32).url # previously str(emoji.url_as(size=32)) - emoji_32x32_png_url = emoji.replace(size=32, static_format="png").url - # previously str(url_as(size=128, static_format="png")) - - emoji_bytes = await emoji.read() # previously emoji.url.read - # Same applies to Sticker and PartialEmoji. - - - -Color blurple changed -~~~~~~~~~~~~~~~~~~~~~ -The ``Colour.blurple`` method has been changed to :meth:`Colour.og_blurple`, and :meth:`Colour.blurple` now returns -the new theme color. - -``self_bot`` argument -~~~~~~~~~~~~~~~~~~~~~ -The ``self_bot`` argument of :class:`~.ext.commands.Bot` has been removed, since user bots are no longer supported. - -VerificationLevel attributes -~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The ``table_flip`` (alias of :attr:`~.VerificationLevel.high`) attribute of :class:`VerificationLevel` has been removed. -The ``extreme``, ``very_high``, and ``double_table_flip`` attributes were removed and have been replaced with -:attr:`~.VerificationLevel.highest`. - - -Arguments of ``oauth_url`` changed -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The ``permissions``, ``guild``, ``redirect_uri``, and ``scopes`` arguments of :func:`utils.oauth_url` have been changed -to be keyword only. - - -StageChannel changes -~~~~~~~~~~~~~~~~~~~~ -Due to the introduction of :class:`StageInstance`, which represents the current session of a :class:`StageChannel`; - -- :meth:`StageChannel.edit` can no longer be used to edit :attr:`~.StageChannel.topic`. Use :meth:`StageInstance.edit` - instead. -- :meth:`StageChannel.clone` no longer clones its topic. - - -Message channel attribute changed -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -:attr:`Message.channel` can now return :class:`Thread`. - - -Guild methods changed -~~~~~~~~~~~~~~~~~~~~~ -The :meth:`~.Guild.get_channel`, :meth:`~.Guild.get_role`, :meth:`~.Guild.get_member_named`, -:meth:`~.Guild.fetch_member`, and :meth:`~.Guild.fetch_emoji` methods' first arguments are now positional only. - - -Guild create_text_channel topic argument -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The ``topic`` argument of :meth:`Guild.create_text_channel` no longer accepts ``None``. - - -Reaction custom emoji -~~~~~~~~~~~~~~~~~~~~~ -The ``custom_emoji`` attribute of :class:`Reaction` has been replaced with the :meth:`Reaction.is_custom_emoji` method -for consistency. - - -Reaction users arguments changed -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -Arguments of :meth:`Reaction.users` have been changed to be keyword only. - - -IntegrationAccount id attribute changed -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -:attr:`IntegrationAccount.id` is now a :class:`str` instead of an :class:`int`, due to Discord changes. - - -BadInviteArgument arguments changed -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -: - - -Where Is The 1.0.0 Migation Page? -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The v1.0 migration guide can be found at :ref:`migrating_1_0`. \ No newline at end of file diff --git a/docs/whats_new.rst b/docs/whats_new.rst index c05e5c37c8..210cb535d2 100644 --- a/docs/whats_new.rst +++ b/docs/whats_new.rst @@ -11,15 +11,6 @@ Changelog This page keeps a detailed human friendly rendering of what's new and changed in specific versions. -.. _vp2p0p0: - -v2.0.0 ------- - -The changeset for this version is too big to be listed here, for more information please -see :ref:`the migrating page `. - - .. _vp1p7p3: v1.7.3 From 50de3cfe4cddd4f0a746c0b267529d37ebc7b2e2 Mon Sep 17 00:00:00 2001 From: Vincent Date: Thu, 13 Jan 2022 10:15:34 +0800 Subject: [PATCH 164/180] fix --- docs/index.rst | 2 +- docs/{migrating_to_v1.rst => migrating.rst} | 0 2 files changed, 1 insertion(+), 1 deletion(-) rename docs/{migrating_to_v1.rst => migrating.rst} (100%) diff --git a/docs/index.rst b/docs/index.rst index d481bd9a06..6cc846fd75 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -75,4 +75,4 @@ If you're looking for something related to the project itself, it's here. whats_new version_guarantees - migrating_to_v1 + migrating diff --git a/docs/migrating_to_v1.rst b/docs/migrating.rst similarity index 100% rename from docs/migrating_to_v1.rst rename to docs/migrating.rst From c6794d4d8c64e453a52def73f93771abda90842a Mon Sep 17 00:00:00 2001 From: Vincent Date: Thu, 13 Jan 2022 10:16:50 +0800 Subject: [PATCH 165/180] i forgor --- setup.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setup.py b/setup.py index 1c8e9a57ea..5b63ae97bf 100644 --- a/setup.py +++ b/setup.py @@ -43,7 +43,7 @@ readme = f.read() # Extra Requirements -# Ex: pip install pycord[voice] or [speed] +# Ex: pip install py-cord[voice] or [speed] extras_require = { "voice": ["PyNaCl>=1.3.0,<1.6"], "docs": [ From 8a0ef98940ea1d1f36691e6c60ba159dc0bacb28 Mon Sep 17 00:00:00 2001 From: Vincent Date: Thu, 13 Jan 2022 16:12:40 +0800 Subject: [PATCH 166/180] fix :skull: --- docs/guide/ext/pages/index.md | 8 ++++---- setup.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/docs/guide/ext/pages/index.md b/docs/guide/ext/pages/index.md index 6fda6cff93..94fd479d59 100644 --- a/docs/guide/ext/pages/index.md +++ b/docs/guide/ext/pages/index.md @@ -18,8 +18,8 @@ scroll = pages.Paginator(pages=my_pages(), show_disabled=False, show_indicator=T ``` Then customize the buttons to your liking ```py -paginator.customize_button("next", button_label=">", button_style=discord.ButtonStyle.green) -paginator.customize_button("prev", button_label="<", button_style=discord.ButtonStyle.green) -paginator.customize_button("first", button_label="<<", button_style=discord.ButtonStyle.blurple) -paginator.customize_button("last", button_label=">>", button_style=discord.ButtonStyle.blurple) +scroll.customize_button("next", button_label=">", button_style=discord.ButtonStyle.green) +scroll.customize_button("prev", button_label="<", button_style=discord.ButtonStyle.green) +scroll.customize_button("first", button_label="<<", button_style=discord.ButtonStyle.blurple) +scroll.customize_button("last", button_label=">>", button_style=discord.ButtonStyle.blurple) ``` \ No newline at end of file diff --git a/setup.py b/setup.py index 5b63ae97bf..e2d95d9665 100644 --- a/setup.py +++ b/setup.py @@ -79,7 +79,7 @@ url="https://github.com/Pycord-Development/pycord", project_urls={ "Website": "https://pycord.dev", - "Documentation": "https://docs.pycord.dev/en/latest/", + "Documentation": "https://docs.pycord.dev/en/master/", "Issue tracker": "https://github.com/Pycord-Development/pycord/issues", }, version=version, From 409d33bd6a423605eade4fd8e1fbd49826036052 Mon Sep 17 00:00:00 2001 From: Lala Sabathil Date: Fri, 14 Jan 2022 18:53:41 +0100 Subject: [PATCH 167/180] Apply suggestions from code review Co-authored-by: BobDotCom <71356958+BobDotCom@users.noreply.github.com> --- .github/SECURITY.md | 5 ++--- .gitignore | 1 + discord/abc.py | 2 +- discord/audit_logs.py | 2 +- discord/client.py | 6 +++--- discord/webhook/__init__.py | 2 +- discord/webhook/async_.py | 2 ++ 7 files changed, 11 insertions(+), 9 deletions(-) diff --git a/.github/SECURITY.md b/.github/SECURITY.md index 2d6e825ba5..20b172ac0b 100644 --- a/.github/SECURITY.md +++ b/.github/SECURITY.md @@ -4,9 +4,8 @@ | Version | Supported | | ------- | ------------------ | -| <2.0.0 | :white_check_mark: | -| 1.7.3 | :x: | -| >1.7.x | :x: | +| 2.0.0 | :white_check_mark: | +| <2.0.0 | :x: | ## Reporting a Vulnerability diff --git a/.gitignore b/.gitignore index 2b642e1369..ad2b3dbf97 100644 --- a/.gitignore +++ b/.gitignore @@ -22,3 +22,4 @@ env/ build/ node_modules/* test.py +*.png diff --git a/discord/abc.py b/discord/abc.py index 279500ddd7..d25ad0a07a 100644 --- a/discord/abc.py +++ b/discord/abc.py @@ -1257,7 +1257,7 @@ async def send( ): """|coro| - Sends a message to the destination where the content was given. + Sends a message to the destination with the content given. The content must be a type that can convert to a string through ``str(content)``. If the content is set to ``None`` (the default), then the ``embed`` parameter must diff --git a/discord/audit_logs.py b/discord/audit_logs.py index a5b806e56f..441a05605c 100644 --- a/discord/audit_logs.py +++ b/discord/audit_logs.py @@ -335,7 +335,7 @@ class _AuditLogProxyStageInstanceAction: class AuditLogEntry(Hashable): r"""Represents an Audit Log entry. - You retrieve these through :meth:`Guild.audit_logs`. + You retrieve these via :meth:`Guild.audit_logs`. .. container:: operations diff --git a/discord/client.py b/discord/client.py index 39e0738826..c96894715f 100644 --- a/discord/client.py +++ b/discord/client.py @@ -262,7 +262,7 @@ def latency(self) -> float: return float('nan') if not ws else ws.latency def is_ws_ratelimited(self) -> bool: - """:class:`bool`: Whether the websocket is currently rate limited or not. + """:class:`bool`: Whether the websocket is currently rate limited. This can be useful to know when deciding whether you should query members using HTTP or via the gateway. @@ -833,7 +833,7 @@ def get_user(self, id: int, /) -> Optional[User]: return self._connection.get_user(id) def get_emoji(self, id: int, /) -> Optional[Emoji]: - """Returns the emoji with the given ID. + """Returns an emoji with the given ID. Parameters ----------- @@ -848,7 +848,7 @@ def get_emoji(self, id: int, /) -> Optional[Emoji]: return self._connection.get_emoji(id) def get_sticker(self, id: int, /) -> Optional[GuildSticker]: - """Returns the guild sticker with the given ID. + """Returns a guild sticker with the given ID. .. versionadded:: 2.0 diff --git a/discord/webhook/__init__.py b/discord/webhook/__init__.py index 22b95f288e..cf93c1f327 100644 --- a/discord/webhook/__init__.py +++ b/discord/webhook/__init__.py @@ -2,7 +2,7 @@ discord.webhook ~~~~~~~~~~~~~~~ -Support For Webhooks +Webhook support for the Discord API :copyright: (c) 2015-2021 Rapptz & (c) 2021-present Pycord Development :license: MIT, see LICENSE for more details. diff --git a/discord/webhook/async_.py b/discord/webhook/async_.py index 7692672657..310ad2a0b5 100644 --- a/discord/webhook/async_.py +++ b/discord/webhook/async_.py @@ -1198,6 +1198,8 @@ async def edit( Whether to use the bot token over the webhook token if available. Defaults to ``True``. + .. versionadded:: 2.0 + Raises ------- HTTPException From 34afde89e0b27cb11ef9dc1ad570facaf5291ec1 Mon Sep 17 00:00:00 2001 From: Lala Sabathil Date: Fri, 14 Jan 2022 18:53:56 +0100 Subject: [PATCH 168/180] Update discord/client.py Co-authored-by: BobDotCom <71356958+BobDotCom@users.noreply.github.com> --- discord/client.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/discord/client.py b/discord/client.py index c96894715f..62b998bc4a 100644 --- a/discord/client.py +++ b/discord/client.py @@ -238,7 +238,7 @@ def __init__( if VoiceClient.warn_nacl: VoiceClient.warn_nacl = False - _log.warning("PyNaCl is not installed, Voice will NOT be supported") + _log.warning("PyNaCl is not installed, voice will NOT be supported") # internals From 6414d797c08e8fab881902edf5f6e73ee7a65428 Mon Sep 17 00:00:00 2001 From: Vincent Date: Sun, 23 Jan 2022 10:23:46 +0800 Subject: [PATCH 169/180] refactor: undo guide --- .../making-a-bot.md => discord.rst} | 4 +- docs/guide/ext/commands/checks.md | 3 - docs/guide/ext/commands/cogs.md | 30 ------- docs/guide/ext/commands/index.md | 9 --- docs/guide/ext/pages/index.md | 25 ------ docs/guide/ext/tasks/index.md | 2 - docs/guide/index.md | 74 ------------------ docs/guide/interactions/button_views.md | 53 ------------- docs/guide/interactions/context_menus.md | 41 ---------- docs/guide/interactions/select_views.md | 50 ------------ docs/guide/interactions/slash_commands.md | 73 ----------------- docs/guide/misc/webhooks.md | 15 ---- docs/guide/starting-out/initial-files.md | 12 --- docs/images/guide/message_command.png | Bin 15384 -> 0 bytes docs/images/guide/user_command.png | Bin 12096 -> 0 bytes docs/index.rst | 4 +- .../installing.md => installing.rst} | 4 +- docs/{guide/misc/intents.md => intents.rst} | 4 +- docs/{guide/misc/logging.md => logging.rst} | 4 +- examples/app_commands/info.py | 45 +++++++---- examples/app_commands/slash_cog.py | 3 +- examples/app_commands/slash_cog_groups.py | 2 +- examples/cooldown.py | 5 +- examples/interactionsBot/bot.py | 5 +- examples/interactionsBot/cogs/button_cog.py | 2 +- examples/interactionsBot/cogs/dropdown_cog.py | 3 +- .../interactionsBot/cogs/slashOption_cog.py | 3 +- examples/interactionsBot/cogs/slash_cog.py | 3 +- examples/views/button_roles.py | 3 +- examples/views/paginator.py | 4 +- 30 files changed, 53 insertions(+), 432 deletions(-) rename docs/{guide/starting-out/making-a-bot.md => discord.rst} (99%) delete mode 100644 docs/guide/ext/commands/checks.md delete mode 100644 docs/guide/ext/commands/cogs.md delete mode 100644 docs/guide/ext/commands/index.md delete mode 100644 docs/guide/ext/pages/index.md delete mode 100644 docs/guide/ext/tasks/index.md delete mode 100644 docs/guide/index.md delete mode 100644 docs/guide/interactions/button_views.md delete mode 100644 docs/guide/interactions/context_menus.md delete mode 100644 docs/guide/interactions/select_views.md delete mode 100644 docs/guide/interactions/slash_commands.md delete mode 100644 docs/guide/misc/webhooks.md delete mode 100644 docs/guide/starting-out/initial-files.md delete mode 100644 docs/images/guide/message_command.png delete mode 100644 docs/images/guide/user_command.png rename docs/{guide/starting-out/installing.md => installing.rst} (98%) rename docs/{guide/misc/intents.md => intents.rst} (99%) rename docs/{guide/misc/logging.md => logging.rst} (97%) diff --git a/docs/guide/starting-out/making-a-bot.md b/docs/discord.rst similarity index 99% rename from docs/guide/starting-out/making-a-bot.md rename to docs/discord.rst index 5cc9698408..736925c298 100644 --- a/docs/guide/starting-out/making-a-bot.md +++ b/docs/discord.rst @@ -1,4 +1,3 @@ -```{eval-rst} :orphan: .. _discord-intro: @@ -94,5 +93,4 @@ If you want to invite your bot you must create an invite URL for it. The person adding the bot needs "Manage Server" permissions to do so. If you want to generate this URL dynamically at run-time inside your bot and using the -:class:`discord.Permissions` interface, you can use :func:`discord.utils.oauth_url`. -``` \ No newline at end of file +:class:`discord.Permissions` interface, you can use :func:`discord.utils.oauth_url`. \ No newline at end of file diff --git a/docs/guide/ext/commands/checks.md b/docs/guide/ext/commands/checks.md deleted file mode 100644 index 6a62d89386..0000000000 --- a/docs/guide/ext/commands/checks.md +++ /dev/null @@ -1,3 +0,0 @@ -# Using checks in Pycord -Pycord's ``ext.commands`` module provides a checking system to check the info or roles, etc of a member. -This will be a full primer of how to use this system and how to make good use of it. \ No newline at end of file diff --git a/docs/guide/ext/commands/cogs.md b/docs/guide/ext/commands/cogs.md deleted file mode 100644 index 4bf92e437a..0000000000 --- a/docs/guide/ext/commands/cogs.md +++ /dev/null @@ -1,30 +0,0 @@ -# Using Cogs in Pycord -The ``ext.commands`` module provided by Pycord introduces a `Cog` system allowing you to make commands of any kind or even events in another file. -# Basics -A basic `Cog` would just be subclassing the `commands.Cog` class, like so: -```py -from discord.ext import commands - -class MyCog(commands.Cog): - def __init__(self, bot): - self.bot = bot -``` -Then to add it as a `Cog` make the function! -```py -def setup(bot): - bot.add_cog(MyCog(bot)) -``` -Then finally just add it to your load_extensions: -```py -bot.load_extension("my_cog") -``` -Then that's it, You now have a `Cog`! - -# How to make a command -Making commands are as-easy as normal, -only difference is using `@commands.command` instead of `@bot.command` inside your `Cog` like so: -```py -@commands.command() -async def my_command(self, ctx): - ... -``` diff --git a/docs/guide/ext/commands/index.md b/docs/guide/ext/commands/index.md deleted file mode 100644 index 4468f4019d..0000000000 --- a/docs/guide/ext/commands/index.md +++ /dev/null @@ -1,9 +0,0 @@ -# Using the ``ext.commands`` module in Pycord - -This page here is just to sort the many pages in the folder. - -```{eval-rst} -``ext.commands`` bolsters features for many things, one thing you might want to look at is :ref:`how to use cogs ` - -another feature ``ext.commands`` has implemented are :ref:`checks ` -``` \ No newline at end of file diff --git a/docs/guide/ext/pages/index.md b/docs/guide/ext/pages/index.md deleted file mode 100644 index 94fd479d59..0000000000 --- a/docs/guide/ext/pages/index.md +++ /dev/null @@ -1,25 +0,0 @@ -# Using the ``ext.pages`` module in Pycord -This is a primer to using all that ``ext.pages`` offers you. - -# Basics - -# Messages -First you will want to tell pages your embeds, like so: -```py -my_pages = [ - "Hey! This is page1", - "And, this is page2" -] -``` -Then define the pages in the `Paginator`, like so: -```py -from discord.ext import pages -scroll = pages.Paginator(pages=my_pages(), show_disabled=False, show_indicator=True) -``` -Then customize the buttons to your liking -```py -scroll.customize_button("next", button_label=">", button_style=discord.ButtonStyle.green) -scroll.customize_button("prev", button_label="<", button_style=discord.ButtonStyle.green) -scroll.customize_button("first", button_label="<<", button_style=discord.ButtonStyle.blurple) -scroll.customize_button("last", button_label=">>", button_style=discord.ButtonStyle.blurple) -``` \ No newline at end of file diff --git a/docs/guide/ext/tasks/index.md b/docs/guide/ext/tasks/index.md deleted file mode 100644 index 2873017c91..0000000000 --- a/docs/guide/ext/tasks/index.md +++ /dev/null @@ -1,2 +0,0 @@ -# Using the ``ext.tasks`` module in Pycord -Pycord's ``ext.tasks`` module provides a toolkit for more advanced `asyncio.tasks` functions in Pycord. \ No newline at end of file diff --git a/docs/guide/index.md b/docs/guide/index.md deleted file mode 100644 index 1b5897a1f9..0000000000 --- a/docs/guide/index.md +++ /dev/null @@ -1,74 +0,0 @@ -# Guide -The Official Guide For Pycord - -# Quick Tip -Pycord comes with automatic generation of files using your command prompt. - -Example some commands you can use: - -## ``python -m py-cord newbot (args)`` - -#### Args: - -- name - - Your Project Name -- --sharded - - If your bot should be sharded or not -- --prefix - - Your Bot Prefix - -## ``python -m py-cord newcog (args)`` - -#### Args: - -- name - - The name of your Cog - -- directory - - Cogs Directory - -- --full - - Get Full Features Of Cogs - -- --class-name - - Name of Your Cog Class - -## Before you begin... -Pycord has a lot of features which would be too advanced for a person just starting out with python, -We would suggest you get the basic knowledge of Python before starting there is a lot of tutorials to follow and we would suggest you start off with small projects then get bigger as you progress. - -### How much python do i need to know? - -- The difference between instances and class attributes. - - e.g. `guild.name` vs `discord.Guild.name` or any variation of these. -- How to use data structures in the language. - - `dict`/`tuple`/`list`/`str`/`...` -- How to solve `NameError` or `SyntaxError` exceptions. -- How to read and understand tracebacks. - -This list **doesn't** fully cover everything you should know before using Pycord, We would suggest you at least know these before attempting to make a bot in Pycord. - -## Guide List - -```{eval-rst} -The guide on how you can try :doc:`starting-out/installing>` - -If you don't know how to make a bot in discord -> :doc:`starting-out/making-a-bot` - -And if you don't know which files or what files to chose when starting we suggest you look at :doc:`starting-out/initial-files` - -The Pycord :doc:`interactions/slash_commands` Guide. - -The Pycord :doc:`interactions/context_menus` Guide. - -The Pycord :doc:`interactions/button_views` Guide. - -The Pycord :doc:`interactions/select_views` Guide. - -A thing you might wanna look at is :doc:`ext/commands/index`. - -:doc:`misc/intents` - -You may wanna try :doc:`misc/logging` in Pycord. -``` - diff --git a/docs/guide/interactions/button_views.md b/docs/guide/interactions/button_views.md deleted file mode 100644 index 4fd18c8239..0000000000 --- a/docs/guide/interactions/button_views.md +++ /dev/null @@ -1,53 +0,0 @@ -# Button Menus -A Primer For Beginners & Advanced Users To Buttons In Pycord - -### Basic Reply Button -First you will want to A Class with your view -like so: - -```py -class My_View_Name(discord.ui.View): - def __init__(self): - super().__init__(timeout=None) - - @discord.ui.button( - label="Green", - style=discord.ButtonStyle.green, - custom_id="persistent_view:green", - ) - async def green(self, button: discord.ui.Button, interaction: discord.Interaction): - await interaction.response.send_message("Press Me!", ephemeral=True) # Makes The Message Ephemeral. -``` - -Then you would want to make a command and send your message with the view like: -```py -ctx.send("Your_Message", view=My_View_Name()) -``` - -And that's it! you have made your first button with Pycord - -### How to disable a button - -You will first want to make your Button. - -```py -@discord.ui.button(label="button_name", style=discord.ButtonStyle.green) -async def disable(self, button: discord.ui.Button, interaction: discord.Interaction): -``` - -Then make this function which would disable the button after a certain number of seconds. - -```py -number = int(button.label) if button.label else 0 -if number + 1 >= 5: - button.style = discord.ButtonStyle.green - button.disabled = True -button.label = str(number + 1) - -# Make sure to update the message with our updated selves -await interaction.response.edit_message(view=self) -``` - -And send your message -```py -ctx.send("your_message", view=my_view_name()) \ No newline at end of file diff --git a/docs/guide/interactions/context_menus.md b/docs/guide/interactions/context_menus.md deleted file mode 100644 index ca78cf81d4..0000000000 --- a/docs/guide/interactions/context_menus.md +++ /dev/null @@ -1,41 +0,0 @@ -# Context Menus -Context Menu commands are very simular to slash commands with the only real difference in code being that they return `member` or `message` - -### User Commands -User Commands are very simular to Slash commands and the same as message commands - -Only difference being you have to return the user in some way: - -```py -@bot.user_command(guild_ids=[...]) # Limits The Guilds With this Menu -async def mention(ctx, member: discord.Member): # User Commands return the member - await ctx.respond(f"{ctx.author.name} just mentioned {member.mention}!") -``` - -And it should return the following: -```{eval-rst} -.. image:: /images/guide/user_command.png - :alt: User Command Image -``` - -### Message Commands -Message Commands are again Simular to slash & user commands and you would make them like so: - -```{eval-rst} - -.. warning:: - - Message Commands have to take in message - -``` -```py -@bot.message_command(name="Show Message ID") # Creates a global message command -async def message_id(ctx, message: discord.Message): # Message commands return the message - await ctx.respond(f"{ctx.author.name}, here's the message id: {message.id}!") -``` - -And it should return with the following: -```{eval-rst} -.. image:: /images/guide/message_command.png - :alt: Message Command Image -``` \ No newline at end of file diff --git a/docs/guide/interactions/select_views.md b/docs/guide/interactions/select_views.md deleted file mode 100644 index 8bdd1e4573..0000000000 --- a/docs/guide/interactions/select_views.md +++ /dev/null @@ -1,50 +0,0 @@ -# Select Menus -A Primer On Select Menus For Beginners & Advanced Users Of Pycord - -Select Menus are class based like how buttons are, So you would want to first make a class with your select view -```py -class my_view_name(discord.ui.Select): - def __init__(self) -``` - -Then make a list of your Select Options - -This list should hold anything from the label to Emoji. -```py -options = [ - discord.SelectOption( - label="my_label_name", description="my_option_description", emoji="your_emoji" - ), -] -``` -And you can add more. - -The limit you can put is 25. - -Then you can make an interaction callback in the same class - -```py -async def callback(self, interaction) - await interaction.response.send_message(f"your_message") -``` - -Then make another class which subclasses View. - -Then add your Select View as a item. -```py -class my_view_name_View(discord.ui.View): - def __init__(self): - super().__init__() - - self.add_item(my_view_name()) -``` - -Now you can make your command With your view - -```py -@bot.slash_command(guild_ids=[...]) # Limits Number Of Guilds With The Command -async def my_command_name(ctx): - await ctx.respond(f"your_message", view=my_view_name_View()) -``` - -And that's it that is all of selects in Pycord! diff --git a/docs/guide/interactions/slash_commands.md b/docs/guide/interactions/slash_commands.md deleted file mode 100644 index ddb2ef20a5..0000000000 --- a/docs/guide/interactions/slash_commands.md +++ /dev/null @@ -1,73 +0,0 @@ -# Slash Commands -A Primer to Slash Commands for advanced & new users - -### Basic Slash Command -Slash Commands are very close to Legacy commands - -Instead of using `@bot.command` you will want to use `@bot.slash_command` - -Most Of Context's message methods were stripped to `ctx.respond("message", view=None)` - -But it is very easy to make them: - -```py -@bot.slash_command(guild_ids=[...]) # limits Guild ID's available -async def example(ctx): - """Example Description""" - await ctx.respond("message", view=None) # Send Message -``` - -### Autocompleted Command -Autocompleted messages are implemented into Pycord! - -They are very easy to make -you would first want to make a list of autocompleted words -```py -my_list = [ - "..." - "..." -] -``` - -Then make a list of User ID's which can use this: - -```py -allowed_users_list = [ - "..." - "..." -] -``` - -Then make a function which would search for results in the list: - -```py -async def list_search(ctx: discord.AutocompleteContext): - """Return's A List Of Autocomplete Results""" - return [ - thing for thing in my_list if ctx.interaction.user.id in allowed_users_list - ] -``` - -Now you can make your command - -```py -@bot.slash_command(name="ac_example") -async def autocomplete_example( - ctx: discord.ApplicationContext, - choice: Option(str, "what will be your choice!", autocomplete=list_search), -): - await ctx.respond(f"You picked {choice}!") -``` - -### Managing Slash Command Permissions - -You will first want to make a slash command -```py -@bot.slash_command(guild_ids=[...]) # Limits guilds with this command -``` - -Then in the bottom add - -```py -@Permissions.foo() # Replace foo with has_role or is_user etc. -``` diff --git a/docs/guide/misc/webhooks.md b/docs/guide/misc/webhooks.md deleted file mode 100644 index 29cb5b208b..0000000000 --- a/docs/guide/misc/webhooks.md +++ /dev/null @@ -1,15 +0,0 @@ -# Webhooks -The Guide To Using Webhooks In Pycord - -## A Basic Webhook - -Down below is a example of a simple webhook -```py -from discord import Webhook, AsyncWebhookAdapter -import aiohttp - -async def example_message(): - async with aiohttp.ClientSession() as session: - webhook = Webhook.from_url('url-here', adapter=AsyncWebhookAdapter(session)) - await webhook.send('Hello!', username='example_webhook') -``` \ No newline at end of file diff --git a/docs/guide/starting-out/initial-files.md b/docs/guide/starting-out/initial-files.md deleted file mode 100644 index 1d74c41342..0000000000 --- a/docs/guide/starting-out/initial-files.md +++ /dev/null @@ -1,12 +0,0 @@ -# Initial Files -This is gonna teaching you the initial files to start with. - -# Users Starting-out -It would be recommended for Users starting out to just use a `main.py` file and put there `Cogs` in a `Cogs` folder. - -# Advanced Users -For advanced users it would be recommended to have your bot split into modules, - -Like `moderation_module` or `fun_module`, etc - -it's also for these users were it's recommended to subclass `Bot` or `Client` instead of doing `=` to add more features. \ No newline at end of file diff --git a/docs/images/guide/message_command.png b/docs/images/guide/message_command.png deleted file mode 100644 index 34798ef998bce64e75fd1235a571ee2323421626..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15384 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 JBWfJ@e*h@@34s6r diff --git a/docs/images/guide/user_command.png b/docs/images/guide/user_command.png deleted file mode 100644 index f623fef747c018b522dde41895dd72b7a2de80e9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12096 zcmZv?WmFtI@GjmKT8g_nEN+G3T4aI6-Q8tzDNb<~cbDQWi$jrOOVQ#iuEn*u-@f-R z=iGaKACf2YVUkHQ$$4hZKva}u&{0TG-n@B(4w98pd-LWk@4vCi#}EJdWGh|0fAH2# zO-ABP?F8AuKLOENTv7bZ8)!W0lj-|^GP1L*uG^b882$gXw?j_l7H{6L&w-@GHN1>Y za*+)1tY2OO>s~p&g4o;FSO2)S%X43|aTLxasw~gQQPaLxRC-Mfd^8N=A|2Lp=RmbC}J)q0Xj|lKTY}4cn>xBFb zHdM(MjT;4q!CP!aI%O~u!7Q}2<^mQ_-N=d%gTz)Znm8weZ!AKE&TfHZmC7aC4~Zvj zUR0=uEM=;0Cjj=`rLei6baTHnM)s_O@eC|!5s2QEC^oCWC6_%H^)SG%K* zOjvG%O_|yAMtaW{Znj$Og*37CVG2WKt%x0U?0<@#?M*-M{&pZ6#O^> zNY*&o1>7QJJ(Mdkq!H?>E{E1D?8Cr0C+{}DT^R$`m8cWd=ueK{i!AbEYT4JnZ%;zV zazFSM>E{R3pIkRD3g)BdeWOtFKb(U$pN4aEU+f&ZQ{1unEG`nIwthq?Gw~P@j!9#- zr-Q@YW$M=ElPtMvD0RV@L5&_?W87S%H|k#^a|O`^3W{6+R@f88fUT>v=C&N-X!~~k z0)b{sp0Z1qBQKKLJb2{MRfmu_`aAy!bDKch_GjNKgU-8Wj80+oAkRj%^S;|mFAu$U z9YR02b@r~ANT>RzGFhxWbhFcU!TqD3TfVOzb9Y{>e$ZLgBYv>K7M3hf32h;PdYoSk zF_@Q;lKUr-b0-YmVEG-H#XIM#!nxg8TM*-VC(bWq4L*^Q21{J% z2e3EMy)WnYM7&2nN+hC)loSJQJ`Inz870LftzP`nmNH!wK1fLc9i?Ut?;re(uFG~4 z>*RWt={&;4_+ey7QhoUns!}__koUGJKlD_|zulE!+{1<3!e-s9i3{4bO*uj>I^U&C z>3$$q|7V>g6G?(#S@M%d0xCfq@i%mJk;G;{W)z%Y)ttmg_4fNV-@p7#gcILy{sN!0 z+~3eWes;N^Rnk}+8#+P#p`z76nwlQadl1r|)>NX3Avr z%1$uv*@gB8GXlSx7>?N==|pyzetR%FVz6PS-!nE*Now%e=qht%`vuJE(c-#44$3GA z5g{i>W1<#<(J)GPr7WxL{%ppj+d(!8 zn5ML@56~gi%5P4tq@D2-<}y1{sPF4Xk8$O&**F>K!?<}$K~#(cj2q2m97my)hj z7+(1KWUi=9Gbx&7P{`%^Dqw{gs%g-rQfK@jd0xJ8hUuMt*w?Q9wv>j|Y7M_XyQUfu z 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 diff --git a/docs/index.rst b/docs/index.rst index 6cc846fd75..ce915aadef 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -25,8 +25,8 @@ Getting started Is this your first time using the library? This is the place to get started! -- **First steps:** :doc:`guide/index` | :doc:`guide/en/starting-out/installing` | :doc:`quickstart` | :doc:`guide/en/misc/logging` -- **Working with Discord:** :doc:`guide/en/starting-out/making-a-bot` | :doc:`guide/en/misc/intents` +- **First steps:** :doc:`installing` | :doc:`quickstart` | :doc:`logging` +- **Working with Discord:** :doc:`discord` | :doc:`intents` - **Examples:** Many examples are available in the :resource:`repository `. Getting help diff --git a/docs/guide/starting-out/installing.md b/docs/installing.rst similarity index 98% rename from docs/guide/starting-out/installing.md rename to docs/installing.rst index 8fbe191da9..d2a48f3e04 100644 --- a/docs/guide/starting-out/installing.md +++ b/docs/installing.rst @@ -1,4 +1,3 @@ -```{eval-rst} :orphan: .. currentmodule:: discord @@ -131,5 +130,4 @@ A quick example to showcase how events work: print(f'Message from {message.author}: {message.content}') client = MyClient() - client.run('my token goes here') -``` \ No newline at end of file + client.run('my token goes here') \ No newline at end of file diff --git a/docs/guide/misc/intents.md b/docs/intents.rst similarity index 99% rename from docs/guide/misc/intents.md rename to docs/intents.rst index 17367c639d..19560df0b9 100644 --- a/docs/guide/misc/intents.md +++ b/docs/intents.rst @@ -1,4 +1,3 @@ -```{eval-rst} :orphan: .. currentmodule:: discord @@ -203,5 +202,4 @@ Under the original system this would result in 2 requests to fetch the member li Unfortunately due to this change being required from Discord there is nothing that the library can do to mitigate this. -If you truly dislike the direction Discord is going with their API, you can contact them via `support `_. -``` \ No newline at end of file +If you truly dislike the direction Discord is going with their API, you can contact them via `support `_. \ No newline at end of file diff --git a/docs/guide/misc/logging.md b/docs/logging.rst similarity index 97% rename from docs/guide/misc/logging.md rename to docs/logging.rst index 896918a70a..596a845cad 100644 --- a/docs/guide/misc/logging.md +++ b/docs/logging.rst @@ -1,4 +1,3 @@ -```{eval-rst} :orphan: .. versionadded:: 0.6.0 @@ -44,5 +43,4 @@ stdout of your program. For more information, check the documentation and tutorial of the -:mod:`logging` module. -``` \ No newline at end of file +:mod:`logging` module. \ No newline at end of file diff --git a/examples/app_commands/info.py b/examples/app_commands/info.py index 6c109995fb..36b543f885 100644 --- a/examples/app_commands/info.py +++ b/examples/app_commands/info.py @@ -1,30 +1,47 @@ import discord from discord.ext import commands + # imports intents = discord.Intents( - guilds=True, - members=True, - messages=True, - ) + guilds=True, + members=True, + messages=True, +) + +bot = commands.Bot( + command_prefix="/", + description="An example to showcase how to extract info about users", + intents=intents, +) -bot = commands.Bot(command_prefix="/", description="An example to showcase how to extract info about users",intents=intents) @bot.slash_command(name="userinfo", description="gets the info of a user") async def info(ctx, user: discord.Member = None): - user = user or ctx.author #if no user is provided it'll use the the author of the message + user = ( + user or ctx.author + ) # if no user is provided it'll use the the author of the message e = discord.Embed() e.set_author(name=user.name) - e.add_field(name="ID", value=user.id, inline=False) # user ID - e.add_field(name="Joined", value=discord.utils.format_dt(round(user.joined_at.timestamp()), "F"), inline=False) # When the user joined the server - e.add_field(name="Created", value=discord.utils.format_dt(round(user.created_at.timestamp()), "F"), inline=False) # When the user's account was created + e.add_field(name="ID", value=user.id, inline=False) # user ID + e.add_field( + name="Joined", + value=discord.utils.format_dt(round(user.joined_at.timestamp()), "F"), + inline=False, + ) # When the user joined the server + e.add_field( + name="Created", + value=discord.utils.format_dt(round(user.created_at.timestamp()), "F"), + inline=False, + ) # When the user's account was created colour = user.colour - if colour.value: # if user has a role with a color - e.colour = colour - - if isinstance(user, discord.User): # checks if the user in the server + if colour.value: # if user has a role with a color + e.colour = colour + + if isinstance(user, discord.User): # checks if the user in the server e.set_footer(text="This member is not in this server.") - await ctx.respond(embed=e) # sends the embed + await ctx.respond(embed=e) # sends the embed + bot.run("your token") diff --git a/examples/app_commands/slash_cog.py b/examples/app_commands/slash_cog.py index b247ab723a..06c11a30ee 100644 --- a/examples/app_commands/slash_cog.py +++ b/examples/app_commands/slash_cog.py @@ -1,4 +1,5 @@ -from discord.commands import slash_command # Importing the decorator that makes slash commands. +from discord.commands import \ + slash_command # Importing the decorator that makes slash commands. from discord.ext import commands diff --git a/examples/app_commands/slash_cog_groups.py b/examples/app_commands/slash_cog_groups.py index 9f1f5ebc82..13b5eab018 100644 --- a/examples/app_commands/slash_cog_groups.py +++ b/examples/app_commands/slash_cog_groups.py @@ -1,5 +1,5 @@ import discord -from discord.commands import SlashCommandGroup, CommandPermission +from discord.commands import CommandPermission, SlashCommandGroup from discord.ext import commands bot = discord.Bot(debug_guild=..., owner_id=...) # main file diff --git a/examples/cooldown.py b/examples/cooldown.py index 7193561727..6e94e903aa 100644 --- a/examples/cooldown.py +++ b/examples/cooldown.py @@ -1,13 +1,14 @@ import discord from discord.ext import commands - bot = commands.Bot() # an application command with cooldown @bot.slash_command() -@commands.cooldown(1, 5, commands.BucketType.user) # the command can only be used once in 5 seconds +@commands.cooldown( + 1, 5, commands.BucketType.user +) # the command can only be used once in 5 seconds async def slash(ctx): await ctx.respond("You can't use this command again in 5 seconds.") diff --git a/examples/interactionsBot/bot.py b/examples/interactionsBot/bot.py index 3a65fedb11..3e7cf90525 100644 --- a/examples/interactionsBot/bot.py +++ b/examples/interactionsBot/bot.py @@ -2,12 +2,13 @@ with slash commands user permission it's better to check with property """ -import discord -from discord.ext import commands import os +import discord +from discord.ext import commands from discord.ui.view import View + # inherits commands.Bot class BotClass(discord.Bot): def __init__(self): diff --git a/examples/interactionsBot/cogs/button_cog.py b/examples/interactionsBot/cogs/button_cog.py index 92d160930e..2d50b8b887 100644 --- a/examples/interactionsBot/cogs/button_cog.py +++ b/examples/interactionsBot/cogs/button_cog.py @@ -1,7 +1,7 @@ import discord +from discord.commands import slash_command from discord.ext import commands from discord.ext.commands.context import Context -from discord.commands import slash_command class ButtonView(discord.ui.View): diff --git a/examples/interactionsBot/cogs/dropdown_cog.py b/examples/interactionsBot/cogs/dropdown_cog.py index c06da7acaf..3e74b9b1c1 100644 --- a/examples/interactionsBot/cogs/dropdown_cog.py +++ b/examples/interactionsBot/cogs/dropdown_cog.py @@ -1,7 +1,8 @@ import discord +from discord.commands import slash_command from discord.ext import commands from discord.ext.commands.context import Context -from discord.commands import slash_command + # Defines a custom Select containing colour options # that the user can choose. The callback function diff --git a/examples/interactionsBot/cogs/slashOption_cog.py b/examples/interactionsBot/cogs/slashOption_cog.py index 0444f95a1a..b793fc8229 100644 --- a/examples/interactionsBot/cogs/slashOption_cog.py +++ b/examples/interactionsBot/cogs/slashOption_cog.py @@ -1,8 +1,7 @@ import discord +from discord.commands import Option, slash_command from discord.ext import commands from discord.ext.commands.context import Context -from discord.commands import slash_command -from discord.commands import Option class SlashOptionExample(commands.Cog): diff --git a/examples/interactionsBot/cogs/slash_cog.py b/examples/interactionsBot/cogs/slash_cog.py index 4607bcc46f..6ca7df59bd 100644 --- a/examples/interactionsBot/cogs/slash_cog.py +++ b/examples/interactionsBot/cogs/slash_cog.py @@ -1,8 +1,7 @@ import discord +from discord.commands import Option, slash_command from discord.ext import commands from discord.ext.commands.context import Context -from discord.commands import slash_command -from discord.commands import Option class SlashExample(commands.Cog): diff --git a/examples/views/button_roles.py b/examples/views/button_roles.py index d9cd387c5d..8591fd31e2 100644 --- a/examples/views/button_roles.py +++ b/examples/views/button_roles.py @@ -70,8 +70,7 @@ def __init__(self, bot): # Make sure to provide a list of guild ids in the guild_ids kwarg argument. @slash_command(guild_ids=[...], description="Post the button role message") async def post(self, ctx: commands.Context): - """Slash command to post a new view with a button for each role. - """ + """Slash command to post a new view with a button for each role.""" # timeout is None because we want this view to be persistent. view = discord.ui.View(timeout=None) diff --git a/examples/views/paginator.py b/examples/views/paginator.py index 66cf92c620..be135f794c 100644 --- a/examples/views/paginator.py +++ b/examples/views/paginator.py @@ -144,9 +144,7 @@ async def pagetest_custom_buttons(self, ctx: discord.ApplicationContext): async def pagetest_emoji_buttons(self, ctx: discord.ApplicationContext): """Demonstrates using emojis for the paginator buttons instead of labels.""" page_buttons = [ - pages.PaginatorButton( - "first", emoji="⏪", style=discord.ButtonStyle.green - ), + pages.PaginatorButton("first", emoji="⏪", style=discord.ButtonStyle.green), pages.PaginatorButton("prev", emoji="⬅", style=discord.ButtonStyle.green), pages.PaginatorButton( "page_indicator", style=discord.ButtonStyle.gray, disabled=True From 96540a43ac5497a20585852ec9323ee1426444cd Mon Sep 17 00:00:00 2001 From: Lala Sabathil Date: Sun, 23 Jan 2022 03:33:14 +0100 Subject: [PATCH 170/180] Update core.py --- discord/commands/core.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/discord/commands/core.py b/discord/commands/core.py index 03fc479f9d..29f0fd02ac 100644 --- a/discord/commands/core.py +++ b/discord/commands/core.py @@ -38,7 +38,7 @@ from .errors import ApplicationCommandError, CheckFailure, ApplicationCommandInvokeError from .options import Option, OptionChoice from .permissions import CommandPermission -from ..enums import SlashCommandOptionType +from ..enums import SlashCommandOptionType, ChannelType from ..errors import ValidationError, ClientException from ..member import Member from ..message import Message From ae9ab1f67aadb86fe2e50511c3acd61226610ba3 Mon Sep 17 00:00:00 2001 From: Lala Sabathil Date: Sun, 23 Jan 2022 03:36:04 +0100 Subject: [PATCH 171/180] Rename slash_cog.py to basicSlash_cog.py --- examples/interactionsBot/cogs/{slash_cog.py => basicSlash_cog.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename examples/interactionsBot/cogs/{slash_cog.py => basicSlash_cog.py} (100%) diff --git a/examples/interactionsBot/cogs/slash_cog.py b/examples/interactionsBot/cogs/basicSlash_cog.py similarity index 100% rename from examples/interactionsBot/cogs/slash_cog.py rename to examples/interactionsBot/cogs/basicSlash_cog.py From 13bb2b9d125305253b0334bf72f7512be1d36289 Mon Sep 17 00:00:00 2001 From: Lala Sabathil Date: Sun, 23 Jan 2022 03:38:37 +0100 Subject: [PATCH 172/180] Update README.rst --- README.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.rst b/README.rst index 3abd31b805..d6f2feb859 100644 --- a/README.rst +++ b/README.rst @@ -130,7 +130,7 @@ Note: Make sure you do not reveal your bot token to anyone, it can grant access Links ----- -- `Documentation `_ +- `Documentation `_ - `Our Official Discord Server `_ - `Official Discord Developers Server `_ - `Unofficial Discord API Server `_ From fc8ead9f33fa29532c61d74f8918b4977c34c39a Mon Sep 17 00:00:00 2001 From: Vincent Date: Sun, 23 Jan 2022 11:20:12 +0800 Subject: [PATCH 173/180] fix: merge conflicts --- discord/commands/core.py | 123 --------------------------------------- 1 file changed, 123 deletions(-) diff --git a/discord/commands/core.py b/discord/commands/core.py index 29f0fd02ac..67db2c049b 100644 --- a/discord/commands/core.py +++ b/discord/commands/core.py @@ -793,129 +793,6 @@ def _update_copy(self, kwargs: Dict[str, Any]): else: return self.copy() -channel_type_map = { - 'TextChannel': ChannelType.text, - 'VoiceChannel': ChannelType.voice, - 'StageChannel': ChannelType.stage_voice, - 'CategoryChannel': ChannelType.category, - 'Thread': ChannelType.public_thread -} - -class ThreadOption: - def __init__(self, thread_type: Literal["public", "private", "news"]): - type_map = { - "public": ChannelType.public_thread, - "private": ChannelType.private_thread, - "news": ChannelType.news_thread, - } - self._type = type_map[thread_type] - - @property - def __name__(self): - return 'ThreadOption' - -class Option: - def __init__( - self, input_type: Any, /, description: str = None, **kwargs - ) -> None: - self.name: Optional[str] = kwargs.pop("name", None) - self.description = description or "No description provided" - self.converter = None - self._raw_type = input_type - self.channel_types: List[SlashCommandOptionType] = kwargs.pop("channel_types", []) - if not isinstance(input_type, SlashCommandOptionType): - if hasattr(input_type, "convert"): - self.converter = input_type - input_type = SlashCommandOptionType.string - else: - _type = SlashCommandOptionType.from_datatype(input_type) - if _type == SlashCommandOptionType.channel: - if not isinstance(input_type, tuple): - input_type = (input_type,) - for i in input_type: - if i.__name__ == 'GuildChannel': - continue - if isinstance(i, ThreadOption): - self.channel_types.append(i._type) - continue - - channel_type = channel_type_map[i.__name__] - self.channel_types.append(channel_type) - input_type = _type - self.input_type = input_type - self.default = kwargs.pop("default", None) - self.required: bool = kwargs.pop("required", True) if self.default is None else False - self.choices: List[OptionChoice] = [ - o if isinstance(o, OptionChoice) else OptionChoice(o) - for o in kwargs.pop("choices", list()) - ] - - if self.input_type == SlashCommandOptionType.integer: - minmax_types = (int, type(None)) - elif self.input_type == SlashCommandOptionType.number: - minmax_types = (int, float, type(None)) - else: - minmax_types = (type(None),) - minmax_typehint = Optional[Union[minmax_types]] # type: ignore - - self.min_value: minmax_typehint = kwargs.pop("min_value", None) - self.max_value: minmax_typehint = kwargs.pop("max_value", None) - - if not (isinstance(self.min_value, minmax_types) or self.min_value is None): - raise TypeError(f"Expected {minmax_typehint} for min_value, got \"{type(self.min_value).__name__}\"") - if not (isinstance(self.max_value, minmax_types) or self.min_value is None): - raise TypeError(f"Expected {minmax_typehint} for max_value, got \"{type(self.max_value).__name__}\"") - - self.autocomplete = kwargs.pop("autocomplete", None) - - def to_dict(self) -> Dict: - as_dict = { - "name": self.name, - "description": self.description, - "type": self.input_type.value, - "required": self.required, - "choices": [c.to_dict() for c in self.choices], - "autocomplete": bool(self.autocomplete) - } - if self.channel_types: - as_dict["channel_types"] = [t.value for t in self.channel_types] - if self.min_value is not None: - as_dict["min_value"] = self.min_value - if self.max_value is not None: - as_dict["max_value"] = self.max_value - - return as_dict - - - def __repr__(self): - return f"" - - -class OptionChoice: - r"""Represents an option choice. - - Attributes - ----------- - name: :class:`str` - The name of the option choice. - value: Optional[Union[:class:`str`, :class:`int`, :class:`float`]] - The value of the option choice. If ``None`` is passed, this will be set to the name of the option choice. - """ - def __init__(self, name: str, value: Optional[Union[str, int, float]] = None): - self.name = name - self.value = value if value is not None else name - - def to_dict(self) -> Dict[str, Union[str, int, float]]: - return {"name": self.name, "value": self.value} - -def option(name, type=None, **kwargs): - """A decorator that can be used instead of typehinting Option""" - def decor(func): - nonlocal type - type = type or func.__annotations__.get(name, str) - func.__annotations__[name] = Option(type, **kwargs) - return func - return decor class SlashCommandGroup(ApplicationCommand): r"""A class that implements the protocol for a slash command group. From c1959f928eb91d3881c90e884c9edf4a4307a9ad Mon Sep 17 00:00:00 2001 From: Middledot Date: Mon, 24 Jan 2022 11:41:48 -0500 Subject: [PATCH 174/180] Fix wrong typing imports --- discord/commands/context.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/discord/commands/context.py b/discord/commands/context.py index 7bc3325253..a8f897edcd 100644 --- a/discord/commands/context.py +++ b/discord/commands/context.py @@ -24,7 +24,7 @@ """ from __future__ import annotations -from typing import TYPE_CHECKING, Optional, Union, TypeVar, Generic, Callable, ParamSpec, List, Any, Dict +from typing import TYPE_CHECKING, Optional, Union, TypeVar, Generic, Callable, List, Any, Dict import discord.utils @@ -43,6 +43,7 @@ from ..ui import View from ..voice_client import VoiceProtocol from ..webhook import Webhook, WebhookMessage + from typing_extensions import ParamSpec from ..guild import Guild from ..interactions import Interaction, InteractionResponse @@ -65,7 +66,7 @@ MISSING: Any = discord.utils.MISSING T = TypeVar("T") -BotT = TypeVar("BotT", bound="Union[Bot, AutoShardedBot]") +BotT = TypeVar("BotT", bound="Union[discord.Bot, discord.AutoShardedBot]") CogT = TypeVar("CogT", bound="Cog") if TYPE_CHECKING: From ed6f27157740b87ebec71c8fd8f252090f589d06 Mon Sep 17 00:00:00 2001 From: Middledot Date: Mon, 24 Jan 2022 11:54:05 -0500 Subject: [PATCH 175/180] Add typing_extensions to requirements --- requirements.txt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/requirements.txt b/requirements.txt index 9ad0580346..0fd817718e 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1 +1,2 @@ -aiohttp>=3.6.0,<3.9.0 \ No newline at end of file +aiohttp>=3.6.0,<3.9.0 +typing-extensions==4.0.1 From a0938e3b2f9fcc94cccbc44a2dd5298de71ca1b9 Mon Sep 17 00:00:00 2001 From: Middledot Date: Mon, 24 Jan 2022 11:59:27 -0500 Subject: [PATCH 176/180] Add a requirement to docs workflows --- .github/workflows/docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 034e3fba66..4b44dc0a54 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -17,7 +17,7 @@ jobs: - name: Install dependencies run: | python -m pip install -U pip - pip install -U sphinx sphinxcontrib-trio aiohttp sphinxcontrib-websupport myst-parser + pip install -U sphinx sphinxcontrib-trio aiohttp sphinxcontrib-websupport myst-parser typing-extensions - name: Compile to html run: | cd docs From a1257838ea82551e71e7890058ebf1dd67da9ccf Mon Sep 17 00:00:00 2001 From: Middledot Date: Mon, 24 Jan 2022 12:01:08 -0500 Subject: [PATCH 177/180] Higher python version of docs workflow --- .github/workflows/docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 4b44dc0a54..561b7be286 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -7,7 +7,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: [ 3.8 ] + python-version: [ 3.10 ] steps: - uses: actions/checkout@v2 - name: Set up Python ${{ matrix.python-version }} From 95f9394d2a05e24591c9ee761cc607100ab7310a Mon Sep 17 00:00:00 2001 From: Middledot Date: Mon, 24 Jan 2022 12:03:07 -0500 Subject: [PATCH 178/180] Docs workflow typo --- .github/workflows/docs.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml index 561b7be286..8ce8ea467a 100644 --- a/.github/workflows/docs.yml +++ b/.github/workflows/docs.yml @@ -7,7 +7,7 @@ jobs: runs-on: ubuntu-latest strategy: matrix: - python-version: [ 3.10 ] + python-version: [ '3.10' ] steps: - uses: actions/checkout@v2 - name: Set up Python ${{ matrix.python-version }} From 9df068541dda21891a337d25d5648f2a6bd3ccc5 Mon Sep 17 00:00:00 2001 From: Middledot Date: Wed, 26 Jan 2022 21:50:03 -0500 Subject: [PATCH 179/180] Commit to re-run jobs --- discord/commands/context.py | 1 - 1 file changed, 1 deletion(-) diff --git a/discord/commands/context.py b/discord/commands/context.py index a8f897edcd..5e0ea30a06 100644 --- a/discord/commands/context.py +++ b/discord/commands/context.py @@ -74,7 +74,6 @@ else: P = TypeVar('P') - class ApplicationContext(discord.abc.Messageable, Generic[BotT]): """Represents a Discord application command interaction context. From edb0c511719dfbb8c05559c4c73b3082784b275a Mon Sep 17 00:00:00 2001 From: Middledot Date: Wed, 26 Jan 2022 22:18:56 -0500 Subject: [PATCH 180/180] Possible fix for docs typehint execution --- discord/commands/permissions.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/discord/commands/permissions.py b/discord/commands/permissions.py index 901c412570..d143f5b02b 100644 --- a/discord/commands/permissions.py +++ b/discord/commands/permissions.py @@ -23,6 +23,8 @@ DEALINGS IN THE SOFTWARE. """ +from __future__ import annotations + from typing import Union, Callable, Optional, TYPE_CHECKING if TYPE_CHECKING: