Add "idtoname" request & change invite format
All checks were successful
Server Build / publish (push) Successful in 28s
Voice Build / publish (push) Successful in 26s

This commit is contained in:
olcxja 2026-05-21 10:58:08 +02:00
commit 017eb2501b
5 changed files with 110 additions and 16 deletions

View file

@ -316,6 +316,24 @@ public class Requests
}
public static async Task IdToName(HttpContext context, Func<Task> 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<Task> next, IQueryCollection query)
{
if (!query.TryGetValue("u", out var username))

View file

@ -182,31 +182,103 @@ public class Utils
public static async Task<string> 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)
if (invites.Length != 0)
{
return "";
foreach (var invite in invites)
{
string content = Encoding.UTF8.GetString(await Fs.ReadFile($"{path}/{invite}"));
if (dmString == "\"dms\": {")
{
dmString += $"\"{invite}\": {{ \"timestamp\": {content} }}";
}
return string.Join(",", invites);
else
{
dmString += $",\"{invite}\": {{ \"timestamp\": {content} }}";
}
}
}
}
dmString += "}";
path = $"{ACCOUNTS_DATA_DIR}/{id}/groupinvites/sent";
if (Fs.Exists(path))
{
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]}\" }}";
}
}
}
}
groupString += "}";
return $"{{{dmString},{groupString}}}";
}
public static async Task<string> 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)
if (invites.Length != 0)
{
return "";
foreach (var invite in invites)
{
string content = Encoding.UTF8.GetString(await Fs.ReadFile($"{path}/{invite}"));
if (dmString == "\"dms\": {")
{
dmString += $"\"{invite}\": {{ \"timestamp\": {content} }}";
}
return string.Join(",", invites);
else
{
dmString += $",\"{invite}\": {{ \"timestamp\": {content} }}";
}
}
}
}
dmString += "}";
path = $"{ACCOUNTS_DATA_DIR}/{id}/groupinvites/recv";
if (Fs.Exists(path))
{
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]}\" }}";
}
}
}
}
groupString += "}";
return $"{{{dmString},{groupString}}}";
}
public static async Task UpdateUserKeys(string id, string body)

View file

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

View file

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

View file

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