using System.Globalization; using Remora.Discord.API.Abstractions.Objects; namespace Boyfriend.Data; /// <summary> /// Stores per-guild settings that can be set by a member /// with <see cref="DiscordPermission.ManageGuild" /> using the /settings command /// </summary> public class GuildConfiguration { /// <summary> /// Represents a scheduled event notification receiver. /// </summary> /// <remarks> /// Used to selectively mention guild members when a scheduled event has started or is about to start. /// </remarks> public enum NotificationReceiver { Interested, Role } public static readonly Dictionary<string, CultureInfo> CultureInfoCache = new() { { "en", new CultureInfo("en-US") }, { "ru", new CultureInfo("ru-RU") }, { "mctaylors-ru", new CultureInfo("tt-RU") } }; public string Language { get; set; } = "en"; /// <summary> /// Controls what message should be sent in <see cref="PublicFeedbackChannel" /> when a new member joins the server. /// </summary> /// <remarks> /// <list type="bullet"> /// <item>No message will be sent if set to "off", "disable" or "disabled".</item> /// <item><see cref="Messages.DefaultWelcomeMessage" /> will be sent if set to "default" or "reset"</item> /// </list> /// </remarks> /// <seealso cref="GuildMemberAddResponder" /> public string WelcomeMessage { get; set; } = "default"; /// <summary> /// Controls whether or not the <see cref="Messages.Ready" /> message should be sent /// in <see cref="PrivateFeedbackChannel" /> on startup. /// </summary> /// <seealso cref="GuildCreateResponder" /> public bool ReceiveStartupMessages { get; set; } public bool RemoveRolesOnMute { get; set; } /// <summary> /// Controls whether or not a guild member's roles are returned if he/she leaves and then joins back. /// </summary> /// <remarks>Roles will not be returned if the member left the guild because of /ban or /kick.</remarks> public bool ReturnRolesOnRejoin { get; set; } public bool AutoStartEvents { get; set; } /// <summary> /// Controls what channel should all public messages be sent to. /// </summary> public ulong PublicFeedbackChannel { get; set; } /// <summary> /// Controls what channel should all private, moderator-only messages be sent to. /// </summary> public ulong PrivateFeedbackChannel { get; set; } public ulong EventNotificationChannel { get; set; } public ulong DefaultRole { get; set; } public ulong MuteRole { get; set; } public ulong EventNotificationRole { get; set; } /// <summary> /// Controls what guild members should be mentioned when a scheduled event has started or is about to start. /// </summary> /// <seealso cref="NotificationReceiver" /> public List<NotificationReceiver> EventStartedReceivers { get; set; } = new() { NotificationReceiver.Interested, NotificationReceiver.Role }; /// <summary> /// Controls the amount of time before a scheduled event to send a reminder in <see cref="EventNotificationChannel" />. /// </summary> public TimeSpan EventEarlyNotificationOffset { get; set; } = TimeSpan.Zero; public CultureInfo GetCulture() { return CultureInfoCache[Language]; } }