Skip to content

Commit

Permalink
Added import all workshop mods for tenant
Browse files Browse the repository at this point in the history
  • Loading branch information
Aragas committed Oct 16, 2024
1 parent 5005c77 commit cfd03ce
Show file tree
Hide file tree
Showing 4 changed files with 86 additions and 8 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,11 @@
<ChildContent>Link</ChildContent>
</Button>
</Field>
<Field>
<Button Color="@Color.Primary" Type="@ButtonType.Submit" Clicked="@OnImportAll" PreventDefaultOnSubmit>
<ChildContent>Import All from Steam Workshop</ChildContent>
</Button>
</Field>
</Form>
</CardBody>
</Card>
Expand Down Expand Up @@ -106,6 +111,12 @@
_isLoading = false;
StateHasChanged();
}
private async Task OnImportAll()
{
await _userClient.AddSteamWorkshopModLinkImportAllAsync();
if (_dataGridRef is not null)
await _dataGridRef.Reload();
}

private async Task<bool> DoLinkMod()
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,11 @@ public async Task<UserAvailableSteamWorkshopModModelPagingDataApiResultModel> Ge
return await _implementation.GetSteamWorkshopModsPaginateAvailabledAsync(body, ct);
}

public async Task<StringApiResultModel> AddSteamWorkshopModLinkImportAllAsync(int? userId = null, string? username = null, CancellationToken ct = default)
{
return await _implementation.AddSteamWorkshopModLinkImportAllAsync(userId, username, ct);
}

public async Task<StringApiResultModel> AddSteamWorkshopModLinkAsync(string modId, int? userId = null, string? username = null, CancellationToken ct = default)
{
return await _implementation.AddSteamWorkshopModLinkAsync(modId, userId, username, ct);
Expand Down Expand Up @@ -187,17 +192,17 @@ public async Task<StringApiResultModel> RemoveNexusModsModManualLinkAsync(int mo
return await _implementation.RemoveNexusModsModManualLinkAsync(modId, userId, username, ct);
}

public async Task<StringApiResultModel> AddSteamWorkshopModManualLinkAsync(string modId, int? userId = null, string? username = null, CancellationToken ct = default(CancellationToken))
public async Task<StringApiResultModel> AddSteamWorkshopModManualLinkAsync(string modId, int? userId = null, string? username = null, CancellationToken ct = default)
{
return await _implementation.AddSteamWorkshopModManualLinkAsync(modId, userId, username, ct);
}

public async Task<StringApiResultModel> RemoveSteamWorkshopModManualLinkAsync(string modId, int? userId = null, string? username = null, CancellationToken ct = default(CancellationToken))
public async Task<StringApiResultModel> RemoveSteamWorkshopModManualLinkAsync(string modId, int? userId = null, string? username = null, CancellationToken ct = default)
{
return await _implementation.RemoveSteamWorkshopModManualLinkAsync(modId, userId, username, ct);
}

public async Task<UserManuallyLinkedSteamWorkshopModModelPagingDataApiResultModel> GetSteamWorkshopModManualLinkPaginatedAsync(PaginatedQuery? body = null, CancellationToken ct = default(CancellationToken))
public async Task<UserManuallyLinkedSteamWorkshopModModelPagingDataApiResultModel> GetSteamWorkshopModManualLinkPaginatedAsync(PaginatedQuery? body = null, CancellationToken ct = default)
{
return await _implementation.GetSteamWorkshopModManualLinkPaginatedAsync(body, ct);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -272,6 +272,55 @@ public NexusModsUserController(ILogger<NexusModsUserController> logger, INexusMo
}


[HttpPost("SteamWorkshopModsLinks/ImportAll")]
public async Task<ApiResult<string?>> AddSteamWorkshopModLinkImportAllAsync([FromQuery] NexusModsUserId? userId, [FromQuery] NexusModsUserName? username, [BindTenant] TenantId tenant, CancellationToken ct)
{
var nexusModsUserId = await GetUserIdAsync(userId, username, ct);
if (nexusModsUserId == NexusModsUserId.None)
return ApiBadRequest("User not found!");

var currentUserId = HttpContext.GetUserId();
if (currentUserId != nexusModsUserId && HttpContext.GetRole() != ApplicationRoles.Moderator && HttpContext.GetRole() != ApplicationRoles.Administrator)
return ApiBadRequest("Permission denied!");

var tokens = HttpContext.GetSteamTokens();
if (tokens is null)
return ApiBadRequest("Steam not linked!");

var steamUserId = SteamUserId.From(tokens.ExternalId);

await using var unitOfWrite = _unitOfWorkFactory.CreateUnitOfWrite();
foreach (var steamAppId in TenantUtils.FromTenantToSteamAppIds(tenant.Value))
{
foreach (var steamWorkshopItemInfo in await _steamAPIClient.GetAllOwnedWorkshopItemAsync(steamUserId, steamAppId, ct))
{
var steamWorkshopModToName = new SteamWorkshopModToNameEntity
{
TenantId = tenant,
SteamWorkshopModId = steamWorkshopItemInfo.ModId,
SteamWorkshopMod = unitOfWrite.UpsertEntityFactory.GetOrCreateSteamWorkshopMod(steamWorkshopItemInfo.ModId),
Name = steamWorkshopItemInfo.Name,
};
unitOfWrite.SteamWorkshopModName.Upsert(steamWorkshopModToName);

var nexusModsUserToSteamWorkshopMod = new NexusModsUserToSteamWorkshopModEntity
{
TenantId = tenant,
NexusModsUserId = userId!.Value,
NexusModsUser = unitOfWrite.UpsertEntityFactory.GetOrCreateNexusModsUser(userId.Value),
SteamWorkshopModId = steamWorkshopItemInfo.ModId,
SteamWorkshopMod = unitOfWrite.UpsertEntityFactory.GetOrCreateSteamWorkshopMod(steamWorkshopItemInfo.ModId),
LinkType = NexusModsUserToModLinkType.ByAPIConfirmation,
};
unitOfWrite.NexusModsUserToSteamWorkshopMods.Upsert(nexusModsUserToSteamWorkshopMod);

}
}

await unitOfWrite.SaveChangesAsync(CancellationToken.None);
return ApiResult("Linked successful!");
}

[HttpPost("SteamWorkshopModsLinks")]
public async Task<ApiResult<string?>> AddSteamWorkshopModLinkAsync([FromQuery, Required] SteamWorkshopModId modId, [FromQuery] NexusModsUserId? userId, [FromQuery] NexusModsUserName? username, [BindTenant] TenantId tenant, CancellationToken ct)
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@
using Microsoft.Extensions.Options;

using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Text.Json;
using System.Text.Json.Serialization;
Expand All @@ -17,14 +18,16 @@ public sealed record SteamUserInfo(
[property: JsonPropertyName("username")] string Username);

public sealed record SteamWorkshopItemInfo(
[property: JsonPropertyName("id")] SteamUserId Id,
[property: JsonPropertyName("id")] SteamUserId UserId,
[property: JsonPropertyName("mod_id")] SteamWorkshopModId ModId,
[property: JsonPropertyName("name")] string Name);

public interface ISteamAPIClient
{
Task<SteamUserInfo?> GetUserInfoAsync(SteamUserId steamUserId, CancellationToken ct);
Task<bool> IsOwningGameAsync(SteamUserId steamUserId, uint appId, CancellationToken ct);
Task<SteamWorkshopItemInfo?> GetOwnedWorkshopItemAsync(SteamUserId steamUserId, uint appId, SteamWorkshopModId workshopModId, CancellationToken ct);
Task<List<SteamWorkshopItemInfo>> GetAllOwnedWorkshopItemAsync(SteamUserId steamUserId, uint appId, CancellationToken ct);
}

public sealed class SteamAPIClient : ISteamAPIClient
Expand Down Expand Up @@ -55,8 +58,6 @@ public record IsOwningWorkshopItemRoot(
[property: JsonPropertyName("response")] IsOwningWorkshopItemResponse Response
);
public record IsOwningWorkshopItemResponse(
[property: JsonPropertyName("result")] int Result,
[property: JsonPropertyName("resultcount")] int ResultCount,
[property: JsonPropertyName("publishedfiledetails")] IReadOnlyList<IsOwningWorkshopItem> WorkshopItems
);
public record IsOwningWorkshopItem(
Expand Down Expand Up @@ -113,12 +114,24 @@ public async Task<bool> IsOwningGameAsync(SteamUserId steamUserId, uint appId, C
var data = JsonSerializer.Deserialize<IsOwningWorkshopItemRoot>(await response.Content.ReadAsStreamAsync(ct));
if (data is null) return null;

var ownsItem = data.Response is { ResultCount: 1, WorkshopItems.Count: 1 } &&
var ownsItem = data.Response is { WorkshopItems.Count: 1 } &&
data.Response.WorkshopItems[0].AppId == appId &&
data.Response.WorkshopItems[0].SteamUserId == steamUserId &&
data.Response.WorkshopItems[0].SteamWorkshopModId == workshopModId;
if (!ownsItem) return null;

return new SteamWorkshopItemInfo(data.Response.WorkshopItems[0].SteamUserId, data.Response.WorkshopItems[0].Name);
return new SteamWorkshopItemInfo(data.Response.WorkshopItems[0].SteamUserId, data.Response.WorkshopItems[0].SteamWorkshopModId, data.Response.WorkshopItems[0].Name);
}

public async Task<List<SteamWorkshopItemInfo>> GetAllOwnedWorkshopItemAsync(SteamUserId steamUserId, uint appId, CancellationToken ct)
{
using var request = new HttpRequestMessage(HttpMethod.Get, $"IPublishedFileService/GetUserFiles/v1/?key={_options.APIKey}&steamid={steamUserId}&appid={appId}&return_short_description=true");
using var response = await _httpClient.SendAsync(request, ct);
if (!response.IsSuccessStatusCode) return null;

Check warning on line 130 in src/BUTR.Site.NexusMods.Server/Services/HttpClients/ISteamAPIClient.cs

View workflow job for this annotation

GitHub Actions / build

Possible null reference return.

var data = JsonSerializer.Deserialize<IsOwningWorkshopItemRoot>(await response.Content.ReadAsStreamAsync(ct));
if (data is not { Response.WorkshopItems.Count: > 0 }) return null;

Check warning on line 133 in src/BUTR.Site.NexusMods.Server/Services/HttpClients/ISteamAPIClient.cs

View workflow job for this annotation

GitHub Actions / build

Possible null reference return.

return data.Response.WorkshopItems.Select(x => new SteamWorkshopItemInfo(x.SteamUserId, x.SteamWorkshopModId, x.Name)).ToList();
}
}

0 comments on commit cfd03ce

Please sign in to comment.