mirror of
https://github.com/chylex/Discord-History-Tracker.git
synced 2024-11-25 14:42:44 +01:00
Compare commits
3 Commits
65d935cca1
...
069ab97196
Author | SHA1 | Date | |
---|---|---|---|
069ab97196 | |||
caab038eaa | |||
fb837374fc |
@ -1,9 +1,9 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
|
||||||
using System.Diagnostics.CodeAnalysis;
|
using System.Diagnostics.CodeAnalysis;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
using System.Runtime.InteropServices;
|
using System.Runtime.InteropServices;
|
||||||
using System.Text.Json;
|
using System.Text.Json;
|
||||||
|
using System.Text.Json.Nodes;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using DHT.Utils.Logging;
|
using DHT.Utils.Logging;
|
||||||
using static System.Environment.SpecialFolder;
|
using static System.Environment.SpecialFolder;
|
||||||
@ -47,12 +47,12 @@ static class DiscordAppSettings {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static bool AreDevToolsEnabled(Dictionary<string, object?> json) {
|
private static bool AreDevToolsEnabled(JsonObject json) {
|
||||||
return json.TryGetValue(JsonKeyDevTools, out var value) && value is JsonElement { ValueKind: JsonValueKind.True };
|
return json.TryGetPropertyValue(JsonKeyDevTools, out var node) && node?.GetValueKind() == JsonValueKind.True;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static async Task<SettingsJsonResult> ConfigureDevTools(bool enable) {
|
public static async Task<SettingsJsonResult> ConfigureDevTools(bool enable) {
|
||||||
Dictionary<string, object?> json;
|
JsonObject json;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
json = await ReadSettingsJson();
|
json = await ReadSettingsJson();
|
||||||
@ -109,13 +109,13 @@ static class DiscordAppSettings {
|
|||||||
return SettingsJsonResult.Success;
|
return SettingsJsonResult.Success;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async Task<Dictionary<string, object?>> ReadSettingsJson() {
|
private static async Task<JsonObject> ReadSettingsJson() {
|
||||||
await using var stream = new FileStream(JsonFilePath, FileMode.Open, FileAccess.Read, FileShare.Read);
|
await using var stream = new FileStream(JsonFilePath, FileMode.Open, FileAccess.Read, FileShare.Read);
|
||||||
return await JsonSerializer.DeserializeAsync<Dictionary<string, object?>?>(stream) ?? throw new JsonException();
|
return await JsonSerializer.DeserializeAsync(stream, DiscordAppSettingsJsonContext.Default.JsonObject) ?? throw new JsonException();
|
||||||
}
|
}
|
||||||
|
|
||||||
private static async Task WriteSettingsJson(Dictionary<string, object?> json) {
|
private static async Task WriteSettingsJson(JsonObject json) {
|
||||||
await using var stream = new FileStream(JsonFilePath, FileMode.Truncate, FileAccess.Write, FileShare.None);
|
await using var stream = new FileStream(JsonFilePath, FileMode.Truncate, FileAccess.Write, FileShare.None);
|
||||||
await JsonSerializer.SerializeAsync(stream, json, new JsonSerializerOptions { WriteIndented = true });
|
await JsonSerializer.SerializeAsync(stream, json, DiscordAppSettingsJsonContext.Default.JsonObject);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
8
app/Desktop/Discord/DiscordAppSettingsJsonContext.cs
Normal file
8
app/Desktop/Discord/DiscordAppSettingsJsonContext.cs
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
using System.Text.Json.Nodes;
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
|
namespace DHT.Desktop.Discord;
|
||||||
|
|
||||||
|
[JsonSourceGenerationOptions(GenerationMode = JsonSourceGenerationMode.Default, WriteIndented = true)]
|
||||||
|
[JsonSerializable(typeof(JsonObject))]
|
||||||
|
sealed partial class DiscordAppSettingsJsonContext : JsonSerializerContext {}
|
@ -19,9 +19,21 @@
|
|||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
|
<SuppressTrimAnalysisWarnings>false</SuppressTrimAnalysisWarnings>
|
||||||
<PublishTrimmed>true</PublishTrimmed>
|
<PublishTrimmed>true</PublishTrimmed>
|
||||||
<TrimMode>partial</TrimMode>
|
<TrimMode>partial</TrimMode>
|
||||||
<JsonSerializerIsReflectionEnabledByDefault>true</JsonSerializerIsReflectionEnabledByDefault>
|
<EnableUnsafeBinaryFormatterSerialization>false</EnableUnsafeBinaryFormatterSerialization>
|
||||||
|
<EnableUnsafeUTF7Encoding>false</EnableUnsafeUTF7Encoding>
|
||||||
|
<EventSourceSupport>false</EventSourceSupport>
|
||||||
|
<HttpActivityPropagationSupport>false</HttpActivityPropagationSupport>
|
||||||
|
<JsonSerializerIsReflectionEnabledByDefault>false</JsonSerializerIsReflectionEnabledByDefault>
|
||||||
|
</PropertyGroup>
|
||||||
|
|
||||||
|
<PropertyGroup>
|
||||||
|
<PublishSingleFile>true</PublishSingleFile>
|
||||||
|
<PublishReadyToRun>false</PublishReadyToRun>
|
||||||
|
<EnableCompressionInSingleFile>true</EnableCompressionInSingleFile>
|
||||||
|
<IncludeNativeLibrariesForSelfExtract>true</IncludeNativeLibrariesForSelfExtract>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
|
<PropertyGroup Condition=" '$(Configuration)' == 'Release' ">
|
||||||
|
23
app/Server/Database/Import/DiscordEmbedLegacyJson.cs
Normal file
23
app/Server/Database/Import/DiscordEmbedLegacyJson.cs
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
|
namespace DHT.Server.Database.Import;
|
||||||
|
|
||||||
|
sealed class DiscordEmbedLegacyJson {
|
||||||
|
public required string Url { get; init; }
|
||||||
|
public required string Type { get; init; }
|
||||||
|
|
||||||
|
public bool DhtLegacy { get; } = true;
|
||||||
|
|
||||||
|
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
|
||||||
|
public string? Title { get; init; }
|
||||||
|
|
||||||
|
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
|
||||||
|
public string? Description { get; init; }
|
||||||
|
|
||||||
|
[JsonIgnore(Condition = JsonIgnoreCondition.WhenWritingNull)]
|
||||||
|
public ImageJson? Image { get; init; }
|
||||||
|
|
||||||
|
public sealed class ImageJson {
|
||||||
|
public required string Url { get; init; }
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,7 @@
|
|||||||
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
|
namespace DHT.Server.Database.Import;
|
||||||
|
|
||||||
|
[JsonSourceGenerationOptions(PropertyNamingPolicy = JsonKnownNamingPolicy.SnakeCaseLower, GenerationMode = JsonSourceGenerationMode.Default)]
|
||||||
|
[JsonSerializable(typeof(DiscordEmbedLegacyJson))]
|
||||||
|
sealed partial class DiscordEmbedLegacyJsonContext : JsonSerializerContext {}
|
@ -21,7 +21,7 @@ public static class LegacyArchiveImport {
|
|||||||
|
|
||||||
public static async Task<bool> Read(Stream stream, IDatabaseFile db, FakeSnowflake fakeSnowflake, Func<Data.Server[], Task<Dictionary<Data.Server, ulong>?>> askForServerIds) {
|
public static async Task<bool> Read(Stream stream, IDatabaseFile db, FakeSnowflake fakeSnowflake, Func<Data.Server[], Task<Dictionary<Data.Server, ulong>?>> askForServerIds) {
|
||||||
var perf = Log.Start();
|
var perf = Log.Start();
|
||||||
var root = await JsonSerializer.DeserializeAsync<JsonElement>(stream);
|
var root = await JsonSerializer.DeserializeAsync(stream, LegacyArchiveJsonContext.Default.JsonElement);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
var meta = root.RequireObject("meta");
|
var meta = root.RequireObject("meta");
|
||||||
@ -213,29 +213,16 @@ public static class LegacyArchiveImport {
|
|||||||
string url = embedObj.RequireString("url", path);
|
string url = embedObj.RequireString("url", path);
|
||||||
string type = embedObj.RequireString("type", path);
|
string type = embedObj.RequireString("type", path);
|
||||||
|
|
||||||
var embedJson = new Dictionary<string, object> {
|
var embed = new DiscordEmbedLegacyJson {
|
||||||
{ "url", url },
|
Url = url,
|
||||||
{ "type", type },
|
Type = type,
|
||||||
{ "dht_legacy", true },
|
Title = type == "rich" && embedObj.HasKey("t") ? embedObj.RequireString("t", path) : null,
|
||||||
|
Description = type == "rich" && embedObj.HasKey("d") ? embedObj.RequireString("d", path) : null,
|
||||||
|
Image = type == "image" ? new DiscordEmbedLegacyJson.ImageJson { Url = url } : null
|
||||||
};
|
};
|
||||||
|
|
||||||
if (type == "image") {
|
|
||||||
embedJson["image"] = new Dictionary<string, string> {
|
|
||||||
{ "url", url }
|
|
||||||
};
|
|
||||||
}
|
|
||||||
else if (type == "rich") {
|
|
||||||
if (embedObj.HasKey("t")) {
|
|
||||||
embedJson["title"] = embedObj.RequireString("t", path);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (embedObj.HasKey("d")) {
|
|
||||||
embedJson["description"] = embedObj.RequireString("d", path);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return new Embed {
|
return new Embed {
|
||||||
Json = JsonSerializer.Serialize(embedJson)
|
Json = JsonSerializer.Serialize(embed, DiscordEmbedLegacyJsonContext.Default.DiscordEmbedLegacyJson)
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
8
app/Server/Database/Import/LegacyArchiveJsonContext.cs
Normal file
8
app/Server/Database/Import/LegacyArchiveJsonContext.cs
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
using System.Text.Json;
|
||||||
|
using System.Text.Json.Serialization;
|
||||||
|
|
||||||
|
namespace DHT.Server.Database.Import;
|
||||||
|
|
||||||
|
[JsonSourceGenerationOptions(PropertyNamingPolicy = JsonKnownNamingPolicy.CamelCase, GenerationMode = JsonSourceGenerationMode.Default)]
|
||||||
|
[JsonSerializable(typeof(JsonElement))]
|
||||||
|
sealed partial class LegacyArchiveJsonContext : JsonSerializerContext {}
|
@ -17,6 +17,9 @@ using Microsoft.AspNetCore.Http;
|
|||||||
namespace DHT.Server.Endpoints;
|
namespace DHT.Server.Endpoints;
|
||||||
|
|
||||||
sealed class TrackMessagesEndpoint : BaseEndpoint {
|
sealed class TrackMessagesEndpoint : BaseEndpoint {
|
||||||
|
private const string HasNewMessages = "1";
|
||||||
|
private const string NoNewMessages = "0";
|
||||||
|
|
||||||
public TrackMessagesEndpoint(IDatabaseFile db, ServerParameters parameters) : base(db, parameters) {}
|
public TrackMessagesEndpoint(IDatabaseFile db, ServerParameters parameters) : base(db, parameters) {}
|
||||||
|
|
||||||
protected override async Task<IHttpOutput> Respond(HttpContext ctx) {
|
protected override async Task<IHttpOutput> Respond(HttpContext ctx) {
|
||||||
@ -41,7 +44,7 @@ sealed class TrackMessagesEndpoint : BaseEndpoint {
|
|||||||
|
|
||||||
Db.AddMessages(messages);
|
Db.AddMessages(messages);
|
||||||
|
|
||||||
return new HttpOutput.Json(anyNewMessages ? 1 : 0);
|
return new HttpOutput.Text(anyNewMessages ? HasNewMessages : NoNewMessages);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Message ReadMessage(JsonElement json, string path) => new() {
|
private static Message ReadMessage(JsonElement json, string path) => new() {
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
using System.Text;
|
||||||
using System.Threading.Tasks;
|
using System.Threading.Tasks;
|
||||||
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Http;
|
||||||
|
|
||||||
@ -12,15 +13,15 @@ public static class HttpOutput {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public sealed class Json : IHttpOutput {
|
public sealed class Text : IHttpOutput {
|
||||||
private readonly object? obj;
|
private readonly string text;
|
||||||
|
|
||||||
public Json(object? obj) {
|
public Text(string text) {
|
||||||
this.obj = obj;
|
this.text = text;
|
||||||
}
|
}
|
||||||
|
|
||||||
public Task WriteTo(HttpResponse response) {
|
public Task WriteTo(HttpResponse response) {
|
||||||
return response.WriteAsJsonAsync(obj);
|
return response.WriteAsync(text, Encoding.UTF8);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -4,11 +4,11 @@ set list=win-x64 linux-x64 osx-x64
|
|||||||
rmdir /S /Q bin
|
rmdir /S /Q bin
|
||||||
|
|
||||||
(for %%a in (%list%) do (
|
(for %%a in (%list%) do (
|
||||||
dotnet publish Desktop -c Release -r %%a -o ./bin/%%a -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true -p:PublishReadyToRun=false --self-contained true
|
dotnet publish Desktop -c Release -r %%a -o ./bin/%%a --self-contained true
|
||||||
powershell "Compress-Archive -Path ./bin/%%a/* -DestinationPath ./bin/%%a.zip -CompressionLevel Optimal"
|
powershell "Compress-Archive -Path ./bin/%%a/* -DestinationPath ./bin/%%a.zip -CompressionLevel Optimal"
|
||||||
))
|
))
|
||||||
|
|
||||||
dotnet publish Desktop -c Release -o ./bin/portable -p:PublishTrimmed=false --self-contained false
|
dotnet publish Desktop -c Release -o ./bin/portable -p:PublishSingleFile=false -p:PublishTrimmed=false --self-contained false
|
||||||
powershell "Compress-Archive -Path ./bin/portable/* -DestinationPath ./bin/portable.zip -CompressionLevel Optimal"
|
powershell "Compress-Archive -Path ./bin/portable/* -DestinationPath ./bin/portable.zip -CompressionLevel Optimal"
|
||||||
|
|
||||||
echo Done
|
echo Done
|
||||||
|
@ -17,9 +17,9 @@ rm -rf "./bin"
|
|||||||
configurations=(win-x64 linux-x64 osx-x64)
|
configurations=(win-x64 linux-x64 osx-x64)
|
||||||
|
|
||||||
for cfg in ${configurations[@]}; do
|
for cfg in ${configurations[@]}; do
|
||||||
dotnet publish Desktop -c Release -r "$cfg" -o "./bin/$cfg" -p:PublishSingleFile=true -p:IncludeNativeLibrariesForSelfExtract=true -p:PublishReadyToRun=false --self-contained true
|
dotnet publish Desktop -c Release -r "$cfg" -o "./bin/$cfg" --self-contained true
|
||||||
makezip "$cfg"
|
makezip "$cfg"
|
||||||
done
|
done
|
||||||
|
|
||||||
dotnet publish Desktop -c Release -o "./bin/portable" -p:PublishTrimmed=false --self-contained false
|
dotnet publish Desktop -c Release -o "./bin/portable" -p:PublishSingleFile=false -p:PublishTrimmed=false --self-contained false
|
||||||
makezip "portable"
|
makezip "portable"
|
||||||
|
Loading…
Reference in New Issue
Block a user