Files
Vanadium-2023-2025-Leak-Server/Classes/DBs/ActionLinkDB.cs
T
skidfire fe3468c65d yikes,
2026-09-06 19:59:27 -04:00

87 lines
3.1 KiB
C#

using LiteDB;
namespace Vanadium.Classes.DBs
{
public class ActionLinkDB
{
public class ActionLink
{
public int Id { get; set; }
public string Code { get; set; } = "";
public long CreatorPlayerId { get; set; }
public string Data { get; set; } = "";
public int CodeType { get; set; }
public int ExtraDataId { get; set; }
public DateTime ExpiresAt { get; set; }
public DateTime CreatedAt { get; set; }
}
public class ActionLinkResponse
{
public bool isValid { get; set; }
public int codeType { get; set; }
public string extraJson { get; set; } = "";
public long creatorPlayerId { get; set; }
public string data { get; set; } = "";
}
public static LiteDatabase ActionLinkDBFile = new LiteDatabase("Filename=" + Path.Join(Program.dataDir, "DBs", "ActionLinks.db") + ";Connection=shared");
public static readonly ILiteCollection<ActionLink> ActionLinks = ActionLinkDBFile.GetCollection<ActionLink>("ActionLinks");
static ActionLinkDB()
{
ActionLinks.EnsureIndex(x => x.Code);
ActionLinks.EnsureIndex(x => x.CreatorPlayerId);
ActionLinks.EnsureIndex(x => x.ExpiresAt);
}
private static string GenerateCode()
{
const string chars = "abcdefghijklmnopqrstuvwxyz";
return new string(Enumerable.Range(0, 9).Select(_ => chars[Random.Shared.Next(chars.Length)]).ToArray());
}
public static ActionLink? CreateActionLink(long creatorPlayerId, string data, int codeType, int extraDataId, int validHours)
{
if (PlayerDB.Players.FindById(creatorPlayerId) == null)
return null;
if (codeType == 5 && !RoomDB.DoesRoomExist(extraDataId))
return null;
string code;
do { code = GenerateCode(); } while (ActionLinks.FindOne(x => x.Code == code) != null);
var link = new ActionLink
{
Code = code,
CreatorPlayerId = creatorPlayerId,
Data = data,
CodeType = codeType,
ExtraDataId = extraDataId,
ExpiresAt = DateTime.UtcNow.AddHours(validHours),
CreatedAt = DateTime.UtcNow
};
ActionLinks.Insert(link);
return link;
}
public static ActionLinkResponse GetActionLinkResponse(string code)
{
var invalid = new ActionLinkResponse { isValid = false, codeType = 0, extraJson = "", creatorPlayerId = 0, data = "" };
var link = ActionLinks.FindOne(x => x.Code == code);
if (link == null || DateTime.UtcNow > link.ExpiresAt) return invalid;
if (PlayerDB.Players.FindById(link.CreatorPlayerId) == null) return invalid;
if (link.CodeType == 5 && !RoomDB.DoesRoomExist(link.ExtraDataId)) return invalid;
return new ActionLinkResponse
{
isValid = true,
codeType = link.CodeType,
extraJson = link.Data,
creatorPlayerId = link.CreatorPlayerId,
data = link.Data
};
}
}
}