mirror of
https://github.com/achiez/NebulaAuth-Steam-Desktop-Authenticator-by-Achies.git
synced 2026-07-25 06:14:31 +00:00
8ff960189e
- Update: Added "Copy Password" to Mafile context menu (if available) - Update: "Save Password" now pre-fills the current password in the "Login Again" dialog when encryption is enabled - Fix: Prevented overlapping confirmation cycles in AutoConfirmer - Fix: Added a Snackbar notification when a confirmation cycle is skipped due to a too frequent timer interval - Fix: Fixed a rare bug where the previous proxy was used instead of the current one during session refresh - Fix: Corrected "Session Permanently Expired" message showing on unrelated errors (e.g. network issues) - UI-Fix: Fixed visual glitch where proxy input appeared non-empty when switching to a mafile-specific proxy - Cleanup: Refactored and cleaned up codebase, improved styling and formatting via ReSharper
105 lines
2.9 KiB
C#
105 lines
2.9 KiB
C#
using ProtoBuf;
|
|
using SteamLib.ProtoCore.Enums;
|
|
using SteamLib.ProtoCore.Interfaces;
|
|
|
|
namespace SteamLib.ProtoCore;
|
|
|
|
public class ProtoResponse
|
|
{
|
|
public EResult Result { get; }
|
|
public IProtoMsg? ProtoObject { get; protected set; }
|
|
|
|
|
|
protected ProtoResponse(EResult result, IProtoMsg? protoObject)
|
|
{
|
|
Result = result;
|
|
ProtoObject = protoObject;
|
|
}
|
|
}
|
|
|
|
public class ProtoResponse<TProtoResponse> : ProtoResponse
|
|
where TProtoResponse : IProtoMsg
|
|
{
|
|
public TProtoResponse? ResponseMsg
|
|
{
|
|
get => ProtoObject == null ? default : (TProtoResponse) ProtoObject;
|
|
set => ProtoObject = value;
|
|
}
|
|
|
|
public ProtoResponse(EResult result, TProtoResponse? protoObject) : base(result, protoObject)
|
|
{
|
|
}
|
|
|
|
public static ProtoResponse<TProtoResponse> FromHttpResponse(HttpResponseMessage response)
|
|
{
|
|
response.EnsureSuccessStatusCode();
|
|
var eResult = EResult.Invalid;
|
|
if (response.Headers.TryGetValues("x-eresult", out var val))
|
|
{
|
|
var eResultInt = Convert.ToInt32(val.Single());
|
|
eResult = (EResult) eResultInt;
|
|
}
|
|
|
|
var msg = default(TProtoResponse);
|
|
Stream? stream = null;
|
|
try
|
|
{
|
|
stream = response.Content.ReadAsStream();
|
|
msg = Serializer.Deserialize<TProtoResponse>(stream);
|
|
}
|
|
catch
|
|
{
|
|
//Ignored
|
|
}
|
|
finally
|
|
{
|
|
stream?.Dispose();
|
|
}
|
|
|
|
return new ProtoResponse<TProtoResponse>(eResult, msg);
|
|
}
|
|
|
|
public static async Task<ProtoResponse<TProtoResponse>> FromHttpResponseAsync(HttpResponseMessage response,
|
|
CancellationToken cancellationToken = default)
|
|
{
|
|
response.EnsureSuccessStatusCode();
|
|
var eResult = EResult.Invalid;
|
|
if (response.Headers.TryGetValues("x-eresult", out var val))
|
|
{
|
|
var eResultInt = Convert.ToInt32(val.Single());
|
|
eResult = (EResult) eResultInt;
|
|
}
|
|
|
|
var msg = default(TProtoResponse);
|
|
Stream? stream = null;
|
|
try
|
|
{
|
|
stream = await response.Content.ReadAsStreamAsync(cancellationToken);
|
|
msg = Serializer.Deserialize<TProtoResponse>(stream);
|
|
}
|
|
catch
|
|
{
|
|
//Ignored
|
|
}
|
|
finally
|
|
{
|
|
if (stream != null) await stream.DisposeAsync();
|
|
}
|
|
|
|
|
|
return new ProtoResponse<TProtoResponse>(eResult, msg);
|
|
}
|
|
|
|
/// <summary>
|
|
/// Ensures that <see cref="ResponseMsg" /> is not <see langword="null" /> and returns it otherwise throws
|
|
/// <see cref="NullReferenceException" />.
|
|
/// </summary>
|
|
/// <returns></returns>
|
|
/// <exception cref="NullReferenceException"></exception>
|
|
public TProtoResponse GetResponse()
|
|
{
|
|
if (ResponseMsg == null)
|
|
throw new NullReferenceException("ResponseMsg in response was null");
|
|
return ResponseMsg;
|
|
}
|
|
} |