diff --git a/Commands/BanCommandGroup.cs b/Commands/BanCommandGroup.cs
index d9c9419..1a7c38b 100644
--- a/Commands/BanCommandGroup.cs
+++ b/Commands/BanCommandGroup.cs
@@ -141,6 +141,7 @@ public class BanCommandGroup : CommandGroup {
var memberData = data.GetMemberData(target.ID);
memberData.BannedUntil
= duration is not null ? DateTimeOffset.UtcNow.Add(duration.Value) : DateTimeOffset.MaxValue;
+ memberData.Roles.Clear();
responseEmbed = new EmbedBuilder().WithSmallTitle(
string.Format(Messages.UserBanned, target.GetTag()), target)
diff --git a/Commands/KickCommandGroup.cs b/Commands/KickCommandGroup.cs
index 6df068f..8db60b8 100644
--- a/Commands/KickCommandGroup.cs
+++ b/Commands/KickCommandGroup.cs
@@ -71,7 +71,8 @@ public class KickCommandGroup : CommandGroup {
if (!currentUserResult.IsDefined(out var currentUser))
return Result.FromError(currentUserResult);
- var cfg = await _dataService.GetConfiguration(guildId.Value, CancellationToken);
+ var data = await _dataService.GetData(guildId.Value, CancellationToken);
+ var cfg = data.Configuration;
Messages.Culture = cfg.GetCulture();
var memberResult = await _guildApi.GetGuildMemberAsync(guildId.Value, target.ID, CancellationToken);
@@ -123,6 +124,7 @@ public class KickCommandGroup : CommandGroup {
ct: CancellationToken);
if (!kickResult.IsSuccess)
return Result.FromError(kickResult.Error);
+ data.GetMemberData(target.ID).Roles.Clear();
responseEmbed = new EmbedBuilder().WithSmallTitle(
string.Format(Messages.UserKicked, target.GetTag()), target)
diff --git a/Data/MemberData.cs b/Data/MemberData.cs
index 6cbf787..755fb74 100644
--- a/Data/MemberData.cs
+++ b/Data/MemberData.cs
@@ -2,6 +2,9 @@ using Remora.Rest.Core;
namespace Boyfriend.Data;
+///
+/// Stores information about a member
+///
public class MemberData {
public MemberData(ulong id, DateTimeOffset? bannedUntil) {
Id = id;
diff --git a/EventResponders.cs b/EventResponders.cs
index 52c22af..d45c5f8 100644
--- a/EventResponders.cs
+++ b/EventResponders.cs
@@ -208,6 +208,7 @@ public class MessageEditedResponder : IResponder {
///
/// Handles sending a guild's if one is set.
+/// If is enabled, roles will be returned.
///
///
public class GuildMemberAddResponder : IResponder {
@@ -223,19 +224,22 @@ public class GuildMemberAddResponder : IResponder {
}
public async Task RespondAsync(IGuildMemberAdd gatewayEvent, CancellationToken ct = default) {
- var guildConfiguration = await _dataService.GetConfiguration(gatewayEvent.GuildID, ct);
- if (guildConfiguration.PublicFeedbackChannel is 0)
- return Result.FromSuccess();
- if (guildConfiguration.WelcomeMessage is "off" or "disable" or "disabled")
- return Result.FromSuccess();
-
- Messages.Culture = guildConfiguration.GetCulture();
- var welcomeMessage = guildConfiguration.WelcomeMessage is "default" or "reset"
- ? Messages.DefaultWelcomeMessage
- : guildConfiguration.WelcomeMessage;
-
if (!gatewayEvent.User.IsDefined(out var user))
return Result.FromError(new ArgumentNullError(nameof(gatewayEvent.User)));
+ var data = await _dataService.GetData(gatewayEvent.GuildID, ct);
+ var cfg = data.Configuration;
+ if (cfg.PublicFeedbackChannel is 0 || cfg.WelcomeMessage is "off" or "disable" or "disabled")
+ return Result.FromSuccess();
+ if (cfg.ReturnRolesOnRejoin) {
+ var result = await _guildApi.ModifyGuildMemberAsync(
+ gatewayEvent.GuildID, user.ID, roles: data.GetMemberData(user.ID).Roles, ct: ct);
+ if (!result.IsSuccess) return Result.FromError(result.Error);
+ }
+
+ Messages.Culture = data.Culture;
+ var welcomeMessage = cfg.WelcomeMessage is "default" or "reset"
+ ? Messages.DefaultWelcomeMessage
+ : cfg.WelcomeMessage;
var guildResult = await _guildApi.GetGuildAsync(gatewayEvent.GuildID, ct: ct);
if (!guildResult.IsDefined(out var guild)) return Result.FromError(guildResult);
@@ -249,7 +253,7 @@ public class GuildMemberAddResponder : IResponder {
if (!embed.IsDefined(out var built)) return Result.FromError(embed);
return (Result)await _channelApi.CreateMessageAsync(
- guildConfiguration.PublicFeedbackChannel.ToDiscordSnowflake(), embeds: new[] { built },
+ cfg.PublicFeedbackChannel.ToDiscordSnowflake(), embeds: new[] { built },
allowedMentions: Boyfriend.NoMentions, ct: ct);
}
}
diff --git a/Services/GuildUpdateService.cs b/Services/GuildUpdateService.cs
index cf3fef8..5e3f36a 100644
--- a/Services/GuildUpdateService.cs
+++ b/Services/GuildUpdateService.cs
@@ -146,7 +146,8 @@ public class GuildUpdateService : BackgroundService {
var storedEvent = data.ScheduledEvents[scheduledEvent.ID.Value];
if (storedEvent.Status == scheduledEvent.Status) {
if (DateTimeOffset.UtcNow >= scheduledEvent.ScheduledStartTime) {
- if (scheduledEvent.Status is not GuildScheduledEventStatus.Active) {
+ if (data.Configuration.AutoStartEvents
+ && scheduledEvent.Status is not GuildScheduledEventStatus.Active) {
var startResult = await _eventApi.ModifyGuildScheduledEventAsync(
guildId, scheduledEvent.ID,
status: GuildScheduledEventStatus.Active, ct: ct);
@@ -155,9 +156,10 @@ public class GuildUpdateService : BackgroundService {
"Error in automatic scheduled event start request.\n{ErrorMessage}",
startResult.Error.Message);
}
- } else if (DateTimeOffset.UtcNow
- >= scheduledEvent.ScheduledStartTime - data.Configuration.EventEarlyNotificationOffset
- && !storedEvent.EarlyNotificationSent) {
+ } else if (data.Configuration.EventEarlyNotificationOffset != TimeSpan.Zero
+ && !storedEvent.EarlyNotificationSent
+ && DateTimeOffset.UtcNow
+ >= scheduledEvent.ScheduledStartTime - data.Configuration.EventEarlyNotificationOffset) {
var earlyResult = await SendScheduledEventUpdatedMessage(scheduledEvent, data, true, ct);
if (earlyResult.IsSuccess)
storedEvent.EarlyNotificationSent = true;