Files
2026-07-23 18:21:43 -07:00

334 lines
12 KiB
C#

using DeluxeBackend.Controllers.Matchmaking;
using DeluxeBackend.Models;
using DeluxeBackend.Services;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System.Net.NetworkInformation;
using static DeluxeBackend.Controllers.Api.PlayerEventsController;
using static DeluxeBackend.Enums;
namespace DeluxeBackend.Controllers.Api
{
[Route("api/inventions")]
[ApiController]
[Authorize(Roles = "gameClient")]
public class InventionsController(ILiteDbService db, IJwtService jwt, DiscordBotService discord) : ControllerBase
{
public class NewInventionRequestDTO
{
public required string name { get; set; }
public required string description { get; set; }
public required string imageName { get; set; }
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 long creationRoomId { get; set; } = -1;
public required string inventionDataFilename { get; set; }
public required List<long> referencedInventions { get; set; }
public RoomRoleType creatorAccountRole { get; set; }
}
public class AddVersionInventionRequestDTO
{
public long inventionId { get; set; }
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 long creationRoomId { get; set; } = -1;
public string? inventionDataFilename { get; set; }
public List<long>? referencedInventions { get; set; }
}
[Token(Token = "0x200056D")]
public enum FDOIOPFMNJL
{
[Token(Token = "0x4001262")]
Success,
[Token(Token = "0x4001263")]
InvalidParameters,
[Token(Token = "0x4001264")]
PlayerCannotUpload,
[Token(Token = "0x4001265")]
DuplicateName,
[Token(Token = "0x4001266")]
NameTooShort,
[Token(Token = "0x4001267")]
NameTooLong,
[Token(Token = "0x4001268")]
NotCreator,
[Token(Token = "0x4001269")]
DoesNotExist,
[Token(Token = "0x400126A")]
ImageDoesNotExist,
[Token(Token = "0x400126B")]
InventionLimitReached,
[Token(Token = "0x400126C")]
DescriptionTooLong,
[Token(Token = "0x400126D")]
InnapropriateName,
[Token(Token = "0x400126E")]
InnapropriateDescription,
[Token(Token = "0x400126F")]
CannotBeModified,
[Token(Token = "0x4001270")]
PlayerCannotPublish,
[Token(Token = "0x4001271")]
AlreadyPublished,
[Token(Token = "0x4001272")]
AlreadyUnpublished,
[Token(Token = "0x4001273")]
InventionUnderModerationReview,
[Token(Token = "0x4001274")]
PlayerCannotDownload,
[Token(Token = "0x4001275")]
PlayerAlreadyOwns,
[Token(Token = "0x4001276")]
DescriptionTooShort,
[Token(Token = "0x4001277")]
DoesNotHavePermission,
[Token(Token = "0x4001278")]
PermissionLevelCannotBeChanged,
[Token(Token = "0x4001279")]
AlreadyCheered,
[Token(Token = "0x400127A")]
AlreadyRemovedCheer,
[Token(Token = "0x400127B")]
ModeratorRestrictedPublishing,
[Token(Token = "0x400127C")]
PlayerCannotSell,
[Token(Token = "0x400127D")]
InvalidPrice,
[Token(Token = "0x400127E")]
PriceCannotBeChanged,
[Token(Token = "0x400127F")]
InvalidPermissionForPaidInvention,
[Token(Token = "0x4001280")]
PurchaseFailed,
[Token(Token = "0x4001281")]
CannotDownloadPaidInvention,
[Token(Token = "0x4001282")]
CannotSellUnownedLineage,
[Token(Token = "0x4001283")]
DoesNotAllowTrial,
[Token(Token = "0x4001284")]
StillOnTrialCooldown,
[Token(Token = "0x4001285")]
PlayerCannotTrial,
[Token(Token = "0x4001286")]
PaidInventionPublishingDisabled,
[Token(Token = "0x4001287")]
PaidInventionPurchasingDisabled,
[Token(Token = "0x4001288")]
OperationIsDisabled,
[Token(Token = "0x4001289")]
PlayerRestrictedFromP2PSelling,
[Token(Token = "0x400128A")]
PlayerNotRecRoomPlusMember,
[Token(Token = "0x400128B")]
InvalidInstantiationCost,
[Token(Token = "0x400128C")]
FeaturedInventionNotPublished,
[Token(Token = "0x400128D")]
FeaturedInventionNotActive,
[Token(Token = "0x400128E")]
InventionContainsBlockedFiles,
[Token(Token = "0x400128F")]
PlayerRestrictedFromP2PBuying
}
[HttpGet("v2/mine")]
public async Task<IActionResult> Mine()
{
LoginWithInfoResult? login = await jwt.GetLoginWithInfo(User);
if (login == null) return Unauthorized();
Account account = login.Account;
var downloadedInventions = db.Inventions
.Include(x => x.Creator)
.Include(x => x.Room)
.Find(x => x.DownloadIds.Contains(account.Id))
.Select(x => x.ToDictionary())
.ToList();
return Ok(downloadedInventions);
}
[HttpPost("v6/save")]
public async Task<IActionResult> Save([FromBody] NewInventionRequestDTO request)
{
LoginWithInfoResult? login = await jwt.GetLoginWithInfo(User);
if (login == null) return Unauthorized();
Account account = login.Account;
if (!account.DiscordId.HasValue)
{
return Ok(new { Status = (int)FDOIOPFMNJL.PlayerNotRecRoomPlusMember });
}
if (!await discord.HasUserBoostedGuild(account.DiscordId.Value))
{
return Ok(new { Status = (int)FDOIOPFMNJL.PlayerNotRecRoomPlusMember });
}
Room? room = db.Rooms.FindById(request.creationRoomId);
if (room == null) return NotFound();
InventionVersion inventionVersion = new()
{
Id = 1,
ReplicationId = Guid.NewGuid(),
InstantiationCost = request.instantiationCost,
LightsCost = request.lightsCost,
ChipsCost = request.chipsCost,
CloudVariablesCost = request.cloudVariablesCost,
BlobName = request.inventionDataFilename
};
Invention invention = new()
{
ReplicationId = Guid.NewGuid(),
Creator = account,
Name = request.name,
Description = request.description,
ImageName = request.imageName,
CurrentVersionNumber = 1,
Accessibility = RoomAccessibility.Private,
Room = room,
Versions=[inventionVersion],
DownloadIds = [account.Id]
};
db.Inventions.Insert(invention);
return Ok(new { Status= (int)FDOIOPFMNJL.Success, Invention=invention.ToDictionary(), InventionVersion=inventionVersion.ToDictionary(invention.Id) });
}
[HttpGet("v1/versions")]
public async Task<IActionResult> Versions([FromQuery] long inventionId)
{
LoginWithInfoResult? login = await jwt.GetLoginWithInfo(User);
if (login == null) return Unauthorized();
Account account = login.Account;
Invention? invention = db.Inventions.FindById(inventionId);
if (invention == null)
{
return NotFound();
}
var versionList = invention.Versions.Select(v => v.ToDictionary(invention.Id)).ToList();
return Ok(versionList);
}
[HttpPatch("v4/addversion")]
public async Task<IActionResult> AddVersion([FromBody] AddVersionInventionRequestDTO request)
{
LoginWithInfoResult? login = await jwt.GetLoginWithInfo(User);
if (login == null) return Unauthorized();
Account account = login.Account;
Invention? invention = db.Inventions.Include(x => x.Creator).Include(x => x.Room).FindById(request.inventionId);
if (invention == null)
{
return Ok(new { Status = (int)FDOIOPFMNJL.DoesNotExist });
}
if (invention.Creator.Id != account.Id)
{
return Ok(new { Status = (int)FDOIOPFMNJL.NotCreator });
}
if (string.IsNullOrEmpty(request.inventionDataFilename))
{
return Ok(new { Status = (int)FDOIOPFMNJL.InvalidParameters });
}
if (!account.DiscordId.HasValue)
{
return Ok(new { Status = (int)FDOIOPFMNJL.PlayerNotRecRoomPlusMember });
}
if (!await discord.HasUserBoostedGuild(account.DiscordId.Value))
{
return Ok(new { Status = (int)FDOIOPFMNJL.PlayerNotRecRoomPlusMember });
}
int nextVersionNumber = invention.CurrentVersionNumber + 1;
InventionVersion inventionVersion = new()
{
Id = nextVersionNumber,
ReplicationId = Guid.NewGuid(),
InstantiationCost = request.instantiationCost,
LightsCost = request.lightsCost,
ChipsCost = request.chipsCost,
CloudVariablesCost = request.cloudVariablesCost,
BlobName = request.inventionDataFilename
};
invention.Versions.Add(inventionVersion);
invention.CurrentVersionNumber = nextVersionNumber;
invention.ModifiedAt = DateTime.UtcNow;
db.Inventions.Update(invention);
return Ok(new
{
Status = (int)FDOIOPFMNJL.Success,
Invention = invention.ToDictionary(),
InventionVersion = inventionVersion.ToDictionary(invention.Id)
});
}
[HttpGet("v2/batch")]
[HttpPost("v2/batch")]
public async Task<IActionResult> Versions([FromQuery(Name = "id")] List<long>? queryIds,[FromForm(Name = "id")] List<long>? formIds)
{
List<long> id = (queryIds != null && queryIds.Count > 0)
? queryIds
: (formIds ?? new List<long>());
LoginWithInfoResult? login = await jwt.GetLoginWithInfo(User);
if (login == null) return Unauthorized();
Account account = login.Account;
if (id.Count == 0)
{
return Ok(new List<object>());
}
var inventionsBatch = db.Inventions
.Find(x => id.Contains(x.Id))
.Select(x => x.ToDictionary())
.ToList();
return Ok(inventionsBatch);
}
}
}