feat(client): handle announce and version

This commit is contained in:
Anna 2022-07-09 20:52:58 -04:00
parent debfa99a27
commit 73e2cec4e0
9 changed files with 78 additions and 6 deletions

View File

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

View File

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

View File

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

View File

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

View File

@ -0,0 +1,9 @@
using MessagePack;
namespace ExtraChat.Protocol;
[MessagePackObject]
public class AnnounceResponse {
[Key(0)]
public string Announcement;
}

View File

@ -54,4 +54,7 @@ public abstract record RequestKind {
[MessagePackObject]
public record SendSecrets(SendSecretsRequest Request) : RequestKind;
[MessagePackObject]
public record Version(VersionRequest Request) : RequestKind;
}

View File

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

View File

@ -0,0 +1,10 @@
using MessagePack;
namespace ExtraChat.Protocol;
[Serializable]
[MessagePackObject]
public class VersionRequest {
[Key(0)]
public uint Version;
}

View File

@ -0,0 +1,10 @@
using MessagePack;
namespace ExtraChat.Protocol;
[Serializable]
[MessagePackObject]
public class VersionResponse {
[Key(0)]
public uint Version;
}