diff --git a/lib/StaticData.php b/lib/StaticData.php index 6e869b72..62dc8eea 100644 --- a/lib/StaticData.php +++ b/lib/StaticData.php @@ -26,6 +26,7 @@ public function __construct( private DatabaseStatistics $databaseStatistics, private ShareStatistics $shareStatistics, private SessionStatistics $sessionStatistics, + private SubscriptionStatistics $subscriptionStatistics, private SystemStatistics $systemStatistics, private IAppConfig $appConfig, private OsStatusService $osStatus, @@ -69,6 +70,7 @@ public function getData(): array { 'fpm' => $this->fpmStatistics->getFpmStatistics(), 'database' => $this->databaseStatistics->getDatabaseStatistics(), 'activeUsers' => $this->sessionStatistics->getSessionStatistics(), + 'subscriptionUsers' => $this->subscriptionStatistics->getSubscriptionUsers(), 'freeSpace' => $this->systemStatistics->getFreeSpace(), 'memTotal' => $memory->getMemTotal(), 'phpinfo' => $this->appConfig->getAppValueBool('phpinfo', false), diff --git a/lib/SubscriptionStatistics.php b/lib/SubscriptionStatistics.php new file mode 100644 index 00000000..84a33314 --- /dev/null +++ b/lib/SubscriptionStatistics.php @@ -0,0 +1,37 @@ +appManager->isEnabledForAnyone('support')) { + return null; + } + + // Last subscription info fetched by the support app, no public API exposes it + $subscriptionInfo = $this->appConfig->getValueArray('support', 'last_response', lazy: true); + $amountOfUsers = (int)($subscriptionInfo['amountOfUsers'] ?? 0); + + return $amountOfUsers > 0 ? $amountOfUsers : null; + } +} diff --git a/src/components/ActiveUsersSection.vue b/src/components/ActiveUsersSection.vue index bac0b457..be55fad4 100644 --- a/src/components/ActiveUsersSection.vue +++ b/src/components/ActiveUsersSection.vue @@ -45,15 +45,21 @@ import SectionHeading from './SectionHeading.vue' const props = defineProps<{ activeUsers: { last1hour: number, last24hours: number, last7days: number, last1month: number, total: number } numUsers: number + subscriptionUsers: number | null }>() /** - * Format the active-user count as its share of all users, e.g. "3% of all users". + * Format the active-user count as its share of the subscription quota when one is known, + * otherwise of all users, e.g. "3% of all users". * * @param count number of active users in the period */ function percentageOfAllUsers(count: number): string { - const percentage = props.numUsers === 0 ? 0 : Math.round(count * 1000 / props.numUsers) / 10 + const total = props.subscriptionUsers ?? props.numUsers + const percentage = total === 0 ? 0 : Math.round(count * 1000 / total) / 10 + if (props.subscriptionUsers !== null) { + return t('serverinfo', '{0}% of your subscription quota', [String(percentage)]) + } return t('serverinfo', '{0}% of all users', [String(percentage)]) } diff --git a/src/composables/useStaticData.ts b/src/composables/useStaticData.ts index 35ae0fb4..e52b79d0 100644 --- a/src/composables/useStaticData.ts +++ b/src/composables/useStaticData.ts @@ -51,6 +51,7 @@ export interface StaticData { fpm: Record | false database: { type: string, version: string, size: number } activeUsers: { last1hour: number, last24hours: number, last7days: number, last1month: number, total: number } + subscriptionUsers: number | null freeSpace: number | null memTotal: number phpinfo: boolean diff --git a/src/views/StatusView.vue b/src/views/StatusView.vue index 1c033f80..dc3bd442 100644 --- a/src/views/StatusView.vue +++ b/src/views/StatusView.vue @@ -62,7 +62,7 @@ - +