Wait for all offline users before raising LoggedIn
This commit is contained in:
@@ -32,6 +32,7 @@ namespace Discord
|
||||
private ConcurrentDictionary<ulong, Channel> _channels;
|
||||
private ConcurrentDictionary<ulong, Channel> _privateChannels; //Key = RecipientId
|
||||
private Dictionary<string, Region> _regions;
|
||||
private Stopwatch _connectionStopwatch;
|
||||
|
||||
internal Logger Logger { get; }
|
||||
|
||||
@@ -109,6 +110,8 @@ namespace Discord
|
||||
//Logging
|
||||
Log = new LogManager(this);
|
||||
Logger = Log.CreateLogger("Discord");
|
||||
if (config.LogLevel >= LogSeverity.Verbose)
|
||||
_connectionStopwatch = new Stopwatch();
|
||||
|
||||
//Async
|
||||
_taskManager = new TaskManager(Cleanup);
|
||||
@@ -143,11 +146,7 @@ namespace Discord
|
||||
ClientAPI = new JsonRestClient(Config, DiscordConfig.ClientAPIUrl, Log.CreateLogger("ClientAPI"));
|
||||
StatusAPI = new JsonRestClient(Config, DiscordConfig.StatusAPIUrl, Log.CreateLogger("StatusAPI"));
|
||||
GatewaySocket = new GatewaySocket(Config, Serializer, Log.CreateLogger("Gateway"));
|
||||
GatewaySocket.Connected += (s, e) =>
|
||||
{
|
||||
if (State == ConnectionState.Connecting)
|
||||
EndConnect();
|
||||
};
|
||||
|
||||
//GatewaySocket.Disconnected += (s, e) => OnDisconnected(e.WasUnexpected, e.Exception);
|
||||
GatewaySocket.ReceivedDispatch += (s, e) => OnReceivedEvent(e);
|
||||
|
||||
@@ -186,7 +185,10 @@ namespace Discord
|
||||
|
||||
Stopwatch stopwatch = null;
|
||||
if (Config.LogLevel >= LogSeverity.Verbose)
|
||||
{
|
||||
_connectionStopwatch.Restart();
|
||||
stopwatch = Stopwatch.StartNew();
|
||||
}
|
||||
State = ConnectionState.Connecting;
|
||||
_disconnectedEvent.Reset();
|
||||
|
||||
@@ -208,7 +210,7 @@ namespace Discord
|
||||
{
|
||||
stopwatch.Stop();
|
||||
double seconds = Math.Round(stopwatch.ElapsedTicks / (double)TimeSpan.TicksPerSecond, 2);
|
||||
Logger.Verbose($"Connection took {seconds} sec");
|
||||
Logger.Verbose($"Handshake + Ready took {seconds} sec");
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -253,11 +255,21 @@ namespace Discord
|
||||
}
|
||||
private void EndConnect()
|
||||
{
|
||||
State = ConnectionState.Connected;
|
||||
_connectedEvent.Set();
|
||||
if (State == ConnectionState.Connecting)
|
||||
{
|
||||
State = ConnectionState.Connected;
|
||||
_connectedEvent.Set();
|
||||
|
||||
SendStatus();
|
||||
OnLoggedIn();
|
||||
if (Config.LogLevel >= LogSeverity.Verbose)
|
||||
{
|
||||
_connectionStopwatch.Stop();
|
||||
double seconds = Math.Round(_connectionStopwatch.ElapsedTicks / (double)TimeSpan.TicksPerSecond, 2);
|
||||
Logger.Verbose($"Connection took {seconds} sec");
|
||||
}
|
||||
|
||||
SendStatus();
|
||||
OnLoggedIn();
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary> Disconnects from the Discord server, canceling any pending requests. </summary>
|
||||
@@ -472,9 +484,6 @@ namespace Discord
|
||||
//Global
|
||||
case "READY":
|
||||
{
|
||||
Stopwatch stopwatch = null;
|
||||
if (Config.LogLevel >= LogSeverity.Verbose)
|
||||
stopwatch = Stopwatch.StartNew();
|
||||
var data = e.Payload.ToObject<ReadyEvent>(Serializer);
|
||||
|
||||
int channelCount = 0;
|
||||
@@ -512,13 +521,8 @@ namespace Discord
|
||||
}
|
||||
if (largeServers.Count > 0)
|
||||
GatewaySocket.SendRequestMembers(largeServers, "", 0);
|
||||
|
||||
if (Config.LogLevel >= LogSeverity.Verbose)
|
||||
{
|
||||
stopwatch.Stop();
|
||||
double seconds = Math.Round(stopwatch.ElapsedTicks / (double)TimeSpan.TicksPerSecond, 2);
|
||||
Logger.Verbose($"READY took {seconds} sec");
|
||||
}
|
||||
else
|
||||
EndConnect();
|
||||
}
|
||||
break;
|
||||
|
||||
@@ -532,9 +536,9 @@ namespace Discord
|
||||
server.Update(data);
|
||||
|
||||
if (data.Unavailable != false)
|
||||
Logger.Debug($"GUILD_CREATE: {server.Path}");
|
||||
Logger.Info($"GUILD_CREATE: {server.Path}");
|
||||
else
|
||||
Logger.Debug($"GUILD_AVAILABLE: {server.Path}");
|
||||
Logger.Info($"GUILD_AVAILABLE: {server.Path}");
|
||||
|
||||
if (data.Unavailable != false)
|
||||
OnJoinedServer(server);
|
||||
@@ -550,7 +554,7 @@ namespace Discord
|
||||
{
|
||||
var before = Config.EnablePreUpdateEvents ? server.Clone() : null;
|
||||
server.Update(data);
|
||||
Logger.Debug($"GUILD_UPDATE: {server.Path}");
|
||||
Logger.Info($"GUILD_UPDATE: {server.Path}");
|
||||
OnServerUpdated(before, server);
|
||||
}
|
||||
else
|
||||
@@ -564,9 +568,9 @@ namespace Discord
|
||||
if (server != null)
|
||||
{
|
||||
if (data.Unavailable != true)
|
||||
Logger.Debug($"GUILD_DELETE: {server.Path}");
|
||||
Logger.Info($"GUILD_DELETE: {server.Path}");
|
||||
else
|
||||
Logger.Debug($"GUILD_UNAVAILABLE: {server.Path}");
|
||||
Logger.Info($"GUILD_UNAVAILABLE: {server.Path}");
|
||||
|
||||
OnServerUnavailable(server);
|
||||
if (data.Unavailable != true)
|
||||
@@ -596,7 +600,7 @@ namespace Discord
|
||||
if (channel != null)
|
||||
{
|
||||
channel.Update(data);
|
||||
Logger.Debug($"CHANNEL_CREATE: {channel.Path}");
|
||||
Logger.Info($"CHANNEL_CREATE: {channel.Path}");
|
||||
OnChannelCreated(channel);
|
||||
}
|
||||
}
|
||||
@@ -609,7 +613,7 @@ namespace Discord
|
||||
{
|
||||
var before = Config.EnablePreUpdateEvents ? channel.Clone() : null;
|
||||
channel.Update(data);
|
||||
Logger.Debug($"CHANNEL_UPDATE: {channel.Path}");
|
||||
Logger.Info($"CHANNEL_UPDATE: {channel.Path}");
|
||||
OnChannelUpdated(before, channel);
|
||||
}
|
||||
else
|
||||
@@ -622,7 +626,7 @@ namespace Discord
|
||||
var channel = RemoveChannel(data.Id);
|
||||
if (channel != null)
|
||||
{
|
||||
Logger.Debug($"CHANNEL_DELETE: {channel.Path}");
|
||||
Logger.Info($"CHANNEL_DELETE: {channel.Path}");
|
||||
OnChannelDestroyed(channel);
|
||||
}
|
||||
else
|
||||
@@ -637,10 +641,10 @@ namespace Discord
|
||||
var server = GetServer(data.GuildId.Value);
|
||||
if (server != null)
|
||||
{
|
||||
var user = server.AddUser(data.User.Id, true);
|
||||
var user = server.AddUser(data.User.Id, true, true);
|
||||
user.Update(data);
|
||||
user.UpdateActivity();
|
||||
Logger.Debug($"GUILD_MEMBER_ADD: {user.Path}");
|
||||
Logger.Info($"GUILD_MEMBER_ADD: {user.Path}");
|
||||
OnUserJoined(user);
|
||||
}
|
||||
else
|
||||
@@ -658,7 +662,7 @@ namespace Discord
|
||||
{
|
||||
var before = Config.EnablePreUpdateEvents ? user.Clone() : null;
|
||||
user.Update(data);
|
||||
Logger.Debug($"GUILD_MEMBER_UPDATE: {user.Path}");
|
||||
Logger.Info($"GUILD_MEMBER_UPDATE: {user.Path}");
|
||||
OnUserUpdated(before, user);
|
||||
}
|
||||
else
|
||||
@@ -677,7 +681,7 @@ namespace Discord
|
||||
var user = server.RemoveUser(data.User.Id);
|
||||
if (user != null)
|
||||
{
|
||||
Logger.Debug($"GUILD_MEMBER_REMOVE: {user.Path}");
|
||||
Logger.Info($"GUILD_MEMBER_REMOVE: {user.Path}");
|
||||
OnUserLeft(user);
|
||||
}
|
||||
else
|
||||
@@ -695,11 +699,23 @@ namespace Discord
|
||||
{
|
||||
foreach (var memberData in data.Members)
|
||||
{
|
||||
var user = server.AddUser(memberData.User.Id, true);
|
||||
var user = server.AddUser(memberData.User.Id, true, false);
|
||||
user.Update(memberData);
|
||||
//OnUserAdded(user);
|
||||
}
|
||||
Logger.Debug($"GUILD_MEMBERS_CHUNK: {data.Members.Length} users");
|
||||
Logger.Verbose($"GUILD_MEMBERS_CHUNK: {data.Members.Length} users");
|
||||
|
||||
if (server.CurrentUserCount >= server.UserCount) //Finished downloading for there
|
||||
{
|
||||
bool isConnectComplete = true;
|
||||
foreach (var server2 in _servers.Select(x => x.Value))
|
||||
{
|
||||
if (server2.CurrentUserCount < server2.UserCount)
|
||||
isConnectComplete = false;
|
||||
}
|
||||
if (isConnectComplete)
|
||||
EndConnect();
|
||||
}
|
||||
}
|
||||
else
|
||||
Logger.Warning("GUILD_MEMBERS_CHUNK referenced an unknown guild.");
|
||||
@@ -715,7 +731,7 @@ namespace Discord
|
||||
{
|
||||
var role = server.AddRole(data.Data.Id);
|
||||
role.Update(data.Data, false);
|
||||
Logger.Debug($"GUILD_ROLE_CREATE: {role.Path}");
|
||||
Logger.Info($"GUILD_ROLE_CREATE: {role.Path}");
|
||||
OnRoleCreated(role);
|
||||
}
|
||||
else
|
||||
@@ -733,7 +749,7 @@ namespace Discord
|
||||
{
|
||||
var before = Config.EnablePreUpdateEvents ? role.Clone() : null;
|
||||
role.Update(data.Data, true);
|
||||
Logger.Debug($"GUILD_ROLE_UPDATE: {role.Path}");
|
||||
Logger.Info($"GUILD_ROLE_UPDATE: {role.Path}");
|
||||
OnRoleUpdated(before, role);
|
||||
}
|
||||
else
|
||||
@@ -752,7 +768,7 @@ namespace Discord
|
||||
var role = server.RemoveRole(data.RoleId);
|
||||
if (role != null)
|
||||
{
|
||||
Logger.Debug($"GUILD_ROLE_DELETE: {role.Path}");
|
||||
Logger.Info($"GUILD_ROLE_DELETE: {role.Path}");
|
||||
OnRoleDeleted(role);
|
||||
}
|
||||
else
|
||||
@@ -773,7 +789,7 @@ namespace Discord
|
||||
var user = server.GetUser(data.User.Id);
|
||||
if (user != null)
|
||||
{
|
||||
Logger.Debug($"GUILD_BAN_ADD: {user.Path}");
|
||||
Logger.Info($"GUILD_BAN_ADD: {user.Path}");
|
||||
OnUserBanned(user);
|
||||
}
|
||||
else
|
||||
@@ -791,7 +807,7 @@ namespace Discord
|
||||
{
|
||||
var user = new User(this, data.User.Id, server);
|
||||
user.Update(data.User);
|
||||
Logger.Debug($"GUILD_BAN_REMOVE: {user.Path}");
|
||||
Logger.Info($"GUILD_BAN_REMOVE: {user.Path}");
|
||||
OnUserUnbanned(user);
|
||||
}
|
||||
else
|
||||
@@ -837,7 +853,7 @@ namespace Discord
|
||||
msg.Update(data);
|
||||
user.UpdateActivity();
|
||||
|
||||
Logger.Debug($"MESSAGE_CREATE: {channel.Path} ({user.Name ?? "Unknown"})");
|
||||
Logger.Verbose($"MESSAGE_CREATE: {channel.Path} ({user.Name ?? "Unknown"})");
|
||||
OnMessageReceived(msg);
|
||||
}
|
||||
else
|
||||
@@ -856,7 +872,7 @@ namespace Discord
|
||||
var msg = channel.GetMessage(data.Id, data.Author?.Id);
|
||||
var before = Config.EnablePreUpdateEvents ? msg.Clone() : null;
|
||||
msg.Update(data);
|
||||
Logger.Debug($"MESSAGE_UPDATE: {channel.Path} ({data.Author?.Username ?? "Unknown"})");
|
||||
Logger.Verbose($"MESSAGE_UPDATE: {channel.Path} ({data.Author?.Username ?? "Unknown"})");
|
||||
OnMessageUpdated(before, msg);
|
||||
}
|
||||
else
|
||||
@@ -870,7 +886,7 @@ namespace Discord
|
||||
if (channel != null)
|
||||
{
|
||||
var msg = channel.RemoveMessage(data.Id);
|
||||
Logger.Debug($"MESSAGE_DELETE: {channel.Path} ({msg.User?.Name ?? "Unknown"})");
|
||||
Logger.Verbose($"MESSAGE_DELETE: {channel.Path} ({msg.User?.Name ?? "Unknown"})");
|
||||
OnMessageDeleted(msg);
|
||||
}
|
||||
else
|
||||
@@ -903,7 +919,8 @@ namespace Discord
|
||||
|
||||
if (user != null)
|
||||
{
|
||||
Logger.Debug($"PRESENCE_UPDATE: {user.Path}");
|
||||
/*if (Config.LogLevel == LogSeverity.Debug)
|
||||
Logger.Debug($"PRESENCE_UPDATE: {user.Path}");*/
|
||||
var before = Config.EnablePreUpdateEvents ? user.Clone() : null;
|
||||
user.Update(data);
|
||||
OnUserUpdated(before, user);
|
||||
@@ -930,7 +947,8 @@ namespace Discord
|
||||
user = channel.Server.GetUser(data.UserId);
|
||||
if (user != null)
|
||||
{
|
||||
Logger.Debug($"TYPING_START: {channel.Path} ({user.Name})");
|
||||
/*if (Config.LogLevel == LogSeverity.Debug)
|
||||
Logger.Debug($"TYPING_START: {channel.Path} ({user.Name})");*/
|
||||
OnUserIsTypingUpdated(channel, user);
|
||||
user.UpdateActivity();
|
||||
}
|
||||
@@ -950,7 +968,8 @@ namespace Discord
|
||||
var user = server.GetUser(data.UserId);
|
||||
if (user != null)
|
||||
{
|
||||
Logger.Debug($"VOICE_STATE_UPDATE: {user.Path}");
|
||||
/*if (Config.LogLevel == LogSeverity.Debug)
|
||||
Logger.Debug($"VOICE_STATE_UPDATE: {user.Path}");*/
|
||||
var before = Config.EnablePreUpdateEvents ? user.Clone() : null;
|
||||
user.Update(data);
|
||||
//Logger.Verbose($"Voice Updated: {server.Name}/{user.Name}");
|
||||
@@ -975,7 +994,7 @@ namespace Discord
|
||||
PrivateUser.Update(data);
|
||||
foreach (var server in _servers)
|
||||
server.Value.CurrentUser.Update(data);
|
||||
Logger.Debug($"USER_UPDATE");
|
||||
Logger.Info($"USER_UPDATE");
|
||||
OnProfileUpdated(before, CurrentUser);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -107,10 +107,12 @@ namespace Discord
|
||||
|
||||
/// <summary> Gets the number of channels in this server. </summary>
|
||||
public int ChannelCount => _channels.Count;
|
||||
/// <summary> Gets the number of users downloaded for this server so far. </summary>
|
||||
internal int CurrentUserCount => _users.Count;
|
||||
/// <summary> Gets the number of users in this server. </summary>
|
||||
public int UserCount => _userCount;
|
||||
/// <summary> Gets the number of roles in this server. </summary>
|
||||
public int RoleCount => _channels.Count;
|
||||
public int RoleCount => _roles.Count;
|
||||
|
||||
internal Server(DiscordClient client, ulong id)
|
||||
{
|
||||
@@ -175,7 +177,7 @@ namespace Discord
|
||||
{
|
||||
_users = new ConcurrentDictionary<ulong, Member>(2, (int)(model.Members.Length * 1.05));
|
||||
foreach (var subModel in model.Members)
|
||||
AddUser(subModel.User.Id, true).Update(subModel);
|
||||
AddUser(subModel.User.Id, true, true).Update(subModel);
|
||||
}
|
||||
|
||||
if (model.VoiceStates != null)
|
||||
@@ -446,9 +448,10 @@ namespace Discord
|
||||
#endregion
|
||||
|
||||
#region Users
|
||||
internal User AddUser(ulong id, bool cachePerms)
|
||||
internal User AddUser(ulong id, bool cachePerms, bool incrementCount)
|
||||
{
|
||||
_userCount++;
|
||||
if (incrementCount)
|
||||
_userCount++;
|
||||
Member member = new Member(new User(Client, id, this), ServerPermissions.None);
|
||||
if (id == Client.CurrentUser.Id)
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user