diff --git a/lib/nyxx.dart b/lib/nyxx.dart index 8c53a39ec..4119dc7f8 100644 --- a/lib/nyxx.dart +++ b/lib/nyxx.dart @@ -68,7 +68,7 @@ export 'src/builders/application_command.dart' show ApplicationCommandBuilder, ApplicationCommandUpdateBuilder, CommandOptionBuilder, CommandOptionChoiceBuilder; export 'src/builders/interaction_response.dart' show InteractionResponseBuilder, ModalBuilder, InteractionCallbackType; export 'src/builders/entitlement.dart' show TestEntitlementBuilder, TestEntitlementType; -export 'src/builders/application.dart' show ApplicationUpdateBuilder; +export 'src/builders/application.dart' show ApplicationUpdateBuilder, ApplicationIntegrationTypeConfigurationBuilder; export 'src/cache/cache.dart' show Cache, CacheConfig; diff --git a/lib/src/builders/application.dart b/lib/src/builders/application.dart index ff9efd058..268046f96 100644 --- a/lib/src/builders/application.dart +++ b/lib/src/builders/application.dart @@ -4,6 +4,22 @@ import 'package:nyxx/src/builders/sentinels.dart'; import 'package:nyxx/src/models/application.dart'; import 'package:nyxx/src/utils/flags.dart'; +class ApplicationIntegrationTypeConfigurationBuilder extends CreateBuilder { + /// Install params for each installation context's default in-app authorization link. + final InstallationParameters? oauth2InstallParameters; + + ApplicationIntegrationTypeConfigurationBuilder({this.oauth2InstallParameters}); + + @override + Map build() => { + if (oauth2InstallParameters != null) + 'oauth2_install_params': { + 'scopes': oauth2InstallParameters!.scopes, + 'permissions': oauth2InstallParameters!.permissions.value.toString(), + }, + }; +} + class ApplicationUpdateBuilder extends UpdateBuilder { Uri? customInstallUrl; @@ -23,7 +39,7 @@ class ApplicationUpdateBuilder extends UpdateBuilder { List? tags; - Map? integrationTypesConfig; + Map? integrationTypesConfig; ApplicationUpdateBuilder({ this.customInstallUrl, @@ -49,13 +65,9 @@ class ApplicationUpdateBuilder extends UpdateBuilder { 'permissions': installationParameters!.permissions.value.toString(), }, if (integrationTypesConfig != null) - 'integration_types_config': integrationTypesConfig!.map((key, value) => MapEntry(key.value.toString(), { - if (value.oauth2InstallParameters != null) - 'oauth2_install_params': { - 'scopes': value.oauth2InstallParameters!.scopes, - 'permissions': value.oauth2InstallParameters!.permissions.value.toString(), - }, - })), + 'integration_types_config': { + for (final MapEntry(:key, :value) in integrationTypesConfig!.entries) key.value.toString(): value.build(), + }, if (flags != null) 'flags': flags!.value, if (!identical(icon, sentinelImageBuilder)) 'icon': icon?.buildDataString(), if (!identical(coverImage, sentinelImageBuilder)) 'cover_image': coverImage?.buildDataString(), diff --git a/lib/src/http/managers/application_command_manager.dart b/lib/src/http/managers/application_command_manager.dart index e57a3d53c..c334a30f5 100644 --- a/lib/src/http/managers/application_command_manager.dart +++ b/lib/src/http/managers/application_command_manager.dart @@ -59,8 +59,8 @@ abstract class ApplicationCommandManager extends Manager { defaultMemberPermissions: maybeParse(raw['default_member_permissions'], (String raw) => Permissions(int.parse(raw))), hasDmPermission: raw['dm_permission'] as bool?, isNsfw: raw['nsfw'] as bool?, - integrationTypes: (raw['integration_types'] as List).cast().map(ApplicationIntegrationType.parse).toList(), - contexts: (raw['contexts'] as List? ?? []).cast().map(InteractionContextType.parse).toList(), + integrationTypes: parseMany(raw['integration_types']! as List, ApplicationIntegrationType.parse), + contexts: maybeParseMany(raw['contexts'], InteractionContextType.parse), version: Snowflake.parse(raw['version']!), ); } diff --git a/lib/src/http/managers/application_manager.dart b/lib/src/http/managers/application_manager.dart index b687f0558..f2e373178 100644 --- a/lib/src/http/managers/application_manager.dart +++ b/lib/src/http/managers/application_manager.dart @@ -62,9 +62,12 @@ class ApplicationManager { installationParameters: maybeParse(raw['install_params'], parseInstallationParameters), customInstallUrl: maybeParse(raw['custom_install_url'], Uri.parse), integrationTypesConfig: maybeParse( - raw['integration_types_config'], - (config) => (config as Map).cast().map((key, value) => - MapEntry(ApplicationIntegrationType.parse(int.parse(key)), parseApplicationIntegrationTypeConfiguration((value as Map).cast())))), + raw['integration_types_config'], + (Map config) => { + for (final MapEntry(:key, :value) in config.entries) + ApplicationIntegrationType.parse(int.parse(key)): parseApplicationIntegrationTypeConfiguration(value as Map) + }, + ), roleConnectionsVerificationUrl: maybeParse(raw['role_connections_verification_url'], Uri.parse), ); } diff --git a/lib/src/http/managers/interaction_manager.dart b/lib/src/http/managers/interaction_manager.dart index c8a424a28..a1d3266fd 100644 --- a/lib/src/http/managers/interaction_manager.dart +++ b/lib/src/http/managers/interaction_manager.dart @@ -55,10 +55,11 @@ class InteractionManager { final entitlements = parseMany(raw['entitlements'] as List, client.applications[applicationId].entitlements.parse); final authorizingIntegrationOwners = maybeParse( - raw['authorizing_integration_owners'], - (map) => - (map as Map).cast().map((key, value) => MapEntry(ApplicationIntegrationType.parse(int.parse(key)), Snowflake.parse(value)))) ?? - {}; + raw['authorizing_integration_owners'], + (Map map) => { + for (final MapEntry(:key, :value) in map.entries) ApplicationIntegrationType.parse(int.parse(key)): Snowflake.parse(value!), + }, + ); final context = maybeParse(raw['context'], InteractionContextType.parse); return switch (type) { diff --git a/lib/src/http/managers/message_manager.dart b/lib/src/http/managers/message_manager.dart index 5a370ea8e..6aa8af936 100644 --- a/lib/src/http/managers/message_manager.dart +++ b/lib/src/http/managers/message_manager.dart @@ -83,7 +83,7 @@ class MessageManager extends Manager { ), interactionMetadata: maybeParse( raw['interaction_metadata'], - (Map raw) => parseMessageInteractionMetadata(raw.cast()), + parseMessageInteractionMetadata, ), thread: maybeParse(raw['thread'], client.channels.parse) as Thread?, components: maybeParseMany(raw['components'], parseMessageComponent), @@ -325,9 +325,10 @@ class MessageManager extends Manager { id: Snowflake.parse(raw['id']!), type: InteractionType.parse(raw['type'] as int), userId: Snowflake.parse(raw['user_id']!), - authorizingIntegrationOwners: (raw['authorizing_integration_owners'] as Map) - .cast() - .map((key, value) => MapEntry(ApplicationIntegrationType.parse(int.parse(key)), Snowflake.parse(value))), + authorizingIntegrationOwners: { + for (final MapEntry(:key, :value) in (raw['authorizing_integration_owners'] as Map).entries) + ApplicationIntegrationType.parse(int.parse(key)): Snowflake.parse(value!), + }, originalResponseMessageId: maybeParse(raw['original_response_message_id'], Snowflake.parse), interactedMessageId: maybeParse(raw['interacted_message_id'], Snowflake.parse), triggeringInteractionMetadata: maybeParse(raw['triggering_interaction_metadata'], parseMessageInteractionMetadata), diff --git a/lib/src/models/commands/application_command.dart b/lib/src/models/commands/application_command.dart index f31208edc..3dd49b312 100644 --- a/lib/src/models/commands/application_command.dart +++ b/lib/src/models/commands/application_command.dart @@ -66,7 +66,7 @@ class ApplicationCommand extends PartialApplicationCommand { final List integrationTypes; /// Interaction context(s) where the command can be used, only for globally-scoped commands. By default, all interaction context types included for new commands. - final List contexts; + final List? contexts; /// An auto-incrementing version number. final Snowflake version; diff --git a/lib/src/models/interaction.dart b/lib/src/models/interaction.dart index a67483abb..e5ed84589 100644 --- a/lib/src/models/interaction.dart +++ b/lib/src/models/interaction.dart @@ -109,7 +109,7 @@ abstract class Interaction with ToStringHelper { final List entitlements; /// Mapping of installation contexts that the interaction was authorized for to related user or guild IDs. - final Map authorizingIntegrationOwners; + final Map? authorizingIntegrationOwners; /// Context where the interaction was triggered from. final InteractionContextType? context;