@@ -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>(); | ||||
} | } | ||||