diff --git a/LarpixServer/Account/Requests.cs b/LarpixServer/Account/Requests.cs index b77754c..0cc3882 100644 --- a/LarpixServer/Account/Requests.cs +++ b/LarpixServer/Account/Requests.cs @@ -631,11 +631,17 @@ public class Requests , password)); break; case "user/dm/create": - await context.Response.WriteAsync( - Encryption.Encryption.EncryptString( - await Room.Requests.DmCreate(id, serializedBody.string2) - , password)); + await context.Response.WriteAsync(Encryption.Encryption.EncryptString(await Room.Requests.DmCreate(id, serializedBody.string2), password)); break; + case "dm/messages/get": + { + Universal3String msgGet = JsonSerializer.Deserialize( + serializedBody.string2, + AppJsonSerializerContext.Default.Universal3String + ); + await context.Response.WriteAsync(Encryption.Encryption.EncryptString(await Room.Requests.GetDmMessages(id, msgGet.string1, msgGet.string3, msgGet.string2), password)); + break; + } case "dm/key/get": await context.Response.WriteAsync( Encryption.Encryption.EncryptString( diff --git a/LarpixServer/Filesystem/Fs.cs b/LarpixServer/Filesystem/Fs.cs index 637ad3e..d6b7ad8 100644 --- a/LarpixServer/Filesystem/Fs.cs +++ b/LarpixServer/Filesystem/Fs.cs @@ -160,10 +160,14 @@ public class Fs try { - var dir = Path.GetDirectoryName(path); - if (!string.IsNullOrEmpty(dir) && !Directory.Exists(dir)) + var dir = Path.GetDirectoryName(path)?.Replace("\\", "/"); + if (!string.IsNullOrEmpty(dir)) { - CreateDirectory(dir); + existCache[dir] = true; + if (!Directory.Exists(dir)) + { + CreateDirectory(dir); + } } await File.WriteAllBytesAsync(path, content); diff --git a/LarpixServer/Room/Requests.cs b/LarpixServer/Room/Requests.cs index 8f25d65..3d55c86 100644 --- a/LarpixServer/Room/Requests.cs +++ b/LarpixServer/Room/Requests.cs @@ -29,6 +29,49 @@ public class Requests string memberPath = $"{ROOMS_DIR}/dms/{DOMAIN}/{dmId}/members/{id};{DOMAIN}"; return Fs.Exists(memberPath); } + public static async Task GetDmMessages(string id, string dmId, string startOffset, string countStr) + { + if (!await IsMemberOfDm(id, dmId)) return "error:forbidden"; + + string msgDir = $"{ROOMS_DIR}/dms/{DOMAIN}/{dmId}/messages"; + if (!Fs.Exists(msgDir)) return "{}"; + + long last = 0; + if (Fs.Exists($"{msgDir}/last")) + { + string lastStr = Encoding.UTF8.GetString(await Fs.ReadFile($"{msgDir}/last")); + long.TryParse(lastStr, out last); + } + + long start = last; + if (!string.IsNullOrEmpty(startOffset) && long.TryParse(startOffset, out long s)) + { + start = s; + } + + int count = 50; + if (!string.IsNullOrEmpty(countStr) && int.TryParse(countStr, out int c)) + { + count = Math.Min(c, 100); + } + + StringBuilder sb = new StringBuilder("{"); + int fetched = 0; + for (long i = start; i >= 0 && fetched < count; i--) + { + string p = $"{msgDir}/{i}"; + if (Fs.Exists(p)) + { + if (fetched > 0) sb.Append(','); + sb.Append($"\"{i}\":"); + sb.Append(Encoding.UTF8.GetString(await Fs.ReadFile(p))); + fetched++; + } + } + sb.Append("}"); + return sb.ToString(); + } + public static async Task GetDmKey(string id, string dmId) {