@@ -11,18 +11,18 @@ namespace Discord.Collections | |||
_msgCleaner = new MessageCleaner(client); | |||
} | |||
internal Message GetOrAdd(string id, string channelId) => GetOrAdd(id, () => new Message(_client, id, channelId)); | |||
internal Message GetOrAdd(string id, string channelId, string userId) => GetOrAdd(id, () => new Message(_client, id, channelId, userId)); | |||
internal new Message TryRemove(string id) => base.TryRemove(id); | |||
internal new Message Remap(string oldKey, string newKey) => base.Remap(oldKey, newKey); | |||
protected override void OnCreated(Message item) | |||
{ | |||
item.Channel.AddMessage(item.UserId); | |||
item.Channel.AddMessage(item.Id); | |||
item.User.AddRef(); | |||
} | |||
protected override void OnRemoved(Message item) | |||
{ | |||
item.Channel.RemoveMessage(item.UserId); | |||
item.Channel.RemoveMessage(item.Id); | |||
item.User.RemoveRef(); | |||
} | |||
@@ -254,7 +254,7 @@ namespace Discord | |||
var nonce = GenerateNonce(); | |||
if (_config.UseMessageQueue) | |||
{ | |||
var msg = _messages.GetOrAdd("nonce_" + nonce, channelId); | |||
var msg = _messages.GetOrAdd("nonce_" + nonce, channelId, _currentUserId); | |||
msg.Update(new Net.API.Message | |||
{ | |||
Content = blockText, | |||
@@ -269,9 +269,9 @@ namespace Discord | |||
} | |||
else | |||
{ | |||
var response = await _api.SendMessage(channelId, blockText, mentions, nonce).ConfigureAwait(false); | |||
var msg = _messages.GetOrAdd(response.Id, channelId); | |||
msg.Update(response); | |||
var model = await _api.SendMessage(channelId, blockText, mentions, nonce).ConfigureAwait(false); | |||
var msg = _messages.GetOrAdd(model.Id, channelId, model.Author.Id); | |||
msg.Update(model); | |||
try { RaiseMessageSent(result[i]); } catch { } | |||
} | |||
await Task.Delay(1000).ConfigureAwait(false); | |||
@@ -319,9 +319,9 @@ namespace Discord | |||
if (text.Length > DiscordAPIClient.MaxMessageSize) | |||
text = text.Substring(0, DiscordAPIClient.MaxMessageSize); | |||
var response = await _api.EditMessage(channelId, messageId, text, mentions).ConfigureAwait(false); | |||
var msg = _messages.GetOrAdd(messageId, channelId); | |||
msg.Update(response); | |||
var model = await _api.EditMessage(channelId, messageId, text, mentions).ConfigureAwait(false); | |||
var msg = _messages.GetOrAdd(messageId, channelId, model.Author.Id); | |||
msg.Update(model); | |||
} | |||
/// <summary> Deletes the provided message. </summary> | |||
@@ -402,7 +402,7 @@ namespace Discord | |||
var msgs = await _api.GetMessages(channel.Id, count).ConfigureAwait(false); | |||
return msgs.Select(x => | |||
{ | |||
var msg = _messages.GetOrAdd(x.Id, x.ChannelId); | |||
var msg = _messages.GetOrAdd(x.Id, x.ChannelId, x.Author.Id); | |||
msg.Update(x); | |||
if (_config.TrackActivity) | |||
{ | |||
@@ -42,23 +42,36 @@ namespace Discord | |||
/// <summary> Returns the current logged-in user. </summary> | |||
public User CurrentUser => _currentUser; | |||
private User _currentUser; | |||
/// <summary> Returns the id of the server this user is currently connected to for voice. </summary> | |||
public string CurrentVoiceServerId => _voiceSocket.CurrentVoiceServerId; | |||
/// <summary> Returns the server this user is currently connected to for voice. </summary> | |||
public Server CurrentVoiceServer => _servers[_voiceSocket.CurrentVoiceServerId]; | |||
/// <summary> Returns the current connection state of this client. </summary> | |||
public DiscordClientState State => (DiscordClientState)_state; | |||
private int _state; | |||
/// <summary> Returns the configuration object used to make this client. Note that this object cannot be edited directly - to change the configuration of this client, use the DiscordClient(DiscordClientConfig config) constructor. </summary> | |||
public DiscordClientConfig Config => _config; | |||
private readonly DiscordClientConfig _config; | |||
/// <summary> Returns a collection of all channels this client is a member of. </summary> | |||
public Channels Channels => _channels; | |||
private readonly Channels _channels; | |||
/// <summary> Returns a collection of all user-server pairs this client can currently see. </summary> | |||
public Members Members => _members; | |||
private readonly Members _members; | |||
/// <summary> Returns a collection of all messages this client has seen since logging in and currently has in cache. </summary> | |||
public Messages Messages => _messages; | |||
private readonly Messages _messages; | |||
//TODO: Do we need the roles cache? | |||
/// <summary> Returns a collection of all role-server pairs this client can currently see. </summary> | |||
public Roles Roles => _roles; | |||
private readonly Roles _roles; | |||
/// <summary> Returns a collection of all servers this client is a member of. </summary> | |||
public Servers Servers => _servers; | |||
private readonly Servers _servers; | |||
/// <summary> Returns a collection of all users this client can currently see. </summary> | |||
public Users Users => _users; | |||
private readonly Users _users; | |||
@@ -343,7 +356,7 @@ namespace Discord | |||
} | |||
if (msg == null) | |||
msg = _messages.GetOrAdd(data.Id, data.ChannelId); | |||
msg = _messages.GetOrAdd(data.Id, data.ChannelId, data.Author.Id); | |||
msg.Update(data); | |||
if (_config.TrackActivity) | |||
msg.User.UpdateActivity(data.Timestamp); | |||
@@ -355,7 +368,7 @@ namespace Discord | |||
case "MESSAGE_UPDATE": | |||
{ | |||
var data = e.Payload.ToObject<Events.MessageUpdate>(_serializer); | |||
var msg = _messages.GetOrAdd(data.Id, data.ChannelId); | |||
var msg = _messages.GetOrAdd(data.Id, data.ChannelId, data.Author.Id); | |||
msg.Update(data); | |||
RaiseEvent(nameof(MessageUpdated), () => RaiseMessageUpdated(msg)); | |||
} | |||
@@ -114,11 +114,12 @@ namespace Discord | |||
[JsonIgnore] | |||
public Member Member => _client.Members[ServerId, UserId]; | |||
internal Message(DiscordClient client, string id, string channelId) | |||
internal Message(DiscordClient client, string id, string channelId, string userId) | |||
{ | |||
_client = client; | |||
Id = id; | |||
ChannelId = channelId; | |||
UserId = userId; | |||
} | |||
internal void Update(Net.API.Message model) | |||