| @@ -190,7 +190,7 @@ namespace Discord.WebSocket | |||||
| { | { | ||||
| WebSocketProvider = DefaultWebSocketProvider.Instance; | WebSocketProvider = DefaultWebSocketProvider.Instance; | ||||
| UdpSocketProvider = DefaultUdpSocketProvider.Instance; | UdpSocketProvider = DefaultUdpSocketProvider.Instance; | ||||
| MessageCache = new MessageCache(); | |||||
| MessageCache = new MessageCache(MessageCacheSize); | |||||
| } | } | ||||
| internal DiscordSocketConfig Clone() => MemberwiseClone() as DiscordSocketConfig; | internal DiscordSocketConfig Clone() => MemberwiseClone() as DiscordSocketConfig; | ||||
| @@ -17,6 +17,7 @@ namespace Discord.WebSocket | |||||
| /// A read-only collection of WebSocket-based messages. | /// A read-only collection of WebSocket-based messages. | ||||
| /// </returns> | /// </returns> | ||||
| IReadOnlyCollection<SocketMessage> CachedMessages { get; } | IReadOnlyCollection<SocketMessage> CachedMessages { get; } | ||||
| IMessageCache MessageCache { get; } | |||||
| /// <summary> | /// <summary> | ||||
| /// Sends a message to this message channel. | /// Sends a message to this message channel. | ||||
| @@ -25,7 +25,7 @@ namespace Discord.WebSocket | |||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public IReadOnlyCollection<SocketMessage> CachedMessages => _messages?.Messages ?? ImmutableArray.Create<SocketMessage>(); | public IReadOnlyCollection<SocketMessage> CachedMessages => _messages?.Messages ?? ImmutableArray.Create<SocketMessage>(); | ||||
| public IMessageCache MessageCache => _messages; | |||||
| /// <summary> | /// <summary> | ||||
| /// Gets a collection that is the current logged-in user and the recipient. | /// Gets a collection that is the current logged-in user and the recipient. | ||||
| /// </summary> | /// </summary> | ||||
| @@ -36,7 +36,7 @@ namespace Discord.WebSocket | |||||
| { | { | ||||
| Recipient = recipient; | Recipient = recipient; | ||||
| recipient.GlobalUser.AddRef(); | recipient.GlobalUser.AddRef(); | ||||
| _messages = discord.MessageCache.CreateMessageCache(); | |||||
| _messages = discord.MessageCache.CreateMessageCache(discord.MessageCacheSize); | |||||
| } | } | ||||
| internal static SocketDMChannel Create(DiscordSocketClient discord, ClientState state, Model model) | internal static SocketDMChannel Create(DiscordSocketClient discord, ClientState state, Model model) | ||||
| { | { | ||||
| @@ -31,6 +31,7 @@ namespace Discord.WebSocket | |||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public IReadOnlyCollection<SocketMessage> CachedMessages => _messages?.Messages ?? ImmutableArray.Create<SocketMessage>(); | public IReadOnlyCollection<SocketMessage> CachedMessages => _messages?.Messages ?? ImmutableArray.Create<SocketMessage>(); | ||||
| public IMessageCache MessageCache => _messages; | |||||
| public new IReadOnlyCollection<SocketGroupUser> Users => _users.ToReadOnlyCollection(); | public new IReadOnlyCollection<SocketGroupUser> Users => _users.ToReadOnlyCollection(); | ||||
| public IReadOnlyCollection<SocketGroupUser> Recipients | public IReadOnlyCollection<SocketGroupUser> Recipients | ||||
| => _users.Select(x => x.Value).Where(x => x.Id != Discord.CurrentUser.Id).ToReadOnlyCollection(() => _users.Count - 1); | => _users.Select(x => x.Value).Where(x => x.Id != Discord.CurrentUser.Id).ToReadOnlyCollection(() => _users.Count - 1); | ||||
| @@ -38,7 +39,7 @@ namespace Discord.WebSocket | |||||
| internal SocketGroupChannel(DiscordSocketClient discord, ulong id) | internal SocketGroupChannel(DiscordSocketClient discord, ulong id) | ||||
| : base(discord, id) | : base(discord, id) | ||||
| { | { | ||||
| _messages = discord.MessageCache.CreateMessageCache(); | |||||
| _messages = discord.MessageCache.CreateMessageCache(discord.MessageCacheSize); | |||||
| _voiceStates = new ConcurrentDictionary<ulong, SocketVoiceState>(ConcurrentHashSet.DefaultConcurrencyLevel, 5); | _voiceStates = new ConcurrentDictionary<ulong, SocketVoiceState>(ConcurrentHashSet.DefaultConcurrencyLevel, 5); | ||||
| _users = new ConcurrentDictionary<ulong, SocketGroupUser>(ConcurrentHashSet.DefaultConcurrencyLevel, 5); | _users = new ConcurrentDictionary<ulong, SocketGroupUser>(ConcurrentHashSet.DefaultConcurrencyLevel, 5); | ||||
| } | } | ||||
| @@ -44,6 +44,7 @@ namespace Discord.WebSocket | |||||
| public string Mention => MentionUtils.MentionChannel(Id); | public string Mention => MentionUtils.MentionChannel(Id); | ||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public IReadOnlyCollection<SocketMessage> CachedMessages => _messages?.Messages ?? ImmutableArray.Create<SocketMessage>(); | public IReadOnlyCollection<SocketMessage> CachedMessages => _messages?.Messages ?? ImmutableArray.Create<SocketMessage>(); | ||||
| public IMessageCache MessageCache => _messages; | |||||
| /// <inheritdoc /> | /// <inheritdoc /> | ||||
| public override IReadOnlyCollection<SocketGuildUser> Users | public override IReadOnlyCollection<SocketGuildUser> Users | ||||
| => Guild.Users.Where(x => Permissions.GetValue( | => Guild.Users.Where(x => Permissions.GetValue( | ||||
| @@ -54,7 +55,7 @@ namespace Discord.WebSocket | |||||
| : base(discord, id, guild) | : base(discord, id, guild) | ||||
| { | { | ||||
| if (Discord.MessageCacheSize > 0) | if (Discord.MessageCacheSize > 0) | ||||
| _messages = discord.MessageCache.CreateMessageCache(); | |||||
| _messages = discord.MessageCache.CreateMessageCache(discord.MessageCacheSize); | |||||
| } | } | ||||
| internal new static SocketTextChannel Create(SocketGuild guild, ClientState state, Model model) | internal new static SocketTextChannel Create(SocketGuild guild, ClientState state, Model model) | ||||
| { | { | ||||
| @@ -5,7 +5,7 @@ namespace Discord | |||||
| { | { | ||||
| public interface IMessageCache | public interface IMessageCache | ||||
| { | { | ||||
| public IMessageCache CreateMessageCache(); | |||||
| public IMessageCache CreateMessageCache(int size); | |||||
| public IReadOnlyCollection<SocketMessage> Messages { get; } | public IReadOnlyCollection<SocketMessage> Messages { get; } | ||||
| @@ -14,11 +14,11 @@ namespace Discord.WebSocket | |||||
| public IReadOnlyCollection<SocketMessage> Messages => _messages.ToReadOnlyCollection(); | public IReadOnlyCollection<SocketMessage> Messages => _messages.ToReadOnlyCollection(); | ||||
| public IMessageCache CreateMessageCache() => new MessageCache(); | |||||
| public IMessageCache CreateMessageCache(int size) => new MessageCache(size); | |||||
| public MessageCache() | |||||
| public MessageCache(int size) | |||||
| { | { | ||||
| _size = 50; // todo: get this from the existing DiscordSocketConfig value. | |||||
| _size = size; | |||||
| _messages = new ConcurrentDictionary<ulong, SocketMessage>(ConcurrentHashSet.DefaultConcurrencyLevel, (int)(_size * 1.05)); | _messages = new ConcurrentDictionary<ulong, SocketMessage>(ConcurrentHashSet.DefaultConcurrencyLevel, (int)(_size * 1.05)); | ||||
| _orderedMessages = new ConcurrentQueue<ulong>(); | _orderedMessages = new ConcurrentQueue<ulong>(); | ||||
| } | } | ||||