115 lines
No EOL
4.2 KiB
C#
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;
|
|
}
|
|
} |