using LiteDB; using static DeluxeBackend.Enums; namespace DeluxeBackend.Models { public class ActionLinkExtraData { public ulong? DiscordUserId { get; set; } = null; public long? RoomId { get; set; } = null; } public class ActionLink { [BsonId] public long Id { get; set; } public PlatformType? Platform { get; set; } = null; public required string Code { get; set; } public required long CreatorPlayerId { get; set; } public required string Description { get; set; } public required ActionLinkType Type { get; set; } public ActionLinkExtraData? ExtraData { get; set; } = null; public required DateTime ExpiresAt { get; set; } public int MaxUses { get; set; } = 100; public int Uses { get; set; } = 0; [BsonIgnore] public bool IsValid { get { var now = DateTime.UtcNow; bool timeValid = ExpiresAt.Kind == DateTimeKind.Utc ? ExpiresAt > now : ExpiresAt.ToUniversalTime() > now; return timeValid && Uses < MaxUses; } } [BsonIgnore] public Dictionary ToDictionary() { Dictionary dataMeow = new() { ["Type"] = (int)Type }; if (Type == ActionLinkType.DiscordLink) { dataMeow["Type"] = (int)ActionLinkType.Room; ExtraData!.RoomId = 2; } if (Platform != null) { dataMeow["Platform"] = (int)Platform; } if (ExtraData != null) { dataMeow["ExtraJson"] = System.Text.Json.JsonSerializer.Serialize(ExtraData); } Dictionary data = new() { ["creatorPlayerId"] = CreatorPlayerId, ["data"] = System.Text.Json.JsonSerializer.Serialize(dataMeow), ["isValid"] = IsValid }; return data; } } }