using Discord.Net.Udp; using Discord.Net.WebSockets; using Discord.Rest; namespace Discord.WebSocket { /// /// Represents a configuration class for . /// /// /// This configuration, based on , helps determine several key configurations the /// socket client depend on. For instance, shards and connection timeout. /// /// /// The following config enables the message cache and configures the client to always download user upon guild /// availability. /// /// var config = new DiscordSocketConfig /// { /// AlwaysDownloadUsers = true, /// MessageCacheSize = 100 /// }; /// var client = new DiscordSocketClient(config); /// /// public class DiscordSocketConfig : DiscordRestConfig { /// /// Returns the encoding gateway should use. /// public const string GatewayEncoding = "json"; /// /// Gets or sets the WebSocket host to connect to. If null, the client will use the /// /gateway endpoint. /// public string GatewayHost { get; set; } = null; /// /// Gets or sets the time, in milliseconds, to wait for a connection to complete before aborting. /// public int ConnectionTimeout { get; set; } = 30000; /// /// Gets or sets the ID for this shard. Must be less than . /// public int? ShardId { get; set; } = null; /// /// Gets or sets the total number of shards for this application. /// /// /// If this is left in a sharded client the bot will get the recommended shard /// count from discord and use that. /// public int? TotalShards { get; set; } = null; /// /// Gets or sets whether or not the client should download the default stickers on startup. /// /// /// When this is set to default stickers arn't present and cannot be resolved by the client. /// This will make all default stickers have the type of . /// public bool AlwaysDownloadDefaultStickers { get; set; } = false; /// /// Gets or sets whether or not the client should automatically resolve the stickers sent on a message. /// /// /// Note if a sticker isn't cached the client will preform a rest request to resolve it. This /// may be very rest heavy depending on your bots size, it isn't recommended to use this with large scale bots as you /// can get ratelimited easily. /// public bool AlwaysResolveStickers { get; set; } = false; /// /// Gets or sets the number of messages per channel that should be kept in cache. Setting this to zero /// disables the message cache entirely. /// public int MessageCacheSize { get; set; } = 0; /// /// Gets or sets the max number of users a guild may have for offline users to be included in the READY /// packet. The maximum value allowed is 250. /// public int LargeThreshold { get; set; } = 250; /// /// Gets or sets the provider used to generate new WebSocket connections. /// public WebSocketProvider WebSocketProvider { get; set; } /// /// Gets or sets the provider used to generate new UDP sockets. /// public UdpSocketProvider UdpSocketProvider { get; set; } /// /// Gets or sets whether or not all users should be downloaded as guilds come available. /// /// /// /// By default, the Discord gateway will only send offline members if a guild has less than a certain number /// of members (determined by in this library). This behavior is why /// sometimes a user may be missing from the WebSocket cache for collections such as /// . /// /// /// This property ensures that whenever a guild becomes available (determined by /// ), incomplete user chunks will be /// downloaded to the WebSocket cache. /// /// /// For more information, please see /// Request Guild Members /// on the official Discord API documentation. /// /// /// Please note that it can be difficult to fill the cache completely on large guilds depending on the /// traffic. If you are using the command system, the default user TypeReader may fail to find the user /// due to this issue. This may be resolved at v3 of the library. Until then, you may want to consider /// overriding the TypeReader and use /// /// or /// as a backup. /// /// public bool AlwaysDownloadUsers { get; set; } = false; /// /// Gets or sets the timeout for event handlers, in milliseconds, after which a warning will be logged. /// Setting this property to nulldisables this check. /// public int? HandlerTimeout { get; set; } = 3000; /// /// Gets or sets the maximum identify concurrency. /// /// /// This information is provided by Discord. /// It is only used when using a and auto-sharding is disabled. /// public int IdentifyMaxConcurrency { get; set; } = 1; /// /// Gets or sets the maximum wait time in milliseconds between GUILD_AVAILABLE events before firing READY. /// If zero, READY will fire as soon as it is received and all guilds will be unavailable. /// /// /// This property is measured in milliseconds; negative values will throw an exception. /// If a guild is not received before READY, it will be unavailable. /// /// /// A representing the maximum wait time in milliseconds between GUILD_AVAILABLE events /// before firing READY. /// /// Value must be at least 0. public int MaxWaitBetweenGuildAvailablesBeforeReady { get { return maxWaitForGuildAvailable; } set { Preconditions.AtLeast(value, 0, nameof(MaxWaitBetweenGuildAvailablesBeforeReady)); maxWaitForGuildAvailable = value; } } private int maxWaitForGuildAvailable = 10000; /// /// Gets or sets gateway intents to limit what events are sent from Discord. /// The default is . /// /// /// For more information, please see /// GatewayIntents /// on the official Discord API documentation. /// public GatewayIntents GatewayIntents { get; set; } = GatewayIntents.AllUnprivileged; /// /// Gets or sets whether or not to log warnings related to guild intents and events. /// public bool LogGatewayIntentWarnings { get; set; } = true; /// /// Gets or sets whether or not Unknown Dispatch event messages should be logged. /// public bool SuppressUnknownDispatchWarnings { get; set; } = true; /// /// Initializes a new instance of the class with the default configuration. /// public DiscordSocketConfig() { WebSocketProvider = DefaultWebSocketProvider.Instance; UdpSocketProvider = DefaultUdpSocketProvider.Instance; } internal DiscordSocketConfig Clone() => MemberwiseClone() as DiscordSocketConfig; } }