From 2acd4f8861a9c4dc40f86b0cd5492c641d1862f7 Mon Sep 17 00:00:00 2001 From: RogueException Date: Sun, 25 Oct 2015 02:00:55 -0300 Subject: [PATCH] Even more bug fixes --- src/Discord.Net.Commands/CommandsPlugin.cs | 2 +- src/Discord.Net/DiscordClient.Messages.cs | 2 +- src/Discord.Net/DiscordClient.Servers.cs | 2 -- src/Discord.Net/DiscordClient.Users.cs | 2 +- src/Discord.Net/DiscordClient.Voice.cs | 28 +++++++++----------- src/Discord.Net/DiscordClient.cs | 2 +- src/Discord.Net/Models/Channel.cs | 9 ++++--- src/Discord.Net/Models/GlobalUser.cs | 22 ++++++++++++---- src/Discord.Net/Models/Invite.cs | 4 +-- src/Discord.Net/Models/Message.cs | 30 ++++++++++++---------- src/Discord.Net/Models/User.cs | 2 +- 11 files changed, 57 insertions(+), 48 deletions(-) diff --git a/src/Discord.Net.Commands/CommandsPlugin.cs b/src/Discord.Net.Commands/CommandsPlugin.cs index dc2446a51..80e682162 100644 --- a/src/Discord.Net.Commands/CommandsPlugin.cs +++ b/src/Discord.Net.Commands/CommandsPlugin.cs @@ -35,7 +35,7 @@ namespace Discord.Commands return; //Ignore messages from ourselves - if (e.Message.UserId == client.CurrentUserId) + if (e.Message.User == client.CurrentUser) return; //Check for the command character diff --git a/src/Discord.Net/DiscordClient.Messages.cs b/src/Discord.Net/DiscordClient.Messages.cs index 7b7311cdb..70a57bebd 100644 --- a/src/Discord.Net/DiscordClient.Messages.cs +++ b/src/Discord.Net/DiscordClient.Messages.cs @@ -248,7 +248,7 @@ namespace Discord SendMessageResponse response = null; try { - response = await _api.SendMessage(msg.Channel.Id, msg.RawText, msg.MentionIds, msg.Nonce, msg.IsTTS).ConfigureAwait(false); + response = await _api.SendMessage(msg.Channel.Id, msg.RawText, msg.Mentions.Select(x => x.Id), msg.Nonce, msg.IsTTS).ConfigureAwait(false); } catch (WebException) { break; } catch (HttpException) { hasFailed = true; } diff --git a/src/Discord.Net/DiscordClient.Servers.cs b/src/Discord.Net/DiscordClient.Servers.cs index 0db0ba1f3..fbe417227 100644 --- a/src/Discord.Net/DiscordClient.Servers.cs +++ b/src/Discord.Net/DiscordClient.Servers.cs @@ -61,8 +61,6 @@ namespace Discord internal Servers Servers => _servers; private readonly Servers _servers; - public Server PMServer { get; } - /// Returns the server with the specified id, or null if none was found. public Server GetServer(string id) => _servers[id]; diff --git a/src/Discord.Net/DiscordClient.Users.cs b/src/Discord.Net/DiscordClient.Users.cs index ba9a083ae..7202da0e8 100644 --- a/src/Discord.Net/DiscordClient.Users.cs +++ b/src/Discord.Net/DiscordClient.Users.cs @@ -29,7 +29,7 @@ namespace Discord RaiseEvent(nameof(UserRemoved), () => UserRemoved(this, new MemberEventArgs(member))); } public event EventHandler ProfileUpdated; - private void RaiseProfileUpdated(GlobalUser user) + private void RaiseProfileUpdated() { if (ProfileUpdated != null) RaiseEvent(nameof(ProfileUpdated), () => ProfileUpdated(this, EventArgs.Empty)); diff --git a/src/Discord.Net/DiscordClient.Voice.cs b/src/Discord.Net/DiscordClient.Voice.cs index 6562a9461..5d47386d9 100644 --- a/src/Discord.Net/DiscordClient.Voice.cs +++ b/src/Discord.Net/DiscordClient.Voice.cs @@ -7,40 +7,38 @@ namespace Discord public partial class DiscordClient { public IDiscordVoiceClient GetVoiceClient(Server server) - => GetVoiceClient(server.Id); - public IDiscordVoiceClient GetVoiceClient(string serverId) { - if (serverId == null) throw new ArgumentNullException(nameof(serverId)); + if (server.Id == null) throw new ArgumentNullException(nameof(server.Id)); if (!Config.EnableVoiceMultiserver) { - if (serverId == _voiceServerId) + if (server.Id == _voiceServerId) return this; else return null; } DiscordWSClient client; - if (_voiceClients.TryGetValue(serverId, out client)) + if (_voiceClients.TryGetValue(server.Id, out client)) return client; else return null; } - private async Task CreateVoiceClient(string serverId) + private async Task CreateVoiceClient(Server server) { if (!Config.EnableVoiceMultiserver) { - _voiceServerId = serverId; + _voiceServerId = server.Id; return this; } - var client = _voiceClients.GetOrAdd(serverId, _ => + var client = _voiceClients.GetOrAdd(server.Id, _ => { var config = _config.Clone(); config.LogLevel = _config.LogLevel;// (LogMessageSeverity)Math.Min((int)_config.LogLevel, (int)LogMessageSeverity.Warning); config.VoiceOnly = true; config.VoiceClientId = unchecked(++_nextVoiceClientId); - return new DiscordWSClient(config, serverId); + return new DiscordWSClient(config, server.Id); }); client.LogMessage += (s, e) => RaiseOnLog(e.Severity, e.Source, $"(#{client.Config.VoiceClientId}) {e.Message}"); await client.Connect(_gateway, _token).ConfigureAwait(false); @@ -52,28 +50,26 @@ namespace Discord if (channel == null) throw new ArgumentNullException(nameof(channel)); CheckReady(); //checkVoice is done inside the voice client - var client = await CreateVoiceClient(channel.Server.Id).ConfigureAwait(false); + var client = await CreateVoiceClient(channel.Server).ConfigureAwait(false); await client.JoinChannel(channel.Id).ConfigureAwait(false); return client; } - public Task LeaveVoiceServer(Server server) - => LeaveVoiceServer(server?.Id); - public async Task LeaveVoiceServer(string serverId) + public async Task LeaveVoiceServer(Server server) { + if (server == null) throw new ArgumentNullException(nameof(server)); CheckReady(checkVoice: true); - if (serverId == null) throw new ArgumentNullException(nameof(serverId)); if (Config.EnableVoiceMultiserver) { DiscordWSClient client; - if (_voiceClients.TryRemove(serverId, out client)) + if (_voiceClients.TryRemove(server.Id, out client)) await client.Disconnect().ConfigureAwait(false); } else { await _voiceSocket.Disconnect().ConfigureAwait(false); - _dataSocket.SendLeaveVoice(serverId); + _dataSocket.SendLeaveVoice(server.Id); } } } diff --git a/src/Discord.Net/DiscordClient.cs b/src/Discord.Net/DiscordClient.cs index 56b6bcb18..f92ac86ee 100644 --- a/src/Discord.Net/DiscordClient.cs +++ b/src/Discord.Net/DiscordClient.cs @@ -599,7 +599,7 @@ namespace Discord if (user != null) { user.Update(data); - RaiseProfileUpdated(user); + RaiseProfileUpdated(); } } break; diff --git a/src/Discord.Net/Models/Channel.cs b/src/Discord.Net/Models/Channel.cs index 1eda52a87..e741476cb 100644 --- a/src/Discord.Net/Models/Channel.cs +++ b/src/Discord.Net/Models/Channel.cs @@ -84,11 +84,11 @@ namespace Discord } internal override void OnCached() { - if (IsPrivate) { - var recipient = _client.Users[_recipientId, _serverId]; + var recipient = _client.Users[_recipientId, null]; Name = "@" + recipient.Name; + recipient.GlobalUser.PrivateChannel = this; Recipient = recipient; } else @@ -96,7 +96,8 @@ namespace Discord var server = _client.Servers[_serverId]; server.AddChannel(this); Server = server; - } + Recipient = null; + } } internal override void OnUncached() { @@ -104,7 +105,7 @@ namespace Discord if (server != null) server.RemoveChannel(this); Server = null; - + var recipient = Recipient; if (recipient != null) recipient.GlobalUser.PrivateChannel = null; diff --git a/src/Discord.Net/Models/GlobalUser.cs b/src/Discord.Net/Models/GlobalUser.cs index 38dc96a05..72cc2c9bf 100644 --- a/src/Discord.Net/Models/GlobalUser.cs +++ b/src/Discord.Net/Models/GlobalUser.cs @@ -22,7 +22,17 @@ namespace Discord /// Returns the private messaging channel with this user, if one exists. [JsonIgnore] - public Channel PrivateChannel { get; internal set; } + public Channel PrivateChannel + { + get { return _privateChannel; } + internal set + { + _privateChannel = value; + if (value == null) + CheckUser(); + } + } + private Channel _privateChannel; /// Returns a collection of all server-specific data for every server this user is a member of. [JsonIgnore] @@ -51,10 +61,12 @@ namespace Discord internal void RemoveUser(User user) { if (_users.TryRemove(user.UniqueId, out user)) - { - if (_users.Count == 0) - _client.GlobalUsers.TryRemove(Id); - } + CheckUser(); + } + internal void CheckUser() + { + if (_users.Count == 0 && PrivateChannel == null) + _client.GlobalUsers.TryRemove(Id); } public override string ToString() => Id; diff --git a/src/Discord.Net/Models/Invite.cs b/src/Discord.Net/Models/Invite.cs index 0a7c1aad6..8a8fec544 100644 --- a/src/Discord.Net/Models/Invite.cs +++ b/src/Discord.Net/Models/Invite.cs @@ -6,8 +6,6 @@ namespace Discord { public sealed class Invite : CachedObject { - /// Returns the unique code for this invite. - public string Code { get; private set; } /// Returns, if enabled, an alternative human-readable code for URLs. public string XkcdCode { get; } /// Time (in seconds) until the invite expires. Set to 0 to never expire. @@ -22,7 +20,7 @@ namespace Discord public bool IsTemporary { get; private set; } /// Returns a URL for this invite using XkcdCode if available or Id if not. - public string Url => API.Endpoints.InviteUrl(XkcdCode ?? Code); + public string Url => API.Endpoints.InviteUrl(XkcdCode ?? Id); /// Returns the user that created this invite. [JsonIgnore] diff --git a/src/Discord.Net/Models/Message.cs b/src/Discord.Net/Models/Message.cs index f195ef771..8062fb82d 100644 --- a/src/Discord.Net/Models/Message.cs +++ b/src/Discord.Net/Models/Message.cs @@ -92,7 +92,6 @@ namespace Discord } private string _cleanText; - private string _channelId, _userId; /// Returns the local unique identifier for this message. public string Nonce { get; internal set; } @@ -123,10 +122,7 @@ namespace Discord /// Returns a collection of all embeded content in this message. public Embed[] Embeds { get; private set; } private static readonly Embed[] _initialEmbeds = new Embed[0]; - - private static readonly string[] _initialMentions = new string[0]; - /// Returns a collection of all user ids mentioned in this message. - public string[] MentionIds { get; private set; } + /// Returns a collection of all users mentioned in this message. [JsonIgnore] public IEnumerable Mentions { get; internal set; } @@ -137,14 +133,14 @@ namespace Discord /// Returns the channel this message was sent to. [JsonIgnore] public Channel Channel { get; private set; } + private readonly string _channelId; /// Returns true if the current user created this message. - public bool IsAuthor => _client.CurrentUserId == UserId; - /// Returns the id of the author of this message. - public string UserId { get; } + public bool IsAuthor => _client.CurrentUserId == _userId; /// Returns the author of this message. [JsonIgnore] - public User User => _client.Users[_userId, Channel.Server.Id]; + public User User { get; private set; } + private readonly string _userId; internal Message(DiscordClient client, string id, string channelId, string userId) : base(client, id) @@ -153,7 +149,6 @@ namespace Discord _userId = userId; Attachments = _initialAttachments; Embeds = _initialEmbeds; - MentionIds = _initialMentions; } internal override void OnCached() { @@ -161,6 +156,10 @@ namespace Discord var channel = _client.Channels[_channelId]; channel.AddMessage(this); Channel = channel; + + var user = _client.Users[_channelId, channel.Server?.Id]; + //user.AddMessage(this); + User = user; } internal override void OnUncached() { @@ -169,7 +168,12 @@ namespace Discord if (channel != null) channel.RemoveMessage(this); Channel = null; - } + + var user = User; + /*if (user != null) + user.RemoveMessage(this);*/ + User = null; + } internal void Update(MessageInfo model) { @@ -207,8 +211,8 @@ namespace Discord EditedTimestamp = model.EditedTimestamp; if (model.Mentions != null) { - MentionIds = model.Mentions.Select(x => x.Id)?.ToArray(); - IsMentioningMe = MentionIds.Contains(_client.CurrentUserId); + Mentions = model.Mentions.Select(x => _client.Users[x.Id, Channel.Server?.Id]).ToArray(); + IsMentioningMe = model.Mentions.Any(x => x.Id == _client.CurrentUserId); } if (model.Content != null) { diff --git a/src/Discord.Net/Models/User.cs b/src/Discord.Net/Models/User.cs index 2e4021ac7..6ea6f5d2e 100644 --- a/src/Discord.Net/Models/User.cs +++ b/src/Discord.Net/Models/User.cs @@ -64,7 +64,7 @@ namespace Discord /// Returns a collection of all messages this user has sent on this server that are still in cache. [JsonIgnore] - public IEnumerable Messages => _client.Messages.Where(x => x.UserId == Id && x.Server.Id == _serverId); + public IEnumerable Messages => _client.Messages.Where(x => x.User.Id == Id && x.Server.Id == _serverId); /// Returns a collection of all channels this user is a member of. [JsonIgnore]