From 57ffa18c61e7aac5f7be31c5b1dad48835933765 Mon Sep 17 00:00:00 2001 From: Toaster2 Date: Sat, 11 Apr 2026 19:42:33 +0200 Subject: [PATCH 1/2] Allow setting server status URL using the integration config --- Refresh.Core/Configuration/IntegrationConfig.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Refresh.Core/Configuration/IntegrationConfig.cs b/Refresh.Core/Configuration/IntegrationConfig.cs index 3db13aa51..f4c999535 100644 --- a/Refresh.Core/Configuration/IntegrationConfig.cs +++ b/Refresh.Core/Configuration/IntegrationConfig.cs @@ -7,7 +7,7 @@ namespace Refresh.Core.Configuration; /// public class IntegrationConfig : Config { - public override int CurrentConfigVersion => 8; + public override int CurrentConfigVersion => 9; public override int Version { get; set; } protected override void Migrate(int oldVer, dynamic oldConfig) { @@ -69,6 +69,7 @@ protected override void Migrate(int oldVer, dynamic oldConfig) #endregion public string? GrafanaDashboardUrl { get; set; } + public string? ServerStatusUrl { get; set; } /// /// A link to a .SVG or .PNG containing the logo to use for branding. From 8e9f4a0f4232ddb1407ae1eb943e7f7c0b7c0450 Mon Sep 17 00:00:00 2001 From: Toaster2 Date: Sat, 11 Apr 2026 19:44:00 +0200 Subject: [PATCH 2/2] Expose role-perms and other things over /instance --- .../DataTypes/Response/ApiInstanceResponse.cs | 7 +++++ .../Response/ApiRolePermissionsResponse.cs | 27 +++++++++++++++++++ .../Response/ApiTimedLevelLimitResponse.cs | 8 ++++++ .../Endpoints/InstanceApiEndpoints.cs | 5 ++++ 4 files changed, 47 insertions(+) create mode 100644 Refresh.Interfaces.APIv3/Endpoints/DataTypes/Response/ApiRolePermissionsResponse.cs create mode 100644 Refresh.Interfaces.APIv3/Endpoints/DataTypes/Response/ApiTimedLevelLimitResponse.cs diff --git a/Refresh.Interfaces.APIv3/Endpoints/DataTypes/Response/ApiInstanceResponse.cs b/Refresh.Interfaces.APIv3/Endpoints/DataTypes/Response/ApiInstanceResponse.cs index cdd09d283..65ff4fcf1 100644 --- a/Refresh.Interfaces.APIv3/Endpoints/DataTypes/Response/ApiInstanceResponse.cs +++ b/Refresh.Interfaces.APIv3/Endpoints/DataTypes/Response/ApiInstanceResponse.cs @@ -47,6 +47,7 @@ public class ApiInstanceResponse : IApiResponse public required bool MaintenanceModeEnabled { get; set; } public required string? GrafanaDashboardUrl { get; set; } + public required string? ServerStatusUrl { get; set; } public required string WebsiteLogoUrl { get; set; } public required string? WebsiteDefaultTheme { get; set; } @@ -54,4 +55,10 @@ public class ApiInstanceResponse : IApiResponse public required ApiContactInfoResponse ContactInfo { get; set; } public required ApiContestResponse? ActiveContest { get; set; } + + public required ApiRolePermissionsResponse NormalUserPermissions { get; set; } + public required ApiRolePermissionsResponse TrustedUserPermissions { get; set; } + + public required bool IsPresenceServerEnabled { get; set; } + // TODO: similar attribute for CWLib integration } \ No newline at end of file diff --git a/Refresh.Interfaces.APIv3/Endpoints/DataTypes/Response/ApiRolePermissionsResponse.cs b/Refresh.Interfaces.APIv3/Endpoints/DataTypes/Response/ApiRolePermissionsResponse.cs new file mode 100644 index 000000000..da60ec658 --- /dev/null +++ b/Refresh.Interfaces.APIv3/Endpoints/DataTypes/Response/ApiRolePermissionsResponse.cs @@ -0,0 +1,27 @@ +using Refresh.Core.Configuration; + +namespace Refresh.Interfaces.APIv3.Endpoints.DataTypes.Response; + +[JsonObject(NamingStrategyType = typeof(CamelCaseNamingStrategy))] +public class ApiRolePermissionsResponse : IApiResponse +{ + public required ConfigAssetFlags BlockedAssetFlags { get; set; } + public required bool ReadOnlyMode { get; set; } + public required ApiTimedLevelLimitResponse? TimedLevelUploadLimits { get; set; } + public required int UserFilesizeQuota { get; set; } + + public static ApiRolePermissionsResponse FromOld(RolePermissions old) + { + return new() + { + BlockedAssetFlags = old.BlockedAssetFlags, + ReadOnlyMode = old.ReadOnlyMode, + TimedLevelUploadLimits = old.TimedLevelUploadLimits.Enabled ? new ApiTimedLevelLimitResponse() + { + TimeSpanHours = old.TimedLevelUploadLimits.TimeSpanHours, + LevelQuota = old.TimedLevelUploadLimits.LevelQuota, + } : null, + UserFilesizeQuota = old.UserFilesizeQuota, + }; + } +} \ No newline at end of file diff --git a/Refresh.Interfaces.APIv3/Endpoints/DataTypes/Response/ApiTimedLevelLimitResponse.cs b/Refresh.Interfaces.APIv3/Endpoints/DataTypes/Response/ApiTimedLevelLimitResponse.cs new file mode 100644 index 000000000..f9e2e2b52 --- /dev/null +++ b/Refresh.Interfaces.APIv3/Endpoints/DataTypes/Response/ApiTimedLevelLimitResponse.cs @@ -0,0 +1,8 @@ +namespace Refresh.Interfaces.APIv3.Endpoints.DataTypes.Response; + +[JsonObject(NamingStrategyType = typeof(CamelCaseNamingStrategy))] +public class ApiTimedLevelLimitResponse : IApiResponse +{ + public required int TimeSpanHours { get; set; } + public required int LevelQuota { get; set; } +} \ No newline at end of file diff --git a/Refresh.Interfaces.APIv3/Endpoints/InstanceApiEndpoints.cs b/Refresh.Interfaces.APIv3/Endpoints/InstanceApiEndpoints.cs index 1639719e4..4a5b88963 100644 --- a/Refresh.Interfaces.APIv3/Endpoints/InstanceApiEndpoints.cs +++ b/Refresh.Interfaces.APIv3/Endpoints/InstanceApiEndpoints.cs @@ -72,6 +72,11 @@ public ApiResponse GetInstanceInformation(RequestContext co GrafanaDashboardUrl = integrationConfig.GrafanaDashboardUrl, WebsiteLogoUrl = integrationConfig.WebsiteLogoUrl, WebsiteDefaultTheme = integrationConfig.WebsiteDefaultTheme, + IsPresenceServerEnabled = integrationConfig.PresenceEnabled, + ServerStatusUrl = integrationConfig.ServerStatusUrl, + + NormalUserPermissions = ApiRolePermissionsResponse.FromOld(gameConfig.NormalUserPermissions), + TrustedUserPermissions = ApiRolePermissionsResponse.FromOld(gameConfig.TrustedUserPermissions), ContactInfo = new ApiContactInfoResponse {