From ce17a2367be7db454179c9d75591c25d74719c21 Mon Sep 17 00:00:00 2001 From: Lexedia Date: Sun, 26 Jan 2025 17:42:54 +0100 Subject: [PATCH 1/3] add incidents data --- lib/src/builders/guild/guild.dart | 21 ++++++++++++++++++ lib/src/http/managers/guild_manager.dart | 28 ++++++++++++++++++++++++ lib/src/http/route.dart | 3 +++ lib/src/models/guild/guild.dart | 26 ++++++++++++++++++++++ 4 files changed, 78 insertions(+) diff --git a/lib/src/builders/guild/guild.dart b/lib/src/builders/guild/guild.dart index 1d45e3470..f0938486e 100644 --- a/lib/src/builders/guild/guild.dart +++ b/lib/src/builders/guild/guild.dart @@ -200,3 +200,24 @@ class GuildUpdateBuilder extends UpdateBuilder { if (!identical(safetyAlertsChannelId, sentinelSnowflake)) 'safety_alerts_channel_id': safetyAlertsChannelId?.toString(), }; } + +class GuildIncidentsUpdateBuilder extends UpdateBuilder { + /// When invites will be enabled again + DateTime? invitesDisabledUntil; + + /// When direct messages will be enabled again + DateTime? dmsDisabledUntil; + + GuildIncidentsUpdateBuilder({ + this.invitesDisabledUntil = sentinelDateTime, + this.dmsDisabledUntil = sentinelDateTime, + }); + + @override + Map build() => { + if (!identical(invitesDisabledUntil, sentinelDateTime)) + 'invites_disabled_until': invitesDisabledUntil?.toIso8601String(), + if (!identical(dmsDisabledUntil, sentinelDateTime)) + 'dms_disabled_until': dmsDisabledUntil?.toIso8601String(), + }; +} \ No newline at end of file diff --git a/lib/src/http/managers/guild_manager.dart b/lib/src/http/managers/guild_manager.dart index 280574366..6e5754d6a 100644 --- a/lib/src/http/managers/guild_manager.dart +++ b/lib/src/http/managers/guild_manager.dart @@ -89,6 +89,7 @@ class GuildManager extends Manager { emojiList: parseMany(raw['emojis'] as List, this[id].emojis.parse), stickerList: parseMany(raw['stickers'] as List? ?? [], this[id].stickers.parse), safetyAlertsChannelId: maybeParse(raw['safety_alerts_channel_id'], Snowflake.parse), + incidentsData: maybeParse(raw['incidents_data'], parseIncidentsData), ); } @@ -334,6 +335,16 @@ class GuildManager extends Manager { ); } + /// Parse a [IncidentsData] from [raw]. + IncidentsData parseIncidentsData(Map raw) { + return IncidentsData( + dmSpamDetectedAt: maybeParse(raw['dm_spam_detected_at'], DateTime.parse), + dmsDisabledUntil: maybeParse(raw['dms_disabled_until'], DateTime.parse), + invitesDisabledUntil: maybeParse(raw['dm_spam_detected_at'], DateTime.parse), + raidDetectedAt: maybeParse(raw['raid_detected_at'], DateTime.parse), + ); + } + @override Future fetch(Snowflake id, {bool? withCounts}) async { final route = HttpRoute()..guilds(id: id.toString()); @@ -825,4 +836,21 @@ class GuildManager extends Manager { client.updateCacheWith(template); return template; } + + /// Modifies the incident actions of the guild. + Future updateIncidents(Snowflake guildId, GuildIncidentsUpdateBuilder builder) async { + final route = HttpRoute() + ..guilds(id: guildId.toString()) + ..incidentActions(); + + final request = BasicRequest( + route, + method: 'PUT', + body: jsonEncode(builder.build()), + ); + + final response = await client.httpHandler.executeSafe(request); + + return parseIncidentsData(response.jsonBody as Map); + } } diff --git a/lib/src/http/route.dart b/lib/src/http/route.dart index 7c82df579..10861bc09 100644 --- a/lib/src/http/route.dart +++ b/lib/src/http/route.dart @@ -344,4 +344,7 @@ extension RouteHelpers on HttpRoute { /// Adds the [`send-soundboard-sound`](https://discord.com/developers/docs/resources/soundboard#send-soundboard-sound) part to this [HttpRoute]. void sendSoundboardSound() => add(HttpRoutePart('send-soundboard-sound')); + + /// Adds the [`incident-actions`](https://discord.com/developers/docs/resources/guild#modify-guild-incident-actions) part to this [HttpRoute]. + void incidentActions() => add(HttpRoutePart('incident-actions')); } diff --git a/lib/src/models/guild/guild.dart b/lib/src/models/guild/guild.dart index 22b5b10b7..cfeb8abea 100644 --- a/lib/src/models/guild/guild.dart +++ b/lib/src/models/guild/guild.dart @@ -46,6 +46,7 @@ import 'package:nyxx/src/models/voice/voice_region.dart'; import 'package:nyxx/src/models/voice/voice_state.dart'; import 'package:nyxx/src/utils/enum_like.dart'; import 'package:nyxx/src/utils/flags.dart'; +import 'package:nyxx/src/utils/to_string_helper/to_string_helper.dart'; /// A partial [Guild]. class PartialGuild extends WritableSnowflakeEntity { @@ -372,6 +373,9 @@ class Guild extends UserGuild { /// The ID of the channel safety alerts are sent to. final Snowflake? safetyAlertsChannelId; + /// The incidents data for this guild. + final IncidentsData? incidentsData; + /// {@macro guild} /// @nodoc Guild({ @@ -417,6 +421,7 @@ class Guild extends UserGuild { required this.emojiList, required this.stickerList, required this.safetyAlertsChannelId, + required this.incidentsData, }); /// The owner of the guild. @@ -765,3 +770,24 @@ final class NsfwLevel extends EnumLike { @Deprecated('The .parse() constructor is deprecated. Use the unnamed constructor instead.') NsfwLevel.parse(int value) : this(value); } + +class IncidentsData with ToStringHelper { + /// When [Invite]s get enabled again. + final DateTime? invitesDisabledUntil; + + /// When direct messages get enabled again. + final DateTime? dmsDisabledUntil; + + /// When the dm spam was detected. + final DateTime? dmSpamDetectedAt; + + /// When the raid was detected. + final DateTime? raidDetectedAt; + + const IncidentsData({ + required this.invitesDisabledUntil, + required this.dmsDisabledUntil, + required this.dmSpamDetectedAt, + required this.raidDetectedAt, + }); +} From c75a4d281813c66d72152fefe496ccef9d9112ea Mon Sep 17 00:00:00 2001 From: Lexedia Date: Sun, 26 Jan 2025 17:44:48 +0100 Subject: [PATCH 2/3] export classes --- lib/nyxx.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/nyxx.dart b/lib/nyxx.dart index 17d19f440..80279e732 100644 --- a/lib/nyxx.dart +++ b/lib/nyxx.dart @@ -52,7 +52,7 @@ export 'src/builders/message/component.dart' show ActionRowBuilder, ButtonBuilder, MessageComponentBuilder, SelectMenuBuilder, SelectMenuOptionBuilder, TextInputBuilder, DefaultValue; export 'src/builders/message/poll.dart' show PollAnswerBuilder, PollBuilder, PollMediaBuilder; export 'src/builders/webhook.dart' show WebhookBuilder, WebhookUpdateBuilder; -export 'src/builders/guild/guild.dart' show GuildBuilder, GuildUpdateBuilder; +export 'src/builders/guild/guild.dart' show GuildBuilder, GuildUpdateBuilder, GuildIncidentsUpdateBuilder; export 'src/builders/guild/member.dart' show CurrentMemberUpdateBuilder, MemberBuilder, MemberUpdateBuilder; export 'src/builders/guild/welcome_screen.dart' show WelcomeScreenUpdateBuilder; export 'src/builders/guild/widget.dart' show WidgetSettingsUpdateBuilder; @@ -204,7 +204,8 @@ export 'src/models/guild/guild.dart' NsfwLevel, PremiumTier, VerificationLevel, - UserGuild; + UserGuild, + IncidentsData; export 'src/models/guild/integration.dart' show PartialIntegration, Integration, IntegrationAccount, IntegrationApplication, IntegrationExpireBehavior; export 'src/models/guild/member.dart' show Member, MemberFlags, PartialMember; export 'src/models/guild/onboarding.dart' show Onboarding, OnboardingPrompt, OnboardingPromptOption, OnboardingPromptType, OnboardingMode; From dab8304e0b23b43ae1c062caffa6f6cbd8bbc466 Mon Sep 17 00:00:00 2001 From: Lexedia Date: Sun, 26 Jan 2025 17:45:22 +0100 Subject: [PATCH 3/3] [ci skip] fmt --- lib/src/builders/guild/guild.dart | 10 ++++------ lib/src/http/managers/guild_manager.dart | 2 +- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/lib/src/builders/guild/guild.dart b/lib/src/builders/guild/guild.dart index f0938486e..0f38b8654 100644 --- a/lib/src/builders/guild/guild.dart +++ b/lib/src/builders/guild/guild.dart @@ -215,9 +215,7 @@ class GuildIncidentsUpdateBuilder extends UpdateBuilder { @override Map build() => { - if (!identical(invitesDisabledUntil, sentinelDateTime)) - 'invites_disabled_until': invitesDisabledUntil?.toIso8601String(), - if (!identical(dmsDisabledUntil, sentinelDateTime)) - 'dms_disabled_until': dmsDisabledUntil?.toIso8601String(), - }; -} \ No newline at end of file + if (!identical(invitesDisabledUntil, sentinelDateTime)) 'invites_disabled_until': invitesDisabledUntil?.toIso8601String(), + if (!identical(dmsDisabledUntil, sentinelDateTime)) 'dms_disabled_until': dmsDisabledUntil?.toIso8601String(), + }; +} diff --git a/lib/src/http/managers/guild_manager.dart b/lib/src/http/managers/guild_manager.dart index 6e5754d6a..0e83a3fce 100644 --- a/lib/src/http/managers/guild_manager.dart +++ b/lib/src/http/managers/guild_manager.dart @@ -850,7 +850,7 @@ class GuildManager extends Manager { ); final response = await client.httpHandler.executeSafe(request); - + return parseIncidentsData(response.jsonBody as Map); } }