| @@ -304,6 +304,17 @@ namespace Discord | |||||
| } | } | ||||
| private Task SendStatus() | private Task SendStatus() | ||||
| { | { | ||||
| PrivateUser.Status = Status; | |||||
| PrivateUser.CurrentGame = CurrentGame; | |||||
| foreach (var server in Servers) | |||||
| { | |||||
| var current = server.CurrentUser; | |||||
| if (current != null) | |||||
| { | |||||
| current.Status = Status; | |||||
| current.CurrentGame = CurrentGame; | |||||
| } | |||||
| } | |||||
| GatewaySocket.SendUpdateStatus(Status == UserStatus.Idle ? EpochTime.GetMilliseconds() - (10 * 60 * 1000) : (long?)null, CurrentGame); | GatewaySocket.SendUpdateStatus(Status == UserStatus.Idle ? EpochTime.GetMilliseconds() - (10 * 60 * 1000) : (long?)null, CurrentGame); | ||||
| return TaskHelper.CompletedTask; | return TaskHelper.CompletedTask; | ||||
| } | } | ||||
| @@ -29,15 +29,18 @@ namespace Discord | |||||
| public static bool TryGetOrAdd<TKey, TValue>(this ConcurrentDictionary<TKey, TValue> d, | public static bool TryGetOrAdd<TKey, TValue>(this ConcurrentDictionary<TKey, TValue> d, | ||||
| TKey key, Func<TKey, TValue> factory, out TValue result) | TKey key, Func<TKey, TValue> factory, out TValue result) | ||||
| where TValue : class | |||||
| { | { | ||||
| TValue newValue = null; | |||||
| bool created = false; | |||||
| TValue newValue = default(TValue); | |||||
| while (true) | while (true) | ||||
| { | { | ||||
| if (d.TryGetValue(key, out result)) | if (d.TryGetValue(key, out result)) | ||||
| return false; | return false; | ||||
| if (newValue == null) | |||||
| if (!created) | |||||
| { | |||||
| newValue = factory(key); | newValue = factory(key); | ||||
| created = true; | |||||
| } | |||||
| if (d.TryAdd(key, newValue)) | if (d.TryAdd(key, newValue)) | ||||
| { | { | ||||
| result = newValue; | result = newValue; | ||||
| @@ -391,6 +391,11 @@ namespace Discord | |||||
| { | { | ||||
| foreach (var channel in AllChannels) | foreach (var channel in AllChannels) | ||||
| channel.AddUser(user.User); | channel.AddUser(user.User); | ||||
| if (id == Client.CurrentUser.Id) | |||||
| { | |||||
| user.User.CurrentGame = Client.CurrentGame; | |||||
| user.User.Status = Client.Status; | |||||
| } | |||||
| } | } | ||||
| return user.User; | return user.User; | ||||
| } | } | ||||
| @@ -59,9 +59,9 @@ namespace Discord | |||||
| /// <summary> Gets the unique identifier for this user's current avatar. </summary> | /// <summary> Gets the unique identifier for this user's current avatar. </summary> | ||||
| public string AvatarId { get; private set; } | public string AvatarId { get; private set; } | ||||
| /// <summary> Gets the name of the game this user is currently playing. </summary> | /// <summary> Gets the name of the game this user is currently playing. </summary> | ||||
| public string CurrentGame { get; private set; } | |||||
| public string CurrentGame { get; internal set; } | |||||
| /// <summary> Gets the current status for this user. </summary> | /// <summary> Gets the current status for this user. </summary> | ||||
| public UserStatus Status { get; private set; } | |||||
| public UserStatus Status { get; internal set; } | |||||
| /// <summary> Gets the datetime that this user joined this server. </summary> | /// <summary> Gets the datetime that this user joined this server. </summary> | ||||
| public DateTime JoinedAt { get; private set; } | public DateTime JoinedAt { get; private set; } | ||||
| /// <summary> Returns the time this user last sent/edited a message, started typing or sent voice data in this server. </summary> | /// <summary> Returns the time this user last sent/edited a message, started typing or sent voice data in this server. </summary> | ||||