Browse Source

Wait for all offline users before raising LoggedIn

tags/docs-0.9
RogueException 9 years ago
parent
commit
d6f22d11dc
2 changed files with 72 additions and 50 deletions
  1. +65
    -46
      src/Discord.Net/DiscordClient.cs
  2. +7
    -4
      src/Discord.Net/Models/Server.cs

+ 65
- 46
src/Discord.Net/DiscordClient.cs View File

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


+ 7
- 4
src/Discord.Net/Models/Server.cs View File

@@ -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)
{


Loading…
Cancel
Save