+
Table Status: {{ foundryStatus.active }}
World: {{ foundryStatus.world }}
Users: {{ foundryStatus.users }}
@@ -21,18 +22,18 @@
-
-
+
+
-
+
-
+
@@ -27,8 +34,12 @@
-
+
@@ -49,12 +60,7 @@ import ConfirmDialog from 'primevue/confirmdialog'
import { useConfirm } from 'primevue/useconfirm'
import { useUserData } from './user'
-import {
- startTable,
- hardStartTable,
- stopTable,
- deleteTable,
-} from './game_tables'
+import { startTable, hardStartTable, stopTable, deleteTable } from './game_tables'
import type { GameTable } from './game_tables'
@@ -105,6 +111,6 @@ function buildButtonModel(table: any) {
}
function isTableOwner(gameTable: GameTable): boolean {
- return user.value.is_admin || gameTable.user_id == user.value.id
+ return user.value !== null && (user.value.is_admin || gameTable.user_id == user.value.id)
}
diff --git a/src/TableManager.vue b/src/TableManager.vue
index f04be37..ff02af4 100644
--- a/src/TableManager.vue
+++ b/src/TableManager.vue
@@ -1,13 +1,29 @@
-
+
+
+ All Tables
+
+
+
+
+
+
+
+
+
+
+
+
-
-
-
- Active Tables
-
+
diff --git a/src/game_tables.ts b/src/game_tables.ts
index befe531..ccb7cb9 100644
--- a/src/game_tables.ts
+++ b/src/game_tables.ts
@@ -11,6 +11,13 @@ export interface GameTable {
user_id: number
}
+export interface FoundryStatus {
+ running: boolean
+ active: boolean
+ world: string
+ users: number
+}
+
let $selectedTable: Ref | undefined
let $activeTables: Ref> | undefined
let $allTables: Ref> | undefined
@@ -28,8 +35,7 @@ export function useAllTables(): Ref> {
}
export function useSelectedTable(): Ref {
- if (!$selectedTable)
- $selectedTable = ref(null)
+ if (!$selectedTable) $selectedTable = ref(null)
return $selectedTable
}
@@ -43,31 +49,35 @@ export function loadAllTables(): void {
}
export function loadSelectedTable(tableId: number = 0): void {
- if ($selectedTable && $selectedTable.value) {
- let id = tableId || $selectedTable.value.id
- axios.get(`/api/tables/${id}`).then((resp) => ($selectedTable!.value = resp.data))
+ if ($selectedTable && $selectedTable.value && tableId === 0) {
+ axios
+ .get(`/api/tables/${$selectedTable.value.id}`)
+ .then((resp) => ($selectedTable!.value = resp.data))
+ } else if (tableId !== 0) {
+ axios.get(`/api/tables/${tableId}`).then((resp) => ($selectedTable!.value = resp.data))
}
}
export function clearSelectedTable(): void {
if ($selectedTable) {
- $selectedTable.value = {
- id: 0,
- table_name: 'None',
- table_link: 'None',
- active: false,
- version: 0,
- user_id: 0,
- }
+ $selectedTable.value = null
}
}
-export async function startTable(gameTable: GameTable): Promise {
+export async function startTable(gameTable: GameTable | null): Promise {
+ if (gameTable === null) {
+ return
+ }
+
await axios
.post(`/api/tables/${gameTable.id}:start`, { hard: 'False' })
.then(() => loadAllTables())
.then(() => loadActiveTables())
.then(() => loadSelectedTable())
+ .catch(e => {
+ console.log(e)
+ console.log(e.response)
+ })
for (let retries = 0; retries < 10; retries++) {
try {
@@ -75,10 +85,9 @@ export async function startTable(gameTable: GameTable): Promise {
console.log('loaded')
return
} catch {
- await new Promise(f => setTimeout(f, 1000))
+ await new Promise((f) => setTimeout(f, 1000))
}
}
-
}
export function hardStartTable(gameTable: GameTable): void {
@@ -114,10 +123,26 @@ export function updateTable(tableId: number, updatedTable: GameTable): void {
.then(() => loadSelectedTable())
}
-export function deleteTable(gameTable: GameTable): void {
- axios
- .delete(`/api/tables/${gameTable.id}`)
- .then(() => loadAllTables())
- .then(() => loadActiveTables())
- .then(() => loadSelectedTable())
+export function deleteTable(gameTable: GameTable | null): void {
+ if (gameTable !== null) {
+ axios
+ .delete(`/api/tables/${gameTable.id}`)
+ .then(() => loadAllTables())
+ .then(() => loadActiveTables())
+ .then(() => loadSelectedTable())
+ }
+}
+
+export async function getFoundryStatus(gameTable: GameTable): Promise {
+ return axios.get(`http://${location.host}/${gameTable.table_link}/api/status`).then((resp) => {
+ if (typeof resp.data !== 'string') {
+ return {
+ running: resp.data.version,
+ active: resp.data.active,
+ world: resp.data.world,
+ users: resp.data.users,
+ }
+ }
+ return null
+ })
}
diff --git a/src/user.ts b/src/user.ts
index 4c3b896..e37cfaf 100644
--- a/src/user.ts
+++ b/src/user.ts
@@ -9,17 +9,21 @@ export interface User {
authenticated: boolean
}
-const $current_user = ref({ id: 0, username: 'username', is_admin: false, authenticated: false })
+const $current_user: Ref = ref(null)
function loadCurrentUser(): void {
axios.get('/api/auth/user').then((resp) => {
$current_user.value = resp.data
+ }).catch(() => {
+ $current_user.value = null
})
}
-export function useUserData(): Ref {
+export function useUserData(): Ref {
onMounted(() => {
- loadCurrentUser()
+ if ($current_user.value === null) {
+ loadCurrentUser()
+ }
})
return readonly($current_user)
@@ -32,7 +36,7 @@ export function login(username: string, password: string): void {
}
export function logout(): void {
- if ($current_user.value.authenticated) {
+ if ($current_user.value && $current_user.value.authenticated) {
axios.post('/api/auth/logout').then((resp) => {
$current_user.value = resp.data
})
@@ -40,6 +44,9 @@ export function logout(): void {
}
export function resetPassword(password: string): void {
+ if ($current_user.value === null) {
+ return
+ }
axios.post(`/api/auth/user/${$current_user.value.id}`, {
username: $current_user.value.username,
password,