fix few locks and unpin message
All checks were successful
Server Build / publish (push) Successful in 28s
Voice Build / publish (push) Successful in 24s

This commit is contained in:
olcxja 2026-07-25 13:55:34 +02:00
commit 5c58492b60
2 changed files with 95 additions and 65 deletions

View file

@ -40,8 +40,8 @@ public class BackgroundDelete : BackgroundService
{ {
string id = Path.GetFileName(account); string id = Path.GetFileName(account);
SemaphoreSlim userLock = Utils.GetUserLock(id); SemaphoreSlim userLock = Utils.GetUserLock(id);
await userLock.WaitAsync();
await Requests.createLock.WaitAsync(); await Requests.createLock.WaitAsync();
await userLock.WaitAsync();
try try
{ {
string username = await Account.Utils.NameFromId(id); string username = await Account.Utils.NameFromId(id);
@ -55,8 +55,8 @@ public class BackgroundDelete : BackgroundService
} }
finally finally
{ {
Requests.createLock.Release();
userLock.Release(); userLock.Release();
Requests.createLock.Release();
} }
} }
} }

View file

@ -427,14 +427,19 @@ public class Requests
} }
string msgDir = $"{ROOMS_DIR}/dms/{DOMAIN}/{dmId}/messages"; string msgDir = $"{ROOMS_DIR}/dms/{DOMAIN}/{dmId}/messages";
long nextId = 0;
Message msg = new Message();
await createLock.WaitAsync();
try
{
long last = 0; long last = 0;
if (Fs.Exists($"{msgDir}/last")) if (Fs.Exists($"{msgDir}/last"))
{ {
last = long.Parse(Encoding.UTF8.GetString(await Fs.ReadFile($"{msgDir}/last"))); last = long.Parse(Encoding.UTF8.GetString(await Fs.ReadFile($"{msgDir}/last")));
} }
long nextId = last + 1; nextId = last + 1;
Message msg = new Message();
msg.author = id; msg.author = id;
msg.timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString(); msg.timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString();
msg.type = "larp.text"; msg.type = "larp.text";
@ -482,6 +487,11 @@ public class Requests
await Fs.WriteFile($"{msgDir}/{nextId}", Encoding.UTF8.GetBytes(JsonSerializer.Serialize(msg, AppJsonSerializerContext.Default.Message))); await Fs.WriteFile($"{msgDir}/{nextId}", Encoding.UTF8.GetBytes(JsonSerializer.Serialize(msg, AppJsonSerializerContext.Default.Message)));
await Fs.WriteFile($"{msgDir}/last", Encoding.UTF8.GetBytes(nextId.ToString())); await Fs.WriteFile($"{msgDir}/last", Encoding.UTF8.GetBytes(nextId.ToString()));
}
finally
{
createLock.Release();
}
string[] members = Fs.ReadDirectory($"{ROOMS_DIR}/dms/{DOMAIN}/{dmId}/members"); string[] members = Fs.ReadDirectory($"{ROOMS_DIR}/dms/{DOMAIN}/{dmId}/members");
foreach(string memberWD in members) foreach(string memberWD in members)
@ -548,6 +558,18 @@ public class Requests
await Fs.WriteFile(msgPath, Encoding.UTF8.GetBytes(JsonSerializer.Serialize(msg, AppJsonSerializerContext.Default.Message))); await Fs.WriteFile(msgPath, Encoding.UTF8.GetBytes(JsonSerializer.Serialize(msg, AppJsonSerializerContext.Default.Message)));
string reactDir = $"{ROOMS_DIR}/dms/{DOMAIN}/{dmId}/reactions/{msgId}";
if (Fs.Exists(reactDir))
{
Fs.DeleteDirectory(reactDir);
}
string attDir = $"{ROOMS_DIR}/dms/{DOMAIN}/{dmId}/attachments/{msgId}";
if (Fs.Exists(attDir))
{
Fs.DeleteDirectory(attDir);
}
string[] members = Fs.ReadDirectory($"{ROOMS_DIR}/dms/{DOMAIN}/{dmId}/members"); string[] members = Fs.ReadDirectory($"{ROOMS_DIR}/dms/{DOMAIN}/{dmId}/members");
foreach(string memberWD in members) foreach(string memberWD in members)
{ {
@ -593,6 +615,9 @@ public class Requests
string reactDir = $"{ROOMS_DIR}/dms/{DOMAIN}/{dmId}/reactions/{msgId}"; string reactDir = $"{ROOMS_DIR}/dms/{DOMAIN}/{dmId}/reactions/{msgId}";
if (!Fs.Exists(reactDir)) Fs.CreateDirectory(reactDir); if (!Fs.Exists(reactDir)) Fs.CreateDirectory(reactDir);
await createLock.WaitAsync();
try
{
long last = 0; long last = 0;
if (Fs.Exists($"{reactDir}/last")) if (Fs.Exists($"{reactDir}/last"))
{ {
@ -602,6 +627,11 @@ public class Requests
await Fs.WriteFile($"{reactDir}/{nextId}", Encoding.UTF8.GetBytes($"{id}\n{reaction}")); await Fs.WriteFile($"{reactDir}/{nextId}", Encoding.UTF8.GetBytes($"{id}\n{reaction}"));
await Fs.WriteFile($"{reactDir}/last", Encoding.UTF8.GetBytes(nextId.ToString())); await Fs.WriteFile($"{reactDir}/last", Encoding.UTF8.GetBytes(nextId.ToString()));
}
finally
{
createLock.Release();
}
string[] members = Fs.ReadDirectory($"{ROOMS_DIR}/dms/{DOMAIN}/{dmId}/members"); string[] members = Fs.ReadDirectory($"{ROOMS_DIR}/dms/{DOMAIN}/{dmId}/members");
foreach(string memberWD in members) foreach(string memberWD in members)
@ -680,6 +710,9 @@ public class Requests
string pinnedFilePath = $"{pinnedDir}/{msgId}"; string pinnedFilePath = $"{pinnedDir}/{msgId}";
bool isNowPinned = false; bool isNowPinned = false;
await createLock.WaitAsync();
try
{
if (Fs.Exists(pinnedFilePath)) if (Fs.Exists(pinnedFilePath))
{ {
Fs.DeleteFile(pinnedFilePath); Fs.DeleteFile(pinnedFilePath);
@ -693,9 +726,6 @@ public class Requests
// Send larp.info.pin message // Send larp.info.pin message
long nextId = 0; long nextId = 0;
await createLock.WaitAsync();
try
{
if (Fs.Exists($"{ROOMS_DIR}/dms/{DOMAIN}/{dmId}/messages/last")) if (Fs.Exists($"{ROOMS_DIR}/dms/{DOMAIN}/{dmId}/messages/last"))
{ {
string lastStr = Encoding.UTF8.GetString(await Fs.ReadFile($"{ROOMS_DIR}/dms/{DOMAIN}/{dmId}/messages/last")); string lastStr = Encoding.UTF8.GetString(await Fs.ReadFile($"{ROOMS_DIR}/dms/{DOMAIN}/{dmId}/messages/last"));
@ -709,7 +739,7 @@ public class Requests
infoMessage.attachment = ""; infoMessage.attachment = "";
infoMessage.author = id; infoMessage.author = id;
infoMessage.timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString(); infoMessage.timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString();
infoMessage.type = "larp.info.pin"; infoMessage.type = isNowPinned ? "larp.info.pin" : "larp.info.unpin";
infoMessage.content = isNowPinned ? "{blah(message.pinned.by)}" : "{blah(message.unpinned.by)}"; infoMessage.content = isNowPinned ? "{blah(message.pinned.by)}" : "{blah(message.unpinned.by)}";
infoMessage.key = ""; infoMessage.key = "";
infoMessage.pervious = msgId; infoMessage.pervious = msgId;