feat(client): handle announce and version
This commit is contained in:
parent
debfa99a27
commit
73e2cec4e0
|
@ -154,6 +154,8 @@ internal class Client : IDisposable {
|
|||
|
||||
internal Task AuthenticateAndList() {
|
||||
return Task.Run(async () => {
|
||||
await this.SendVersion();
|
||||
|
||||
if (await this.Authenticate()) {
|
||||
this._wasConnected = true;
|
||||
this.Plugin.ChatGui.PrintChat(new XivChatEntry {
|
||||
|
@ -315,6 +317,12 @@ internal class Client : IDisposable {
|
|||
}
|
||||
}
|
||||
|
||||
internal async Task SendVersion() {
|
||||
await this.QueueMessage(new RequestKind.Version(new VersionRequest {
|
||||
Version = 1,
|
||||
}));
|
||||
}
|
||||
|
||||
internal async Task<bool> Authenticate() {
|
||||
if (this.Plugin.ConfigInfo.Key is not { } key) {
|
||||
return false;
|
||||
|
@ -571,6 +579,10 @@ internal class Client : IDisposable {
|
|||
Task.Run(async () => await this.HandleSendSecrets(resp));
|
||||
break;
|
||||
}
|
||||
case { Kind: ResponseKind.Announce { Response: var resp }, Number: 0 }: {
|
||||
Task.Run(() => this.HandleAnnounce(resp));
|
||||
break;
|
||||
}
|
||||
default: {
|
||||
this._waitersMutex.WaitOne();
|
||||
try {
|
||||
|
@ -601,6 +613,13 @@ internal class Client : IDisposable {
|
|||
}
|
||||
#pragma warning restore CS4014
|
||||
|
||||
private void HandleAnnounce(AnnounceResponse resp) {
|
||||
this.Plugin.ChatGui.PrintChat(new XivChatEntry {
|
||||
Type = XivChatType.Notice,
|
||||
Message = $"[ExtraChat] {resp.Announcement}",
|
||||
});
|
||||
}
|
||||
|
||||
private void HandleSecrets(SecretsResponse resp) {
|
||||
var kx = SodiumKeyExchange.CalculateClientSharedSecret(this.KeyPair.GetPublicKey(), this.GetPrivateKey(), resp.PublicKey);
|
||||
var shared = SecretBox.Decrypt(kx.ReadSharedSecret, resp.EncryptedSharedSecret);
|
||||
|
|
|
@ -53,12 +53,12 @@
|
|||
</ItemGroup>
|
||||
|
||||
<ItemGroup>
|
||||
<PackageReference Include="ASodium" Version="0.5.3"/>
|
||||
<PackageReference Include="Dalamud.ContextMenu" Version="1.0.0"/>
|
||||
<PackageReference Include="DalamudPackager" Version="2.1.7"/>
|
||||
<PackageReference Include="MessagePack" Version="2.3.112"/>
|
||||
<PackageReference Include="System.Net.WebSockets.Client" Version="4.3.2"/>
|
||||
<PackageReference Include="System.Threading.Channels" Version="6.0.0"/>
|
||||
<PackageReference Include="ASodium" Version="0.5.3" />
|
||||
<PackageReference Include="Dalamud.ContextMenu" Version="1.0.0" />
|
||||
<PackageReference Include="DalamudPackager" Version="2.1.7" />
|
||||
<PackageReference Include="MessagePack" Version="2.3.112" />
|
||||
<PackageReference Include="System.Net.WebSockets.Client" Version="4.3.2" />
|
||||
<PackageReference Include="System.Threading.Channels" Version="6.0.0" />
|
||||
</ItemGroup>
|
||||
|
||||
</Project>
|
||||
|
|
|
@ -78,6 +78,9 @@ public class RequestKindFormatter : IMessagePackFormatter<RequestKind> {
|
|||
case RequestKind.SendSecrets sendSecrets:
|
||||
options.Resolver.GetFormatterWithVerify<SendSecretsRequest>().Serialize(ref writer, sendSecrets.Request, options);
|
||||
break;
|
||||
case RequestKind.Version version:
|
||||
options.Resolver.GetFormatterWithVerify<VersionRequest>().Serialize(ref writer, version.Request, options);
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -153,6 +156,10 @@ public class RequestKindFormatter : IMessagePackFormatter<RequestKind> {
|
|||
var request = options.Resolver.GetFormatterWithVerify<SendSecretsRequest>().Deserialize(ref reader, options);
|
||||
return new RequestKind.SendSecrets(request);
|
||||
}
|
||||
case "version": {
|
||||
var request = options.Resolver.GetFormatterWithVerify<VersionRequest>().Deserialize(ref reader, options);
|
||||
return new RequestKind.Version(request);
|
||||
}
|
||||
default:
|
||||
throw new MessagePackSerializationException("Invalid RequestKind");
|
||||
}
|
||||
|
|
|
@ -98,6 +98,14 @@ public class ResponseKindFormatter : IMessagePackFormatter<ResponseKind> {
|
|||
var response = options.Resolver.GetFormatterWithVerify<SendSecretsResponse>().Deserialize(ref reader, options);
|
||||
return new ResponseKind.SendSecrets(response);
|
||||
}
|
||||
case "version": {
|
||||
var response = options.Resolver.GetFormatterWithVerify<VersionResponse>().Deserialize(ref reader, options);
|
||||
return new ResponseKind.Version(response);
|
||||
}
|
||||
case "announce": {
|
||||
var response = options.Resolver.GetFormatterWithVerify<AnnounceResponse>().Deserialize(ref reader, options);
|
||||
return new ResponseKind.Announce(response);
|
||||
}
|
||||
default:
|
||||
throw new MessagePackSerializationException("Invalid ResponseKind");
|
||||
}
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
using MessagePack;
|
||||
|
||||
namespace ExtraChat.Protocol;
|
||||
|
||||
[MessagePackObject]
|
||||
public class AnnounceResponse {
|
||||
[Key(0)]
|
||||
public string Announcement;
|
||||
}
|
|
@ -54,4 +54,7 @@ public abstract record RequestKind {
|
|||
|
||||
[MessagePackObject]
|
||||
public record SendSecrets(SendSecretsRequest Request) : RequestKind;
|
||||
|
||||
[MessagePackObject]
|
||||
public record Version(VersionRequest Request) : RequestKind;
|
||||
}
|
||||
|
|
|
@ -66,4 +66,10 @@ public abstract record ResponseKind {
|
|||
|
||||
[MessagePackObject]
|
||||
public record SendSecrets(SendSecretsResponse Response) : ResponseKind;
|
||||
|
||||
[MessagePackObject]
|
||||
public record Version(VersionResponse Response) : ResponseKind;
|
||||
|
||||
[MessagePackObject]
|
||||
public record Announce(AnnounceResponse Response) : ResponseKind;
|
||||
}
|
||||
|
|
|
@ -0,0 +1,10 @@
|
|||
using MessagePack;
|
||||
|
||||
namespace ExtraChat.Protocol;
|
||||
|
||||
[Serializable]
|
||||
[MessagePackObject]
|
||||
public class VersionRequest {
|
||||
[Key(0)]
|
||||
public uint Version;
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
using MessagePack;
|
||||
|
||||
namespace ExtraChat.Protocol;
|
||||
|
||||
[Serializable]
|
||||
[MessagePackObject]
|
||||
public class VersionResponse {
|
||||
[Key(0)]
|
||||
public uint Version;
|
||||
}
|
Loading…
Reference in New Issue