diff --git a/LarpixServer/Account/Requests.cs b/LarpixServer/Account/Requests.cs index 4707cd5..3aeda86 100644 --- a/LarpixServer/Account/Requests.cs +++ b/LarpixServer/Account/Requests.cs @@ -315,6 +315,24 @@ public class Requests return; } + + public static async Task IdToName(HttpContext context, Func next, IQueryCollection query) + { + if (!query.TryGetValue("id", out var id)) + { + return; + } + + if (!Utils.IsUserLocal(id, out string domain)) //federation :( + { + return; + } + id = id.ToString().Split(":")[0]; + + await context.Response.WriteAsync(await Utils.NameFromId(id) + $":{DOMAIN}"); + return; + + } public static async Task NextNonce(HttpContext context, Func next, IQueryCollection query) { diff --git a/LarpixServer/Account/Utils.cs b/LarpixServer/Account/Utils.cs index f5d8f58..1fbc042 100644 --- a/LarpixServer/Account/Utils.cs +++ b/LarpixServer/Account/Utils.cs @@ -182,31 +182,103 @@ public class Utils public static async Task GetUserSentInvites(string id) { + string dmString = "\"dms\": {"; + string groupString = "\"groups\": {"; string path = $"{ACCOUNTS_DATA_DIR}/{id}/dminvites/sent"; - if (!Fs.Exists(path)) + if (Fs.Exists(path)) { - return ""; + string[] invites = Fs.ReadDirectory(path); + if (invites.Length != 0) + { + foreach (var invite in invites) + { + string content = Encoding.UTF8.GetString(await Fs.ReadFile($"{path}/{invite}")); + if (dmString == "\"dms\": {") + { + dmString += $"\"{invite}\": {{ \"timestamp\": {content} }}"; + } + else + { + dmString += $",\"{invite}\": {{ \"timestamp\": {content} }}"; + } + } + } } - string[] invites = Fs.ReadDirectory(path); - if (invites.Length == 0) + dmString += "}"; + + path = $"{ACCOUNTS_DATA_DIR}/{id}/groupinvites/sent"; + if (Fs.Exists(path)) { - return ""; + string[] invites = Fs.ReadDirectory(path); + if (invites.Length != 0) + { + foreach (var invite in invites) //filename - group;domain-receiverid;domain + { string[] inviteArray = invite.Split('-'); + string content = Encoding.UTF8.GetString(await Fs.ReadFile($"{path}/{invite}")); + if (groupString == "\"groups\": {") + { + groupString += $"\"{inviteArray[0]}\": {{ \"timestamp\": {content}, \"receiver\": \"{inviteArray[1]}\" }}"; + } + else + { + groupString += $",\"{inviteArray[0]}\": {{ \"timestamp\": {content}, \"receiver\": \"{inviteArray[1]}\" }}"; + } + } + } } - return string.Join(",", invites); + groupString += "}"; + + return $"{{{dmString},{groupString}}}"; } public static async Task GetUserReceivedInvites(string id) { + string dmString = "\"dms\": {"; + string groupString = "\"groups\": {"; string path = $"{ACCOUNTS_DATA_DIR}/{id}/dminvites/recv"; - if (!Fs.Exists(path)) + if (Fs.Exists(path)) { - return ""; + string[] invites = Fs.ReadDirectory(path); + if (invites.Length != 0) + { + foreach (var invite in invites) + { + string content = Encoding.UTF8.GetString(await Fs.ReadFile($"{path}/{invite}")); + if (dmString == "\"dms\": {") + { + dmString += $"\"{invite}\": {{ \"timestamp\": {content} }}"; + } + else + { + dmString += $",\"{invite}\": {{ \"timestamp\": {content} }}"; + } + } + } } - string[] invites = Fs.ReadDirectory(path); - if (invites.Length == 0) + dmString += "}"; + + path = $"{ACCOUNTS_DATA_DIR}/{id}/groupinvites/recv"; + if (Fs.Exists(path)) { - return ""; + string[] invites = Fs.ReadDirectory(path); + if (invites.Length != 0) + { + foreach (var invite in invites) + { + string[] content = Encoding.UTF8.GetString(await Fs.ReadFile($"{path}/{invite}")).Split(':'); + if (groupString == "\"groups\": {") + { + groupString += $"\"{invite}\": {{ \"timestamp\": {content[1]}, \"sender\": \"{content[0]}\" }}"; + } + else + { + groupString += $",\"{invite}\": {{ \"timestamp\": {content[1]}, \"sender\": \"{content[0]}\" }}"; + } + } + } } - return string.Join(",", invites); + groupString += "}"; + + return $"{{{dmString},{groupString}}}"; } public static async Task UpdateUserKeys(string id, string body) diff --git a/LarpixServer/Federation/Receiver.cs b/LarpixServer/Federation/Receiver.cs index f555baf..b860ed2 100644 --- a/LarpixServer/Federation/Receiver.cs +++ b/LarpixServer/Federation/Receiver.cs @@ -46,7 +46,7 @@ public class Receiver await context.Response.WriteAsync("info:user.already.invited"); return; } - await Fs.WriteFile(inviteFile, Encoding.UTF8.GetBytes("0")); + await Fs.WriteFile(inviteFile, Encoding.UTF8.GetBytes(DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString())); } finally { diff --git a/LarpixServer/Program.cs b/LarpixServer/Program.cs index 31f4a05..d89b850 100644 --- a/LarpixServer/Program.cs +++ b/LarpixServer/Program.cs @@ -165,6 +165,9 @@ public class Program case "/_larpix/correctedname": await Account.Requests.CorrectedName(context, next, query); return; + case "/_larpix/idtoname": + await Account.Requests.IdToName(context, next, query); + return; case "/_larpix/nextnonce": await Account.Requests.NextNonce(context, next, query); return; diff --git a/LarpixServer/Room/Requests.cs b/LarpixServer/Room/Requests.cs index c24f055..a308a65 100644 --- a/LarpixServer/Room/Requests.cs +++ b/LarpixServer/Room/Requests.cs @@ -17,7 +17,7 @@ public class Requests username2 = username2.Split(":")[0]; string remoteId2 = await Federation.Sender.GetUserId(username2, domain); - await Fs.WriteFile(ACCOUNTS_DATA_DIR + $"/{id}/dminvites/sent/{remoteId2};{domain}", []); //only save sent while federating + await Fs.WriteFile(ACCOUNTS_DATA_DIR + $"/{id}/dminvites/sent/{remoteId2};{domain}", Encoding.UTF8.GetBytes(DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString())); return await Federation.Sender.DmInvite(id, domain, remoteId2); } @@ -43,8 +43,9 @@ public class Requests return "info:user.already.invited"; } - await Fs.WriteFile(inviteFile, Encoding.UTF8.GetBytes("0")); - await Fs.WriteFile(ACCOUNTS_DATA_DIR + $"/{id}/dminvites/sent/{id2}", []); //we should also save that this user invited someone, because listing sent invites is cool + byte[] timestamp = Encoding.UTF8.GetBytes(DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString()); + await Fs.WriteFile(inviteFile, timestamp); + await Fs.WriteFile(ACCOUNTS_DATA_DIR + $"/{id}/dminvites/sent/{id2}", timestamp); //we should also save that this user invited someone, because listing sent invites is cool } finally {