|
@@ -57,7 +57,8 @@ namespace Discord.WebSocket |
|
|
/// <inheritdoc /> |
|
|
/// <inheritdoc /> |
|
|
public override int Latency { get; protected set; } |
|
|
public override int Latency { get; protected set; } |
|
|
/// <inheritdoc /> |
|
|
/// <inheritdoc /> |
|
|
public override UserStatus Status { get; protected set; } = UserStatus.Online; |
|
|
|
|
|
|
|
|
public override UserStatus Status { get => _status ?? UserStatus.Online; protected set => _status = value; } |
|
|
|
|
|
private UserStatus? _status; |
|
|
/// <inheritdoc /> |
|
|
/// <inheritdoc /> |
|
|
public override IActivity Activity { get => _activity.GetValueOrDefault(); protected set => _activity = Optional.Create(value); } |
|
|
public override IActivity Activity { get => _activity.GetValueOrDefault(); protected set => _activity = Optional.Create(value); } |
|
|
private Optional<IActivity> _activity; |
|
|
private Optional<IActivity> _activity; |
|
@@ -449,22 +450,25 @@ namespace Discord.WebSocket |
|
|
return; |
|
|
return; |
|
|
CurrentUser.Presence = new SocketPresence(Status, Activity, null, null); |
|
|
CurrentUser.Presence = new SocketPresence(Status, Activity, null, null); |
|
|
|
|
|
|
|
|
var presence = BuildCurrentStatus(); |
|
|
|
|
|
|
|
|
var presence = BuildCurrentStatus() ?? (UserStatus.Online, false, null, null); |
|
|
|
|
|
|
|
|
await ApiClient.SendStatusUpdateAsync( |
|
|
await ApiClient.SendStatusUpdateAsync( |
|
|
presence.Item1, |
|
|
|
|
|
presence.Item2, |
|
|
|
|
|
presence.Item3, |
|
|
|
|
|
presence.Item4).ConfigureAwait(false); |
|
|
|
|
|
|
|
|
status: presence.Item1, |
|
|
|
|
|
isAFK: presence.Item2, |
|
|
|
|
|
since: presence.Item3, |
|
|
|
|
|
game: presence.Item4).ConfigureAwait(false); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private (UserStatus, bool, long?, GameModel[]) BuildCurrentStatus() |
|
|
|
|
|
|
|
|
private (UserStatus, bool, long?, GameModel)? BuildCurrentStatus() |
|
|
{ |
|
|
{ |
|
|
var status = Status; |
|
|
|
|
|
|
|
|
var status = _status; |
|
|
var statusSince = _statusSince; |
|
|
var statusSince = _statusSince; |
|
|
var activity = _activity; |
|
|
var activity = _activity; |
|
|
|
|
|
|
|
|
GameModel[] gameModels = null; |
|
|
|
|
|
|
|
|
if (status == null && !activity.IsSpecified) |
|
|
|
|
|
return null; |
|
|
|
|
|
|
|
|
|
|
|
GameModel game = null; |
|
|
// Discord only accepts rich presence over RPC, don't even bother building a payload |
|
|
// Discord only accepts rich presence over RPC, don't even bother building a payload |
|
|
|
|
|
|
|
|
if (activity.GetValueOrDefault() != null) |
|
|
if (activity.GetValueOrDefault() != null) |
|
@@ -476,15 +480,15 @@ namespace Discord.WebSocket |
|
|
gameModel.Type = Activity.Type; |
|
|
gameModel.Type = Activity.Type; |
|
|
if (Activity is StreamingGame streamGame) |
|
|
if (Activity is StreamingGame streamGame) |
|
|
gameModel.StreamUrl = streamGame.Url; |
|
|
gameModel.StreamUrl = streamGame.Url; |
|
|
gameModels = new[] { gameModel }; |
|
|
|
|
|
|
|
|
game = gameModel; |
|
|
} |
|
|
} |
|
|
else if (activity.IsSpecified) |
|
|
else if (activity.IsSpecified) |
|
|
gameModels = new GameModel[0]; |
|
|
|
|
|
|
|
|
game = null; |
|
|
|
|
|
|
|
|
return (status, |
|
|
|
|
|
|
|
|
return (status ?? UserStatus.Online, |
|
|
status == UserStatus.AFK, |
|
|
status == UserStatus.AFK, |
|
|
statusSince != null ? _statusSince.Value.ToUnixTimeMilliseconds() : (long?)null, |
|
|
statusSince != null ? _statusSince.Value.ToUnixTimeMilliseconds() : (long?)null, |
|
|
gameModels); |
|
|
|
|
|
|
|
|
game); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string type, object payload) |
|
|
private async Task ProcessMessageAsync(GatewayOpCode opCode, int? seq, string type, object payload) |
|
|