{"id":14238601,"url":"https://github.com/discord-py-ui/discord-ui","last_synced_at":"2026-01-14T10:00:40.948Z","repository":{"id":45925540,"uuid":"374376666","full_name":"discord-py-ui/discord-ui","owner":"discord-py-ui","description":"A discord.py extension for sending, receiving and handling ui interactions in discord","archived":true,"fork":false,"pushed_at":"2022-02-19T16:32:54.000Z","size":1761,"stargazers_count":35,"open_issues_count":1,"forks_count":10,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-01-13T16:43:31.695Z","etag":null,"topics":["bot","discord","discord-api","discord-bot","discord-buttons","discord-commands","discord-components","discord-context-commands","discord-extension","discord-interaction","discord-interactions","discord-message-components","discord-py","discord-select-menus","discord-slash","discord-slash-commands","discord-ui","discord-ui-commands","discordpy","python"],"latest_commit_sha":null,"homepage":"https://discord-ui.rtfd.io/","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/discord-py-ui.png","metadata":{"files":{"readme":"README.md","changelog":"changelog.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2021-06-06T14:08:56.000Z","updated_at":"2025-02-19T05:42:52.000Z","dependencies_parsed_at":"2022-09-13T07:50:15.999Z","dependency_job_id":null,"html_url":"https://github.com/discord-py-ui/discord-ui","commit_stats":null,"previous_names":["kusoredsto/discord-ui"],"tags_count":67,"template":false,"template_full_name":null,"purl":"pkg:github/discord-py-ui/discord-ui","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/discord-py-ui%2Fdiscord-ui","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/discord-py-ui%2Fdiscord-ui/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/discord-py-ui%2Fdiscord-ui/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/discord-py-ui%2Fdiscord-ui/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/discord-py-ui","download_url":"https://codeload.github.com/discord-py-ui/discord-ui/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/discord-py-ui%2Fdiscord-ui/sbom","scorecard":{"id":80923,"data":{"date":"2025-08-11","repo":{"name":"github.com/discord-py-ui/discord-ui","commit":"00b11df3c1ed9e9cb80aec1c5b8f85df030b3c23"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.4,"checks":[{"name":"SAST","score":10,"reason":"SAST tool detected: CodeQL","details":["Info: SAST configuration detected: CodeQL","Warn: no pull requests merged into dev branch"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Maintained","score":0,"reason":"project is archived","details":["Warn: Repository is archived."],"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Info: jobLevel 'actions' permission set to 'read': .github/workflows/codeql-analysis.yml:28","Info: jobLevel 'contents' permission set to 'read': .github/workflows/codeql-analysis.yml:29","Warn: no topLevel permission defined: .github/workflows/codeql-analysis.yml:1","Warn: no topLevel permission defined: .github/workflows/main.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Code-Review","score":0,"reason":"Found 0/30 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:42: update your workflow using https://app.stepsecurity.io/secureworkflow/discord-py-ui/discord-ui/codeql-analysis.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:46: update your workflow using https://app.stepsecurity.io/secureworkflow/discord-py-ui/discord-ui/codeql-analysis.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:57: update your workflow using https://app.stepsecurity.io/secureworkflow/discord-py-ui/discord-ui/codeql-analysis.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/codeql-analysis.yml:71: update your workflow using https://app.stepsecurity.io/secureworkflow/discord-py-ui/discord-ui/codeql-analysis.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/discord-py-ui/discord-ui/main.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:25: update your workflow using https://app.stepsecurity.io/secureworkflow/discord-py-ui/discord-ui/main.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:43: update your workflow using https://app.stepsecurity.io/secureworkflow/discord-py-ui/discord-ui/main.yml/main?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/main.yml:51: update your workflow using https://app.stepsecurity.io/secureworkflow/discord-py-ui/discord-ui/main.yml/main?enable=pin","Warn: pipCommand not pinned by hash: .github/workflows/main.yml:30","Warn: pipCommand not pinned by hash: .github/workflows/main.yml:31","Info:   0 out of   8 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   2 pipCommand dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":-1,"reason":"internal error: error during branchesHandler.setup: internal error: githubv4.Query: Resource not accessible by integration","details":null,"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"Vulnerabilities","score":0,"reason":"12 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: PYSEC-2023-120 / GHSA-45c4-8wx5-qw6w","Warn: Project is vulnerable to: GHSA-5m98-qgg9-wh84","Warn: Project is vulnerable to: GHSA-7gpw-8wmc-pm8g","Warn: Project is vulnerable to: GHSA-8495-4g3g-x7pr","Warn: Project is vulnerable to: PYSEC-2024-26 / GHSA-8qpw-xqxj-h4r2","Warn: Project is vulnerable to: GHSA-9548-qrrj-x5pj","Warn: Project is vulnerable to: PYSEC-2023-246 / GHSA-gfw2-4jvh-wgfg","Warn: Project is vulnerable to: GHSA-pjjw-qhg8-p2p9","Warn: Project is vulnerable to: PYSEC-2023-250 / GHSA-q3qx-c6g2-7pw2","Warn: Project is vulnerable to: PYSEC-2023-251 / GHSA-qvrw-v9rv-5rjx","Warn: Project is vulnerable to: PYSEC-2021-76 / GHSA-v6wp-4m6f-gcjg","Warn: Project is vulnerable to: PYSEC-2023-247 / GHSA-xx9p-xxvh-7g8j"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-15T05:49:54.403Z","repository_id":45925540,"created_at":"2025-08-15T05:49:54.403Z","updated_at":"2025-08-15T05:49:54.403Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28416479,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T08:38:59.149Z","status":"ssl_error","status_checked_at":"2026-01-14T08:38:43.588Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["bot","discord","discord-api","discord-bot","discord-buttons","discord-commands","discord-components","discord-context-commands","discord-extension","discord-interaction","discord-interactions","discord-message-components","discord-py","discord-select-menus","discord-slash","discord-slash-commands","discord-ui","discord-ui-commands","discordpy","python"],"created_at":"2024-08-21T03:00:56.775Z","updated_at":"2026-01-14T10:00:40.908Z","avatar_url":"https://github.com/discord-py-ui.png","language":"Python","funding_links":[],"categories":["Archived/Deprecated"],"sub_categories":["Miscellaneous"],"readme":"\u003cbr /\u003e\r\n\u003cp align=\"center\"\u003e\r\n    \u003ch2 align=\"center\"\u003ediscord-ui\u003c/h2\u003e\r\n    \u003cp align=\"center\"\u003e\r\n        A discord.py extension for using discord ui/interaction features\r\n        \u003cbr /\u003e\r\n        \u003ca href=\"https://pypi.org/project/discord-ui/\"\u003e\u003cb\u003epip package\u003c/b\u003e\u003c/a\u003e\r\n        ▪ \r\n        \u003ca href=\"https://discord-ui.readthedocs.io/en/latest/\"\u003e\u003cb\u003eread the docs\u003c/b\u003e\u003c/a\u003e \r\n        ▪ \r\n        \u003ca href=\"https://github.com/discord-py-ui/discord-ui/tree/main/examples\"\u003e\u003cb\u003eexamples\u003c/b\u003e\u003c/a\u003e\r\n    \u003c/p\u003e\r\n\u003c/p\u003e\r\n\r\n[RIP](https://gist.github.com/404kuso/8b8b5d25d0ffe7dd361450252a62bb4a)\r\n\r\n[![Downloads](https://pepy.tech/badge/discord-ui)](https://pepy.tech/project/discord-ui)\r\n![PyPI](https://img.shields.io/pypi/v/discord-ui)\r\n![PyPI - Python Version](https://img.shields.io/pypi/pyversions/discord-ui)\r\n[![Codacy Badge](https://api.codacy.com/project/badge/Grade/550953d11c8242b9b7944642a2e292c7)](https://app.codacy.com/gh/discord-py-ui/discord-ui?utm_source=github.com\u0026utm_medium=referral\u0026utm_content=discord-py-ui/discord-ui\u0026utm_campaign=Badge_Grade_Settings)\r\n\r\n\r\n## Introduction\r\n\r\n\r\nThis is a [discord.py](https://github.com/Rapptz/discord.py) ui extension made by [404kuso](https://github.com/404kuso) and [RedstoneZockt](https://github.com/RedstoneZockt)\r\nfor using discord's newest ui features like buttons, slash commands and context commands.\r\n\r\n[Documentation](https://discord-ui.readthedocs.io/en/latest/)\r\n\r\n## Installation\r\n\r\n\r\n### Windows\r\n```cmd\r\npy -m pip install discord-ui\r\n```\r\n\r\n### Linux\r\n```bash\r\npython3 -m pip install discord-ui\r\n```\r\n\r\n## License\r\n\r\nThis project is under MIT License\r\n\r\n## Issues\r\n\r\nIf you find any issues, please report them \r\n\r\nhttps://github.com/discord-py-ui/discord-ui/issues\r\n\r\n## Note\r\n\r\nIf you want to use slash commands, in the oauth2 invite link generation, \r\nyou have to check both `bot` and `application.commands` fields\r\n\r\n![](./docs/source/images/slash/invite_scope.png)\r\n\r\n## Example\r\n\r\nExample for creating a simple slash command\r\n```py\r\nimport discord\r\nfrom discord.ext import commands\r\nfrom discord_ui import UI, SlashOption\r\n\r\nclient = commands.Bot(\" \")\r\nui = UI(client)\r\n\r\n@ui.slash.command(\"hello_world\", options=[SlashOption(bool, \"cool\", \"whether this libary is cool\", required=False)], guild_ids=[785567635802816595])\r\nasync def command(ctx, cool=True):\r\n    \"\"\"This is a simple slash command\"\"\"\r\n    # you can use docstrings for the slash command description too\r\n    await ctx.respond(\"You said this libary is \" + str(cool))\r\n\r\nclient.run(\"your_token\")\r\n```\r\n\r\nExample for creating a user-context command\r\n```py\r\nimport discord\r\nfrom discord.ext import commands\r\nfrom discurd_ui import UI\r\n\r\nclient = commands.Bot(\" \")\r\nui = UI(client)\r\n\r\n@ui.slash.user_command(\"avatar\", guild_ids=[785567635802816595])\r\nasync def avatar(ctx, user: discord.Member):\r\n    \"\"\"Sends the avatar of a user\"\"\"\r\n    await ctx.respond(embed=discord.Embed(description=user.display_name).set_image(url=user.avatar_url))\r\n\r\nclient.run(\"your_token\")\r\n```\r\n\r\nExample for autocompletion of choices\r\n\r\n```py\r\nimport discord\r\nfrom discord_ui import UI, SlashOption, AutocompleteInteraction\r\n\r\nasync def generator(ctx: AutocompleteInteraction):\r\n    available_choices = [\"hmm\", \"this\", \"is\", \"a\", \"an\", \"test\", \"testing\"]\r\n    return [(x, x) for x in available_choices if x.startswith(ctx.value_query)]\r\n\r\n@ui.slash.command(\"search_word\", options=[SlashOption(str, \"query\", choice_generator=generator)])\r\nasync def search_word(ctx, query):\r\n    await ctx.send(\"got \" + query + \" for query\")\r\n\r\nclient.run(\"your_token\")\r\n```\r\n\r\nExample for sending a button and receiving it\r\n\r\n```py\r\nimport discord\r\nfrom discord.ext import commands\r\nfrom discord_ui import UI, LinkButton, Button\r\n\r\nfrom asyncio import TimeoutError\r\n\r\nclient = commands.Bot(\" \")\r\nui = UI(client)\r\n\r\n@client.listen(\"on_message\")\r\nasync def on_message(message: discord.Message):\r\n    if message.content == \"!btn\":\r\n        msg = await message.channel.send(\"you\", components=[\r\n            [Button(\"press me\", color=\"green\"), LinkButton(\"https://discord.com\", emoji=\"😁\")],\r\n            Button(custom_id=\"my_custom_id\")\r\n        ])\r\n        try:\r\n            btn = await msg.wait_for(\"button\", client, by=message.author, timeout=20)\r\n            await btn.respond(\"you pressed `\" + btn.content + \"`\")\r\n        except TimeoutError:\r\n            await msg.delete()\r\n\r\nclient.run(\"your_token_here\")\r\n```\r\n\r\nExample for sending Selectmenus and receiving them\r\n\r\n```py\r\nimport discord\r\nfrom discord.ext import commands\r\nfrom discord_ui import UI, SelectMenu, SelectOption\r\n\r\nfrom asyncio import TimeoutError\r\n\r\nclient = commands.Bot(\" \")\r\nui = UI(client)\r\n\r\n@client.listen(\"on_message\")\r\nasync def on_message(message: discord.Message):\r\n    if message.content == \"!sel\":\r\n        msg = await message.channel.send(\"you\", components=[SelectMenu(options=[\r\n            SelectOption(\"my_value\", label=\"test\", description=\"this is a test\"),\r\n            SelectOption(\"my_other_value\", emoji=\"🤗\", description=\"this is a test too\")\r\n        ], \"custom_id\", max_values=2)])\r\n        try:\r\n            sel = await msg.wait_for(\"select\", client, by=message.author, timeout=20)\r\n            await sel.respond(\"you selected `\" + str([x.content for x in sel.selected_options]) + \"`\")\r\n        except TimeoutError:\r\n            await msg.delete()\r\n\r\nclient.run(\"your_token_here\")\r\n```\r\n\r\nExample for cogs\r\n```py\r\nfrom discord.ext import commands\r\nfrom discord_ui import UI\r\nfrom discord_ui.cogs import slash_command, subslash_command, listening_component\r\n\r\nbot = commands.Bot(\" \")\r\nui = UI(bot)\r\n\r\nclass Example(commands.Cog):\r\n    def __init__(self, bot):\r\n        self.bot = bot\r\n    \r\n    @slash_command(name=\"example\", guild_ids=[785567635802816595])\r\n    async def example(self, ctx):\r\n        await ctx.respond(\"gotchu\")\r\n\r\n    @subslash_command(base_names=\"example\", name=\"command\"):\r\n    async def example_command(self, ctx):\r\n        await ctx.respond(\"okayy\")\r\n    \r\nbot.add_cog(Example(bot))\r\nbot.run(\"your token\")\r\n```\r\n\r\nYou can find more (and better) examples [here](https://github.com/discord-py-ui/discord-ui/tree/main/examples)\r\n\r\n\r\n\r\n## Contact\r\n\r\nYou can contact us on discord\r\n\r\n- [**Redstone**](https://discord.com/users/355333222596476930)\r\n- [**kuso**](https://discord.com/users/539459006847254542)\r\n- [**discord server**](https://discord.gg/bDJCGD994p)\r\n\r\n\r\n# Changelog\r\n\r\nThis will be moved to https://discord-py-ui.github.io/discord-ui/\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e5.1.2\u003c/summary\u003e\r\n\r\n    ## **Fixed**\r\n    - `commands.nuke`\r\n    - nextcord import issue (#112) \r\n    \r\n    \u003c/details\u003e\r\n \r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e5.1.0\u003c/summary\u003e\r\n    \r\n    ## **Breaking changes**\r\n    - Component custom ids are now optional, if no custom id is passed, a 100 characters long random string will be used and because of that the order of Component init params changed\r\n    - The order of SelectMenus init params changed, `custom_id` comes now after `options`\r\n    ```py\r\n    SelectMenu(\"my_custom_id\", [options...here])\r\n    # is now\r\n    SelectMenu([options...here], \"my_custom_id\")\r\n    ```\r\n    - Same for Buttons\r\n    ```py\r\n    Button(\"my_custom_id\", \"label\")\r\n    # is now\r\n    Button(\"label\", \"my_custom_id\")\r\n    ```\r\n    - ButtonStyles is now ButtonStyle\r\n    - renamed cog decorators, the old ones still work but they will show a deprecation warning: `slash_command` -\u003e `slash_command`, `subslash_command` -\u003e `subslash_command`, `context_cog` -\u003e `context_command`, `listening_component` -\u003e `listening_component`\r\n    - Removed `Slash.edit_command` and `Slash.edit_subcommand`, \"moved\" to `Command.edit`\r\n    - `SlashedCommand` is now `SlashInteraction`, `SlashedSubCommand` is now `SubSlashInteraction` and `SlashedContext` is now `ContextInteraction`\r\n    - The command attributes of CommandInteractions (SlashedCommand, ...) are now moved to `Interaction.command.` (the `.command` attribute is a reference to the real command, if you change properties of the command they will be updated)\r\n    - The component attributes of an interaction are now moved to `.component`\r\n    - ContextCommands `.param` attribute is now `.target`\r\n\r\n    ## **Changed**\r\n    - `argument_type` in SlashOption is now `type`\r\n    - `ButtonStyle` value names changed: color names are now capitalized and `Danger` is now `Destructive`\r\n    - `Listener.target_user` is now `Listener.target_users` and can take users, members and ids as the value\r\n    - `BaseCommand.options` and `SlashOption.options` is now of type `SlashOptionCollection`, which allows you to acces options by index and name\r\n    ```py\r\n    my_command.options[\"option name\"]\r\n    # or\r\n    my_command.options[0]\r\n    ```\r\n    You can also use some methods like `.get`, `.set` (which will return itself after it set something, so `SlashOption.set(key, value).set(key, value)` would work) and ``SlashOption.options + SlashOption.option`` will add both SlashOptions together\r\n    - If an invalid guild id was passed to a slashcommand, no exception will be raised anymore, it will just be printed into the console and ignored `logging.error()`\r\n    - Moved the `discord_ui.ext.py` module into a folder\r\n    - `on_button_press` and `on_menu_select` is now `on_button` and `on_select`. The old event names will still work but will be removed in the next release\r\n\r\n    ## **Fixed**\r\n    - disable_action_row\r\n    - `ActionRow.disable`\r\n    - no interaction events being dispatched because subclasses of dpy2 `commands.Bot` instances wouldn't get overriden which lead to not enabling needed debug events\r\n    - when no matching component listener in `Listener` could be found, the events for components events wouldn't be dispatched\r\n    - `delete_after` keyword in message send override not working\r\n    - mentionable type in slashoptions not being parsed to objects\r\n    - `@discord.ext.commands.Cooldown` not working on cog slashcommands\r\n\r\n    ## **Added**\r\n    - `**fields` to all functions that edit the message components (like `.disable_components`, `.disable_component`, ...). The `**fields` parameter can be used to edit other properties of the message without using `.edit` again and send a \"useless\" request\r\n    - `@Lister.on_error` and `@Listener.wrong_user` decorators for handling Exceptions in Listeners\r\n    - When no keyword was passed to `@Listener.button` or `@Listener.select`, the function will be called on every button/slect\r\n    - `channel_type` to SlashOption, list of `discord.ChannelType`. This will restrict the shown channels for channel slash options to this list.\r\n    - support for nextcord. Other libs **should** work too, but they are not tested. \r\n    - `Mentionable` type for SlashOptions\r\n    - description for short slashoptions. If you set the options for a slash command via callback params, you can add a description (and a type) to them with your docstring. There are 3 different styles you can use:\r\n    ```py\r\n    # style 1\r\n    @ui.slash.command()\r\n    async def my_command(ctx, my_option, my_other_option):\r\n        \"\"\"This is my command description\r\n\r\n        my_option: `int`:\r\n            This is the description for the my_option parameter\r\n        my_other_option: `str`:\r\n            This is the description for another option\r\n        \"\"\"\r\n        ...\r\n    \r\n    # style 2\r\n    @ui.slash.command()\r\n    async def my_command(ctx, my_option: int, my_other_option: str):\r\n        \"\"\"This is my command description\r\n\r\n        my_option: This is the description for the my_option parameter\r\n        my_other_option: This is the description for another option\r\n        \"\"\"\r\n        ...\r\n\r\n    # style 3\r\n    @ui.slash.command()\r\n    async def my_command(ctx, my_option, my_other_option: str):\r\n        \"\"\"This is my command description\r\n\r\n\r\n        `int`: This is the description for the my_option parameter\r\n\r\n        This is the description for another option\r\n        \"\"\"\r\n        ...\r\n    ```\r\n    Note: You don't have to use `` `type` ``, you can just use `type`\r\n    - Empty descriptions for slashcommands and slashoptions. The default description value is now `\\u200b` which is an \"empty\" char\r\n    - Modifying slashcommand options is now WWAAYYYY easier. You can just do `.options[name or index].name = \"new name\"` and the option will be updated\r\n    - You can set the autocomplete choice generator with a decorator now\r\n    ```py\r\n    ui.slash.command(options=[SlashOption(str, \"my_option\")])\r\n    async def my_command(ctx, my_option):\r\n        ...\r\n\r\n\r\n    @my_command.options[\"my_option\"].autocomplete_function\r\n    async def my_generator(ctx):\r\n        ...\r\n    # or\r\n    @my_command.options[0].autocomplete_function\r\n    async def my_generator(ctx):\r\n        ...\r\n    ```\r\n    - All apllication command decorators will now return the created Command\r\n    ```py\r\n    @ui.slash.command(...)\r\n    async my_command(ctx):\r\n        ...\r\n    type(my_command) # SlashCommand\r\n    ```\r\n    - Added edit and delete method to slashcommand. You can use this for editing or deleting the command later\r\n    ```py\r\n    # edit\r\n    await my_command.edit(name=\"test\")\r\n    # delete\r\n    await my_command.delete()\r\n    ```\r\n    - `id` to SlashCommand\r\n    - `commands_synced` event which will be dispatched when all commands where synced with the api (`UI.Slash.sync_commands`)\r\n    - `BaseCommmand.update` method which updates the api command with the lcoal changes\r\n    - `SlashSubCommand.base`, which will be shared among all subslashcommands with the same base\r\n\r\n\r\n    ## **Removed**\r\n    - `discord.ext.commands.Bot` override for enabling the debug event, this will be enabled when creating a UI instance from the bot\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e5.0.1\u003c/summary\u003e\r\n\r\n    ## **Fixed**\r\n    - Choices not working\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e5.0.0\u003c/summary\u003e\r\n\r\n    ## **Fixed**\r\n    - Roles not being parsed correctly\r\n\r\n    ## **Changed**\r\n    - default_permission\r\n    \u003e default_permission can now be of type `discord.Permissions` but the api doesn't support that yet.\r\n    - slash http\r\n    \u003e some code changes to slash-http features\r\n\r\n    ## **Added**\r\n    - ChoiceGeneratorContext\r\n    \u003e Context class for choice generation\r\n    - SlashOption\r\n    \u003e `choice_generator` keyword and `autocomplete` keyword. \r\n    \u003e `autocomplete` is not needed if you pass choice_generator\r\n    - File sending\r\n    \u003e You are now able to send hidden files\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e4.3.8\u003c/summary\u003e\r\n    \r\n    ## **Fixed**\r\n    - Issue with SlashOptions\r\n    \u003e required is now false by default again\r\n    \r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e4.3.7\u003c/summary\u003e\r\n\r\n    ## **Changed**\r\n    - SlashOption\r\n    \u003e Required is now ``True`` by default\r\n\r\n    ## **Fixed**\r\n    - `AttributeError: 'LinkButton' object has no attribute 'component_type'`\r\n\r\n    ## **Removed**\r\n    - decompressing\r\n    \u003e The lib now doesn't decompress byte data anymore, which means everything before the dpy commit `848d752` doesn't work with this lib.\r\n    \u003e\r\n    \u003e [message reference](https://discord.com/channels/336642139381301249/381965829857738772/879980113742143548) in discordpy discord server\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e4.3.6\u003c/summary\u003e\r\n\r\n    ## **Fixed**\r\n    - Slashcommand comparing\r\n    - Ephemeralmessage keyerror exception\r\n\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e4.3.5\u003c/summary\u003e\r\n\r\n    ## **Fixed**\r\n    - send function issues\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e4.3.4\u003c/summary\u003e\r\n\r\n    ## Fixed\r\n    - SlashOption not accepting tuple\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e4.3.3\u003c/summary\u003e\r\n\r\n    ## **Fixed**\r\n    - fixed `TypeError: 'NoneType' object is not iterable`\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e4.3.2\u003c/summary\u003e\r\n\r\n    ## **Fixed**\r\n    - `Could not find a matching option type for parameter '\u003cclass 'NoneType'\u003e'`\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e4.3.1\u003c/summary\u003e\r\n\r\n    ## **Removed**\r\n    - unused parameter\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e4.3.0\u003c/summary\u003e\r\n\r\n    ## **Fixed**\r\n    - `Message.wait_for`\r\n    \u003e by keyword doesn't work properly\r\n\r\n    ## **Removed**\r\n    - Hash\r\n    \u003e Removed the hash property from Buttons and SelectMenus due to the removal of it from the api\r\n    \r\n    ## **Added**\r\n    - `discord_ui.ext`\r\n    \u003e A module with useful tools and decorators to use [more information](https://discord-ui.readthedocs.io/en/latest/ext.html)\r\n    \r\n    - BaseCommand\r\n    \u003e BaseCommand (the superclass for all applicationcommands) has now some extra properties:\r\n        \r\n        - is_chat_input\r\n        \u003e Whether this command is a slash command\r\n        \r\n        - is_message_context\r\n        \u003e Whether this command is a message context command\r\n        \r\n        - is_user_context\r\n        \u003e Whether this command is a user context command\r\n    \r\n    - SlashedCommand\r\n    \u003e Added properties:\r\n        \r\n        - is_alias\r\n        \u003e Whether the invoked command is an alias or not\r\n        \r\n        - aliases\r\n        \u003e All the available aliases for the command\r\n    \r\n    - Listeners\r\n    \u003e Listeners are something that you can use for a better processing of received components.\r\n    \u003e You could see them as a cog to the message components\r\n    \u003e [more information](https://discord-ui.readthedocs.io/en/latest/listeners.html)\r\n\r\n    ## **Changed**\r\n    - SelectInteraction\r\n    \u003e `SelectInteraction.selected_values` are not the raw values that were selected, `SelectMenu.selected_options` are the options of type `SlashOption` that were selected\r\n    - MISSING =\u003e None\r\n    \u003e All instance values that were `MISSING` by default are now `None`\r\n\r\n\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e4.2.15\u003c/summary\u003e\r\n\r\n    # Fixed\r\n    - #97\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e4.2.14\u003c/summary\u003e\r\n\r\n    ## **Fixed**\r\n    - small SelectOption issues\r\n    - context commands\r\n\r\n    ## **Changed**\r\n    - allow context commands to have names with spaces\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e4.2.13\u003c/summary\u003e\r\n\r\n    ## **Fixed**\r\n    - `TypeError: 'EMPTY' is not a callable object` in context commands\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e4.2.12\u003c/summary\u003e\r\n\r\n    ## **Fixed**\r\n    - context commands\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e4.2.11\u003c/summary\u003e\r\n\r\n    ## **Fixed**\r\n    - cog context commands returned wrong type\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e4.2.10\u003c/summary\u003e\r\n\r\n    ## **Fixed**\r\n    - cog context commands typo with `guild_permission` keyword\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e4.2.8\u003c/summary\u003e\r\n    \r\n    ## **Added**\r\n\r\n    - edit_subcomand\r\n\r\n    ## **Fixed**\r\n\r\n    - print statements\r\n\r\n    ## **Fixed**\r\n\r\n    - #94 (again 💀)\r\n    - received subcommands\r\n    \u003e The base_names and the name will be now set to the right value\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e4.2.7\u003c/summary\u003e\r\n\r\n    ## **Added**\r\n    - `on_component`\r\n    \u003e There is now an event with the name `component` that will be dispatched whenever a component was received\r\n    \u003e If you use `Message.wait_for`, there is now a new event choice with the name `component` (`message.wait_for(\"component\", client)`)\r\n\r\n    ## **Fixed**\r\n    - #94\r\n    \u003e DM issue with deleting messages\r\n\r\n    ## **Changed**\r\n    - `edit`\r\n    \u003e Edit now takes \"content\" as not positional (`.edit(\"the content\")` works now)\r\n    - component lenght\r\n    \u003e You are now able to set component values with the right max lenght\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e4.2.6\u003c/summary\u003e\r\n\r\n    ## **Fixed**\r\n\r\n    - emebds\r\n    \u003e there was an issue with sending embeds\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e4.2.5\u003c/summary\u003e\r\n\r\n    ## **Fixed**\r\n\r\n    - listening_components\r\n    \u003e There was an issue with listening components that they needed two parameters but only one was passed\r\n    \u003e Another issue was `TypeError: __init__() missing 1 required positional argument: 'custom_id'`?\r\n\r\n    - emebds\r\n    \u003e there was an issue with sending embeds\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e4.2.2\u003c/summary\u003e\r\n\r\n    ## **Changed**\r\n\r\n    - sync_commands\r\n    \u003e the `delete_unused` keyword is now optional, if you don't pass a parameter, `slash.delete_unused` will be used (from the `__init__` function)\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e4.2.1\u003c/summary\u003e\r\n\r\n    ## **Fixed**\r\n    \r\n    - `cannot import name 'InteractionResponseType' from 'discord.enums'`\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e4.2.0\u003c/summary\u003e\r\n\r\n    ## **Added**\r\n\r\n    - cog_remove sync\r\n    \u003e when you remove a cog the slash commands will now get deleted if you set `delete_unused` to True and set `sync_on_cog` to True\r\n    - alternativ slash options\r\n    \u003e you don't have to specify options in one of the slash decorators anymore. Instead, you can set them in your callback function\r\n    \u003e Example\r\n    ```py\r\n    @ui.slash.command()\r\n    async def greet(ctx, user):                         # This will add an required option with the name \"user\" of type \"user\"\r\n        \"\"\"Greets a user\r\n        \r\n        You can use multiline docstrings, because only the first line will be used for the description\r\n        \"\"\"\r\n        ...\r\n    \r\n    @ui.slash.command()\r\n    async def tag(ctx, target: discord.User = None):    # This will add an optional option with the name \"target\" of type \"user\"\r\n                                                        # Note: you could also use target: \"user\" = None or anything else you would use in SlashOption for the type\r\n        ...\r\n\r\n    ```\r\n\r\n    ## **Fixed**\r\n\r\n    - sync_commands\r\n    \u003e if you would sync the commands after the first sync, it threw an error\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e4.1.4\u003c/summary\u003e\r\n\r\n    ## **Fixed**\r\n\r\n    - slashcommands in forbidden guilds\r\n    \u003e when trying to get slash commands in a guild with no `appication.commands` permission, it won't throw an exepction anymore\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e4.1.2\u003c/summary\u003e\r\n\r\n    ## **Fixed**\r\n\r\n    - Subcommands editing\r\n    \u003e subcommand checks were wrong and this would result in errors like `In options.0.options.2: Option name 'name' is already used in these options`\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e4.1.1\u003c/summary\u003e\r\n\r\n    ## **Fixed**\r\n\r\n    - Interaction.author.voice\r\n    \u003e For some reason the voice property of the creator or the interaction would be set\r\n\r\n    - Global slashcommands\r\n    \u003e They wouldn't be registered to the api\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e4.1.0\u003c/summary\u003e\r\n\r\n    ## **Added**\r\n\r\n    - py 3.6 \u003c support\r\n    \u003e You should be able to use this package with python 3.6 or newer\r\n\r\n    ## **Fixed**\r\n\r\n    - print\r\n    \u003e Forgot to remove print statements💀\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e4.0.4\u003c/summary\u003e\r\n\r\n    ## **Fixed**\r\n\r\n    - slashcommand\r\n    \u003e when a user was passed in an option, its guild was always None\r\n    - context commands\r\n    \u003e if no name passed, the context command wouldn't take the callback name as the name of the command\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e4.0.3\u003c/summary\u003e\r\n\r\n    ## **Fixed**\r\n\r\n    - Message.wait_for\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e4.0.2\u003c/summary\u003e\r\n\r\n    ## **Fixed**\r\n\r\n    - Issue with receiving context commands\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e4.0.1\u003c/summary\u003e\r\n    \r\n    ## **Fixed**\r\n\r\n    - discord.ext import error\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e4.0.0\u003c/summary\u003e\r\n\r\n    ## **Added**\r\n\r\n    **You now have much more control over your slash commands!**\r\n    - Permissions\r\n    \u003e You can update your permissions with the `Slash.update_permissions` function\r\n    - Creating commands\r\n    \u003e You can now create slash commands without the decorator in a much more eaisier way! Check out the `Slash.add_command` function\r\n    - Edit commands\r\n    \u003e You can edit commands in code with the `Slash.edit_command` function\r\n\r\n    - Listening components\r\n    \u003e You can add and remove listening components now with the `Components.add_listening_component`, `Components.remove_listening_component` and `Components.remove_listening_components` functions\r\n\r\n    - Cogs\r\n    \u003e You can now use cog decorators like `slash_command`, `subslash_command` and `listening_component`\r\n\r\n    ## **Fixed**\r\n\r\n    - SlashCommand\r\n    \u003e Slash commands wouldn't be updated if only `default_permission` was changed\r\n\r\n    ## **Changed**\r\n\r\n    - wait_for\r\n    \u003e Message.wait_for now takes `by` and `check` as parameters and `event_name` and `client` switched place (`wait_for(client, \"event_name\")` is now `wait_for(\"event_name\", client)`)\r\n    - listening components\r\n    \u003e You can specify listening_components now more presicely, you can add messages, users, and a check to filter\r\n    - Interaction.member\r\n    \u003e `Interaction.member` is now `Interaction.author`\r\n    - listening comonents\r\n    \u003e Listening component callback functions now only take one parameter, the used component\r\n    - `on_button_press` and `on_menu_select`\r\n    \u003e These events now take a sole parameter, the used component. If you want to acces to message, use `passed_component.message`\r\n\r\n    ## **Removed**\r\n\r\n    - ResponseMessage\r\n    \u003e Removed ResponseMessage\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e3.3.5\u003c/summary\u003e\r\n    \r\n    ## **Fixed**\r\n\r\n    - SelectMenu\r\n    \u003e SelectMenu issue when creating it from data\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e3.3.4\u003c/summary\u003e\r\n\r\n    ## **Changed**\r\n\r\n    - edit\r\n    \u003e `Message.edit` now takes a `embed` parameter\r\n\r\n    ## **Fixed**\r\n\r\n    - print\r\n    \u003e Forgot to remove some `print` statements \r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e3.3.3\u003c/summary\u003e\r\n\r\n    ## **Added**\r\n\r\n    - class representation\r\n    \u003e classes have now a `__repr__` function\r\n    - UI(override_dpy)\r\n    \u003e You can now choose whether you want to override some of dpy objects and functions (default is True) (see [the override module](https://github.com/discord-py-ui/discord-ui/blob/main/discord_ui/override.py) for more information)\r\n    \u003e This also appeals to the `Components` class (Components(override_dpy))\r\n    \u003e note: if you don't want to create a `UI` object, you can instead override dpy with the `override_dpy` method\r\n    ```py\r\n    from discord_ui import override_dpy\r\n\r\n    override_dpy()\r\n    ```\r\n\r\n    ## **Fixed**\r\n\r\n    - dpy2\r\n    \u003e discord.py v2 now auto-decompresses socket data and passes a string instead of the uncompressed data.\r\n    - override dpy message\r\n    \u003e when overriding dpy message object, the components would mix\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e3.3.2\u003c/summary\u003e\r\n\r\n    ## **Added**\r\n\r\n    - EphemeralResponseMessage\r\n    \u003e You can now edit a ephemeral message which was created from an interaction (ex. when a button in a hidden message was pressed)\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e3.3.1\u003c/summary\u003e\r\n\r\n    ## **Added**\r\n\r\n    - interaction\r\n    \u003e `Interaction.channel` and `Interaction.guild`\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e3.3.0\u003c/summary\u003e\r\n\r\n    ## **Fixed**\r\n\r\n    - interaction usage in dms\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e3.2.9\u003c/summary\u003e\r\n    \r\n    ## **Added**\r\n\r\n    - ratelimit fix\r\n    \u003e The lib will now retry after the ratelimit reset and doesn't throw an HTTPException anymore\r\n\r\n    ## **Fixed**\r\n\r\n    - sync_commands\r\n    \u003e Got `KeyError` exception while syncing commands\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e3.2.8\u003c/summary\u003e\r\n\r\n    ## **Fixed**\r\n\r\n    - hidden responding\r\n    \u003e When a hidden response was about to be send without defering the interaction it would thrown an error\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e3.2.7\u003c/summary\u003e\r\n\r\n    ## **Added**\r\n\r\n    - warnings\r\n        - When a guild_permission with an invalid guild id is passed, it will throw an exception when syncing the commands\r\n        - When the value of a guild_permission is not of type `SlashPermission` it will throw an exception\r\n    - context-commands\r\n    \u003e You can now have context commands with the same name as a normal slash command\r\n    - slashcommand description\r\n    \u003e You can use docstrings `\"\"\"docstring\"\"\"` for setting the description of a slash commmand by setting the dosctring for the callback function\r\n\r\n    ## **Changed**\r\n\r\n    - auto_defer\r\n    \u003e auto_defer is now disabled by default\r\n    - slash sync\r\n    \u003e You can now disable auto_sync for slash commmands and sync them by yourself with `Slash.sync_commands(delete_unused)`\r\n    - Interacion.defer\r\n    \u003e `Interaction._deferred` is not `Interaction.deferred` and `Interaction.defer()` doesn't throw an exception anymore, it will just log the error with `logging.error()`\r\n\r\n    ## **Fixed**\r\n\r\n    - try\r\n    \u003e There was a try/catch in the `Interaction.respond` function that would allow the code to continue when an exception occured while responding with ninja_mode\r\n    - context commands\r\n    \u003e There was an issue adding context-commands\r\n    - Command checking\r\n    \u003e Now, the libary only edits commands when changes were made \r\n\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e3.2.6\u003c/summary\u003e\r\n\r\n    ## **Added**\r\n\r\n    - auto ninja_mode\r\n    \u003e If you use `.respond()`, the function will try to use ninja_mode automatically\r\n\r\n    ## **Changed**\r\n\r\n    - project\r\n    \u003e Moved git-project to https://github.com/discord-py-ui/discord-ui\r\n\r\n    ## **Fixed**\r\n\r\n    - ninja_mode response\r\n    \u003e responding with ninja_mode would end up in an exception\r\n\r\n    - file sending\r\n    \u003e fixed another file sending issue with slash commands\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e3.2.5\u003c/summary\u003e\r\n\r\n    ## **Fixed**\r\n\r\n    - #89 (thanks for reporting)\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e3.2.4\u003c/summary\u003e\r\n\r\n    - Fixed version issues with the package\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e3.2.2\u003c/summary\u003e\r\n\r\n    ## **Fixed**\r\n\r\n    - #85: `AttributeError: module 'discord' has no attribute '_Components__version'`\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e3.2.0\u003c/summary\u003e\r\n\r\n    ## **Fixed**\r\n\r\n    I'm really sorry for all the issues this libary got, if you still find issues, please report them in https://github.com/discord-py-ui/discord-ui/issues\r\n\r\n    - SelectOpion\r\n    \u003e There was an issue with emojis not being set in SelectOptions\r\n\r\n    -  LinkButton\r\n    \u003e There was an issue with setting the url not being set\r\n\r\n    - SlashCommands\r\n    \u003e There was an issue with creating commands that don't already exist\r\n\r\n    ## **Changed**\r\n\r\n    - SelectInteraction\r\n    \u003e `.values` is not `.selected_values`\r\n\r\n    ## **Added**\r\n\r\n    -  Interaction\r\n    \u003e Buttons and SelectMenus have a `.message` property for the message where their interaction was creted\r\n    \u003e ResponseMessages have a `.interaction` property for the received interaction\r\n    \r\n    - Events\r\n    \u003e We added a `interaction_received` event for all interactions that are received\r\n\r\n    \r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e3.1.0\u003c/summary\u003e\r\n\r\n    ## **Added**\r\n\r\n    - discordpy 2 support\r\n    \u003e We added support for discord.py v2, so you can stay loyal to our libary and use it together with discord.py v2!\r\n    \r\n    - Exceptions\r\n    \u003e Added own Exceptions for errors\r\n    \r\n    - ParseMethod\r\n    \u003e You can change the way the extension parses interaction data. You can choose between [different Methods](https://discord-ui.rtfd.io/en/latest/ui.html#id1)\r\n    \r\n    - Auto-defer\r\n    \u003e The libary will autodefer all interactions public. If you want to change that, take a look at [the documentation for this feature](https://discord-ui.rtfd.io/en/latest/ui.html#id2)\r\n    \r\n    - slashcommand edit check\r\n    \u003e Slash commands will only be edited if there were some changes, so you won't get a `invalid interaction` error in discord after starting the bot\r\n    \u003e If only permissions were changed, just the permissions will be edited and not the whole command like before\r\n\r\n    ## **Fixed**\r\n\r\n    - slash commands\r\n    \u003e I finally fixed the damn slashcommand system, it should work now\r\n\r\n    - Parsing\r\n    \u003e The resolving, fetching and pulling from the cache methods should all work\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e3.0.1\u003c/summary\u003e\r\n    \r\n    ## **Fixed**\r\n\r\n    - small project issues\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e3.0.0\u003c/summary\u003e\r\n\r\n    ## **Added**\r\n\r\n    - context commands\r\n    \u003e Context commands are now available\r\n\r\n    ## **Changed**\r\n\r\n    - Project name\r\n    \u003e The project's name was changed from `discord-message-components` to `discord-ui`\r\n\r\n    - ``Extension`` is now ``UI``\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e2.1.0\u003c/summary\u003e\r\n\r\n    ## **Added**\r\n\r\n    - Webhook support\r\n    \u003e You are now able to use webhooks together with message components, to send a webhook message with the components, use the `Components.send_webhook` function.\r\n    \u003e The standart webhook function is also overriden with the new component function\r\n\r\n    - Float type\r\n    \u003e You can now use `float` as the argument type for a slash command option\r\n\r\n    - Auto empty names\r\n    \u003e Buttons, LinkButtons and SelectOptions labels are now by default `\\u200b`, which is an \"empty\" char \r\n\r\n    ## **Changed**\r\n\r\n    - Code documentation to more be more informative\r\n\r\n    ## **Fixed**\r\n\r\n    - Fixed small code issues (they were already fixed in previous versions, but I just wanna list this here)\r\n\r\n    - Docs are now working\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e2.0.2\u003c/summary\u003e\r\n\r\n    ## **Fixed**\r\n\r\n    - SelectOption\r\n    \u003e Select option threw an exception if it was smaller than 1 or higher than 100\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e2.0.0\u003c/summary\u003e\r\n    \r\n    ## **Added**\r\n\r\n    - Slashcomamnd support\r\n        - `Slash` class for slash commands\r\n        - `Slash.command`, `Slash.subcommand` and `Slash.subcommand_groups` are available for creating slash commands\r\n        - `SlashedCommand` and `SlashedSubCommand` are there for used slash commands \r\n    \r\n    - ``Message``\r\n        - disable_action_row(row_numbers: `int` | `range`, disable: `bool`)\r\n        \u003e disables (enables) component row(s) in the message\r\n        \r\n        - disable_components(disable: `bool`)\r\n        \u003e disables (enables) all componentss\r\n    \r\n    - overrides\r\n        - `Messageable.send` returns Message instead of discord.Message and takes components parameter\r\n        - `override_client` function added\r\n    \r\n    - `interaction.send`, creates followup messages which can be hidden\r\n    \r\n    - `Component.listening_component`\r\n    \u003e A listening component with a callback function that will always be executed whenever a component with the specified custom_id \r\n    was used\r\n\r\n\r\n    ## **Changed**\r\n    - Message\r\n        \r\n        - All Message objects don't use the client object anymore\r\n        - Message.wait_for now needs the client as the first parameter\r\n\r\n    ## **Fixed**\r\n    - Interaction\r\n    \u003e All interaction responses work now\r\n    - A lot of issues I fogor💀\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e1.2.2\u003c/summary\u003e\r\n\r\n    ## **Fixed**\r\n\r\n    - Docs fixed\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e1.2.1\u003c/summary\u003e\r\n\r\n    ## **Fixed**\r\n\r\n    - Small code fixes\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e1.2.0\u003c/summary\u003e\r\n\r\n    ## **Added**\r\n\r\n    - Complete message component suppport\r\n    - Select menus\r\n    - [documentation](https://discord-ui.readthedocs.io/en/latest/)\r\n    \r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e1.1.2\u003c/summary\u003e\r\n\r\n    ## **Fixed**\r\n\r\n    - Small code fixes\r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e1.1.1\u003c/summary\u003e\r\n\r\n    ## **Added**\r\n\r\n    - Message.edit()\r\n        \u003e You can now edit messages with button support\r\n\r\n    \u003c/details\u003e\r\n\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e1.1.0\u003c/summary\u003e\r\n\r\n    ## **Changed**\r\n\r\n    - Major changes to request code, now using the client's request\r\n    - `ResponseMessage.acknowledge()` -\u003e `ResponseMessage.defer()`\r\n        \u003e Changed the name of the function + changed `ResponseMessage.acknowledged` -\u003e `ResponseMessage.deferred`\r\n    - `ResponseMessage.defer()` =\u003e `await ResponseMessage.defer()`\r\n        \u003e `defer` (`acknowledge`) is now async and needs to be awaited\r\n\r\n    ## **Added**\r\n    \r\n    - hidden responses\r\n        \u003e You can now send responses only visible to the user\r\n    \r\n\r\n    ## **Fixed**\r\n    \r\n    - `ResponseMessage.respond()`\r\n        \u003e Now doesn't show a failed interaction\r\n \r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e1.0.5\u003c/summary\u003e\r\n    \r\n    ## **Fixed**\r\n\r\n    - `ResponseMessage.respond()`\r\n        \u003e responding now doesn't fail after sending the message, it will now defer the interaction by it self if not already deferred and then send the message\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e1.0.4\u003c/summary\u003e\r\n    \r\n    ## **Added**\r\n\r\n    - `ResponseMessage.acknowledged`\r\n        \u003e Whether the message was acknowledged with the `ResponseMessage.acknowledged()` function\r\n\r\n    ## **Changed**\r\n\r\n    - `ResponseMessage.respond()` =\u003e `await ResponseMessage.respond()`\r\n        \u003e respond() function is now async and needs to be awaited\r\n\r\n    - `ResponseMessage.respond() -\u003e None` =\u003e `ResponseMessage.respond() -\u003e Message or None`\r\n        \u003e respond() now returns the sent message or None if ninja_mode is true \r\n\r\n    \u003c/details\u003e\r\n\r\n-   \u003cdetails\u003e\r\n    \u003csummary\u003e1.0.3\u003c/summary\u003e\r\n\r\n    ## **Added**\r\n\r\n    - `Button.hash`\r\n        \u003e Buttons have now a custom hash property, generated by the discord api \r\n    \r\n    \u003c/details\u003e\r\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdiscord-py-ui%2Fdiscord-ui","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fdiscord-py-ui%2Fdiscord-ui","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fdiscord-py-ui%2Fdiscord-ui/lists"}