Files
GSM/.claude/settings.local.json
Alexander Zielonka 2b1fbb9f02 Initial commit: Homelab documentation
- infrastructure.md: Network topology, server overview, credentials
- gsm.md: Gameserver Monitor detailed documentation
- todo.md: Project roadmap and completed tasks
- CLAUDE.md: AI assistant context
- temp/: Frontend component backups

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-05 06:16:05 +01:00

16 lines
5.5 KiB
JSON

{
"permissions": {
"allow": [
"Bash(ssh:*)",
"Bash(scp:*)",
"Bash(veth.*)",
"Bash(docker.*)",
"Bash(curl:*)",
"Bash(findstr:*)",
"Bash(cat:*)",
"Bash(powershell -Command @'\n$content = @\"\"\nimport { useState, useEffect } from 'react'\nimport { useNavigate } from 'react-router-dom'\nimport { getServers } from '../api'\nimport { useUser } from '../context/UserContext'\nimport ServerCard from '../components/ServerCard'\nimport SettingsModal from '../components/SettingsModal'\nimport UserManagement from '../components/UserManagement'\n\nexport default function Dashboard\\({ onLogout }\\) {\n const navigate = useNavigate\\(\\)\n const { user, token, loading: userLoading, isSuperadmin, role } = useUser\\(\\)\n const [servers, setServers] = useState\\([]\\)\n const [loading, setLoading] = useState\\(true\\)\n const [error, setError] = useState\\(''\\)\n const [showSettings, setShowSettings] = useState\\(false\\)\n const [showUserMgmt, setShowUserMgmt] = useState\\(false\\)\n\n const fetchServers = async \\(\\) => {\n try {\n const data = await getServers\\(token\\)\n setServers\\(data\\)\n setError\\(''\\)\n } catch \\(err\\) {\n setError\\('Failed to connect to server'\\)\n if \\(err.message.includes\\('401'\\) || err.message.includes\\('403'\\)\\) {\n onLogout\\(\\)\n }\n } finally {\n setLoading\\(false\\)\n }\n }\n\n useEffect\\(\\(\\) => {\n if \\(!userLoading\\) {\n fetchServers\\(\\)\n const interval = setInterval\\(fetchServers, 10000\\)\n return \\(\\) => clearInterval\\(interval\\)\n }\n }, [token, userLoading]\\)\n\n const roleLabels = {\n user: 'Viewer',\n moderator: 'Operator',\n superadmin: 'Admin'\n }\n\n if \\(userLoading\\) {\n return \\(\n <div className=\"\"min-h-screen flex items-center justify-center\"\">\n <div className=\"\"text-neutral-400\"\">Loading...</div>\n </div>\n \\)\n }\n\n const onlineCount = servers.filter\\(s => s.running\\).length\n const totalPlayers = servers.reduce\\(\\(sum, s\\) => sum + \\(s.players?.online || 0\\), 0\\)\n\n return \\(\n <div className=\"\"min-h-screen page-enter\"\">\n {/* Header */}\n <header className=\"\"border-b border-neutral-800 bg-neutral-900/50 backdrop-blur-sm sticky top-0 z-10\"\">\n <div className=\"\"container-main py-4\"\">\n <div className=\"\"flex items-center justify-between\"\">\n <div className=\"\"flex items-center gap-6\"\">\n <h1 className=\"\"text-xl font-semibold text-white\"\">\n Gameserver Monitor\n </h1>\n <div className=\"\"hidden md:flex items-center gap-4 text-sm text-neutral-400\"\">\n <span>\n <span className=\"\"text-white font-medium\"\">{onlineCount}</span>/{servers.length} online\n </span>\n <span className=\"\"text-neutral-600\"\">|</span>\n <span>\n <span className=\"\"text-white font-medium\"\">{totalPlayers}</span> players\n </span>\n </div>\n </div>\n\n <div className=\"\"flex items-center gap-3\"\">\n <div className=\"\"hidden sm:block text-right mr-2\"\">\n <div className=\"\"text-sm text-white\"\">{user?.username}</div>\n <div className=\"\"text-xs text-neutral-500\"\">{roleLabels[role]}</div>\n </div>\n\n {isSuperadmin && \\(\n <button\n onClick={\\(\\) => setShowUserMgmt\\(true\\)}\n className=\"\"btn btn-ghost\"\"\n >\n Users\n </button>\n \\)}\n\n <button\n onClick={\\(\\) => setShowSettings\\(true\\)}\n className=\"\"btn btn-ghost\"\"\n >\n Settings\n </button>\n\n <button\n onClick={onLogout}\n className=\"\"btn btn-outline\"\"\n >\n Sign out\n </button>\n </div>\n </div>\n </div>\n </header>\n\n {/* Main Content */}\n <main className=\"\"container-main py-8\"\">\n {error && \\(\n <div className=\"\"mb-6 alert alert-error fade-in\"\">\n {error}\n </div>\n \\)}\n\n {loading ? \\(\n <div className=\"\"text-center py-12\"\">\n <div className=\"\"text-neutral-400\"\">Loading servers...</div>\n </div>\n \\) : \\(\n <div className=\"\"grid grid-cols-1 md:grid-cols-2 gap-6\"\">\n {servers.map\\(\\(server, index\\) => \\(\n <div\n key={server.id}\n className=\"\"fade-in-up\"\"\n style={{ animationDelay: ``$``{index * 50}ms``, animationFillMode: 'both' }}\n >\n <ServerCard\n server={server}\n onClick={\\(\\) => navigate\\('/server/' + server.id\\)}\n />\n </div>\n \\)\\)}\n </div>\n \\)}\n </main>\n\n {/* Modals */}\n {showSettings && \\(\n <SettingsModal onClose={\\(\\) => setShowSettings\\(false\\)} />\n \\)}\n\n {showUserMgmt && \\(\n <UserManagement onClose={\\(\\) => setShowUserMgmt\\(false\\)} />\n \\)}\n </div>\n \\)\n}\n\"\"@\n$content | Out-File -FilePath \"\"Dashboard.jsx\"\" -Encoding UTF8\n'@)",
"Bash(git add:*)"
]
}
}