Skip to content

Commit e9e06c4

Browse files
feat: add support for editing our own application information
1 parent a34d0f9 commit e9e06c4

File tree

3 files changed

+191
-3
lines changed

3 files changed

+191
-3
lines changed

disnake/appinfo.py

Lines changed: 99 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,13 @@
22

33
from __future__ import annotations
44

5-
from typing import TYPE_CHECKING, List, Optional
5+
from typing import TYPE_CHECKING, Any, Dict, List, Optional
66

77
from . import utils
8-
from .asset import Asset
8+
from .asset import Asset, AssetBytes
99
from .flags import ApplicationFlags
1010
from .permissions import Permissions
11+
from .utils import MISSING
1112

1213
if TYPE_CHECKING:
1314
from .guild import Guild
@@ -20,6 +21,7 @@
2021
)
2122
from .user import User
2223

24+
2325
__all__ = (
2426
"AppInfo",
2527
"PartialAppInfo",
@@ -64,6 +66,12 @@ def to_url(self) -> str:
6466
"""
6567
return utils.oauth_url(self._app_id, scopes=self.scopes, permissions=self.permissions)
6668

69+
def to_dict(self) -> Dict[str, Any]:
70+
return {
71+
"scopes": self.scopes,
72+
"permissions": self.permissions.value,
73+
}
74+
6775

6876
class AppInfo:
6977
"""Represents the application info for the bot provided by Discord.
@@ -280,6 +288,95 @@ def summary(self) -> str:
280288
)
281289
return self._summary
282290

291+
async def edit(
292+
self,
293+
*,
294+
description: Optional[str] = MISSING,
295+
flags: ApplicationFlags = MISSING,
296+
icon: Optional[AssetBytes] = MISSING,
297+
cover_image: Optional[AssetBytes] = MISSING,
298+
custom_install_url: Optional[str] = MISSING,
299+
install_params: Optional[InstallParams] = MISSING,
300+
role_connections_verification_url: Optional[str] = MISSING,
301+
interactions_endpoint_url: Optional[str] = MISSING,
302+
tags: Optional[List[str]] = MISSING,
303+
) -> AppInfo:
304+
"""|coro|
305+
306+
Edit's the application's information.
307+
308+
All parameters are optional.
309+
310+
Returns a new :class:`AppInfo` with the updated information.
311+
312+
.. versionadded:: 2.10
313+
314+
Parameters
315+
----------
316+
description: Optional[:class:`str`]
317+
The application's description.
318+
flags: Optional[:class:`ApplicationFlags`]
319+
The application's public flags.
320+
tags: Optional[List[:class:`str`]]
321+
The application's tags.
322+
install_params: Optional[:class:`InstallParams`]
323+
The installation parameters for this application.
324+
custom_install_url: Optional[:class:`str`]
325+
The custom installation url for this application.
326+
role_connections_verification_url: Optional[:class:`str`]
327+
The application's role connection verification entry point,
328+
which when configured will render the app as a verification method
329+
in the guild role verification configuration.
330+
icon: |resource_type|
331+
Update the application's icon asset, if any.
332+
cover_image: |resource_type|
333+
Retrieves the cover image on a store embed, if any.
334+
335+
Raises
336+
------
337+
HTTPException
338+
Editing the information failed somehow.
339+
340+
Returns
341+
-------
342+
:class:`.AppInfo`
343+
The bot's new application information.
344+
"""
345+
fields: Dict[str, Any] = {}
346+
347+
if install_params is not MISSING:
348+
fields["install_params"] = None if install_params is None else install_params.to_dict()
349+
350+
if icon is not MISSING:
351+
fields["icon"] = await utils._assetbytes_to_base64_data(icon)
352+
353+
if cover_image is not MISSING:
354+
fields["cover_image"] = await utils._assetbytes_to_base64_data(cover_image)
355+
356+
if flags is not MISSING:
357+
fields["flags"] = flags.value
358+
359+
if description is not MISSING:
360+
fields["description"] = description
361+
362+
if custom_install_url is not MISSING:
363+
fields["custom_install_url"] = custom_install_url
364+
365+
if role_connections_verification_url is not MISSING:
366+
fields["role_connections_verification_url"] = role_connections_verification_url
367+
368+
if interactions_endpoint_url is not MISSING:
369+
fields["interactions_endpoint_url"] = interactions_endpoint_url
370+
371+
if tags is not MISSING:
372+
fields["tags"] = tags
373+
374+
data = await self._state.http.edit_application_info(**fields)
375+
376+
if "rpc_origins" not in data:
377+
data["rpc_origins"] = None
378+
return AppInfo(self._state, data)
379+
283380

284381
class PartialAppInfo:
285382
"""Represents a partial AppInfo given by :func:`~disnake.abc.GuildChannel.create_invite`.

disnake/client.py

Lines changed: 89 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@
4242
ApplicationCommand,
4343
GuildApplicationCommandPermissions,
4444
)
45-
from .appinfo import AppInfo
45+
from .appinfo import AppInfo, InstallParams
4646
from .application_role_connection import ApplicationRoleConnectionMetadata
4747
from .backoff import ExponentialBackoff
4848
from .channel import PartialMessageable, _threaded_channel_factory
@@ -2372,6 +2372,94 @@ async def application_info(self) -> AppInfo:
23722372
data["rpc_origins"] = None
23732373
return AppInfo(self._connection, data)
23742374

2375+
async def edit_application_info(
2376+
self,
2377+
*,
2378+
description: Optional[str] = MISSING,
2379+
flags: ApplicationFlags = MISSING,
2380+
icon: Optional[AssetBytes] = MISSING,
2381+
cover_image: Optional[AssetBytes] = MISSING,
2382+
custom_install_url: Optional[str] = MISSING,
2383+
install_params: Optional[InstallParams] = MISSING,
2384+
role_connections_verification_url: Optional[str] = MISSING,
2385+
interactions_endpoint_url: Optional[str] = MISSING,
2386+
tags: Optional[List[str]] = MISSING,
2387+
**fields: Any,
2388+
) -> AppInfo:
2389+
"""|coro|
2390+
2391+
Edit's the application's information.
2392+
2393+
All parameters are optional.
2394+
2395+
.. versionadded:: 2.10
2396+
2397+
Parameters
2398+
----------
2399+
description: Optional[:class:`str`]
2400+
The application's description.
2401+
flags: Optional[:class:`.ApplicationFlags`]
2402+
The application's public flags.
2403+
tags: Optional[List[:class:`str`]]
2404+
The application's tags.
2405+
install_params: Optional[:class:`.InstallParams`]
2406+
The installation parameters for this application.
2407+
custom_install_url: Optional[:class:`str`]
2408+
The custom installation url for this application.
2409+
role_connections_verification_url: Optional[:class:`str`]
2410+
The application's role connection verification entry point,
2411+
which when configured will render the app as a verification method
2412+
in the guild role verification configuration.
2413+
icon: |resource_type|
2414+
Update the application's icon asset, if any.
2415+
cover_image: |resource_type|
2416+
Retrieves the cover image on a store embed, if any.
2417+
2418+
Raises
2419+
------
2420+
HTTPException
2421+
Editing the information failed somehow.
2422+
2423+
Returns
2424+
-------
2425+
:class:`.AppInfo`
2426+
The bot's application information.
2427+
"""
2428+
fields: Dict[str, Any] = {}
2429+
2430+
if install_params is not MISSING:
2431+
fields["install_params"] = None if install_params is None else install_params.to_dict()
2432+
2433+
if icon is not MISSING:
2434+
fields["icon"] = await utils._assetbytes_to_base64_data(icon)
2435+
2436+
if cover_image is not MISSING:
2437+
fields["cover_image"] = await utils._assetbytes_to_base64_data(cover_image)
2438+
2439+
if flags is not MISSING:
2440+
fields["flags"] = flags.value
2441+
2442+
if description is not MISSING:
2443+
fields["description"] = description
2444+
2445+
if custom_install_url is not MISSING:
2446+
fields["custom_install_url"] = custom_install_url
2447+
2448+
if role_connections_verification_url is not MISSING:
2449+
fields["role_connections_verification_url"] = role_connections_verification_url
2450+
2451+
if interactions_endpoint_url is not MISSING:
2452+
fields["interactions_endpoint_url"] = interactions_endpoint_url
2453+
2454+
if tags is not MISSING:
2455+
fields["tags"] = tags
2456+
2457+
data = await self.http.edit_application_info(**fields)
2458+
2459+
if "rpc_origins" not in data:
2460+
data["rpc_origins"] = None
2461+
return AppInfo(self._connection, data)
2462+
23752463
async def fetch_user(self, user_id: int, /) -> User:
23762464
"""|coro|
23772465

disnake/http.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2794,6 +2794,9 @@ def get_voice_regions(self) -> Response[List[voice.VoiceRegion]]:
27942794
def application_info(self) -> Response[appinfo.AppInfo]:
27952795
return self.request(Route("GET", "/oauth2/applications/@me"))
27962796

2797+
def edit_application_info(self, **fields: Any) -> Response[appinfo.AppInfo]:
2798+
return self.request(Route("PATCH", "/applications/@me"), json=fields)
2799+
27972800
def get_application_role_connection_metadata_records(
27982801
self, application_id: Snowflake
27992802
) -> Response[List[application_role_connection.ApplicationRoleConnectionMetadata]]:

0 commit comments

Comments
 (0)