diff --git a/src/lib/services/taImages.ts b/src/lib/services/taImages.ts index 6ad3c17..e6fd428 100644 --- a/src/lib/services/taImages.ts +++ b/src/lib/services/taImages.ts @@ -6,7 +6,7 @@ */ export function bufferToImageUrl(imageBuffer: Uint8Array, mimeType: string = 'image/png'): string { if(imageBuffer.length == 1) { - throw new Error("This is the default logo.") + return '/talogo.png' } // Method 1: Create a data URL const base64String = arrayBufferToBase64(imageBuffer); diff --git a/src/lib/stores.js b/src/lib/stores.js index b06a3ad..3fcf06d 100644 --- a/src/lib/stores.js +++ b/src/lib/stores.js @@ -24,4 +24,7 @@ export const TABotTokenStore = createPersistedStore('TABotTokenTAUI', null); export const TAServerUrl = createPersistedStore('TAServerUrl', "server.tournamentassistant.net"); -export const TAServerPort = createPersistedStore('TAServerPort', "8676"); \ No newline at end of file +export const TAServerPort = createPersistedStore('TAServerPort', "8676"); + +// In the future, use a store for TAClient, since svelte is neat :))) +export const client = new TAClient(); \ No newline at end of file diff --git a/src/routes/authTokens/+page.svelte b/src/routes/authTokens/+page.svelte index d26e546..5fd938a 100644 --- a/src/routes/authTokens/+page.svelte +++ b/src/routes/authTokens/+page.svelte @@ -2,7 +2,7 @@ import { onMount, onDestroy } from 'svelte'; import Notification from '$lib/components/notifications/Popup.svelte'; import { discordAuthUrl } from '$lib/config.json'; - import { discordDataStore, discordTokenStore, authTokenStore, TAServerPort, TAServerUrl } from '$lib/stores'; + import { discordDataStore, discordTokenStore, authTokenStore, TAServerPort, TAServerUrl, client } from '$lib/stores'; import { TAClient, Response_ResponseType } from 'moons-ta-client'; import { v4 as uuidv4 } from "uuid"; @@ -20,9 +20,6 @@ // Change to an object for better reactivity let copyClicked: Record = {}; - // Declare client at component level so we can access it in onDestroy - let client: TAClient = new TAClient(); - // Remove 'Bearer ' from the token if ($authTokenStore) { const cleanToken = $authTokenStore.replace('Bearer ', ''); @@ -41,14 +38,15 @@ } try { - const connectResult = await client.connect($TAServerUrl, $TAServerPort); - - if (connectResult.details.oneofKind === "connect" && connectResult.type === Response_ResponseType.Fail) { - error = "Failed to connect to server"; - loading = false; - return; - } + if(!client.isConnected) { + const connectResult = await client.connect($TAServerUrl, $TAServerPort); + if (connectResult.details.oneofKind === "connect" && connectResult.type === Response_ResponseType.Fail) { + error = "Failed to connect to server"; + loading = false; + } + } + const tokens = await client.getBotTokensForUser($discordDataStore.id); authTokens = (tokens as any).details.getBotTokensForUser?.botUsers || []; loading = false; @@ -64,13 +62,6 @@ } }); - onDestroy(() => { - if (client) { - // Properly disconnect and clean up any listeners - client.disconnect(); - } - }); - function closeNotification() { showLoginNotification = false; } diff --git a/src/routes/tournaments/+page.svelte b/src/routes/tournaments/+page.svelte index cea6230..e19c1e3 100644 --- a/src/routes/tournaments/+page.svelte +++ b/src/routes/tournaments/+page.svelte @@ -3,7 +3,7 @@ import { onMount, onDestroy } from 'svelte'; import Notification from '$lib/components/notifications/Popup.svelte'; import { discordAuthUrl } from '$lib/config.json'; - import { discordDataStore, discordTokenStore, authTokenStore, TAServerPort, TAServerUrl } from '$lib/stores'; + import { discordDataStore, discordTokenStore, authTokenStore, TAServerPort, TAServerUrl, client } from '$lib/stores'; import { TAClient, Response_ResponseType, Tournament } from 'moons-ta-client'; import { bufferToImageUrl } from '$lib/services/taImages'; import { v4 as uuidv4 } from "uuid"; @@ -34,9 +34,6 @@ let nameError = ''; let creating = false; - // Declare client at component level so we can access it in onDestroy - let client: TAClient = new TAClient(); - // Remove 'Bearer ' from the token if($authTokenStore) { const cleanToken = $authTokenStore.replace('Bearer ', ''); @@ -66,12 +63,14 @@ } try { - const connectResult = await client.connect($TAServerUrl, $TAServerPort); + if(!client.isConnected) { + const connectResult = await client.connect($TAServerUrl, $TAServerPort); - if (connectResult.details.oneofKind === "connect" && connectResult.type === Response_ResponseType.Fail) { - authError = connectResult.details.connect.message; - loading = false; - return; + if (connectResult.details.oneofKind === "connect" && connectResult.type === Response_ResponseType.Fail) { + authError = connectResult.details.connect.message; + loading = false; + return; + } } // Get tournaments from the client @@ -103,14 +102,14 @@ // Fetch authorized users for this tournament // This initiates the API call immediately but doesn't block the map function - // const authorisedUsersPromise = fetchTournamentAuthorisedUsers(t.guid); + // const authorisedUsersPromise = await fetchTournamentAuthorisedUsers(t.guid); return { id: t.guid.substring(0, 8), // Short ID for display name: t.settings?.tournamentName || 'Unnamed Tournament', image: imageUrl, guid: t.guid, - // authorisedUsers: await authorisedUsersPromise // Wait for the promise to resolve + // authorisedUsers: authorisedUsersPromise // Wait for the promise to resolve }; })); } catch (connErr) { @@ -127,10 +126,10 @@ }); onDestroy(() => { - if (client.isConnected == true) { - // Properly disconnect and clean up any listeners - client.disconnect(); - } + // if (client.isConnected == true) { + // // Properly disconnect and clean up any listeners + // client.disconnect(); + // } }); async function fetchTournamentAuthorisedUsers(tournamentGuid: string) { diff --git a/src/routes/tournaments/[tournamentguid]/+page.svelte b/src/routes/tournaments/[tournamentguid]/+page.svelte index 73c7214..0b63422 100644 --- a/src/routes/tournaments/[tournamentguid]/+page.svelte +++ b/src/routes/tournaments/[tournamentguid]/+page.svelte @@ -1,5 +1,5 @@ @@ -200,20 +216,19 @@
-

{'Unnamed Match'}

- +

+ x.guid == match.leader)?.discordInfo?.avatarUrl || "https://api.dicebear.com/7.x/identicon/svg?seed=" + tournament?.users.find(x => x.guid == match.leader)?.guid} + alt="Player" + class="player-avatar" + /> + {tournament?.users.find(x => x.guid == match.leader)?.discordInfo?.username}'s Match +

{#if match.associatedUsers && match.associatedUsers.length > 0} {#each match.associatedUsers as userGuid} - {#if client.stateManager.getUser(tournamentGuid, userGuid)} + {#if client.stateManager.getUser(tournamentGuid, userGuid) && client.stateManager.getUser(tournamentGuid, userGuid)?.clientType == 0}
Player
-

{player.discordInfo.username}

+

{player.name} ({player.discordInfo.username})

{PlayerPlayState[player.playState]}

@@ -276,7 +291,7 @@

{$selectedPlayerGuids.length} players selected

- diff --git a/src/routes/tournaments/[tournamentguid]/mappools/+page.svelte b/src/routes/tournaments/[tournamentguid]/mappools/+page.svelte index d410cf5..83d0e29 100644 --- a/src/routes/tournaments/[tournamentguid]/mappools/+page.svelte +++ b/src/routes/tournaments/[tournamentguid]/mappools/+page.svelte @@ -1,5 +1,5 @@
diff --git a/src/routes/tournaments/[tournamentguid]/mappools/[poolGuid]/+page.svelte b/src/routes/tournaments/[tournamentguid]/mappools/[poolGuid]/+page.svelte index 72e6f4c..7552000 100644 --- a/src/routes/tournaments/[tournamentguid]/mappools/[poolGuid]/+page.svelte +++ b/src/routes/tournaments/[tournamentguid]/mappools/[poolGuid]/+page.svelte @@ -2,7 +2,7 @@ import { onMount, onDestroy } from "svelte"; //@ts-ignore import { TAClient, Response_ResponseType, Map, Tournament, GameplayModifiers_GameOptions } from 'moons-ta-client'; - import { TABotTokenStore, TAServerPort, TAServerUrl, authTokenStore } from "$lib/stores"; + import { TABotTokenStore, TAServerPort, TAServerUrl, authTokenStore, client } from "$lib/stores"; import { bufferToImageUrl } from "$lib/services/taImages.js"; import SideMenu from "$lib/components/menus/SideMenuTournaments.svelte"; import Popup from "$lib/components/notifications/Popup.svelte"; @@ -108,8 +108,6 @@ let showSuccessNotification = false; let successMessage = ""; - const client = new TAClient(); - // Remove 'Bearer ' from the token if ($authTokenStore) { const cleanToken = $authTokenStore.replace('Bearer ', ''); @@ -202,20 +200,20 @@ try { if(!client.isConnected) { const connectResult = await client.connect($TAServerUrl, $TAServerPort); - + if (connectResult.details.oneofKind === "connect" && connectResult.type === Response_ResponseType.Fail) { throw new Error(connectResult.details.connect.message); } - + } + + if(!client.stateManager.getTournament(tournamentGuid)!.users.some(user => user.guid == client.stateManager.getSelfGuid())) { const joinResult = await client.joinTournament(tournamentGuid); if (joinResult.details.oneofKind !== 'join' || joinResult.type === Response_ResponseType.Fail) { throw new Error('Could not join tournament'); } - - tournament = await joinResult.details.join.state?.tournaments.find((x: Tournament) => x.guid === tournamentGuid); - } else { - tournament = await client.stateManager.getTournament(tournamentGuid)!; - } + } + + tournament = client.stateManager.getTournament(tournamentGuid)!; // Find the map pool with the specified GUID @@ -265,10 +263,6 @@ window.location.href = "/discordAuth"; } }); - - onDestroy(() => { - client.disconnect(); - });
diff --git a/src/routes/tournaments/[tournamentguid]/settings/+page.svelte b/src/routes/tournaments/[tournamentguid]/settings/+page.svelte index 111fe15..93cfda4 100644 --- a/src/routes/tournaments/[tournamentguid]/settings/+page.svelte +++ b/src/routes/tournaments/[tournamentguid]/settings/+page.svelte @@ -1,5 +1,5 @@
diff --git a/src/routes/tournaments/[tournamentguid]/teams/+page.svelte b/src/routes/tournaments/[tournamentguid]/teams/+page.svelte index b200586..3bc6a74 100644 --- a/src/routes/tournaments/[tournamentguid]/teams/+page.svelte +++ b/src/routes/tournaments/[tournamentguid]/teams/+page.svelte @@ -1,5 +1,5 @@