diff --git a/packages/client-core/src/components/World/EngineHooks.tsx b/packages/client-core/src/components/World/EngineHooks.tsx index b62239a1e3c..798b03ce8d1 100755 --- a/packages/client-core/src/components/World/EngineHooks.tsx +++ b/packages/client-core/src/components/World/EngineHooks.tsx @@ -36,6 +36,7 @@ import { NotificationService } from '../../common/services/NotificationService' import { useRouter } from '../../common/services/RouterService' import { useLocationState } from '../../social/services/LocationService' import { SocketWebRTCClientNetwork } from '../../transports/SocketWebRTCClientFunctions' +import { AvatarService } from '../../user/services/AvatarService' import { startClientSystems } from '../../world/startClientSystems' const logger = multiLogger.child({ component: 'client-core:world' }) @@ -57,6 +58,24 @@ export const useLoadEngine = () => { }, []) } +const fetchMissingAvatar = async (user, avatarSpawnPose) => { + const avatar = await AvatarService.getAvatar(user.avatar.id.value) + if (avatar && (avatar.modelResource?.LOD0_url || (avatar.modelResource as any)?.src)) + spawnLocalAvatarInWorld({ + avatarSpawnPose, + avatarDetail: { + avatarURL: avatar.modelResource?.LOD0_url || (avatar.modelResource as any)?.src, + thumbnailURL: avatar.thumbnailResource?.LOD0_url || (avatar.thumbnailResource as any)?.src + }, + name: user.name.value + }) + else + NotificationService.dispatchNotify( + 'Your avatar is missing its model. Please change your avatar from the user menu.', + { variant: 'error' } + ) +} + export const useLocationSpawnAvatar = (spectate = false) => { const sceneLoaded = useHookstate(getMutableState(EngineState).sceneLoaded) const authState = useAuthState() @@ -89,7 +108,7 @@ export const useLocationSpawnAvatar = (spectate = false) => { ? getSpawnPoint(spawnPoint, Engine.instance.userId) : getRandomSpawnPoint(Engine.instance.userId) - if (avatarDetails.modelResource?.LOD0_url || (avatarDetails.modelResource as any).src) + if (avatarDetails.modelResource?.LOD0_url || (avatarDetails.modelResource as any)?.src) spawnLocalAvatarInWorld({ avatarSpawnPose, avatarDetail: { @@ -98,12 +117,7 @@ export const useLocationSpawnAvatar = (spectate = false) => { }, name: user.name.value }) - else { - NotificationService.dispatchNotify( - 'Your avatar is missing its model. Please change your avatar from the user menu.', - { variant: 'error' } - ) - } + else fetchMissingAvatar(user, avatarSpawnPose) }, [sceneLoaded, authState.user, authState.user?.avatar, spectateParam]) } diff --git a/packages/client-core/src/user/services/AvatarService.ts b/packages/client-core/src/user/services/AvatarService.ts index 80d4d65d5b0..08ba5a80bfa 100644 --- a/packages/client-core/src/user/services/AvatarService.ts +++ b/packages/client-core/src/user/services/AvatarService.ts @@ -7,6 +7,7 @@ import { AvatarInterface } from '@etherealengine/common/src/interfaces/AvatarInt import { StaticResourceInterface } from '@etherealengine/common/src/interfaces/StaticResourceInterface' import { UserId } from '@etherealengine/common/src/interfaces/UserId' import { matches, Validator } from '@etherealengine/engine/src/common/functions/MatchesUtils' +import { Engine } from '@etherealengine/engine/src/ecs/classes/Engine' import { WorldNetworkAction } from '@etherealengine/engine/src/networking/functions/WorldNetworkAction' import { defineAction, defineState, dispatchAction, getMutableState, useState } from '@etherealengine/hyperflux' @@ -191,6 +192,14 @@ export const AvatarService = { isPublic } }).promise as Promise + }, + + async getAvatar(id: string) { + try { + return Engine.instance.api.service('avatar').get(id) + } catch (err) { + return null + } } } diff --git a/packages/server-core/src/user/user/user.hooks.ts b/packages/server-core/src/user/user/user.hooks.ts index bce9382f64e..c46cd2df390 100755 --- a/packages/server-core/src/user/user/user.hooks.ts +++ b/packages/server-core/src/user/user/user.hooks.ts @@ -7,6 +7,7 @@ import addAssociations from '@etherealengine/server-core/src/hooks/add-associati import addScopeToUser from '../../hooks/add-scope-to-user' import authenticate from '../../hooks/authenticate' import verifyScope from '../../hooks/verify-scope' +import logger from '../../ServerLogger' const restrictUserPatch = (context: HookContext) => { if (context.params.isInternal) return context @@ -89,29 +90,161 @@ const addAvatarResources = () => { return async (context: HookContext): Promise => { const { app, result } = context - if (result.avatar) { + // if (!result.data) console.log('result.avatar', result, result.avatar, result.avatar?.dataValues, result.dataValues, result.dataValues?.avatar?.dataValues,) + + if (result.dataValues?.avatar) { + if (result.dataValues?.avatar.modelResourceId) + try { + result.dataValues.avatar.modelResource = await app + .service('static-resource') + .get(result.dataValues.avatar.modelResourceId) + } catch (err) { + logger.error('error getting avatar model %o', err) + } + if (result.dataValues?.avatar.dataValues?.modelResourceId) + try { + result.dataValues.avatar.dataValues.modelResource = await app + .service('static-resource') + .get(result.dataValues.avatar.dataValues.modelResourceId) + } catch (err) { + logger.error('error getting avatar model %o', err) + } + if (result.dataValues?.avatar.thumbnailResourceId) + try { + result.dataValues.avatar.thumbnailResource = await app + .service('static-resource') + .get(result.dataValues.avatar.thumbnailResourceId) + } catch (err) { + logger.error('error getting avatar model %o', err) + } + if (result.dataValues?.avatar.dataValues?.thumbnailResourceId) + try { + result.dataValues.avatar.dataValues.thumbnailResource = await app + .service('static-resource') + .get(result.dataValues.avatar.dataValues.thumbnailResourceId) + } catch (err) { + logger.error('error getting avatar model %o', err) + } + } else if (result.avatar) { if (result.avatar.modelResourceId) try { result.avatar.modelResource = await app.service('static-resource').get(result.avatar.modelResourceId) - } catch (err) {} - if (result.avatar.dataValues.modelResourceId) + } catch (err) { + logger.error('error getting avatar model %o', err) + } + if (result.avatar.dataValues?.modelResourceId) try { result.avatar.dataValues.modelResource = await app .service('static-resource') .get(result.avatar.dataValues.modelResourceId) - } catch (err) {} + } catch (err) { + logger.error('error getting avatar model %o', err) + } if (result.avatar.thumbnailResourceId) try { result.avatar.thumbnailResource = await app.service('static-resource').get(result.avatar.thumbnailResourceId) - } catch (err) {} - if (result.avatar.dataValues.thumbnailResourceId) + } catch (err) { + logger.error('error getting avatar model %o', err) + } + if (result.avatar.dataValues?.thumbnailResourceId) try { result.avatar.dataValues.thumbnailResource = await app .service('static-resource') .get(result.avatar.dataValues.thumbnailResourceId) - } catch (err) {} + } catch (err) { + logger.error('error getting avatar model %o', err) + } } + // if (result.data) { + // const mappedUsers = result.data.map(user => { + // return new Promise(async (resolve, reject) => { + // if (user.avatar) { + // if (user.avatar.modelResourceId) + // try { + // user.avatar.modelResource = await app.service('static-resource').get(user.avatar.modelResourceId) + // resolve(user) + // } catch (err) { + // logger.error('error getting avatar model %o', err) + // reject(err) + // } + // if (user.avatar.dataValues?.modelResourceId) + // try { + // user.avatar.dataValues.modelResource = await app + // .service('static-resource') + // .get(user.avatar.dataValues.modelResourceId) + // resolve(user) + // } catch (err) { + // logger.error('error getting avatar model %o', err) + // reject(err) + // } + // if (user.avatar.thumbnailResourceId) + // try { + // user.avatar.thumbnailResource = await app.service('static-resource').get(user.avatar.thumbnailResourceId) + // resolve(user) + // } catch (err) { + // logger.error('error getting avatar model %o', err) + // reject(err) + // } + // if (user.avatar.dataValues?.thumbnailResourceId) + // try { + // user.avatar.dataValues.thumbnailResource = await app + // .service('static-resource') + // .get(user.avatar.dataValues.thumbnailResourceId) + // resolve(user) + // } catch (err) { + // logger.error('error getting avatar model %o', err) + // reject(err) + // } + // } + // if (user.dataValues.avatar) { + // if (user.dataValues.avatar.modelResourceId) + // try { + // user.dataValues.avatar.modelResource = await app.service('static-resource').get(user.dataValues.avatar.modelResourceId) + // resolve(user) + // } catch (err) { + // logger.error('error getting avatar model %o', err) + // reject(err) + // } + // try { + // console.log('POPULATING MUTLI DATAVALUES MODELRESOURCE') + // user.dataValues.avatar.dataValues.modelResource = await app + // .service('static-resource') + // .get(user.dataValues.avatar.dataValues.modelResourceId) + // console.log('DONE POPULATED MUTLI DATAVALUES MODELRESOURCE', user, user.dataValues.avatar.dataValues) + // resolve(user) + // } catch (err) { + // logger.error('error getting avatar model %o', err) + // reject(err) + // } + // if (user.dataValues.avatar.thumbnailResourceId) + // try { + // user.dataValues.avatar.thumbnailResource = await app.service('static-resource').get(user.dataValues.avatar.thumbnailResourceId) + // resolve(user) + // } catch (err) { + // logger.error('error getting avatar model %o', err) + // reject(err) + // } + // if (user.dataValues.avatar.dataValues?.thumbnailResourceId) + // try { + // user.dataValues.avatar.dataValues.thumbnailResource = await app + // .service('static-resource') + // .get(user.dataValues.avatar.dataValues.thumbnailResourceId) + // resolve(user) + // } catch (err) { + // logger.error('error getting avatar model %o', err) + // reject(err) + // } + // } + // }) + // }) + // console.log('promises', mappedUsers) + // await Promise.all(mappedUsers) + // result.data = mappedUsers + // } + + // if (!result.data) console.log('Returned result.avatar', result, result.avatar, result.avatar?.dataValues, result.dataValues?.avatar?.dataValues) + // if (result.data && result.total > 0) console.log('nested user', result.data[0].avatar.dataValues) return context } }