LarpixServer/LarpixServer/Federation/Receiver.cs
olcxja 017eb2501b
All checks were successful
Server Build / publish (push) Successful in 28s
Voice Build / publish (push) Successful in 26s
Add "idtoname" request & change invite format
2026-05-21 10:58:08 +02:00

115 lines
No EOL
4.2 KiB
C#

using System.Text;
using System.Text.Json;
using LarpixServer.Filesystem;
using LarpixServer.Utils.Jsons;
using static LarpixServer.Utils.Utils;
namespace LarpixServer.Federation;
public class Receiver
{
public static async Task FederationRequest(HttpContext context, Func<Task> next, IQueryCollection query, StreamReader bodyReader)
{
if (!query.TryGetValue("d", out var domain))
{
return;
}
string body = await LoadBody(bodyReader);
Universal2String serializedBody = JsonSerializer.Deserialize(
body,
AppJsonSerializerContext.Default.Universal2String
);
switch (serializedBody.string1)
{
case "user/id/get":
await context.Response.WriteAsync( await Account.Utils.IdFromName(serializedBody.string2) );
return;
case "dm/invite/send":
string[] ids = serializedBody.string2.Split(','); //0=receiver, 1=sender
if (!await Sender.HasSentDmInvite(ids[1], domain, ids[0]))
{
await context.Response.WriteAsync( "error:bad.request" );
return;
}
SemaphoreSlim userLock = Account.Utils.GetUserLock(ids[0]);
await userLock.WaitAsync();
try
{
string inviteFile = ACCOUNTS_DATA_DIR + $"/{ids[0]}/dminvites/recv/{ids[1]};{domain}";
if (Fs.Exists(inviteFile))
{
await context.Response.WriteAsync("info:user.already.invited");
return;
}
await Fs.WriteFile(inviteFile, Encoding.UTF8.GetBytes(DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString()));
}
finally
{
userLock.Release();
}
await context.Response.WriteAsync("success:user.invited");
return;
case "dm/invite/hassent":
ids = serializedBody.string2.Split(','); //0=sender, 1=receiver
string inviteSentFile = ACCOUNTS_DATA_DIR + $"/{ids[0]}/dminvites/sent/{ids[1]};{domain}";
if (!Fs.Exists(inviteSentFile))
{
await context.Response.WriteAsync( "false" );
return;
}
await context.Response.WriteAsync( "true" );
return;
case "dm/add":
ids = serializedBody.string2.Split(','); //0=creator (inv receiver), 1=inviter
//did i really sent an invite to this user???? idkkk maybeeeee yeahhh i did this
inviteSentFile = ACCOUNTS_DATA_DIR + $"/{ids[0]}/dminvites/sent/{ids[1]};{domain}";
if (!Fs.Exists(inviteSentFile))
{
await context.Response.WriteAsync( "error:no.invite.found" );
return;
}
Fs.DeleteFile(inviteSentFile);
//now full invite is deleted :333333333333333333333333333
//we need to add to dm :33333333333333333333
userLock = Account.Utils.GetUserLock(ids[0]);
await userLock.WaitAsync();
try
{
//best dmId creation ever
List<string> users = new List<string>(){$"{ids[0]};{DOMAIN}", $"{ids[1]};{domain}"};
users.Sort();
string dmId = $"{users[0]}_{users[1]}";
await Account.Utils.UpdateUserDm(ids[0], dmId, "false",
DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString());
await context.Response.WriteAsync("success:dm.accepted");
return;
}
finally
{
userLock.Release();
}
return;
}
return;
}
}