diff --git a/src/Discord.Net.Commands/Map/CommandMap.cs b/src/Discord.Net.Commands/Map/CommandMap.cs index 0f719d56d..5cf667903 100644 --- a/src/Discord.Net.Commands/Map/CommandMap.cs +++ b/src/Discord.Net.Commands/Map/CommandMap.cs @@ -1,6 +1,5 @@ using System.Collections.Concurrent; using System.Collections.Generic; -using System.Collections.Immutable; using System.Linq; namespace Discord.Commands diff --git a/src/Discord.Net/Audio/AudioClient.cs b/src/Discord.Net/Audio/AudioClient.cs index 4b178b807..e4a3a1e51 100644 --- a/src/Discord.Net/Audio/AudioClient.cs +++ b/src/Discord.Net/Audio/AudioClient.cs @@ -49,7 +49,7 @@ namespace Discord.Audio private uint _ssrc; private byte[] _secretKey; - public CachedGuild Guild { get; } + public SocketGuild Guild { get; } public DiscordVoiceAPIClient ApiClient { get; private set; } public ConnectionState ConnectionState { get; private set; } public int Latency { get; private set; } @@ -57,7 +57,7 @@ namespace Discord.Audio private DiscordSocketClient Discord => Guild.Discord; /// Creates a new REST/WebSocket discord client. - public AudioClient(CachedGuild guild, int id) + public AudioClient(SocketGuild guild, int id) { Guild = guild; diff --git a/src/Discord.Net/Data/DataStore.cs b/src/Discord.Net/Data/DataStore.cs index af8598aa8..d7cfe0913 100644 --- a/src/Discord.Net/Data/DataStore.cs +++ b/src/Discord.Net/Data/DataStore.cs @@ -13,76 +13,76 @@ namespace Discord private const double AverageUsersPerGuild = 47.78; //Source: Googie2149 private const double CollectionMultiplier = 1.05; //Add 5% buffer to handle growth - private readonly ConcurrentDictionary _channels; - private readonly ConcurrentDictionary _dmChannels; - private readonly ConcurrentDictionary _guilds; - private readonly ConcurrentDictionary _users; + private readonly ConcurrentDictionary _channels; + private readonly ConcurrentDictionary _dmChannels; + private readonly ConcurrentDictionary _guilds; + private readonly ConcurrentDictionary _users; private readonly ConcurrentHashSet _groupChannels; - internal IReadOnlyCollection Channels => _channels.ToReadOnlyCollection(); - internal IReadOnlyCollection DMChannels => _dmChannels.ToReadOnlyCollection(); - internal IReadOnlyCollection GroupChannels => _groupChannels.Select(x => GetChannel(x) as CachedGroupChannel).ToReadOnlyCollection(_groupChannels); - internal IReadOnlyCollection Guilds => _guilds.ToReadOnlyCollection(); - internal IReadOnlyCollection Users => _users.ToReadOnlyCollection(); + internal IReadOnlyCollection Channels => _channels.ToReadOnlyCollection(); + internal IReadOnlyCollection DMChannels => _dmChannels.ToReadOnlyCollection(); + internal IReadOnlyCollection GroupChannels => _groupChannels.Select(x => GetChannel(x) as SocketGroupChannel).ToReadOnlyCollection(_groupChannels); + internal IReadOnlyCollection Guilds => _guilds.ToReadOnlyCollection(); + internal IReadOnlyCollection Users => _users.ToReadOnlyCollection(); - internal IReadOnlyCollection PrivateChannels => - _dmChannels.Select(x => x.Value as ICachedPrivateChannel).Concat( - _groupChannels.Select(x => GetChannel(x) as ICachedPrivateChannel)) + internal IReadOnlyCollection PrivateChannels => + _dmChannels.Select(x => x.Value as ISocketPrivateChannel).Concat( + _groupChannels.Select(x => GetChannel(x) as ISocketPrivateChannel)) .ToReadOnlyCollection(() => _dmChannels.Count + _groupChannels.Count); public DataStore(int guildCount, int dmChannelCount) { double estimatedChannelCount = guildCount * AverageChannelsPerGuild + dmChannelCount; double estimatedUsersCount = guildCount * AverageUsersPerGuild; - _channels = new ConcurrentDictionary(CollectionConcurrencyLevel, (int)(estimatedChannelCount * CollectionMultiplier)); - _dmChannels = new ConcurrentDictionary(CollectionConcurrencyLevel, (int)(dmChannelCount * CollectionMultiplier)); - _guilds = new ConcurrentDictionary(CollectionConcurrencyLevel, (int)(guildCount * CollectionMultiplier)); - _users = new ConcurrentDictionary(CollectionConcurrencyLevel, (int)(estimatedUsersCount * CollectionMultiplier)); + _channels = new ConcurrentDictionary(CollectionConcurrencyLevel, (int)(estimatedChannelCount * CollectionMultiplier)); + _dmChannels = new ConcurrentDictionary(CollectionConcurrencyLevel, (int)(dmChannelCount * CollectionMultiplier)); + _guilds = new ConcurrentDictionary(CollectionConcurrencyLevel, (int)(guildCount * CollectionMultiplier)); + _users = new ConcurrentDictionary(CollectionConcurrencyLevel, (int)(estimatedUsersCount * CollectionMultiplier)); _groupChannels = new ConcurrentHashSet(CollectionConcurrencyLevel, (int)(10 * CollectionMultiplier)); } - internal ICachedChannel GetChannel(ulong id) + internal ISocketChannel GetChannel(ulong id) { - ICachedChannel channel; + ISocketChannel channel; if (_channels.TryGetValue(id, out channel)) return channel; return null; } - internal CachedDMChannel GetDMChannel(ulong userId) + internal SocketDMChannel GetDMChannel(ulong userId) { - CachedDMChannel channel; + SocketDMChannel channel; if (_dmChannels.TryGetValue(userId, out channel)) return channel; return null; } - internal void AddChannel(ICachedChannel channel) + internal void AddChannel(ISocketChannel channel) { _channels[channel.Id] = channel; - var dmChannel = channel as CachedDMChannel; + var dmChannel = channel as SocketDMChannel; if (dmChannel != null) _dmChannels[dmChannel.Recipient.Id] = dmChannel; else { - var groupChannel = channel as CachedGroupChannel; + var groupChannel = channel as SocketGroupChannel; if (groupChannel != null) _groupChannels.TryAdd(groupChannel.Id); } } - internal ICachedChannel RemoveChannel(ulong id) + internal ISocketChannel RemoveChannel(ulong id) { - ICachedChannel channel; + ISocketChannel channel; if (_channels.TryRemove(id, out channel)) { - var dmChannel = channel as CachedDMChannel; + var dmChannel = channel as SocketDMChannel; if (dmChannel != null) { - CachedDMChannel ignored; + SocketDMChannel ignored; _dmChannels.TryRemove(dmChannel.Recipient.Id, out ignored); } else { - var groupChannel = channel as CachedGroupChannel; + var groupChannel = channel as SocketGroupChannel; if (groupChannel != null) _groupChannels.TryRemove(id); } @@ -91,39 +91,39 @@ namespace Discord return null; } - internal CachedGuild GetGuild(ulong id) + internal SocketGuild GetGuild(ulong id) { - CachedGuild guild; + SocketGuild guild; if (_guilds.TryGetValue(id, out guild)) return guild; return null; } - internal void AddGuild(CachedGuild guild) + internal void AddGuild(SocketGuild guild) { _guilds[guild.Id] = guild; } - internal CachedGuild RemoveGuild(ulong id) + internal SocketGuild RemoveGuild(ulong id) { - CachedGuild guild; + SocketGuild guild; if (_guilds.TryRemove(id, out guild)) return guild; return null; } - internal CachedGlobalUser GetUser(ulong id) + internal SocketGlobalUser GetUser(ulong id) { - CachedGlobalUser user; + SocketGlobalUser user; if (_users.TryGetValue(id, out user)) return user; return null; } - internal CachedGlobalUser GetOrAddUser(ulong id, Func userFactory) + internal SocketGlobalUser GetOrAddUser(ulong id, Func userFactory) { return _users.GetOrAdd(id, userFactory); } - internal CachedGlobalUser RemoveUser(ulong id) + internal SocketGlobalUser RemoveUser(ulong id) { - CachedGlobalUser user; + SocketGlobalUser user; if (_users.TryRemove(id, out user)) return user; return null; diff --git a/src/Discord.Net/DiscordClient.cs b/src/Discord.Net/DiscordClient.cs index 13ce1632c..ff1ce9c0b 100644 --- a/src/Discord.Net/DiscordClient.cs +++ b/src/Discord.Net/DiscordClient.cs @@ -10,7 +10,6 @@ using System.Linq; using System.Threading; using System.Threading.Tasks; using System.Runtime.InteropServices; -using System.Collections.Concurrent; namespace Discord { diff --git a/src/Discord.Net/DiscordSocketClient.cs b/src/Discord.Net/DiscordSocketClient.cs index a2ca7def3..82936d5f0 100644 --- a/src/Discord.Net/DiscordSocketClient.cs +++ b/src/Discord.Net/DiscordSocketClient.cs @@ -44,7 +44,7 @@ namespace Discord /// Gets the estimated round-trip latency, in milliseconds, to the gateway server. public int Latency { get; private set; } - //From DiscordConfig + //From DiscordSocketConfig internal int TotalShards { get; private set; } internal int ConnectionTimeout { get; private set; } internal int ReconnectDelay { get; private set; } @@ -55,8 +55,8 @@ namespace Discord internal DataStore DataStore { get; private set; } internal WebSocketProvider WebSocketProvider { get; private set; } - internal CachedSelfUser CurrentUser => _currentUser as CachedSelfUser; - internal IReadOnlyCollection Guilds => DataStore.Guilds; + internal SocketSelfUser CurrentUser => _currentUser as SocketSelfUser; + internal IReadOnlyCollection Guilds => DataStore.Guilds; internal IReadOnlyCollection VoiceRegions => _voiceRegions.ToReadOnlyCollection(); /// Creates a new REST/WebSocket discord client. @@ -340,15 +340,15 @@ namespace Discord { return Task.FromResult>(Guilds); } - internal CachedGuild AddGuild(ExtendedGuild model, DataStore dataStore) + internal SocketGuild AddGuild(ExtendedGuild model, DataStore dataStore) { - var guild = new CachedGuild(this, model, dataStore); + var guild = new SocketGuild(this, model, dataStore); dataStore.AddGuild(guild); if (model.Large) _largeGuilds.Enqueue(model.Id); return guild; } - internal CachedGuild RemoveGuild(ulong id) + internal SocketGuild RemoveGuild(ulong id) { var guild = DataStore.RemoveGuild(id); foreach (var channel in guild.Channels) @@ -367,7 +367,7 @@ namespace Discord { return Task.FromResult>(DataStore.PrivateChannels); } - internal ICachedChannel AddPrivateChannel(API.Channel model, DataStore dataStore) + internal ISocketChannel AddPrivateChannel(API.Channel model, DataStore dataStore) { switch (model.Type) { @@ -375,13 +375,13 @@ namespace Discord { var recipients = model.Recipients.Value; var user = GetOrAddUser(recipients[0], dataStore); - var channel = new CachedDMChannel(this, new CachedDMUser(user), model); + var channel = new SocketDMChannel(this, new SocketDMUser(user), model); dataStore.AddChannel(channel); return channel; } case ChannelType.Group: { - var channel = new CachedGroupChannel(this, model); + var channel = new SocketGroupChannel(this, model); channel.UpdateUsers(model.Recipients.Value, UpdateSource.Creation, dataStore); dataStore.AddChannel(channel); return channel; @@ -390,9 +390,9 @@ namespace Discord throw new InvalidOperationException($"Unexpected channel type: {model.Type}"); } } - internal ICachedChannel RemovePrivateChannel(ulong id) + internal ISocketChannel RemovePrivateChannel(ulong id) { - var channel = DataStore.RemoveChannel(id) as ICachedPrivateChannel; + var channel = DataStore.RemoveChannel(id) as ISocketPrivateChannel; foreach (var recipient in channel.Recipients) recipient.User.RemoveRef(this); return channel; @@ -413,13 +413,13 @@ namespace Discord { return Task.FromResult(_currentUser); } - internal CachedGlobalUser GetOrAddUser(API.User model, DataStore dataStore) + internal SocketGlobalUser GetOrAddUser(API.User model, DataStore dataStore) { - var user = dataStore.GetOrAddUser(model.Id, _ => new CachedGlobalUser(model)); + var user = dataStore.GetOrAddUser(model.Id, _ => new SocketGlobalUser(model)); user.AddRef(); return user; } - internal CachedGlobalUser RemoveUser(ulong id) + internal SocketGlobalUser RemoveUser(ulong id) { return DataStore.RemoveUser(id); } @@ -429,10 +429,10 @@ namespace Discord => DownloadUsersAsync(DataStore.Guilds.Where(x => !x.HasAllMembers)); /// Downloads the users list for the provided guilds, if they don't have a complete list. public Task DownloadUsersAsync(IEnumerable guilds) - => DownloadUsersAsync(guilds.Select(x => x as CachedGuild).Where(x => x != null)); + => DownloadUsersAsync(guilds.Select(x => x as SocketGuild).Where(x => x != null)); public Task DownloadUsersAsync(params IGuild[] guilds) - => DownloadUsersAsync(guilds.Select(x => x as CachedGuild).Where(x => x != null)); - private async Task DownloadUsersAsync(IEnumerable guilds) + => DownloadUsersAsync(guilds.Select(x => x as SocketGuild).Where(x => x != null)); + private async Task DownloadUsersAsync(IEnumerable guilds) { var cachedGuilds = guilds.ToArray(); if (cachedGuilds.Length == 0) return; @@ -559,7 +559,7 @@ namespace Discord var data = (payload as JToken).ToObject(_serializer); var dataStore = new DataStore(data.Guilds.Length, data.PrivateChannels.Length); - var currentUser = new CachedSelfUser(this, data.User); + var currentUser = new SocketSelfUser(this, data.User); int unavailableGuilds = 0; for (int i = 0; i < data.Guilds.Length; i++) { @@ -625,7 +625,7 @@ namespace Discord } await _gatewayLogger.DebugAsync($"Received Dispatch ({type})").ConfigureAwait(false); - CachedGuild guild; + SocketGuild guild; if (data.Unavailable != false) { guild = AddGuild(data, DataStore); @@ -751,7 +751,7 @@ namespace Discord await _gatewayLogger.DebugAsync("Received Dispatch (CHANNEL_CREATE)").ConfigureAwait(false); var data = (payload as JToken).ToObject(_serializer); - ICachedChannel channel = null; + ISocketChannel channel = null; if (data.GuildId.IsSpecified) { var guild = DataStore.GetGuild(data.GuildId.Value); @@ -789,7 +789,7 @@ namespace Discord var before = channel.Clone(); channel.Update(data, UpdateSource.WebSocket); - if (!((channel as ICachedGuildChannel)?.Guild.IsSynced ?? true)) + if (!((channel as ISocketGuildChannel)?.Guild.IsSynced ?? true)) { await _gatewayLogger.DebugAsync("Ignored CHANNEL_UPDATE, guild is not synced yet.").ConfigureAwait(false); return; @@ -808,7 +808,7 @@ namespace Discord { await _gatewayLogger.DebugAsync("Received Dispatch (CHANNEL_DELETE)").ConfigureAwait(false); - ICachedChannel channel = null; + ISocketChannel channel = null; var data = (payload as JToken).ToObject(_serializer); if (data.GuildId.IsSpecified) { @@ -978,7 +978,7 @@ namespace Discord await _gatewayLogger.DebugAsync("Received Dispatch (CHANNEL_RECIPIENT_ADD)").ConfigureAwait(false); var data = (payload as JToken).ToObject(_serializer); - var channel = DataStore.GetChannel(data.ChannelId) as CachedGroupChannel; + var channel = DataStore.GetChannel(data.ChannelId) as SocketGroupChannel; if (channel != null) { var user = channel.AddUser(data.User, DataStore); @@ -996,7 +996,7 @@ namespace Discord await _gatewayLogger.DebugAsync("Received Dispatch (CHANNEL_RECIPIENT_REMOVE)").ConfigureAwait(false); var data = (payload as JToken).ToObject(_serializer); - var channel = DataStore.GetChannel(data.ChannelId) as CachedGroupChannel; + var channel = DataStore.GetChannel(data.ChannelId) as SocketGroupChannel; if (channel != null) { var user = channel.RemoveUser(data.User.Id); @@ -1166,10 +1166,10 @@ namespace Discord await _gatewayLogger.DebugAsync("Received Dispatch (MESSAGE_CREATE)").ConfigureAwait(false); var data = (payload as JToken).ToObject(_serializer); - var channel = DataStore.GetChannel(data.ChannelId) as ICachedMessageChannel; + var channel = DataStore.GetChannel(data.ChannelId) as ISocketMessageChannel; if (channel != null) { - if (!((channel as ICachedGuildChannel)?.Guild.IsSynced ?? true)) + if (!((channel as ISocketGuildChannel)?.Guild.IsSynced ?? true)) { await _gatewayLogger.DebugAsync("Ignored MESSAGE_CREATE, guild is not synced yet.").ConfigureAwait(false); return; @@ -1200,17 +1200,17 @@ namespace Discord await _gatewayLogger.DebugAsync("Received Dispatch (MESSAGE_UPDATE)").ConfigureAwait(false); var data = (payload as JToken).ToObject(_serializer); - var channel = DataStore.GetChannel(data.ChannelId) as ICachedMessageChannel; + var channel = DataStore.GetChannel(data.ChannelId) as ISocketMessageChannel; if (channel != null) { - if (!((channel as ICachedGuildChannel)?.Guild.IsSynced ?? true)) + if (!((channel as ISocketGuildChannel)?.Guild.IsSynced ?? true)) { await _gatewayLogger.DebugAsync("Ignored MESSAGE_UPDATE, guild is not synced yet.").ConfigureAwait(false); return; } IMessage before = null, after = null; - CachedMessage cachedMsg = channel.GetMessage(data.Id); + SocketMessage cachedMsg = channel.GetMessage(data.Id); if (cachedMsg != null) { before = cachedMsg.Clone(); @@ -1239,10 +1239,10 @@ namespace Discord await _gatewayLogger.DebugAsync("Received Dispatch (MESSAGE_DELETE)").ConfigureAwait(false); var data = (payload as JToken).ToObject(_serializer); - var channel = DataStore.GetChannel(data.ChannelId) as ICachedMessageChannel; + var channel = DataStore.GetChannel(data.ChannelId) as ISocketMessageChannel; if (channel != null) { - if (!((channel as ICachedGuildChannel)?.Guild.IsSynced ?? true)) + if (!((channel as ISocketGuildChannel)?.Guild.IsSynced ?? true)) { await _gatewayLogger.DebugAsync("Ignored MESSAGE_DELETE, guild is not synced yet.").ConfigureAwait(false); return; @@ -1266,10 +1266,10 @@ namespace Discord await _gatewayLogger.DebugAsync("Received Dispatch (MESSAGE_DELETE_BULK)").ConfigureAwait(false); var data = (payload as JToken).ToObject(_serializer); - var channel = DataStore.GetChannel(data.ChannelId) as ICachedMessageChannel; + var channel = DataStore.GetChannel(data.ChannelId) as ISocketMessageChannel; if (channel != null) { - if (!((channel as ICachedGuildChannel)?.Guild.IsSynced ?? true)) + if (!((channel as ISocketGuildChannel)?.Guild.IsSynced ?? true)) { await _gatewayLogger.DebugAsync("Ignored MESSAGE_DELETE_BULK, guild is not synced yet.").ConfigureAwait(false); return; @@ -1341,10 +1341,10 @@ namespace Discord await _gatewayLogger.DebugAsync("Received Dispatch (TYPING_START)").ConfigureAwait(false); var data = (payload as JToken).ToObject(_serializer); - var channel = DataStore.GetChannel(data.ChannelId) as ICachedMessageChannel; + var channel = DataStore.GetChannel(data.ChannelId) as ISocketMessageChannel; if (channel != null) { - if (!((channel as ICachedGuildChannel)?.Guild.IsSynced ?? true)) + if (!((channel as ISocketGuildChannel)?.Guild.IsSynced ?? true)) { await _gatewayLogger.DebugAsync("Ignored TYPING_START, guild is not synced yet.").ConfigureAwait(false); return; @@ -1385,7 +1385,7 @@ namespace Discord var data = (payload as JToken).ToObject(_serializer); if (data.GuildId.HasValue) { - ICachedUser user; + ISocketUser user; VoiceState before, after; if (data.GuildId != null) { @@ -1418,7 +1418,7 @@ namespace Discord } else { - var groupChannel = DataStore.GetChannel(data.ChannelId.Value) as CachedGroupChannel; + var groupChannel = DataStore.GetChannel(data.ChannelId.Value) as SocketGroupChannel; if (groupChannel != null) { if (data.ChannelId != null) diff --git a/src/Discord.Net/Entities/Channels/IMessageChannel.cs b/src/Discord.Net/Entities/Channels/IMessageChannel.cs index a5a73b177..2d1713a06 100644 --- a/src/Discord.Net/Entities/Channels/IMessageChannel.cs +++ b/src/Discord.Net/Entities/Channels/IMessageChannel.cs @@ -24,8 +24,7 @@ namespace Discord /// Gets a collection of messages in this channel. Task> GetMessagesAsync(ulong fromMessageId, Direction dir, int limit = DiscordConfig.MaxMessagesPerBatch); /// Bulk deletes multiple messages. - Task DeleteMessagesAsync(IEnumerable messages); - + Task DeleteMessagesAsync(IEnumerable messages); /// Broadcasts the "user is typing" message to all users in this channel, lasting 10 seconds. Task TriggerTypingAsync(); diff --git a/src/Discord.Net/Entities/Entity.cs b/src/Discord.Net/Entities/Entity.cs index 82b9a2300..cd6d34cff 100644 --- a/src/Discord.Net/Entities/Entity.cs +++ b/src/Discord.Net/Entities/Entity.cs @@ -6,7 +6,8 @@ public abstract DiscordClient Discord { get; } - bool IEntity.IsAttached => false; + internal virtual bool IsAttached => false; + bool IEntity.IsAttached => IsAttached; public Entity(T id) { diff --git a/src/Discord.Net/Entities/Users/GroupUser.cs b/src/Discord.Net/Entities/Users/GroupUser.cs index 98a8dade4..1441eb999 100644 --- a/src/Discord.Net/Entities/Users/GroupUser.cs +++ b/src/Discord.Net/Entities/Users/GroupUser.cs @@ -6,6 +6,9 @@ namespace Discord { internal class GroupUser : IGroupUser { + internal virtual bool IsAttached => false; + bool IEntity.IsAttached => IsAttached; + public GroupChannel Channel { get; private set; } public User User { get; private set; } @@ -14,7 +17,6 @@ namespace Discord public DateTimeOffset CreatedAt => User.CreatedAt; public string Discriminator => User.Discriminator; public ushort DiscriminatorValue => User.DiscriminatorValue; - public bool IsAttached => User.IsAttached; public bool IsBot => User.IsBot; public string Username => User.Username; public string Mention => MentionUtils.Mention(this, false); diff --git a/src/Discord.Net/Entities/Users/GuildUser.cs b/src/Discord.Net/Entities/Users/GuildUser.cs index 1aa0ba9fc..e9e82b54d 100644 --- a/src/Discord.Net/Entities/Users/GuildUser.cs +++ b/src/Discord.Net/Entities/Users/GuildUser.cs @@ -13,6 +13,9 @@ namespace Discord [DebuggerDisplay("{DebuggerDisplay,nq}")] internal class GuildUser : IGuildUser, ISnowflakeEntity { + internal virtual bool IsAttached => false; + bool IEntity.IsAttached => IsAttached; + private long? _joinedAtTicks; public string Nickname { get; private set; } @@ -27,7 +30,6 @@ namespace Discord public DateTimeOffset CreatedAt => User.CreatedAt; public string Discriminator => User.Discriminator; public ushort DiscriminatorValue => User.DiscriminatorValue; - public bool IsAttached => User.IsAttached; public bool IsBot => User.IsBot; public string Mention => MentionUtils.Mention(this, Nickname != null); public string Username => User.Username; diff --git a/src/Discord.Net/Entities/WebSocket/CachedMessage.cs b/src/Discord.Net/Entities/WebSocket/CachedMessage.cs deleted file mode 100644 index cb005f2ef..000000000 --- a/src/Discord.Net/Entities/WebSocket/CachedMessage.cs +++ /dev/null @@ -1,19 +0,0 @@ -using Model = Discord.API.Message; - -namespace Discord -{ - internal class CachedMessage : Message - { - bool IEntity.IsAttached => true; - - public new DiscordSocketClient Discord => base.Discord as DiscordSocketClient; - public new ICachedMessageChannel Channel => base.Channel as ICachedMessageChannel; - - public CachedMessage(ICachedMessageChannel channel, IUser author, Model model) - : base(channel, author, model) - { - } - - public CachedMessage Clone() => MemberwiseClone() as CachedMessage; - } -} diff --git a/src/Discord.Net/Entities/WebSocket/CachedSelfUser.cs b/src/Discord.Net/Entities/WebSocket/CachedSelfUser.cs deleted file mode 100644 index fd56d3803..000000000 --- a/src/Discord.Net/Entities/WebSocket/CachedSelfUser.cs +++ /dev/null @@ -1,21 +0,0 @@ -using System; -using Model = Discord.API.User; - -namespace Discord -{ - internal class CachedSelfUser : SelfUser, ICachedUser - { - bool IEntity.IsAttached => true; - - public new DiscordSocketClient Discord => base.Discord as DiscordSocketClient; - CachedGlobalUser ICachedUser.User { get { throw new NotSupportedException(); } } - - public CachedSelfUser(DiscordSocketClient discord, Model model) - : base(discord, model) - { - } - - public CachedSelfUser Clone() => MemberwiseClone() as CachedSelfUser; - ICachedUser ICachedUser.Clone() => Clone(); - } -} diff --git a/src/Discord.Net/Entities/WebSocket/ICachedChannel.cs b/src/Discord.Net/Entities/WebSocket/Channels/ISocketChannel.cs similarity index 55% rename from src/Discord.Net/Entities/WebSocket/ICachedChannel.cs rename to src/Discord.Net/Entities/WebSocket/Channels/ISocketChannel.cs index caebf7c10..91535e7c9 100644 --- a/src/Discord.Net/Entities/WebSocket/ICachedChannel.cs +++ b/src/Discord.Net/Entities/WebSocket/Channels/ISocketChannel.cs @@ -2,10 +2,10 @@ namespace Discord { - internal interface ICachedChannel : IChannel, ICachedEntity + internal interface ISocketChannel : IChannel { void Update(Model model, UpdateSource source); - ICachedChannel Clone(); + ISocketChannel Clone(); } } diff --git a/src/Discord.Net/Entities/WebSocket/Channels/ISocketGuildChannel.cs b/src/Discord.Net/Entities/WebSocket/Channels/ISocketGuildChannel.cs new file mode 100644 index 000000000..b9925582d --- /dev/null +++ b/src/Discord.Net/Entities/WebSocket/Channels/ISocketGuildChannel.cs @@ -0,0 +1,7 @@ +namespace Discord +{ + internal interface ISocketGuildChannel : ISocketChannel, IGuildChannel + { + new SocketGuild Guild { get; } + } +} diff --git a/src/Discord.Net/Entities/WebSocket/Channels/ISocketMessageChannel.cs b/src/Discord.Net/Entities/WebSocket/Channels/ISocketMessageChannel.cs new file mode 100644 index 000000000..e1a538719 --- /dev/null +++ b/src/Discord.Net/Entities/WebSocket/Channels/ISocketMessageChannel.cs @@ -0,0 +1,16 @@ +using System.Collections.Generic; +using MessageModel = Discord.API.Message; + +namespace Discord +{ + internal interface ISocketMessageChannel : ISocketChannel, IMessageChannel + { + IReadOnlyCollection Users { get; } + + SocketMessage AddMessage(ISocketUser author, MessageModel model); + SocketMessage GetMessage(ulong id); + SocketMessage RemoveMessage(ulong id); + + ISocketUser GetUser(ulong id, bool skipCheck = false); + } +} diff --git a/src/Discord.Net/Entities/WebSocket/Channels/ISocketPrivateChannel.cs b/src/Discord.Net/Entities/WebSocket/Channels/ISocketPrivateChannel.cs new file mode 100644 index 000000000..609aea3b6 --- /dev/null +++ b/src/Discord.Net/Entities/WebSocket/Channels/ISocketPrivateChannel.cs @@ -0,0 +1,9 @@ +using System.Collections.Generic; + +namespace Discord +{ + internal interface ISocketPrivateChannel : ISocketChannel, IPrivateChannel + { + new IReadOnlyCollection Recipients { get; } + } +} diff --git a/src/Discord.Net/Entities/WebSocket/MessageCache.cs b/src/Discord.Net/Entities/WebSocket/Channels/MessageCache.cs similarity index 75% rename from src/Discord.Net/Entities/WebSocket/MessageCache.cs rename to src/Discord.Net/Entities/WebSocket/Channels/MessageCache.cs index 0eaee13c3..953cf6eac 100644 --- a/src/Discord.Net/Entities/WebSocket/MessageCache.cs +++ b/src/Discord.Net/Entities/WebSocket/Channels/MessageCache.cs @@ -10,51 +10,51 @@ namespace Discord { internal class MessageCache : MessageManager { - private readonly ConcurrentDictionary _messages; + private readonly ConcurrentDictionary _messages; private readonly ConcurrentQueue _orderedMessages; private readonly int _size; - public override IReadOnlyCollection Messages => _messages.ToReadOnlyCollection(); + public override IReadOnlyCollection Messages => _messages.ToReadOnlyCollection(); - public MessageCache(DiscordSocketClient discord, ICachedMessageChannel channel) + public MessageCache(DiscordSocketClient discord, ISocketMessageChannel channel) : base(discord, channel) { _size = discord.MessageCacheSize; - _messages = new ConcurrentDictionary(1, (int)(_size * 1.05)); + _messages = new ConcurrentDictionary(1, (int)(_size * 1.05)); _orderedMessages = new ConcurrentQueue(); } - public override void Add(CachedMessage message) + public override void Add(SocketMessage message) { if (_messages.TryAdd(message.Id, message)) { _orderedMessages.Enqueue(message.Id); ulong msgId; - CachedMessage msg; + SocketMessage msg; while (_orderedMessages.Count > _size && _orderedMessages.TryDequeue(out msgId)) _messages.TryRemove(msgId, out msg); } } - public override CachedMessage Remove(ulong id) + public override SocketMessage Remove(ulong id) { - CachedMessage msg; + SocketMessage msg; _messages.TryRemove(id, out msg); return msg; } - public override CachedMessage Get(ulong id) + public override SocketMessage Get(ulong id) { - CachedMessage result; + SocketMessage result; if (_messages.TryGetValue(id, out result)) return result; return null; } - public override IImmutableList GetMany(ulong? fromMessageId, Direction dir, int limit = DiscordConfig.MaxMessagesPerBatch) + public override IImmutableList GetMany(ulong? fromMessageId, Direction dir, int limit = DiscordConfig.MaxMessagesPerBatch) { if (limit < 0) throw new ArgumentOutOfRangeException(nameof(limit)); - if (limit == 0) return ImmutableArray.Empty; + if (limit == 0) return ImmutableArray.Empty; IEnumerable cachedMessageIds; if (fromMessageId == null) @@ -68,7 +68,7 @@ namespace Discord .Take(limit) .Select(x => { - CachedMessage msg; + SocketMessage msg; if (_messages.TryGetValue(x, out msg)) return msg; return null; @@ -77,7 +77,7 @@ namespace Discord .ToImmutableArray(); } - public override async Task DownloadAsync(ulong id) + public override async Task DownloadAsync(ulong id) { var msg = Get(id); if (msg != null) diff --git a/src/Discord.Net/Entities/WebSocket/MessageManager.cs b/src/Discord.Net/Entities/WebSocket/Channels/MessageManager.cs similarity index 72% rename from src/Discord.Net/Entities/WebSocket/MessageManager.cs rename to src/Discord.Net/Entities/WebSocket/Channels/MessageManager.cs index ea9ec11c8..8483ef517 100644 --- a/src/Discord.Net/Entities/WebSocket/MessageManager.cs +++ b/src/Discord.Net/Entities/WebSocket/Channels/MessageManager.cs @@ -10,36 +10,36 @@ namespace Discord internal class MessageManager { private readonly DiscordSocketClient _discord; - private readonly ICachedMessageChannel _channel; + private readonly ISocketMessageChannel _channel; - public virtual IReadOnlyCollection Messages - => ImmutableArray.Create(); + public virtual IReadOnlyCollection Messages + => ImmutableArray.Create(); - public MessageManager(DiscordSocketClient discord, ICachedMessageChannel channel) + public MessageManager(DiscordSocketClient discord, ISocketMessageChannel channel) { _discord = discord; _channel = channel; } - public virtual void Add(CachedMessage message) { } - public virtual CachedMessage Remove(ulong id) => null; - public virtual CachedMessage Get(ulong id) => null; + public virtual void Add(SocketMessage message) { } + public virtual SocketMessage Remove(ulong id) => null; + public virtual SocketMessage Get(ulong id) => null; - public virtual IImmutableList GetMany(ulong? fromMessageId, Direction dir, int limit = DiscordConfig.MaxMessagesPerBatch) - => ImmutableArray.Create(); + public virtual IImmutableList GetMany(ulong? fromMessageId, Direction dir, int limit = DiscordConfig.MaxMessagesPerBatch) + => ImmutableArray.Create(); - public virtual async Task DownloadAsync(ulong id) + public virtual async Task DownloadAsync(ulong id) { var model = await _discord.ApiClient.GetChannelMessageAsync(_channel.Id, id).ConfigureAwait(false); if (model != null) - return new CachedMessage(_channel, new User(model.Author.Value), model); + return new SocketMessage(_channel, new User(model.Author.Value), model); return null; } - public async Task> DownloadAsync(ulong? fromId, Direction dir, int limit) + public async Task> DownloadAsync(ulong? fromId, Direction dir, int limit) { //TODO: Test heavily, especially the ordering of messages if (limit < 0) throw new ArgumentOutOfRangeException(nameof(limit)); - if (limit == 0) return ImmutableArray.Empty; + if (limit == 0) return ImmutableArray.Empty; var cachedMessages = GetMany(fromId, dir, limit); if (cachedMessages.Count == limit) @@ -61,7 +61,7 @@ namespace Discord }; var downloadedMessages = await _discord.ApiClient.GetChannelMessagesAsync(_channel.Id, args).ConfigureAwait(false); - var guild = (_channel as ICachedGuildChannel)?.Guild; + var guild = (_channel as ISocketGuildChannel)?.Guild; return cachedMessages.Concat(downloadedMessages.Select(x => { IUser user = _channel.GetUser(x.Author.Value.Id, true); @@ -73,7 +73,7 @@ namespace Discord else user = newUser; } - return new CachedMessage(_channel, user, x); + return new SocketMessage(_channel, user, x); })).ToImmutableArray(); } } diff --git a/src/Discord.Net/Entities/WebSocket/CachedDMChannel.cs b/src/Discord.Net/Entities/WebSocket/Channels/SocketDMChannel.cs similarity index 65% rename from src/Discord.Net/Entities/WebSocket/CachedDMChannel.cs rename to src/Discord.Net/Entities/WebSocket/Channels/SocketDMChannel.cs index b3dc961d2..bfc0c1c1e 100644 --- a/src/Discord.Net/Entities/WebSocket/CachedDMChannel.cs +++ b/src/Discord.Net/Entities/WebSocket/Channels/SocketDMChannel.cs @@ -6,18 +6,18 @@ using Model = Discord.API.Channel; namespace Discord { - internal class CachedDMChannel : DMChannel, IDMChannel, ICachedChannel, ICachedMessageChannel, ICachedPrivateChannel + internal class SocketDMChannel : DMChannel, IDMChannel, ISocketChannel, ISocketMessageChannel, ISocketPrivateChannel { - bool IEntity.IsAttached => true; + internal override bool IsAttached => true; private readonly MessageManager _messages; public new DiscordSocketClient Discord => base.Discord as DiscordSocketClient; - public new CachedDMUser Recipient => base.Recipient as CachedDMUser; - public IReadOnlyCollection Members => ImmutableArray.Create(Discord.CurrentUser, Recipient); - IReadOnlyCollection ICachedPrivateChannel.Recipients => ImmutableArray.Create(Recipient); + public new SocketDMUser Recipient => base.Recipient as SocketDMUser; + public IReadOnlyCollection Users => ImmutableArray.Create(Discord.CurrentUser, Recipient); + IReadOnlyCollection ISocketPrivateChannel.Recipients => ImmutableArray.Create(Recipient); - public CachedDMChannel(DiscordSocketClient discord, CachedDMUser recipient, Model model) + public SocketDMChannel(DiscordSocketClient discord, SocketDMUser recipient, Model model) : base(discord, recipient, model) { if (Discord.MessageCacheSize > 0) @@ -27,8 +27,8 @@ namespace Discord } public override Task GetUserAsync(ulong id) => Task.FromResult(GetUser(id)); - public override Task> GetUsersAsync() => Task.FromResult>(Members); - public ICachedUser GetUser(ulong id) + public override Task> GetUsersAsync() => Task.FromResult>(Users); + public ISocketUser GetUser(ulong id) { var currentUser = Discord.CurrentUser; if (id == Recipient.Id) @@ -51,25 +51,25 @@ namespace Discord { return await _messages.DownloadAsync(fromMessageId, dir, limit).ConfigureAwait(false); } - public CachedMessage AddMessage(ICachedUser author, MessageModel model) + public SocketMessage AddMessage(ISocketUser author, MessageModel model) { - var msg = new CachedMessage(this, author, model); + var msg = new SocketMessage(this, author, model); _messages.Add(msg); return msg; } - public CachedMessage GetMessage(ulong id) + public SocketMessage GetMessage(ulong id) { return _messages.Get(id); } - public CachedMessage RemoveMessage(ulong id) + public SocketMessage RemoveMessage(ulong id) { return _messages.Remove(id); } - public CachedDMChannel Clone() => MemberwiseClone() as CachedDMChannel; + public SocketDMChannel Clone() => MemberwiseClone() as SocketDMChannel; IMessage IMessageChannel.GetCachedMessage(ulong id) => GetMessage(id); - ICachedUser ICachedMessageChannel.GetUser(ulong id, bool skipCheck) => GetUser(id); - ICachedChannel ICachedChannel.Clone() => Clone(); + ISocketUser ISocketMessageChannel.GetUser(ulong id, bool skipCheck) => GetUser(id); + ISocketChannel ISocketChannel.Clone() => Clone(); } } diff --git a/src/Discord.Net/Entities/WebSocket/CachedGroupChannel.cs b/src/Discord.Net/Entities/WebSocket/Channels/SocketGroupChannel.cs similarity index 75% rename from src/Discord.Net/Entities/WebSocket/CachedGroupChannel.cs rename to src/Discord.Net/Entities/WebSocket/Channels/SocketGroupChannel.cs index 946962822..f0f15d0c4 100644 --- a/src/Discord.Net/Entities/WebSocket/CachedGroupChannel.cs +++ b/src/Discord.Net/Entities/WebSocket/Channels/SocketGroupChannel.cs @@ -11,19 +11,19 @@ using VoiceStateModel = Discord.API.VoiceState; namespace Discord { - internal class CachedGroupChannel : GroupChannel, IGroupChannel, ICachedChannel, ICachedMessageChannel, ICachedPrivateChannel + internal class SocketGroupChannel : GroupChannel, IGroupChannel, ISocketChannel, ISocketMessageChannel, ISocketPrivateChannel { - bool IEntity.IsAttached => true; + internal override bool IsAttached => true; private readonly MessageManager _messages; private ConcurrentDictionary _voiceStates; public new DiscordSocketClient Discord => base.Discord as DiscordSocketClient; - public IReadOnlyCollection Members - => _users.Select(x => x.Value as ICachedUser).Concat(ImmutableArray.Create(Discord.CurrentUser)).ToReadOnlyCollection(() => _users.Count + 1); - public new IReadOnlyCollection Recipients => _users.Select(x => x.Value as ICachedUser).ToReadOnlyCollection(_users); + public IReadOnlyCollection Users + => _users.Select(x => x.Value as ISocketUser).Concat(ImmutableArray.Create(Discord.CurrentUser)).ToReadOnlyCollection(() => _users.Count + 1); + public new IReadOnlyCollection Recipients => _users.Select(x => x.Value as ISocketUser).ToReadOnlyCollection(_users); - public CachedGroupChannel(DiscordSocketClient discord, Model model) + public SocketGroupChannel(DiscordSocketClient discord, Model model) : base(discord, model) { if (Discord.MessageCacheSize > 0) @@ -45,46 +45,46 @@ namespace Discord for (int i = 0; i < models.Length; i++) { var globalUser = Discord.GetOrAddUser(models[i], dataStore); - users[models[i].Id] = new CachedGroupUser(this, globalUser); + users[models[i].Id] = new SocketGroupUser(this, globalUser); } _users = users; } internal override void UpdateUsers(UserModel[] models, UpdateSource source) => UpdateUsers(models, source, Discord.DataStore); - public CachedGroupUser AddUser(UserModel model, DataStore dataStore) + public SocketGroupUser AddUser(UserModel model, DataStore dataStore) { GroupUser user; if (_users.TryGetValue(model.Id, out user)) - return user as CachedGroupUser; + return user as SocketGroupUser; else { var globalUser = Discord.GetOrAddUser(model, dataStore); - var privateUser = new CachedGroupUser(this, globalUser); + var privateUser = new SocketGroupUser(this, globalUser); _users[privateUser.Id] = privateUser; return privateUser; } } - public ICachedUser GetUser(ulong id) + public ISocketUser GetUser(ulong id) { GroupUser user; if (_users.TryGetValue(id, out user)) - return user as CachedGroupUser; + return user as SocketGroupUser; if (id == Discord.CurrentUser.Id) return Discord.CurrentUser; return null; } - public CachedGroupUser RemoveUser(ulong id) + public SocketGroupUser RemoveUser(ulong id) { GroupUser user; if (_users.TryRemove(id, out user)) - return user as CachedGroupUser; + return user as SocketGroupUser; return null; } public VoiceState AddOrUpdateVoiceState(VoiceStateModel model, DataStore dataStore, ConcurrentDictionary voiceStates = null) { - var voiceChannel = dataStore.GetChannel(model.ChannelId.Value) as CachedVoiceChannel; + var voiceChannel = dataStore.GetChannel(model.ChannelId.Value) as SocketVoiceChannel; var voiceState = new VoiceState(voiceChannel, model); (voiceStates ?? _voiceStates)[model.UserId] = voiceState; return voiceState; @@ -116,25 +116,25 @@ namespace Discord { return await _messages.DownloadAsync(fromMessageId, dir, limit).ConfigureAwait(false); } - public CachedMessage AddMessage(ICachedUser author, MessageModel model) + public SocketMessage AddMessage(ISocketUser author, MessageModel model) { - var msg = new CachedMessage(this, author, model); + var msg = new SocketMessage(this, author, model); _messages.Add(msg); return msg; } - public CachedMessage GetMessage(ulong id) + public SocketMessage GetMessage(ulong id) { return _messages.Get(id); } - public CachedMessage RemoveMessage(ulong id) + public SocketMessage RemoveMessage(ulong id) { return _messages.Remove(id); } - public CachedDMChannel Clone() => MemberwiseClone() as CachedDMChannel; + public SocketDMChannel Clone() => MemberwiseClone() as SocketDMChannel; IMessage IMessageChannel.GetCachedMessage(ulong id) => GetMessage(id); - ICachedUser ICachedMessageChannel.GetUser(ulong id, bool skipCheck) => GetUser(id); - ICachedChannel ICachedChannel.Clone() => Clone(); + ISocketUser ISocketMessageChannel.GetUser(ulong id, bool skipCheck) => GetUser(id); + ISocketChannel ISocketChannel.Clone() => Clone(); } } diff --git a/src/Discord.Net/Entities/WebSocket/CachedTextChannel.cs b/src/Discord.Net/Entities/WebSocket/Channels/SocketTextChannel.cs similarity index 73% rename from src/Discord.Net/Entities/WebSocket/CachedTextChannel.cs rename to src/Discord.Net/Entities/WebSocket/Channels/SocketTextChannel.cs index a37c680be..af222e165 100644 --- a/src/Discord.Net/Entities/WebSocket/CachedTextChannel.cs +++ b/src/Discord.Net/Entities/WebSocket/Channels/SocketTextChannel.cs @@ -7,19 +7,19 @@ using Model = Discord.API.Channel; namespace Discord { - internal class CachedTextChannel : TextChannel, ICachedGuildChannel, ICachedMessageChannel + internal class SocketTextChannel : TextChannel, ISocketGuildChannel, ISocketMessageChannel { - bool IEntity.IsAttached => true; + internal override bool IsAttached => true; private readonly MessageManager _messages; public new DiscordSocketClient Discord => base.Discord as DiscordSocketClient; - public new CachedGuild Guild => base.Guild as CachedGuild; + public new SocketGuild Guild => base.Guild as SocketGuild; - public IReadOnlyCollection Members + public IReadOnlyCollection Members => Guild.Members.Where(x => Permissions.GetValue(Permissions.ResolveChannel(x, this, x.GuildPermissions.RawValue), ChannelPermission.ReadMessages)).ToImmutableArray(); - public CachedTextChannel(CachedGuild guild, Model model) + public SocketTextChannel(SocketGuild guild, Model model) : base(guild, model) { if (Discord.MessageCacheSize > 0) @@ -30,7 +30,7 @@ namespace Discord public override Task GetUserAsync(ulong id) => Task.FromResult(GetUser(id)); public override Task> GetUsersAsync() => Task.FromResult>(Members); - public CachedGuildUser GetUser(ulong id, bool skipCheck = false) + public SocketGuildUser GetUser(ulong id, bool skipCheck = false) { var user = Guild.GetUser(id); if (skipCheck) return user; @@ -57,27 +57,27 @@ namespace Discord return await _messages.DownloadAsync(fromMessageId, dir, limit).ConfigureAwait(false); } - public CachedMessage AddMessage(ICachedUser author, MessageModel model) + public SocketMessage AddMessage(ISocketUser author, MessageModel model) { - var msg = new CachedMessage(this, author, model); + var msg = new SocketMessage(this, author, model); _messages.Add(msg); return msg; } - public CachedMessage GetMessage(ulong id) + public SocketMessage GetMessage(ulong id) { return _messages.Get(id); } - public CachedMessage RemoveMessage(ulong id) + public SocketMessage RemoveMessage(ulong id) { return _messages.Remove(id); } - public CachedTextChannel Clone() => MemberwiseClone() as CachedTextChannel; + public SocketTextChannel Clone() => MemberwiseClone() as SocketTextChannel; - IReadOnlyCollection ICachedMessageChannel.Members => Members; + IReadOnlyCollection ISocketMessageChannel.Users => Members; IMessage IMessageChannel.GetCachedMessage(ulong id) => GetMessage(id); - ICachedUser ICachedMessageChannel.GetUser(ulong id, bool skipCheck) => GetUser(id, skipCheck); - ICachedChannel ICachedChannel.Clone() => Clone(); + ISocketUser ISocketMessageChannel.GetUser(ulong id, bool skipCheck) => GetUser(id, skipCheck); + ISocketChannel ISocketChannel.Clone() => Clone(); } } diff --git a/src/Discord.Net/Entities/WebSocket/CachedVoiceChannel.cs b/src/Discord.Net/Entities/WebSocket/Channels/SocketVoiceChannel.cs similarity index 81% rename from src/Discord.Net/Entities/WebSocket/CachedVoiceChannel.cs rename to src/Discord.Net/Entities/WebSocket/Channels/SocketVoiceChannel.cs index 9f27f57d2..f017c1396 100644 --- a/src/Discord.Net/Entities/WebSocket/CachedVoiceChannel.cs +++ b/src/Discord.Net/Entities/WebSocket/Channels/SocketVoiceChannel.cs @@ -8,17 +8,17 @@ using Model = Discord.API.Channel; namespace Discord { - internal class CachedVoiceChannel : VoiceChannel, ICachedGuildChannel + internal class SocketVoiceChannel : VoiceChannel, ISocketGuildChannel { - bool IEntity.IsAttached => true; + internal override bool IsAttached => true; public new DiscordSocketClient Discord => base.Discord as DiscordSocketClient; - public new CachedGuild Guild => base.Guild as CachedGuild; + public new SocketGuild Guild => base.Guild as SocketGuild; public IReadOnlyCollection Members => Guild.VoiceStates.Where(x => x.Value.VoiceChannel.Id == Id).Select(x => Guild.GetUser(x.Key)).ToImmutableArray(); - public CachedVoiceChannel(CachedGuild guild, Model model) + public SocketVoiceChannel(SocketGuild guild, Model model) : base(guild, model) { } @@ -48,8 +48,8 @@ namespace Discord //TODO: Block and return } - public CachedVoiceChannel Clone() => MemberwiseClone() as CachedVoiceChannel; + public SocketVoiceChannel Clone() => MemberwiseClone() as SocketVoiceChannel; - ICachedChannel ICachedChannel.Clone() => Clone(); + ISocketChannel ISocketChannel.Clone() => Clone(); } } diff --git a/src/Discord.Net/Entities/WebSocket/CachedGuild.cs b/src/Discord.Net/Entities/WebSocket/Guilds/SocketGuild.cs similarity index 86% rename from src/Discord.Net/Entities/WebSocket/CachedGuild.cs rename to src/Discord.Net/Entities/WebSocket/Guilds/SocketGuild.cs index 5a7f7edc8..befbab3aa 100644 --- a/src/Discord.Net/Entities/WebSocket/CachedGuild.cs +++ b/src/Discord.Net/Entities/WebSocket/Guilds/SocketGuild.cs @@ -19,14 +19,14 @@ using VoiceStateModel = Discord.API.VoiceState; namespace Discord { - internal class CachedGuild : Guild, IGuild, IUserGuild + internal class SocketGuild : Guild, IGuild, IUserGuild { - bool IEntity.IsAttached => true; + internal override bool IsAttached => true; private readonly SemaphoreSlim _audioLock; private TaskCompletionSource _syncPromise, _downloaderPromise; private ConcurrentHashSet _channels; - private ConcurrentDictionary _members; + private ConcurrentDictionary _members; private ConcurrentDictionary _voiceStates; internal bool _available; @@ -41,20 +41,20 @@ namespace Discord public Task DownloaderPromise => _downloaderPromise.Task; public new DiscordSocketClient Discord => base.Discord as DiscordSocketClient; - public CachedGuildUser CurrentUser => GetUser(Discord.CurrentUser.Id); - public IReadOnlyCollection Channels + public SocketGuildUser CurrentUser => GetUser(Discord.CurrentUser.Id); + public IReadOnlyCollection Channels { get { var channels = _channels; var store = Discord.DataStore; - return channels.Select(x => store.GetChannel(x) as ICachedGuildChannel).Where(x => x != null).ToReadOnlyCollection(channels); + return channels.Select(x => store.GetChannel(x) as ISocketGuildChannel).Where(x => x != null).ToReadOnlyCollection(channels); } } - public IReadOnlyCollection Members => _members.ToReadOnlyCollection(); + public IReadOnlyCollection Members => _members.ToReadOnlyCollection(); public IEnumerable> VoiceStates => _voiceStates; - public CachedGuild(DiscordSocketClient discord, ExtendedModel model, DataStore dataStore) : base(discord, model) + public SocketGuild(DiscordSocketClient discord, ExtendedModel model, DataStore dataStore) : base(discord, model) { _audioLock = new SemaphoreSlim(1, 1); _syncPromise = new TaskCompletionSource(); @@ -72,7 +72,7 @@ namespace Discord if (_channels == null) _channels = new ConcurrentHashSet(); if (_members == null) - _members = new ConcurrentDictionary(); + _members = new ConcurrentDictionary(); if (_roles == null) _roles = new ConcurrentDictionary(); if (Emojis == null) @@ -93,7 +93,7 @@ namespace Discord } _channels = channels; - var members = new ConcurrentDictionary(1, (int)(model.Presences.Length * 1.05)); + var members = new ConcurrentDictionary(1, (int)(model.Presences.Length * 1.05)); { DownloadedMemberCount = 0; for (int i = 0; i < model.Members.Length; i++) @@ -121,7 +121,7 @@ namespace Discord { if (source == UpdateSource.Rest && IsAttached) return; - var members = new ConcurrentDictionary(1, (int)(model.Presences.Length * 1.05)); + var members = new ConcurrentDictionary(1, (int)(model.Presences.Length * 1.05)); { DownloadedMemberCount = 0; for (int i = 0; i < model.Members.Length; i++) @@ -154,14 +154,14 @@ namespace Discord (channels ?? _channels).TryAdd(model.Id); dataStore.AddChannel(channel); } - public ICachedGuildChannel GetChannel(ulong id) + public ISocketGuildChannel GetChannel(ulong id) { - return Discord.DataStore.GetChannel(id) as ICachedGuildChannel; + return Discord.DataStore.GetChannel(id) as ISocketGuildChannel; } - public ICachedGuildChannel RemoveChannel(ulong id) + public ISocketGuildChannel RemoveChannel(ulong id) { _channels.TryRemove(id); - return Discord.DataStore.RemoveChannel(id) as ICachedGuildChannel; + return Discord.DataStore.RemoveChannel(id) as ISocketGuildChannel; } public Role AddRole(RoleModel model, ConcurrentDictionary roles = null) @@ -183,48 +183,48 @@ namespace Discord => Task.FromResult(CurrentUser); public override Task> GetUsersAsync() => Task.FromResult>(Members); - public CachedGuildUser AddUser(MemberModel model, DataStore dataStore, ConcurrentDictionary members = null) + public SocketGuildUser AddUser(MemberModel model, DataStore dataStore, ConcurrentDictionary members = null) { members = members ?? _members; - CachedGuildUser member; + SocketGuildUser member; if (members.TryGetValue(model.User.Id, out member)) member.Update(model, UpdateSource.WebSocket); else { var user = Discord.GetOrAddUser(model.User, dataStore); - member = new CachedGuildUser(this, user, model); + member = new SocketGuildUser(this, user, model); members[user.Id] = member; DownloadedMemberCount++; } return member; } - public CachedGuildUser AddOrUpdateUser(PresenceModel model, DataStore dataStore, ConcurrentDictionary members = null) + public SocketGuildUser AddOrUpdateUser(PresenceModel model, DataStore dataStore, ConcurrentDictionary members = null) { members = members ?? _members; - CachedGuildUser member; + SocketGuildUser member; if (members.TryGetValue(model.User.Id, out member)) member.Update(model, UpdateSource.WebSocket); else { var user = Discord.GetOrAddUser(model.User, dataStore); - member = new CachedGuildUser(this, user, model); + member = new SocketGuildUser(this, user, model); members[user.Id] = member; DownloadedMemberCount++; } return member; } - public CachedGuildUser GetUser(ulong id) + public SocketGuildUser GetUser(ulong id) { - CachedGuildUser member; + SocketGuildUser member; if (_members.TryGetValue(id, out member)) return member; return null; } - public CachedGuildUser RemoveUser(ulong id) + public SocketGuildUser RemoveUser(ulong id) { - CachedGuildUser member; + SocketGuildUser member; if (_members.TryRemove(id, out member)) return member; return null; @@ -240,7 +240,7 @@ namespace Discord public VoiceState AddOrUpdateVoiceState(VoiceStateModel model, DataStore dataStore, ConcurrentDictionary voiceStates = null) { - var voiceChannel = dataStore.GetChannel(model.ChannelId.Value) as CachedVoiceChannel; + var voiceChannel = dataStore.GetChannel(model.ChannelId.Value) as SocketVoiceChannel; var voiceState = new VoiceState(voiceChannel, model); (voiceStates ?? _voiceStates)[model.UserId] = voiceState; return voiceState; @@ -309,16 +309,16 @@ namespace Discord await audioClient.ConnectAsync(url, CurrentUser.Id, voiceState.VoiceSessionId, token).ConfigureAwait(false); } - public CachedGuild Clone() => MemberwiseClone() as CachedGuild; + public SocketGuild Clone() => MemberwiseClone() as SocketGuild; - new internal ICachedGuildChannel ToChannel(ChannelModel model) + new internal ISocketGuildChannel ToChannel(ChannelModel model) { switch (model.Type) { case ChannelType.Text: - return new CachedTextChannel(this, model); + return new SocketTextChannel(this, model); case ChannelType.Voice: - return new CachedVoiceChannel(this, model); + return new SocketVoiceChannel(this, model); default: throw new InvalidOperationException($"Unexpected channel type: {model.Type}"); } diff --git a/src/Discord.Net/Entities/WebSocket/ICachedGuildChannel.cs b/src/Discord.Net/Entities/WebSocket/ICachedGuildChannel.cs deleted file mode 100644 index 290bff64e..000000000 --- a/src/Discord.Net/Entities/WebSocket/ICachedGuildChannel.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Discord -{ - internal interface ICachedGuildChannel : ICachedChannel, IGuildChannel - { - new CachedGuild Guild { get; } - } -} diff --git a/src/Discord.Net/Entities/WebSocket/ICachedMessageChannel.cs b/src/Discord.Net/Entities/WebSocket/ICachedMessageChannel.cs deleted file mode 100644 index 9704198b0..000000000 --- a/src/Discord.Net/Entities/WebSocket/ICachedMessageChannel.cs +++ /dev/null @@ -1,16 +0,0 @@ -using System.Collections.Generic; -using MessageModel = Discord.API.Message; - -namespace Discord -{ - internal interface ICachedMessageChannel : ICachedChannel, IMessageChannel - { - IReadOnlyCollection Members { get; } - - CachedMessage AddMessage(ICachedUser author, MessageModel model); - CachedMessage GetMessage(ulong id); - CachedMessage RemoveMessage(ulong id); - - ICachedUser GetUser(ulong id, bool skipCheck = false); - } -} diff --git a/src/Discord.Net/Entities/WebSocket/ICachedPrivateChannel.cs b/src/Discord.Net/Entities/WebSocket/ICachedPrivateChannel.cs deleted file mode 100644 index af2d885be..000000000 --- a/src/Discord.Net/Entities/WebSocket/ICachedPrivateChannel.cs +++ /dev/null @@ -1,9 +0,0 @@ -using System.Collections.Generic; - -namespace Discord -{ - internal interface ICachedPrivateChannel : ICachedChannel, IPrivateChannel - { - new IReadOnlyCollection Recipients { get; } - } -} diff --git a/src/Discord.Net/Entities/WebSocket/ICachedUser.cs b/src/Discord.Net/Entities/WebSocket/ICachedUser.cs deleted file mode 100644 index fbae8c5ff..000000000 --- a/src/Discord.Net/Entities/WebSocket/ICachedUser.cs +++ /dev/null @@ -1,9 +0,0 @@ -namespace Discord -{ - internal interface ICachedUser : IUser, ICachedEntity - { - CachedGlobalUser User { get; } - - ICachedUser Clone(); - } -} diff --git a/src/Discord.Net/Entities/WebSocket/Messages/SocketMessage.cs b/src/Discord.Net/Entities/WebSocket/Messages/SocketMessage.cs new file mode 100644 index 000000000..71d73a525 --- /dev/null +++ b/src/Discord.Net/Entities/WebSocket/Messages/SocketMessage.cs @@ -0,0 +1,19 @@ +using Model = Discord.API.Message; + +namespace Discord +{ + internal class SocketMessage : Message + { + internal override bool IsAttached => true; + + public new DiscordSocketClient Discord => base.Discord as DiscordSocketClient; + public new ISocketMessageChannel Channel => base.Channel as ISocketMessageChannel; + + public SocketMessage(ISocketMessageChannel channel, IUser author, Model model) + : base(channel, author, model) + { + } + + public SocketMessage Clone() => MemberwiseClone() as SocketMessage; + } +} diff --git a/src/Discord.Net/Entities/WebSocket/Users/ISocketUser.cs b/src/Discord.Net/Entities/WebSocket/Users/ISocketUser.cs new file mode 100644 index 000000000..4b0b7bfdf --- /dev/null +++ b/src/Discord.Net/Entities/WebSocket/Users/ISocketUser.cs @@ -0,0 +1,9 @@ +namespace Discord +{ + internal interface ISocketUser : IUser, IEntity + { + SocketGlobalUser User { get; } + + ISocketUser Clone(); + } +} diff --git a/src/Discord.Net/Entities/WebSocket/Presence.cs b/src/Discord.Net/Entities/WebSocket/Users/Presence.cs similarity index 100% rename from src/Discord.Net/Entities/WebSocket/Presence.cs rename to src/Discord.Net/Entities/WebSocket/Users/Presence.cs diff --git a/src/Discord.Net/Entities/WebSocket/CachedDMUser.cs b/src/Discord.Net/Entities/WebSocket/Users/SocketDMUser.cs similarity index 75% rename from src/Discord.Net/Entities/WebSocket/CachedDMUser.cs rename to src/Discord.Net/Entities/WebSocket/Users/SocketDMUser.cs index 633956a3a..e56dd53ee 100644 --- a/src/Discord.Net/Entities/WebSocket/CachedDMUser.cs +++ b/src/Discord.Net/Entities/WebSocket/Users/SocketDMUser.cs @@ -5,11 +5,12 @@ using PresenceModel = Discord.API.Presence; namespace Discord { [DebuggerDisplay("{DebuggerDisplay,nq}")] - internal class CachedDMUser : ICachedUser + internal class SocketDMUser : ISocketUser { - bool IEntity.IsAttached => true; + internal bool IsAttached => true; + bool IEntity.IsAttached => IsAttached; - public CachedGlobalUser User { get; } + public SocketGlobalUser User { get; } public DiscordSocketClient Discord => User.Discord; @@ -22,12 +23,11 @@ namespace Discord public DateTimeOffset CreatedAt => User.CreatedAt; public string Discriminator => User.Discriminator; public ushort DiscriminatorValue => User.DiscriminatorValue; - public bool IsAttached => User.IsAttached; public bool IsBot => User.IsBot; public string Mention => MentionUtils.Mention(this); public string Username => User.Username; - public CachedDMUser(CachedGlobalUser user) + public SocketDMUser(SocketGlobalUser user) { User = user; } @@ -37,8 +37,8 @@ namespace Discord User.Update(model, source); } - public CachedDMUser Clone() => MemberwiseClone() as CachedDMUser; - ICachedUser ICachedUser.Clone() => Clone(); + public SocketDMUser Clone() => MemberwiseClone() as SocketDMUser; + ISocketUser ISocketUser.Clone() => Clone(); public override string ToString() => $"{Username}#{Discriminator}"; private string DebuggerDisplay => $"{Username}#{Discriminator} ({Id})"; diff --git a/src/Discord.Net/Entities/WebSocket/CachedGlobalUser.cs b/src/Discord.Net/Entities/WebSocket/Users/SocketGlobalUser.cs similarity index 79% rename from src/Discord.Net/Entities/WebSocket/CachedGlobalUser.cs rename to src/Discord.Net/Entities/WebSocket/Users/SocketGlobalUser.cs index 818b2f45e..96bbdd556 100644 --- a/src/Discord.Net/Entities/WebSocket/CachedGlobalUser.cs +++ b/src/Discord.Net/Entities/WebSocket/Users/SocketGlobalUser.cs @@ -4,18 +4,18 @@ using PresenceModel = Discord.API.Presence; namespace Discord { - internal class CachedGlobalUser : User, ICachedUser + internal class SocketGlobalUser : User, ISocketUser { - bool IEntity.IsAttached => true; + internal override bool IsAttached => true; private ushort _references; public Presence Presence { get; private set; } public new DiscordSocketClient Discord { get { throw new NotSupportedException(); } } - CachedGlobalUser ICachedUser.User => this; + SocketGlobalUser ISocketUser.User => this; - public CachedGlobalUser(Model model) + public SocketGlobalUser(Model model) : base(model) { } @@ -53,7 +53,7 @@ namespace Discord //} } - public CachedGlobalUser Clone() => MemberwiseClone() as CachedGlobalUser; - ICachedUser ICachedUser.Clone() => Clone(); + public SocketGlobalUser Clone() => MemberwiseClone() as SocketGlobalUser; + ISocketUser ISocketUser.Clone() => Clone(); } } diff --git a/src/Discord.Net/Entities/WebSocket/CachedGroupUser.cs b/src/Discord.Net/Entities/WebSocket/Users/SocketGroupUser.cs similarity index 62% rename from src/Discord.Net/Entities/WebSocket/CachedGroupUser.cs rename to src/Discord.Net/Entities/WebSocket/Users/SocketGroupUser.cs index c52a7d322..0de43c9b9 100644 --- a/src/Discord.Net/Entities/WebSocket/CachedGroupUser.cs +++ b/src/Discord.Net/Entities/WebSocket/Users/SocketGroupUser.cs @@ -3,13 +3,13 @@ namespace Discord { [DebuggerDisplay("{DebuggerDisplay,nq}")] - internal class CachedGroupUser : GroupUser, ICachedUser + internal class SocketGroupUser : GroupUser, ISocketUser { - bool IEntity.IsAttached => true; + internal override bool IsAttached => true; public new DiscordSocketClient Discord => base.Discord as DiscordSocketClient; - public new CachedGroupChannel Channel => base.Channel as CachedGroupChannel; - public new CachedGlobalUser User => base.User as CachedGlobalUser; + public new SocketGroupChannel Channel => base.Channel as SocketGroupChannel; + public new SocketGlobalUser User => base.User as SocketGlobalUser; public Presence Presence => User.Presence; //{ get; private set; } public override Game Game => Presence.Game; @@ -19,15 +19,15 @@ namespace Discord public bool IsSelfDeafened => VoiceState?.IsSelfDeafened ?? false; public bool IsSelfMuted => VoiceState?.IsSelfMuted ?? false; public bool IsSuppressed => VoiceState?.IsSuppressed ?? false; - public CachedVoiceChannel VoiceChannel => VoiceState?.VoiceChannel; + public SocketVoiceChannel VoiceChannel => VoiceState?.VoiceChannel; - public CachedGroupUser(CachedGroupChannel channel, CachedGlobalUser user) + public SocketGroupUser(SocketGroupChannel channel, SocketGlobalUser user) : base(channel, user) { } - public CachedGroupUser Clone() => MemberwiseClone() as CachedGroupUser; - ICachedUser ICachedUser.Clone() => Clone(); + public SocketGroupUser Clone() => MemberwiseClone() as SocketGroupUser; + ISocketUser ISocketUser.Clone() => Clone(); public override string ToString() => $"{Username}#{Discriminator}"; private string DebuggerDisplay => $"{Username}#{Discriminator} ({Id})"; diff --git a/src/Discord.Net/Entities/WebSocket/CachedGuildUser.cs b/src/Discord.Net/Entities/WebSocket/Users/SocketGuildUser.cs similarity index 69% rename from src/Discord.Net/Entities/WebSocket/CachedGuildUser.cs rename to src/Discord.Net/Entities/WebSocket/Users/SocketGuildUser.cs index 14a90092a..a2fe29d46 100644 --- a/src/Discord.Net/Entities/WebSocket/CachedGuildUser.cs +++ b/src/Discord.Net/Entities/WebSocket/Users/SocketGuildUser.cs @@ -3,13 +3,13 @@ using PresenceModel = Discord.API.Presence; namespace Discord { - internal class CachedGuildUser : GuildUser, ICachedUser + internal class SocketGuildUser : GuildUser, ISocketUser { - bool IEntity.IsAttached => true; + internal override bool IsAttached => true; public new DiscordSocketClient Discord => base.Discord as DiscordSocketClient; - public new CachedGuild Guild => base.Guild as CachedGuild; - public new CachedGlobalUser User => base.User as CachedGlobalUser; + public new SocketGuild Guild => base.Guild as SocketGuild; + public new SocketGlobalUser User => base.User as SocketGlobalUser; public Presence Presence => User.Presence; //{ get; private set; } public override Game Game => Presence.Game; @@ -19,14 +19,14 @@ namespace Discord public bool IsSelfDeafened => VoiceState?.IsSelfDeafened ?? false; public bool IsSelfMuted => VoiceState?.IsSelfMuted ?? false; public bool IsSuppressed => VoiceState?.IsSuppressed ?? false; - public CachedVoiceChannel VoiceChannel => VoiceState?.VoiceChannel; + public SocketVoiceChannel VoiceChannel => VoiceState?.VoiceChannel; - public CachedGuildUser(CachedGuild guild, CachedGlobalUser user, Model model) + public SocketGuildUser(SocketGuild guild, SocketGlobalUser user, Model model) : base(guild, user, model) { //Presence = new Presence(null, UserStatus.Offline); } - public CachedGuildUser(CachedGuild guild, CachedGlobalUser user, PresenceModel model) + public SocketGuildUser(SocketGuild guild, SocketGlobalUser user, PresenceModel model) : base(guild, user, model) { } @@ -41,7 +41,7 @@ namespace Discord User.Update(model, source); } - public CachedGuildUser Clone() => MemberwiseClone() as CachedGuildUser; - ICachedUser ICachedUser.Clone() => Clone(); + public SocketGuildUser Clone() => MemberwiseClone() as SocketGuildUser; + ISocketUser ISocketUser.Clone() => Clone(); } } diff --git a/src/Discord.Net/Entities/WebSocket/Users/SocketSelfUser.cs b/src/Discord.Net/Entities/WebSocket/Users/SocketSelfUser.cs new file mode 100644 index 000000000..a4a6aa733 --- /dev/null +++ b/src/Discord.Net/Entities/WebSocket/Users/SocketSelfUser.cs @@ -0,0 +1,21 @@ +using System; +using Model = Discord.API.User; + +namespace Discord +{ + internal class SocketSelfUser : SelfUser, ISocketUser + { + internal override bool IsAttached => true; + + public new DiscordSocketClient Discord => base.Discord as DiscordSocketClient; + SocketGlobalUser ISocketUser.User { get { throw new NotSupportedException(); } } + + public SocketSelfUser(DiscordSocketClient discord, Model model) + : base(discord, model) + { + } + + public SocketSelfUser Clone() => MemberwiseClone() as SocketSelfUser; + ISocketUser ISocketUser.Clone() => Clone(); + } +} diff --git a/src/Discord.Net/Entities/WebSocket/VoiceState.cs b/src/Discord.Net/Entities/WebSocket/Users/VoiceState.cs similarity index 89% rename from src/Discord.Net/Entities/WebSocket/VoiceState.cs rename to src/Discord.Net/Entities/WebSocket/Users/VoiceState.cs index 275108476..138c025a8 100644 --- a/src/Discord.Net/Entities/WebSocket/VoiceState.cs +++ b/src/Discord.Net/Entities/WebSocket/Users/VoiceState.cs @@ -19,7 +19,7 @@ namespace Discord private readonly Flags _voiceStates; - public CachedVoiceChannel VoiceChannel { get; } + public SocketVoiceChannel VoiceChannel { get; } public string VoiceSessionId { get; } public bool IsMuted => (_voiceStates & Flags.Muted) != 0; @@ -28,9 +28,9 @@ namespace Discord public bool IsSelfMuted => (_voiceStates & Flags.SelfMuted) != 0; public bool IsSelfDeafened => (_voiceStates & Flags.SelfDeafened) != 0; - public VoiceState(CachedVoiceChannel voiceChannel, Model model) + public VoiceState(SocketVoiceChannel voiceChannel, Model model) : this(voiceChannel, model.SessionId, model.SelfMute, model.SelfDeaf, model.Suppress) { } - public VoiceState(CachedVoiceChannel voiceChannel, string sessionId, bool isSelfMuted, bool isSelfDeafened, bool isSuppressed) + public VoiceState(SocketVoiceChannel voiceChannel, string sessionId, bool isSelfMuted, bool isSelfDeafened, bool isSuppressed) { VoiceChannel = voiceChannel; VoiceSessionId = sessionId;