From 4596d986708b1b6bfa9c22553338f3b388a92ead Mon Sep 17 00:00:00 2001 From: alyssa Date: Mon, 23 Dec 2024 22:31:20 +0000 Subject: [PATCH] refactor: remove protobuf --- Cargo.lock | 101 +--------------- Cargo.toml | 4 - Dockerfile | 1 - Myriad/Myriad.csproj | 7 -- Myriad/packages.lock.json | 111 ------------------ .../Controllers/PrivateController.cs | 49 -------- PluralKit.API/PluralKit.API.csproj | 6 - PluralKit.API/packages.lock.json | 13 -- PluralKit.Bot/Commands/Misc.cs | 6 +- PluralKit.Bot/PluralKit.Bot.csproj | 7 -- PluralKit.Bot/Services/ShardInfoService.cs | 32 +++-- PluralKit.Bot/packages.lock.json | 58 --------- PluralKit.Core/PluralKit.Core.csproj | 1 - PluralKit.Core/Utils/ProtobufUtils.cs | 22 ---- PluralKit.Core/packages.lock.json | 6 - PluralKit.Tests/packages.lock.json | 53 --------- ci/Dockerfile.rust | 3 +- dashboard/src/routes/Status/status.svelte | 2 +- flake.nix | 17 ++- lib/libpk/Cargo.toml | 5 - lib/libpk/build.rs | 9 -- lib/libpk/src/lib.rs | 2 +- lib/libpk/src/proto.rs | 1 - proto/discord_cache.proto | 47 -------- proto/state.proto | 21 ---- services/api/Cargo.toml | 1 - services/api/src/endpoints/private.rs | 32 ++--- services/api/src/main.rs | 3 +- services/api/src/middleware/logger.rs | 1 - services/gateway/Cargo.toml | 1 - services/gateway/src/discord/shard_state.rs | 13 +- 31 files changed, 58 insertions(+), 577 deletions(-) delete mode 100644 PluralKit.Core/Utils/ProtobufUtils.cs delete mode 100644 lib/libpk/build.rs delete mode 100644 lib/libpk/src/proto.rs delete mode 100644 proto/discord_cache.proto delete mode 100644 proto/state.proto diff --git a/Cargo.lock b/Cargo.lock index cb904814..7532dde2 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1,6 +1,6 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. -version = 3 +version = 4 [[package]] name = "addr2line" @@ -94,7 +94,6 @@ dependencies = [ "lazy_static", "libpk", "metrics", - "prost", "reverse-proxy-service", "serde", "serde_json", @@ -837,12 +836,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "fixedbitset" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" - [[package]] name = "flate2" version = "1.0.30" @@ -1042,7 +1035,6 @@ dependencies = [ "lazy_static", "libpk", "metrics", - "prost", "serde_json", "serde_variant", "signal-hook", @@ -1547,15 +1539,6 @@ version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "30e22bd8629359895450b59ea7a776c850561b96a3b1d31321c1949d9e6c9146" -[[package]] -name = "itertools" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" -dependencies = [ - "either", -] - [[package]] name = "itoa" version = "1.0.5" @@ -1644,9 +1627,6 @@ dependencies = [ "lazy_static", "metrics", "metrics-exporter-prometheus", - "prost", - "prost-build", - "prost-types", "sentry", "serde", "serde_json", @@ -1874,12 +1854,6 @@ dependencies = [ "windows-sys 0.52.0", ] -[[package]] -name = "multimap" -version = "0.10.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" - [[package]] name = "nibble_vec" version = "0.1.0" @@ -2139,16 +2113,6 @@ dependencies = [ "sha2", ] -[[package]] -name = "petgraph" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" -dependencies = [ - "fixedbitset", - "indexmap", -] - [[package]] name = "pin-project" version = "1.0.12" @@ -2239,16 +2203,6 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" -[[package]] -name = "prettyplease" -version = "0.2.20" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f12335488a2f3b0a83b14edad48dca9879ce89b2edd10e80237e4e852dd645e" -dependencies = [ - "proc-macro2", - "syn 2.0.66", -] - [[package]] name = "proc-macro2" version = "1.0.84" @@ -2258,59 +2212,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "prost" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "deb1435c188b76130da55f17a466d252ff7b1418b2ad3e037d127b94e3411f29" -dependencies = [ - "bytes", - "prost-derive", -] - -[[package]] -name = "prost-build" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22505a5c94da8e3b7c2996394d1c933236c4d743e81a410bcca4e6989fc066a4" -dependencies = [ - "bytes", - "heck 0.5.0", - "itertools", - "log", - "multimap", - "once_cell", - "petgraph", - "prettyplease", - "prost", - "prost-types", - "regex", - "syn 2.0.66", - "tempfile", -] - -[[package]] -name = "prost-derive" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81bddcdb20abf9501610992b6759a4c888aef7d1a7247ef75e2404275ac24af1" -dependencies = [ - "anyhow", - "itertools", - "proc-macro2", - "quote", - "syn 2.0.66", -] - -[[package]] -name = "prost-types" -version = "0.12.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9091c90b0a32608e984ff2fa4091273cbdd755d54935c51d520887f4a1dbd5b0" -dependencies = [ - "prost", -] - [[package]] name = "quanta" version = "0.12.3" diff --git a/Cargo.toml b/Cargo.toml index 2c7aa9de..366e2c60 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -40,7 +40,3 @@ twilight-http = { git = "https://github.com/pluralkit/twilight", default-feature #twilight-util = { path = "../twilight/twilight-util", features = ["permission-calculator"] } #twilight-model = { path = "../twilight/twilight-model" } #twilight-http = { path = "../twilight/twilight-http", default-features = false, features = ["rustls-native-roots"] } - -prost = "0.12" -prost-types = "0.12" -prost-build = "0.12" diff --git a/Dockerfile b/Dockerfile index 9cec299d..dedc085d 100644 --- a/Dockerfile +++ b/Dockerfile @@ -10,7 +10,6 @@ COPY PluralKit.Bot/PluralKit.Bot.csproj /app/PluralKit.Bot/ COPY PluralKit.Core/PluralKit.Core.csproj /app/PluralKit.Core/ COPY PluralKit.Tests/PluralKit.Tests.csproj /app/PluralKit.Tests/ COPY .git/ /app/.git -COPY proto/ /app/proto RUN dotnet restore PluralKit.sln # Copy the rest of the code and build diff --git a/Myriad/Myriad.csproj b/Myriad/Myriad.csproj index c899d7b9..3b92ea30 100644 --- a/Myriad/Myriad.csproj +++ b/Myriad/Myriad.csproj @@ -21,17 +21,10 @@ - - - - - - - diff --git a/Myriad/packages.lock.json b/Myriad/packages.lock.json index 781c0c02..945321a9 100644 --- a/Myriad/packages.lock.json +++ b/Myriad/packages.lock.json @@ -2,28 +2,6 @@ "version": 1, "dependencies": { "net8.0": { - "Google.Protobuf": { - "type": "Direct", - "requested": "[3.29.1, )", - "resolved": "3.29.1", - "contentHash": "kDFLP72bPu4GwquVN7HtFnfqxhQs4CLbUEyOc/0yV48HB0Pxf7tDK7zIx6ifaQwGp+RSoLY1sz1CXqoAEAu+AQ==" - }, - "Grpc.Net.ClientFactory": { - "type": "Direct", - "requested": "[2.67.0, )", - "resolved": "2.67.0", - "contentHash": "owkRL6j8ZXvLnn8SsFGCRiWoe/2wGv+u+TASAylzUtGbHLnw7IiFRoeTs0IgpCNTETvlMLVb0gHDiLGo+mJZ6g==", - "dependencies": { - "Grpc.Net.Client": "2.67.0", - "Microsoft.Extensions.Http": "6.0.0" - } - }, - "Grpc.Tools": { - "type": "Direct", - "requested": "[2.68.1, )", - "resolved": "2.68.1", - "contentHash": "BZ96s7ijKAhJoRpIK+pqCeLaGaSwyc5/CAZFwgCcBuAnkU2naYvH0P6qnYCkl0pWDY/JBOnE2RvX9IvRX1Yc5Q==" - }, "Polly": { "type": "Direct", "requested": "[8.5.0, )", @@ -64,92 +42,16 @@ "Microsoft.Bcl.AsyncInterfaces": "6.0.0" } }, - "Grpc.Core.Api": { - "type": "Transitive", - "resolved": "2.67.0", - "contentHash": "cL1/2f8kc8lsAGNdfCU25deedXVehhLA6GXKLLN4hAWx16XN7BmjYn3gFU+FBpir5yJynvDTHEypr3Tl0j7x/Q==" - }, - "Grpc.Net.Client": { - "type": "Transitive", - "resolved": "2.67.0", - "contentHash": "ofTjJQfegWkVlk5R4k/LlwpcucpsBzntygd4iAeuKd/eLMkmBWoXN+xcjYJ5IibAahRpIJU461jABZvT6E9dwA==", - "dependencies": { - "Grpc.Net.Common": "2.67.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0" - } - }, - "Grpc.Net.Common": { - "type": "Transitive", - "resolved": "2.67.0", - "contentHash": "gazn1cD2Eol0/W5ZJRV4PYbNrxJ9oMs8pGYux5S9E4MymClvl7aqYSmpqgmWAUWvziRqK9K+yt3cjCMfQ3x/5A==", - "dependencies": { - "Grpc.Core.Api": "2.67.0" - } - }, "Microsoft.Bcl.AsyncInterfaces": { "type": "Transitive", "resolved": "6.0.0", "contentHash": "UcSjPsst+DfAdJGVDsu346FX0ci0ah+lw3WRtn18NUwEqRt70HaOQ7lI72vy3+1LxtqI3T5GWwV39rQSrCzAeg==" }, - "Microsoft.Extensions.DependencyInjection": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "k6PWQMuoBDGGHOQTtyois2u4AwyVcIwL2LaSLlTZQm2CYcJ1pxbt6jfAnpWmzENA/wfrYRI/X9DTLoUkE4AsLw==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, - "Microsoft.Extensions.DependencyInjection.Abstractions": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "xlzi2IYREJH3/m6+lUrQlujzX8wDitm4QGnUu6kUXTQAWPuZY8i+ticFJbzfqaetLA6KR/rO6Ew/HuYD+bxifg==" - }, - "Microsoft.Extensions.Http": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "15+pa2G0bAMHbHewaQIdr/y6ag2H3yh4rd9hTXavtWDzQBkvpe2RMqFg8BxDpcQWssmjmBApGPcw93QRz6YcMg==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0" - } - }, - "Microsoft.Extensions.Logging": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "eIbyj40QDg1NDz0HBW0S5f3wrLVnKWnDJ/JtZ+yJDFnDj90VoPuoPmFkeaXrtu+0cKm5GRAwoDf+dBWXK0TUdg==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection": "6.0.0", - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0", - "System.Diagnostics.DiagnosticSource": "6.0.0" - } - }, "Microsoft.Extensions.Logging.Abstractions": { "type": "Transitive", "resolved": "6.0.0", "contentHash": "/HggWBbTwy8TgebGSX5DBZ24ndhzi93sHUBDvP1IxbZD7FDokYzdAr6+vbWGjw2XAfR2EJ1sfKUotpjHnFWPxA==" }, - "Microsoft.Extensions.Options": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "dzXN0+V1AyjOe2xcJ86Qbo233KHuLEY0njf/P2Kw8SfJU+d45HNS2ctJdnEnrWbM9Ye2eFgaC5Mj9otRMU6IsQ==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Primitives": "6.0.0" - } - }, - "Microsoft.Extensions.Primitives": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "9+PnzmQFfEFNR9J2aDTfJGGupShHjOuGw4VUv+JB044biSHrnmCIMD+mJHmb2H7YryrfBEXDurxQ47gJZdCKNQ==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, "Pipelines.Sockets.Unofficial": { "type": "Transitive", "resolved": "2.2.8", @@ -163,23 +65,10 @@ "resolved": "8.5.0", "contentHash": "VYYMZNitZ85UEhwOKkTQI63WEMvzUqwQc74I2mm8h/DBVAMcBBxqYPni4DmuRtbCwngmuONuK2yBJfWNRKzI+A==" }, - "System.Diagnostics.DiagnosticSource": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "frQDfv0rl209cKm1lnwTgFPzNigy2EKk1BS3uAvHvlBVKe5cymGyHO+Sj+NLv5VF/AhHsqPIUUwya5oV4CHMUw==", - "dependencies": { - "System.Runtime.CompilerServices.Unsafe": "6.0.0" - } - }, "System.IO.Pipelines": { "type": "Transitive", "resolved": "5.0.1", "contentHash": "qEePWsaq9LoEEIqhbGe6D5J8c9IqQOUuTzzV6wn1POlfdLkJliZY3OlB0j0f17uMWlqZYjH7txj+2YbyrIA8Yg==" - }, - "System.Runtime.CompilerServices.Unsafe": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "/iUeP3tq1S0XdNNoMz5C9twLSrM/TH+qElHkXWaPvuNOt+99G75NrV0OS2EqHx5wMN7popYjpc8oTjC1y16DLg==" } } } diff --git a/PluralKit.API/Controllers/PrivateController.cs b/PluralKit.API/Controllers/PrivateController.cs index 561fd23b..1f37dc8f 100644 --- a/PluralKit.API/Controllers/PrivateController.cs +++ b/PluralKit.API/Controllers/PrivateController.cs @@ -22,28 +22,6 @@ public class PrivateController: PKControllerBase { public PrivateController(IServiceProvider svc) : base(svc) { } - [HttpGet("meta")] - public async Task> Meta() - { - var db = _redis.Connection.GetDatabase(); - var redisInfo = await db.HashGetAllAsync("pluralkit:shardstatus"); - var shards = redisInfo.Select(x => Proto.Unmarshal(x.Value)).OrderBy(x => x.ShardId); - - var redisClusterInfo = await db.HashGetAllAsync("pluralkit:cluster_stats"); - var clusterInfo = redisClusterInfo.Select(x => JsonConvert.DeserializeObject(x.Value)); - - var guildCount = clusterInfo.Sum(x => x.GuildCount); - var channelCount = clusterInfo.Sum(x => x.ChannelCount); - - var stats = await _repo.GetStats(); - - var o = new JObject(); - o.Add("shards", shards.ToJson()); - o.Add("stats", stats.ToJson(guildCount, channelCount)); - - return Ok(o); - } - [HttpPost("bulk_privacy/member")] public async Task BulkMemberPrivacy([FromBody] JObject inner) { @@ -158,31 +136,4 @@ public static class PrivateJsonExt o.Add("error", error); return o; } - - public static JArray ToJson(this IEnumerable shards) - { - var o = new JArray(); - - foreach (var shard in shards) - { - var s = new JObject(); - s.Add("id", shard.ShardId); - - if (!shard.Up) - s.Add("status", "down"); - else - s.Add("status", "up"); - - s.Add("ping", shard.Latency); - s.Add("disconnection_count", shard.DisconnectionCount); - s.Add("last_heartbeat", shard.LastHeartbeat.ToString()); - s.Add("last_connection", shard.LastConnection.ToString()); - if (shard.HasClusterId) - s.Add("cluster_id", shard.ClusterId); - - o.Add(s); - } - - return o; - } } \ No newline at end of file diff --git a/PluralKit.API/PluralKit.API.csproj b/PluralKit.API/PluralKit.API.csproj index f5db2009..ea792b98 100644 --- a/PluralKit.API/PluralKit.API.csproj +++ b/PluralKit.API/PluralKit.API.csproj @@ -28,15 +28,9 @@ - - - - - - diff --git a/PluralKit.API/packages.lock.json b/PluralKit.API/packages.lock.json index a6350e7c..8c8be7c4 100644 --- a/PluralKit.API/packages.lock.json +++ b/PluralKit.API/packages.lock.json @@ -2,18 +2,6 @@ "version": 1, "dependencies": { "net8.0": { - "Google.Protobuf": { - "type": "Direct", - "requested": "[3.29.1, )", - "resolved": "3.29.1", - "contentHash": "kDFLP72bPu4GwquVN7HtFnfqxhQs4CLbUEyOc/0yV48HB0Pxf7tDK7zIx6ifaQwGp+RSoLY1sz1CXqoAEAu+AQ==" - }, - "Grpc.Tools": { - "type": "Direct", - "requested": "[2.68.1, )", - "resolved": "2.68.1", - "contentHash": "BZ96s7ijKAhJoRpIK+pqCeLaGaSwyc5/CAZFwgCcBuAnkU2naYvH0P6qnYCkl0pWDY/JBOnE2RvX9IvRX1Yc5Q==" - }, "Microsoft.AspNetCore.Mvc.NewtonsoftJson": { "type": "Direct", "requested": "[8.0.11, )", @@ -830,7 +818,6 @@ "Autofac.Extensions.DependencyInjection": "[10.0.0, )", "Dapper": "[2.1.35, )", "Dapper.Contrib": "[2.0.78, )", - "Google.Protobuf": "[3.29.1, )", "Microsoft.Extensions.Caching.Memory": "[9.0.0, )", "Microsoft.Extensions.Configuration": "[9.0.0, )", "Microsoft.Extensions.Configuration.Binder": "[9.0.0, )", diff --git a/PluralKit.Bot/Commands/Misc.cs b/PluralKit.Bot/Commands/Misc.cs index 8ada0ee4..decb574a 100644 --- a/PluralKit.Bot/Commands/Misc.cs +++ b/PluralKit.Bot/Commands/Misc.cs @@ -94,7 +94,7 @@ public class Misc var memoryUsage = process.WorkingSet64; var now = SystemClock.Instance.GetCurrentInstant().ToUnixTimeSeconds(); - var shardUptime = Duration.FromSeconds(now - shardInfo?.LastConnection ?? 0); + var shardUptime = Duration.FromSeconds(now - shardInfo.LastConnection); var shardTotal = _botConfig.Cluster?.TotalShards ?? shards.Count(); int shardClusterTotal = ctx.Cluster.Shards.Count; @@ -106,11 +106,11 @@ public class Misc + (isCluster ? $" {shardClusterTotal} in this cluster," : "") + $" {shardUpTotal} are up)" , true)) .Field(new Embed.Field("Shard uptime", - $"{shardUptime.FormatDuration()} ({shardInfo?.DisconnectionCount} disconnections)", true)) + $"{shardUptime.FormatDuration()} ({shardInfo.DisconnectionCount} disconnections)", true)) .Field(new Embed.Field("CPU usage", $"{_cpu.LastCpuMeasure:P1}", true)) .Field(new Embed.Field("Memory usage", $"{memoryUsage / 1024 / 1024} MiB", true)) .Field(new Embed.Field("Latency", - $"API: {apiLatency.TotalMilliseconds:F0} ms, shard: {shardInfo?.Latency} ms", + $"API: {apiLatency.TotalMilliseconds:F0} ms, shard: {shardInfo.Latency} ms", true)); embed.Field(new("Total numbers", $" {counts.SystemCount:N0} systems," diff --git a/PluralKit.Bot/PluralKit.Bot.csproj b/PluralKit.Bot/PluralKit.Bot.csproj index dd8406a3..f15e7051 100644 --- a/PluralKit.Bot/PluralKit.Bot.csproj +++ b/PluralKit.Bot/PluralKit.Bot.csproj @@ -22,15 +22,8 @@ - - - - - - - diff --git a/PluralKit.Bot/Services/ShardInfoService.cs b/PluralKit.Bot/Services/ShardInfoService.cs index 0defb23b..2382cb8a 100644 --- a/PluralKit.Bot/Services/ShardInfoService.cs +++ b/PluralKit.Bot/Services/ShardInfoService.cs @@ -1,11 +1,11 @@ using System.Net.WebSockets; -using Google.Protobuf; - using Myriad.Gateway; using NodaTime; +using Newtonsoft.Json; + using StackExchange.Redis; using PluralKit.Core; @@ -14,6 +14,17 @@ using Serilog; namespace PluralKit.Bot; +public struct ShardState +{ + [JsonProperty("shard_id")] public int ShardId; + [JsonProperty("up")] public bool Up; + [JsonProperty("disconnection_count")] public int DisconnectionCount; + [JsonProperty("latency")] public int Latency; + [JsonProperty("last_heartbeat")] public int LastHeartbeat; + [JsonProperty("last_connection")] public int LastConnection; + [JsonProperty("cluster_id")] public int? ClusterId; +} + public class ShardInfoService { private readonly int? _clusterId; @@ -43,7 +54,7 @@ public class ShardInfoService return new ShardState[] { }; var db = _redis.Connection.GetDatabase(); var redisInfo = await db.HashGetAllAsync("pluralkit:shardstatus"); - return redisInfo.Select(x => Proto.Unmarshal(x.Value)); + return redisInfo.Select(x => JsonConvert.DeserializeObject(x.Value)); } private void InitializeShard(Shard shard) @@ -53,13 +64,8 @@ public class ShardInfoService async Task Inner() { var db = _redis.Connection.GetDatabase(); - var redisInfo = await db.HashGetAsync("pluralkit::shardstatus", shard.ShardId); - // Skip adding listeners if we've seen this shard & already added listeners to it - if (redisInfo.HasValue) - return; - - // latency = 0 because otherwise shard 0 would serialize to an empty array, thanks protobuf + // latency = 1 because otherwise shard 0 would serialize to an empty array, thanks protobuf var state = new ShardState() { ShardId = shard.ShardId, Up = false, Latency = 1 }; if (_clusterId != null) state.ClusterId = _clusterId.Value; @@ -75,13 +81,13 @@ public class ShardInfoService } } - private async Task TryGetShard(Shard shard) + private async Task TryGetShard(Shard shard) { var db = _redis.Connection.GetDatabase(); var redisInfo = await db.HashGetAsync("pluralkit:shardstatus", shard.ShardId); if (redisInfo.HasValue) - return Proto.Unmarshal(redisInfo); - return null; + return JsonConvert.DeserializeObject(redisInfo); + throw new Exception("expected shard, but didn't get one"); } private void ReadyOrResumed(Shard shard) @@ -145,5 +151,5 @@ public static class RedisExt { // convenience method public static HashEntry[] HashWrapper(this ShardState state) - => new[] { new HashEntry(state.ShardId, state.ToByteArray()) }; + => new[] { new HashEntry(state.ShardId, JsonConvert.SerializeObject(state)) }; } \ No newline at end of file diff --git a/PluralKit.Bot/packages.lock.json b/PluralKit.Bot/packages.lock.json index f5141a33..fbe69392 100644 --- a/PluralKit.Bot/packages.lock.json +++ b/PluralKit.Bot/packages.lock.json @@ -2,28 +2,6 @@ "version": 1, "dependencies": { "net8.0": { - "Google.Protobuf": { - "type": "Direct", - "requested": "[3.29.1, )", - "resolved": "3.29.1", - "contentHash": "kDFLP72bPu4GwquVN7HtFnfqxhQs4CLbUEyOc/0yV48HB0Pxf7tDK7zIx6ifaQwGp+RSoLY1sz1CXqoAEAu+AQ==" - }, - "Grpc.Net.ClientFactory": { - "type": "Direct", - "requested": "[2.67.0, )", - "resolved": "2.67.0", - "contentHash": "owkRL6j8ZXvLnn8SsFGCRiWoe/2wGv+u+TASAylzUtGbHLnw7IiFRoeTs0IgpCNTETvlMLVb0gHDiLGo+mJZ6g==", - "dependencies": { - "Grpc.Net.Client": "2.67.0", - "Microsoft.Extensions.Http": "6.0.0" - } - }, - "Grpc.Tools": { - "type": "Direct", - "requested": "[2.68.1, )", - "resolved": "2.68.1", - "contentHash": "BZ96s7ijKAhJoRpIK+pqCeLaGaSwyc5/CAZFwgCcBuAnkU2naYvH0P6qnYCkl0pWDY/JBOnE2RvX9IvRX1Yc5Q==" - }, "Humanizer.Core": { "type": "Direct", "requested": "[2.14.1, )", @@ -158,28 +136,6 @@ "System.Diagnostics.DiagnosticSource": "5.0.0" } }, - "Grpc.Core.Api": { - "type": "Transitive", - "resolved": "2.67.0", - "contentHash": "cL1/2f8kc8lsAGNdfCU25deedXVehhLA6GXKLLN4hAWx16XN7BmjYn3gFU+FBpir5yJynvDTHEypr3Tl0j7x/Q==" - }, - "Grpc.Net.Client": { - "type": "Transitive", - "resolved": "2.67.0", - "contentHash": "ofTjJQfegWkVlk5R4k/LlwpcucpsBzntygd4iAeuKd/eLMkmBWoXN+xcjYJ5IibAahRpIJU461jABZvT6E9dwA==", - "dependencies": { - "Grpc.Net.Common": "2.67.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0" - } - }, - "Grpc.Net.Common": { - "type": "Transitive", - "resolved": "2.67.0", - "contentHash": "gazn1cD2Eol0/W5ZJRV4PYbNrxJ9oMs8pGYux5S9E4MymClvl7aqYSmpqgmWAUWvziRqK9K+yt3cjCMfQ3x/5A==", - "dependencies": { - "Grpc.Core.Api": "2.67.0" - } - }, "IPNetwork2": { "type": "Transitive", "resolved": "3.0.667", @@ -318,17 +274,6 @@ "resolved": "9.0.0", "contentHash": "jGFKZiXs2HNseK3NK/rfwHNNovER71jSj4BD1a/649ml9+h6oEtYd0GSALZDNW8jZ2Rh+oAeadOa6sagYW1F2A==" }, - "Microsoft.Extensions.Http": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "15+pa2G0bAMHbHewaQIdr/y6ag2H3yh4rd9hTXavtWDzQBkvpe2RMqFg8BxDpcQWssmjmBApGPcw93QRz6YcMg==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0" - } - }, "Microsoft.Extensions.Logging": { "type": "Transitive", "resolved": "9.0.0", @@ -778,8 +723,6 @@ "myriad": { "type": "Project", "dependencies": { - "Google.Protobuf": "[3.29.1, )", - "Grpc.Net.ClientFactory": "[2.67.0, )", "Polly": "[8.5.0, )", "Polly.Contrib.WaitAndRetry": "[1.1.1, )", "Serilog": "[4.2.0, )", @@ -797,7 +740,6 @@ "Autofac.Extensions.DependencyInjection": "[10.0.0, )", "Dapper": "[2.1.35, )", "Dapper.Contrib": "[2.0.78, )", - "Google.Protobuf": "[3.29.1, )", "Microsoft.Extensions.Caching.Memory": "[9.0.0, )", "Microsoft.Extensions.Configuration": "[9.0.0, )", "Microsoft.Extensions.Configuration.Binder": "[9.0.0, )", diff --git a/PluralKit.Core/PluralKit.Core.csproj b/PluralKit.Core/PluralKit.Core.csproj index 1a0063f1..2e956ec5 100644 --- a/PluralKit.Core/PluralKit.Core.csproj +++ b/PluralKit.Core/PluralKit.Core.csproj @@ -23,7 +23,6 @@ - diff --git a/PluralKit.Core/Utils/ProtobufUtils.cs b/PluralKit.Core/Utils/ProtobufUtils.cs deleted file mode 100644 index 63cd9374..00000000 --- a/PluralKit.Core/Utils/ProtobufUtils.cs +++ /dev/null @@ -1,22 +0,0 @@ -using Google.Protobuf; - -namespace PluralKit.Core; - -public static class Proto -{ - private static readonly Dictionary _parser = new(); - - public static byte[] Marshal(this IMessage message) => message.ToByteArray(); - - public static T Unmarshal(this byte[] message) where T : IMessage, new() - { - var type = typeof(T).ToString(); - if (_parser.ContainsKey(type)) - { - return (T)_parser[type].ParseFrom(message); - } - - _parser.Add(type, new MessageParser(() => new T())); - return Unmarshal(message); - } -} \ No newline at end of file diff --git a/PluralKit.Core/packages.lock.json b/PluralKit.Core/packages.lock.json index 624ba549..a4768566 100644 --- a/PluralKit.Core/packages.lock.json +++ b/PluralKit.Core/packages.lock.json @@ -66,12 +66,6 @@ "Dapper": "2.0.78" } }, - "Google.Protobuf": { - "type": "Direct", - "requested": "[3.29.1, )", - "resolved": "3.29.1", - "contentHash": "kDFLP72bPu4GwquVN7HtFnfqxhQs4CLbUEyOc/0yV48HB0Pxf7tDK7zIx6ifaQwGp+RSoLY1sz1CXqoAEAu+AQ==" - }, "IPNetwork2": { "type": "Direct", "requested": "[3.0.667, )", diff --git a/PluralKit.Tests/packages.lock.json b/PluralKit.Tests/packages.lock.json index 19fefd0b..419ec053 100644 --- a/PluralKit.Tests/packages.lock.json +++ b/PluralKit.Tests/packages.lock.json @@ -151,42 +151,6 @@ "System.Diagnostics.DiagnosticSource": "5.0.0" } }, - "Google.Protobuf": { - "type": "Transitive", - "resolved": "3.29.1", - "contentHash": "kDFLP72bPu4GwquVN7HtFnfqxhQs4CLbUEyOc/0yV48HB0Pxf7tDK7zIx6ifaQwGp+RSoLY1sz1CXqoAEAu+AQ==" - }, - "Grpc.Core.Api": { - "type": "Transitive", - "resolved": "2.67.0", - "contentHash": "cL1/2f8kc8lsAGNdfCU25deedXVehhLA6GXKLLN4hAWx16XN7BmjYn3gFU+FBpir5yJynvDTHEypr3Tl0j7x/Q==" - }, - "Grpc.Net.Client": { - "type": "Transitive", - "resolved": "2.67.0", - "contentHash": "ofTjJQfegWkVlk5R4k/LlwpcucpsBzntygd4iAeuKd/eLMkmBWoXN+xcjYJ5IibAahRpIJU461jABZvT6E9dwA==", - "dependencies": { - "Grpc.Net.Common": "2.67.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0" - } - }, - "Grpc.Net.ClientFactory": { - "type": "Transitive", - "resolved": "2.67.0", - "contentHash": "owkRL6j8ZXvLnn8SsFGCRiWoe/2wGv+u+TASAylzUtGbHLnw7IiFRoeTs0IgpCNTETvlMLVb0gHDiLGo+mJZ6g==", - "dependencies": { - "Grpc.Net.Client": "2.67.0", - "Microsoft.Extensions.Http": "6.0.0" - } - }, - "Grpc.Net.Common": { - "type": "Transitive", - "resolved": "2.67.0", - "contentHash": "gazn1cD2Eol0/W5ZJRV4PYbNrxJ9oMs8pGYux5S9E4MymClvl7aqYSmpqgmWAUWvziRqK9K+yt3cjCMfQ3x/5A==", - "dependencies": { - "Grpc.Core.Api": "2.67.0" - } - }, "Humanizer.Core": { "type": "Transitive", "resolved": "2.14.1", @@ -398,17 +362,6 @@ "Microsoft.Extensions.Logging.Abstractions": "9.0.0" } }, - "Microsoft.Extensions.Http": { - "type": "Transitive", - "resolved": "6.0.0", - "contentHash": "15+pa2G0bAMHbHewaQIdr/y6ag2H3yh4rd9hTXavtWDzQBkvpe2RMqFg8BxDpcQWssmjmBApGPcw93QRz6YcMg==", - "dependencies": { - "Microsoft.Extensions.DependencyInjection.Abstractions": "6.0.0", - "Microsoft.Extensions.Logging": "6.0.0", - "Microsoft.Extensions.Logging.Abstractions": "6.0.0", - "Microsoft.Extensions.Options": "6.0.0" - } - }, "Microsoft.Extensions.Logging": { "type": "Transitive", "resolved": "9.0.0", @@ -982,8 +935,6 @@ "myriad": { "type": "Project", "dependencies": { - "Google.Protobuf": "[3.29.1, )", - "Grpc.Net.ClientFactory": "[2.67.0, )", "Polly": "[8.5.0, )", "Polly.Contrib.WaitAndRetry": "[1.1.1, )", "Serilog": "[4.2.0, )", @@ -994,7 +945,6 @@ "pluralkit.api": { "type": "Project", "dependencies": { - "Google.Protobuf": "[3.29.1, )", "Microsoft.AspNetCore.Mvc.NewtonsoftJson": "[8.0.11, )", "Microsoft.AspNetCore.Mvc.Versioning": "[5.1.0, )", "Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer": "[5.1.0, )", @@ -1005,8 +955,6 @@ "pluralkit.bot": { "type": "Project", "dependencies": { - "Google.Protobuf": "[3.29.1, )", - "Grpc.Net.ClientFactory": "[2.67.0, )", "Humanizer.Core": "[2.14.1, )", "Myriad": "[1.0.0, )", "PluralKit.Core": "[1.0.0, )", @@ -1024,7 +972,6 @@ "Autofac.Extensions.DependencyInjection": "[10.0.0, )", "Dapper": "[2.1.35, )", "Dapper.Contrib": "[2.0.78, )", - "Google.Protobuf": "[3.29.1, )", "Microsoft.Extensions.Caching.Memory": "[9.0.0, )", "Microsoft.Extensions.Configuration": "[9.0.0, )", "Microsoft.Extensions.Configuration.Binder": "[9.0.0, )", diff --git a/ci/Dockerfile.rust b/ci/Dockerfile.rust index 9e6dad46..e0156e5c 100644 --- a/ci/Dockerfile.rust +++ b/ci/Dockerfile.rust @@ -2,7 +2,7 @@ FROM alpine:latest AS builder WORKDIR /build -RUN apk add rustup build-base protoc +RUN apk add rustup build-base # todo: arm64 target RUN rustup-init --default-host x86_64-unknown-linux-musl --default-toolchain nightly-2024-08-20 --profile default -y @@ -22,7 +22,6 @@ RUN cargo chef cook --release --recipe-path recipe.json --target x86_64-unknown- COPY Cargo.toml /build/ COPY Cargo.lock /build/ -COPY proto/ /build/proto # this needs to match workspaces in Cargo.toml COPY lib/libpk /build/lib/libpk diff --git a/dashboard/src/routes/Status/status.svelte b/dashboard/src/routes/Status/status.svelte index 8264057b..57568bb1 100644 --- a/dashboard/src/routes/Status/status.svelte +++ b/dashboard/src/routes/Status/status.svelte @@ -25,7 +25,7 @@ let valid = false; const get = async () => { - const pkdata = await api().private.meta.get(); + const pkdata = await api().private.discord.shard_state.get(); let data = pkdata.shards.sort((x, y) => (x.id > y.id) ? 1 : -1); let latencies = 0; data = data.map(shard => { diff --git a/flake.nix b/flake.nix index 5f3989a7..ac600aa4 100644 --- a/flake.nix +++ b/flake.nix @@ -52,7 +52,6 @@ git dotnet-sdk_8 gcc - protobuf omnisharp-roslyn bashInteractive ]; @@ -80,14 +79,14 @@ path = ./.; export = false; }; - nci.crates."gateway" = { - depsDrvConfig.mkDerivation = { - nativeBuildInputs = [ pkgs.protobuf ]; - }; - drvConfig.mkDerivation = { - nativeBuildInputs = [ pkgs.protobuf ]; - }; - }; + # nci.crates."gateway" = { + # depsDrvConfig.mkDerivation = { + # nativeBuildInputs = [ pkgs.protobuf ]; + # }; + # drvConfig.mkDerivation = { + # nativeBuildInputs = [ pkgs.protobuf ]; + # }; + # }; # TODO: expose other rust packages after it's verified they build and work properly packages = lib.genAttrs ["gateway"] (name: rustOutputs.${name}.packages.release); diff --git a/lib/libpk/Cargo.toml b/lib/libpk/Cargo.toml index a21bf55f..714e7d00 100644 --- a/lib/libpk/Cargo.toml +++ b/lib/libpk/Cargo.toml @@ -8,8 +8,6 @@ anyhow = { workspace = true } fred = { workspace = true } lazy_static = { workspace = true } metrics = { workspace = true } -prost = { workspace = true } -prost-types = { workspace = true } sentry = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } @@ -24,6 +22,3 @@ uuid = { workspace = true } config = "0.14.0" json-subscriber = { version = "0.2.2", features = ["env-filter"] } metrics-exporter-prometheus = { version = "0.15.3", default-features = false, features = ["tokio", "http-listener", "tracing"] } - -[build-dependencies] -prost-build = { workspace = true } diff --git a/lib/libpk/build.rs b/lib/libpk/build.rs deleted file mode 100644 index 6569962b..00000000 --- a/lib/libpk/build.rs +++ /dev/null @@ -1,9 +0,0 @@ -use std::io::Result; - -fn main() -> Result<()> { - prost_build::Config::new() - .type_attribute(".ShardState", "#[derive(serde::Serialize)]") - .field_attribute(".ShardState.shard_id", "#[serde(rename = \"id\")]") - .compile_protos(&["../../proto/state.proto"], &["../../proto/"])?; - Ok(()) -} diff --git a/lib/libpk/src/lib.rs b/lib/libpk/src/lib.rs index 19d4e1ee..ee7a6536 100644 --- a/lib/libpk/src/lib.rs +++ b/lib/libpk/src/lib.rs @@ -6,7 +6,7 @@ use sentry::IntoDsn; use tracing_subscriber::{layer::SubscriberExt, util::SubscriberInitExt, EnvFilter}; pub mod db; -pub mod proto; +pub mod state; pub mod util; pub mod _config; diff --git a/lib/libpk/src/proto.rs b/lib/libpk/src/proto.rs deleted file mode 100644 index 3e6d84c3..00000000 --- a/lib/libpk/src/proto.rs +++ /dev/null @@ -1 +0,0 @@ -include!(concat!(env!("OUT_DIR"), "/_.rs")); diff --git a/proto/discord_cache.proto b/proto/discord_cache.proto deleted file mode 100644 index fa11fde3..00000000 --- a/proto/discord_cache.proto +++ /dev/null @@ -1,47 +0,0 @@ -syntax = "proto3"; - -package myriad.cache; - -message Overwrite { - uint64 id = 1; - int32 type = 2; - uint64 allow = 3; - uint64 deny = 4; -} - -message CachedChannel { - uint64 id = 1; - int32 type = 2; - int32 position = 3; - string name = 4; - repeated Overwrite permission_overwrites = 5; - optional uint64 guild_id = 6; - optional uint64 parent_id = 7; -} - -message CachedGuildMember { - repeated uint64 roles = 1; -} - -message CachedGuild { - uint64 id = 1; - string name = 2; - uint64 owner_id = 3; - int32 premium_tier = 4; -} - -message CachedRole { - uint64 id = 1; - string name = 2; - int32 position = 3; - uint64 permissions = 4; - bool mentionable = 5; -} - -message CachedUser { - uint64 id = 1; - string username = 2; - string discriminator = 3; - optional string avatar = 4; - bool bot = 5; -} \ No newline at end of file diff --git a/proto/state.proto b/proto/state.proto deleted file mode 100644 index 448d869b..00000000 --- a/proto/state.proto +++ /dev/null @@ -1,21 +0,0 @@ -syntax = "proto3"; - -message ShardState { - int32 shard_id = 1; - bool up = 2; - int32 disconnection_count = 3; - - // milliseconds - int32 latency = 4; - - // unix timestamp - int32 last_heartbeat = 5; - int32 last_connection = 6; - - optional int32 cluster_id = 7; -} - -message GatewayEvent { - int32 shard_id = 1; - bytes payload = 2; -} diff --git a/services/api/Cargo.toml b/services/api/Cargo.toml index e77eaab5..a8de117b 100644 --- a/services/api/Cargo.toml +++ b/services/api/Cargo.toml @@ -10,7 +10,6 @@ fred = { workspace = true } lazy_static = { workspace = true } libpk = { path = "../../lib/libpk" } metrics = { workspace = true } -prost = { workspace = true } serde = { workspace = true } serde_json = { workspace = true } sqlx = { workspace = true } diff --git a/services/api/src/endpoints/private.rs b/services/api/src/endpoints/private.rs index 9db137ee..95da5041 100644 --- a/services/api/src/endpoints/private.rs +++ b/services/api/src/endpoints/private.rs @@ -1,8 +1,7 @@ use crate::ApiContext; use axum::{extract::State, response::Json}; use fred::interfaces::*; -use libpk::proto::ShardState; -use prost::Message; +use libpk::state::ShardState; use serde::Deserialize; use serde_json::{json, Value}; use std::collections::HashMap; @@ -14,16 +13,22 @@ struct ClusterStats { pub channel_count: i32, } -pub async fn meta(State(ctx): State) -> Json { +pub async fn discord_state(State(ctx): State) -> Json { let shard_status = ctx .redis - .hgetall::>, &str>("pluralkit:shardstatus") + .hgetall::, &str>("pluralkit:shardstatus") .await .unwrap() .values() - .map(|v| ShardState::decode(v.as_slice()).unwrap()) + .map(|v| serde_json::from_str(v).expect("could not deserialize shard")) .collect::>(); + Json(json!({ + "shards": shard_status, + })) +} + +pub async fn meta(State(ctx): State) -> Json { let cluster_stats = ctx .redis .hgetall::, &str>("pluralkit:cluster_stats") @@ -39,15 +44,12 @@ pub async fn meta(State(ctx): State) -> Json { let channel_count: i32 = cluster_stats.iter().map(|v| v.channel_count).sum(); Json(json!({ - "shards": shard_status, - "stats": { - "system_count": db_stats.system_count, - "member_count": db_stats.member_count, - "group_count": db_stats.group_count, - "switch_count": db_stats.switch_count, - "message_count": db_stats.message_count, - "guild_count": guild_count, - "channel_count": channel_count, - } + "system_count": db_stats.system_count, + "member_count": db_stats.member_count, + "group_count": db_stats.group_count, + "switch_count": db_stats.switch_count, + "message_count": db_stats.message_count, + "guild_count": guild_count, + "channel_count": channel_count, })) } diff --git a/services/api/src/main.rs b/services/api/src/main.rs index bbf3c6ee..1a00f1a0 100644 --- a/services/api/src/main.rs +++ b/services/api/src/main.rs @@ -104,10 +104,11 @@ fn router(ctx: ApiContext) -> Router { .route("/v2/messages/:message_id", get(rproxy)) - .route("/private/meta", get(endpoints::private::meta)) .route("/private/bulk_privacy/member", post(rproxy)) .route("/private/bulk_privacy/group", post(rproxy)) .route("/private/discord/callback", post(rproxy)) + .route("/private/discord/shard_state", get(endpoints::private::discord_state)) + .route("/private/stats", get(endpoints::private::meta)) .route("/v2/systems/:system_id/oembed.json", get(rproxy)) .route("/v2/members/:member_id/oembed.json", get(rproxy)) diff --git a/services/api/src/middleware/logger.rs b/services/api/src/middleware/logger.rs index cfb84b4a..020de2e2 100644 --- a/services/api/src/middleware/logger.rs +++ b/services/api/src/middleware/logger.rs @@ -42,7 +42,6 @@ pub async fn logger(request: Request, next: Next) -> Response { let authenticated = { let headers = response.headers_mut(); - println!("{:#?}", headers.keys()); if headers.contains_key(DID_AUTHENTICATE_HEADER) { headers.remove(DID_AUTHENTICATE_HEADER); true diff --git a/services/gateway/Cargo.toml b/services/gateway/Cargo.toml index 6b9f3e25..98142a7f 100644 --- a/services/gateway/Cargo.toml +++ b/services/gateway/Cargo.toml @@ -13,7 +13,6 @@ futures = { workspace = true } lazy_static = { workspace = true } libpk = { path = "../../lib/libpk" } metrics = { workspace = true } -prost = { workspace = true } serde_json = { workspace = true } signal-hook = { workspace = true } tokio = { workspace = true } diff --git a/services/gateway/src/discord/shard_state.rs b/services/gateway/src/discord/shard_state.rs index f92ff866..1e7f94fe 100644 --- a/services/gateway/src/discord/shard_state.rs +++ b/services/gateway/src/discord/shard_state.rs @@ -1,11 +1,10 @@ use bytes::Bytes; use fred::{clients::RedisPool, interfaces::HashesInterface}; use metrics::{counter, gauge}; -use prost::Message; use tracing::info; use twilight_gateway::Event; -use libpk::{proto::*, util::redis::*}; +use libpk::{state::*, util::redis::*}; #[derive(Clone)] pub struct ShardStateManager { @@ -28,26 +27,24 @@ impl ShardStateManager { } async fn get_shard(&self, shard_id: u32) -> anyhow::Result { - let data: Option> = self + let data: Option = self .redis .hget("pluralkit:shardstatus", shard_id) .await .to_option_or_error()?; match data { - Some(buf) => { - Ok(ShardState::decode(buf.as_slice()).expect("could not decode shard data!")) - } + Some(buf) => Ok(serde_json::from_str(&buf).expect("could not decode shard data!")), None => Ok(ShardState::default()), } } async fn save_shard(&self, shard_id: u32, info: ShardState) -> anyhow::Result<()> { self.redis - .hset::<(), &str, (String, Bytes)>( + .hset::<(), &str, (String, String)>( "pluralkit:shardstatus", ( shard_id.to_string(), - Bytes::copy_from_slice(&info.encode_to_vec()), + serde_json::to_string(&info).expect("could not serialize shard"), ), ) .await?;