diff --git a/locale/Messages.resx b/locale/Messages.resx
index 743dd93..2b3d795 100644
--- a/locale/Messages.resx
+++ b/locale/Messages.resx
@@ -585,4 +585,13 @@
Report an issue
+
+ See you soon, {0}!
+
+
+ Send leave messages
+
+
+ Leave message
+
diff --git a/locale/Messages.ru.resx b/locale/Messages.ru.resx
index 67a1d29..d0421ba 100644
--- a/locale/Messages.ru.resx
+++ b/locale/Messages.ru.resx
@@ -585,4 +585,13 @@
Сообщить о проблеме
+
+ До скорой встречи, {0}!
+
+
+ Отправлять сообщения о выходе
+
+
+ Сообщение о выходе
+
diff --git a/locale/Messages.tt-ru.resx b/locale/Messages.tt-ru.resx
index 4050d43..b1647be 100644
--- a/locale/Messages.tt-ru.resx
+++ b/locale/Messages.tt-ru.resx
@@ -585,4 +585,13 @@
зарепортить баг
+
+ ну, мы потеряли {0}
+
+
+ разглашать о том что сбежал шизоид
+
+
+ до свидания (типо настройка)
+
diff --git a/src/Commands/SettingsCommandGroup.cs b/src/Commands/SettingsCommandGroup.cs
index a8891bd..d379c41 100644
--- a/src/Commands/SettingsCommandGroup.cs
+++ b/src/Commands/SettingsCommandGroup.cs
@@ -39,6 +39,7 @@ public class SettingsCommandGroup : CommandGroup
{
GuildSettings.Language,
GuildSettings.WelcomeMessage,
+ GuildSettings.LeaveMessage,
GuildSettings.ReceiveStartupMessages,
GuildSettings.RemoveRolesOnMute,
GuildSettings.ReturnRolesOnRejoin,
diff --git a/src/Data/GuildSettings.cs b/src/Data/GuildSettings.cs
index cdaede6..33047b6 100644
--- a/src/Data/GuildSettings.cs
+++ b/src/Data/GuildSettings.cs
@@ -24,6 +24,18 @@ public static class GuildSettings
///
public static readonly Option WelcomeMessage = new("WelcomeMessage", "default");
+ ///
+ /// Controls what message should be sent in when member leaves the server.
+ ///
+ ///
+ ///
+ /// - No message will be sent if set to "off", "disable" or "disabled".
+ /// - will be sent if set to "default" or "reset"
+ ///
+ ///
+ ///
+ public static readonly Option LeaveMessage = new("LeaveMessage", "default");
+
///
/// Controls whether or not the message should be sent
/// in on startup.
diff --git a/src/Data/Options/AllOptionsEnum.cs b/src/Data/Options/AllOptionsEnum.cs
index a96a9ac..b33cbb1 100644
--- a/src/Data/Options/AllOptionsEnum.cs
+++ b/src/Data/Options/AllOptionsEnum.cs
@@ -14,6 +14,7 @@ public enum AllOptionsEnum
{
[UsedImplicitly] Language,
[UsedImplicitly] WelcomeMessage,
+ [UsedImplicitly] LeaveMessage,
[UsedImplicitly] ReceiveStartupMessages,
[UsedImplicitly] RemoveRolesOnMute,
[UsedImplicitly] ReturnRolesOnRejoin,
diff --git a/src/Messages.Designer.cs b/src/Messages.Designer.cs
index 767bd5b..268ee41 100644
--- a/src/Messages.Designer.cs
+++ b/src/Messages.Designer.cs
@@ -1036,5 +1036,23 @@ namespace Octobot {
return ResourceManager.GetString("ButtonReportIssue", resourceCulture);
}
}
+
+ internal static string DefaultLeaveMessage {
+ get {
+ return ResourceManager.GetString("DefaultLeaveMessage", resourceCulture);
+ }
+ }
+
+ internal static string SettingsLeaveMessage {
+ get {
+ return ResourceManager.GetString("SettingsLeaveMessage", resourceCulture);
+ }
+ }
+
+ internal static string SettingsSendLeaveMessages {
+ get {
+ return ResourceManager.GetString("SettingsSendLeaveMessages", resourceCulture);
+ }
+ }
}
}
diff --git a/src/Responders/GuildMemberLeftResponder.cs b/src/Responders/GuildMemberLeftResponder.cs
new file mode 100644
index 0000000..92f2c49
--- /dev/null
+++ b/src/Responders/GuildMemberLeftResponder.cs
@@ -0,0 +1,67 @@
+using JetBrains.Annotations;
+using Octobot.Data;
+using Octobot.Extensions;
+using Octobot.Services;
+using Remora.Discord.API.Abstractions.Gateway.Events;
+using Remora.Discord.API.Abstractions.Rest;
+using Remora.Discord.Extensions.Embeds;
+using Remora.Discord.Gateway.Responders;
+using Remora.Results;
+
+namespace Octobot.Responders;
+
+///
+/// Handles sending a guild's if one is set.
+///
+///
+[UsedImplicitly]
+public class GuildMemberLeftResponder : IResponder
+{
+ private readonly IDiscordRestChannelAPI _channelApi;
+ private readonly IDiscordRestGuildAPI _guildApi;
+ private readonly GuildDataService _guildData;
+
+ public GuildMemberLeftResponder(
+ IDiscordRestChannelAPI channelApi, GuildDataService guildData, IDiscordRestGuildAPI guildApi)
+ {
+ _channelApi = channelApi;
+ _guildData = guildData;
+ _guildApi = guildApi;
+ }
+
+ public async Task RespondAsync(IGuildMemberRemove gatewayEvent, CancellationToken ct = default)
+ {
+ var user = gatewayEvent.User;
+ var data = await _guildData.GetData(gatewayEvent.GuildID, ct);
+ var cfg = data.Settings;
+
+ if (GuildSettings.PublicFeedbackChannel.Get(cfg).Empty()
+ || GuildSettings.LeaveMessage.Get(cfg) is "off" or "disable" or "disabled")
+ {
+ return Result.FromSuccess();
+ }
+
+ Messages.Culture = GuildSettings.Language.Get(cfg);
+ var leaveMessage = GuildSettings.LeaveMessage.Get(cfg) is "default" or "reset"
+ ? Messages.DefaultLeaveMessage
+ : GuildSettings.LeaveMessage.Get(cfg);
+
+ var guildResult = await _guildApi.GetGuildAsync(gatewayEvent.GuildID, ct: ct);
+ if (!guildResult.IsDefined(out var guild))
+ {
+ return Result.FromError(guildResult);
+ }
+
+ var embed = new EmbedBuilder()
+ .WithSmallTitle(string.Format(leaveMessage, user.GetTag(), guild.Name), user)
+ .WithGuildFooter(guild)
+ .WithTimestamp(DateTimeOffset.UtcNow)
+ .WithColour(ColorsList.Black)
+ .Build();
+
+ return await _channelApi.CreateMessageWithEmbedResultAsync(
+ GuildSettings.PublicFeedbackChannel.Get(cfg), embedResult: embed,
+ allowedMentions: Octobot.NoMentions, ct: ct);
+ }
+}
+