the files

This commit is contained in:
niko
2026-10-14 06:59:51 +02:00
parent f6175893fc
commit 2040419525
1855 changed files with 6735668 additions and 0 deletions
@@ -0,0 +1,89 @@
using LiteDB;
// Invention persistence for the Maker Pen "save selection as invention" flow.
// Minimal but real: stores the metadata the client's v6/v9 save posts (the circuit blob
// itself is uploaded separately and referenced by name), assigns an id + replication id,
// and lists a creator's own inventions. Global namespace like ImageMetadataDB/ClubDB.
public static class InventionDB
{
private static readonly string DbPath = Path.Combine("Data", "DBs", "Inventions.db");
private static readonly Lazy<LiteDatabase> _db = new(() => new LiteDatabase(DbPath));
public static LiteDatabase Db => _db.Value;
public static ILiteCollection<Invention> Collection() => Col();
public class Invention
{
public int InventionId { get; set; }
public string ReplicationId { get; set; } = "";
public ulong CreatorPlayerId { get; set; }
public string Name { get; set; } = "Untitled";
public string Description { get; set; } = "No description yet";
public string ImageName { get; set; } = "";
public string BlobName { get; set; } = ""; // inventionDataFilename (the .inv blob)
public int CurrentVersionNumber { get; set; } = 1;
public int InstantiationCost { get; set; }
public int LightsCost { get; set; }
public int ChipsCost { get; set; }
public int CloudVariablesCost { get; set; }
public int AICost { get; set; }
public int Accessibility { get; set; } = 0; // 0 private until published
public bool IsPublished { get; set; } = false;
public int CreationRoomId { get; set; }
public int Price { get; set; }
public int UgcVersion { get; set; }
public bool HasBetaContent { get; set; }
public string? LongDescription { get; set; }
public string? DisplayMetadataJson { get; set; }
public List<int> ReferencedInventions { get; set; } = new();
public List<string> ReferencedUnityAssetIds { get; set; } = new();
public List<string> Tags { get; set; } = new();
public bool IsFeatured { get; set; } = false; // admin-curated (InventionStore.SetFeatured)
public int NumDownloads { get; set; } = 0; // purchases / pickups
public int CheerCount { get; set; } = 0;
public DateTime CreatedAt { get; set; } = DateTime.UtcNow;
public DateTime ModifiedAt { get; set; } = DateTime.UtcNow;
public DateTime? FirstPublishedAt { get; set; } = null;
}
private static ILiteCollection<Invention> Col()
{
var c = Db.GetCollection<Invention>("inventions");
c.EnsureIndex(x => x.InventionId, true);
c.EnsureIndex(x => x.CreatorPlayerId);
return c;
}
public static Invention Create(Invention inv)
{
var col = Col();
if (inv.InventionId == 0)
{
var last = col.Query().OrderByDescending(x => x.InventionId).Limit(1).FirstOrDefault();
inv.InventionId = (last?.InventionId ?? 0) + 1;
}
if (string.IsNullOrEmpty(inv.ReplicationId)) inv.ReplicationId = Guid.NewGuid().ToString("N");
inv.CreatedAt = inv.ModifiedAt = DateTime.UtcNow;
col.Insert(inv);
return inv;
}
public static Invention? GetById(int id) => Col().FindById(id);
public static List<Invention> GetByCreator(ulong creator) =>
Col().Query().Where(x => x.CreatorPlayerId == creator).OrderByDescending(x => x.InventionId).ToList();
public static Invention? Publish(int id, ulong creator, bool published)
{
var col = Col();
var inv = col.FindById(id);
if (inv == null || inv.CreatorPlayerId != creator) return null;
inv.IsPublished = published;
inv.Accessibility = published ? 1 : 0;
if (published && inv.FirstPublishedAt == null) inv.FirstPublishedAt = DateTime.UtcNow;
inv.ModifiedAt = DateTime.UtcNow;
col.Update(inv);
return inv;
}
public static void Checkpoint() { try { Db.Checkpoint(); } catch { } }
}