mirror of
https://github.com/clusterio/clusterio.git
synced 2026-11-13 23:14:53 +09:00
Show online player count on the instance list (#1196)
Counts users per instance from the shared users subscription, the same data the instance page's online players list reads, so the table adds no per-row requests. The column is sortable and hidden without core.user.subscribe. Fixes #1193 Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
1 parent
ae707f7768
commit
381d1d8573
1 file changed
+24
@@ -7,6 +7,7 @@ import type { ColumnType } from "antd/es/table/interface";
|
||||
import { useAccount } from "../model/account";
|
||||
import { useSystems } from "../model/system";
|
||||
import { useHosts } from "../model/host";
|
||||
import { useUsers } from "../model/user";
|
||||
import { useDefaultModPack, useModPacks } from "../model/mod_pack";
|
||||
import { RestartRequired } from "./system_metrics";
|
||||
import InstanceStatusTag from "./InstanceStatusTag";
|
||||
@@ -33,6 +34,17 @@ export default function InstanceList(props: InstanceListProps) {
|
||||
const [systems] = useSystems();
|
||||
const [modPacks] = useModPacks();
|
||||
const defaultModPack = useDefaultModPack();
|
||||
const [users] = useUsers();
|
||||
const canUsers = account.hasPermission("core.user.subscribe");
|
||||
const onlineCounts = React.useMemo(() => {
|
||||
const counts = new Map<number, number>();
|
||||
for (const user of users.values()) {
|
||||
for (const instanceId of user.instances ?? []) {
|
||||
counts.set(instanceId, (counts.get(instanceId) ?? 0) + 1);
|
||||
}
|
||||
}
|
||||
return counts;
|
||||
}, [users]);
|
||||
const tableState = useTableQueryState<lib.InstanceDetails>({
|
||||
namespace: "instance", defaultSortKey: "name",
|
||||
});
|
||||
@@ -146,6 +158,18 @@ export default function InstanceList(props: InstanceListProps) {
|
||||
},
|
||||
];
|
||||
|
||||
if (canUsers) {
|
||||
const playerCount = (instance: lib.InstanceDetails) => onlineCounts.get(instance.id) ?? 0;
|
||||
columns.push({
|
||||
title: "Players",
|
||||
key: "players",
|
||||
render: (_, instance) => playerCount(instance),
|
||||
sorter: (a, b) => playerCount(a) - playerCount(b),
|
||||
sortOrder: tableState.sortOrder("players"),
|
||||
responsive: ["md"],
|
||||
});
|
||||
}
|
||||
|
||||
if (account.hasAnyPermission(...InstanceControlButtonPermissions)) {
|
||||
columns.push({
|
||||
key: "action",
|
||||
|
||||
Reference in new issue
Block a user