Skip to content

Commit

Permalink
add incidents data (#737)
Browse files Browse the repository at this point in the history
  • Loading branch information
Lexedia authored Feb 8, 2025
1 parent 7dc8bae commit 538935b
Show file tree
Hide file tree
Showing 5 changed files with 79 additions and 2 deletions.
5 changes: 3 additions & 2 deletions lib/nyxx.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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;
Expand Down
19 changes: 19 additions & 0 deletions lib/src/builders/guild/guild.dart
Original file line number Diff line number Diff line change
Expand Up @@ -200,3 +200,22 @@ class GuildUpdateBuilder extends UpdateBuilder<Guild> {
if (!identical(safetyAlertsChannelId, sentinelSnowflake)) 'safety_alerts_channel_id': safetyAlertsChannelId?.toString(),
};
}

class GuildIncidentsUpdateBuilder extends UpdateBuilder<IncidentsData> {
/// 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<String, Object?> build() => {
if (!identical(invitesDisabledUntil, sentinelDateTime)) 'invites_disabled_until': invitesDisabledUntil?.toIso8601String(),
if (!identical(dmsDisabledUntil, sentinelDateTime)) 'dms_disabled_until': dmsDisabledUntil?.toIso8601String(),
};
}
28 changes: 28 additions & 0 deletions lib/src/http/managers/guild_manager.dart
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@ class GuildManager extends Manager<Guild> {
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),
);
}

Expand Down Expand Up @@ -334,6 +335,16 @@ class GuildManager extends Manager<Guild> {
);
}

/// Parse a [IncidentsData] from [raw].
IncidentsData parseIncidentsData(Map<String, Object?> 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<Guild> fetch(Snowflake id, {bool? withCounts}) async {
final route = HttpRoute()..guilds(id: id.toString());
Expand Down Expand Up @@ -825,4 +836,21 @@ class GuildManager extends Manager<Guild> {
client.updateCacheWith(template);
return template;
}

/// Modifies the incident actions of the guild.
Future<IncidentsData> 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<String, Object?>);
}
}
3 changes: 3 additions & 0 deletions lib/src/http/route.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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'));
}
26 changes: 26 additions & 0 deletions lib/src/models/guild/guild.dart
Original file line number Diff line number Diff line change
Expand Up @@ -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<Guild> {
Expand Down Expand Up @@ -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({
Expand Down Expand Up @@ -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.
Expand Down Expand Up @@ -765,3 +770,24 @@ final class NsfwLevel extends EnumLike<int, NsfwLevel> {
@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,
});
}

0 comments on commit 538935b

Please sign in to comment.