diff --git a/back/src/App.ts b/back/src/App.ts index 6430251a..2cd668d2 100644 --- a/back/src/App.ts +++ b/back/src/App.ts @@ -6,6 +6,7 @@ import {PrometheusController} from "./Controller/PrometheusController"; import {FileController} from "./Controller/FileController"; import {DebugController} from "./Controller/DebugController"; import {App as uwsApp} from "./Server/sifrr.server"; +import {ReportController} from "./Controller/ReportController"; class App { public app: uwsApp; @@ -15,6 +16,7 @@ class App { public mapController: MapController; public prometheusController: PrometheusController; private debugController: DebugController; + private reportController: ReportController; constructor() { this.app = new uwsApp(); @@ -24,6 +26,7 @@ class App { this.authenticateController = new AuthenticateController(this.app); this.fileController = new FileController(this.app); this.mapController = new MapController(this.app); + this.reportController = new ReportController(this.app, this.ioSocketController); this.prometheusController = new PrometheusController(this.app, this.ioSocketController); this.debugController = new DebugController(this.app, this.ioSocketController); } diff --git a/back/src/Controller/BaseController.ts b/back/src/Controller/BaseController.ts index 93c17ab4..2757519d 100644 --- a/back/src/Controller/BaseController.ts +++ b/back/src/Controller/BaseController.ts @@ -1,4 +1,5 @@ -import {HttpResponse} from "uWebSockets.js"; +import {HttpRequest, HttpResponse} from "uWebSockets.js"; +import {ADMIN_API_TOKEN} from "../Enum/EnvironmentVariable"; export class BaseController { @@ -7,4 +8,11 @@ export class BaseController { res.writeHeader('access-control-allow-methods', 'GET, POST, OPTIONS, PUT, PATCH, DELETE'); res.writeHeader('access-control-allow-origin', '*'); } + + protected checkAdminToken(req: HttpRequest): void { + //TODO + /*if(req.getHeader('Authorization') !== ADMIN_API_TOKEN){ + throw 'Error token api'; + }*/ + } } diff --git a/back/src/Controller/IoSocketController.ts b/back/src/Controller/IoSocketController.ts index ddf123ce..f277cb4b 100644 --- a/back/src/Controller/IoSocketController.ts +++ b/back/src/Controller/IoSocketController.ts @@ -49,7 +49,7 @@ import { SilentMessage, WebRtcSignalToClientMessage, WebRtcSignalToServerMessage, - WebRtcStartMessage, WebRtcDisconnectMessage, PlayGlobalMessage, ReportPlayerMessage + WebRtcStartMessage, WebRtcDisconnectMessage, PlayGlobalMessage, ReportPlayerMessage, TeleportMessageMessage } from "../Messages/generated/messages_pb"; import {UserMovesMessage} from "../Messages/generated/messages_pb"; import Direction = PositionMessage.Direction; @@ -108,22 +108,6 @@ export class IoSocketController { return true; } - /** - * - * @param token - */ -/* searchClientByToken(token: string): ExSocketInterface | null { - const clients: ExSocketInterface[] = Object.values(this.Io.sockets.sockets) as ExSocketInterface[]; - for (let i = 0; i < clients.length; i++) { - const client = clients[i]; - if (client.token !== token) { - continue - } - return client; - } - return null; - }*/ - private async authenticate(req: HttpRequest): Promise<{ token: string, userUuid: string }> { //console.log(socket.handshake.query.token); @@ -921,4 +905,27 @@ export class IoSocketController { public getWorlds(): Map { return this.Worlds; } + + /** + * + * @param token + */ + searchClientByUuid(uuid: string): ExSocketInterface | null { + for(let socket of this.sockets.values()){ + if(socket.userUuid === uuid){ + return socket; + } + } + return null; + } + + public teleport(userUuid: string) { + let user = this.searchClientByUuid(userUuid); + if(!user){ + throw 'User not found'; + } + const teleportMessageMessage = new TeleportMessageMessage(); + teleportMessageMessage.setMap(`/teleport/${user.userUuid}`); + user.send(teleportMessageMessage.serializeBinary().buffer, true); + } } diff --git a/back/src/Controller/ReportController.ts b/back/src/Controller/ReportController.ts new file mode 100644 index 00000000..d39e9816 --- /dev/null +++ b/back/src/Controller/ReportController.ts @@ -0,0 +1,38 @@ +import {BaseController} from "./BaseController"; +import {HttpRequest, HttpResponse, TemplatedApp} from "uWebSockets.js"; +import {IoSocketController} from "./IoSocketController"; + +export class ReportController extends BaseController { + + constructor(private App: TemplatedApp, private ioSocketController: IoSocketController) { + super(); + this.teleport(); + } + + teleport(){ + this.App.options("/teleport", (res: HttpResponse, req: HttpRequest) => { + this.checkAdminToken(req); + this.addCorsHeaders(res); + res.end(); + }); + + this.App.post("/teleport", (res: HttpResponse, req: HttpRequest) => { + (async () => { + try { + this.checkAdminToken(req); + this.addCorsHeaders(res); + + res.onAborted(() => { + console.warn('Login request was aborted'); + }) + const param = await res.json(); + this.ioSocketController.teleport(param.userUuid); + res.writeStatus("200 OK").end(); + } catch (e) { + console.log("An error happened", e) + res.writeStatus(e.status || "500 Internal Server Error").end('An error happened'); + } + })(); + }); + } +} \ No newline at end of file diff --git a/front/src/Connexion/ConnexionModels.ts b/front/src/Connexion/ConnexionModels.ts index 4ec76198..30d14c79 100644 --- a/front/src/Connexion/ConnexionModels.ts +++ b/front/src/Connexion/ConnexionModels.ts @@ -24,6 +24,8 @@ export enum EventMessage{ PLAY_GLOBAL_MESSAGE = "play-global-message", STOP_GLOBAL_MESSAGE = "stop-global-message", + + TELEPORT = "teleport", } export interface PointInterface { diff --git a/front/src/Connexion/RoomConnection.ts b/front/src/Connexion/RoomConnection.ts index 282d830e..5ce724aa 100644 --- a/front/src/Connexion/RoomConnection.ts +++ b/front/src/Connexion/RoomConnection.ts @@ -22,7 +22,8 @@ import { WebRtcSignalToClientMessage, WebRtcSignalToServerMessage, WebRtcStartMessage, - ReportPlayerMessage + ReportPlayerMessage, + TeleportMessageMessage } from "../Messages/generated/messages_pb" import {UserSimplePeerInterface} from "../WebRtc/SimplePeer"; @@ -129,6 +130,8 @@ export class RoomConnection implements RoomConnection { this.dispatch(EventMessage.PLAY_GLOBAL_MESSAGE, message.getPlayglobalmessage()); } else if (message.hasStopglobalmessage()) { this.dispatch(EventMessage.STOP_GLOBAL_MESSAGE, message.getStopglobalmessage()); + } else if (message.hasTeleportmessagemessage()) { + this.dispatch(EventMessage.TELEPORT, message.getTeleportmessagemessage()); } else { throw new Error('Unknown message received'); } @@ -466,6 +469,12 @@ export class RoomConnection implements RoomConnection { }); } + public receiveTeleportMessage(callback: (messageId: string) => void) { + return this.onMessage(EventMessage.TELEPORT, (message: TeleportMessageMessage) => { + callback(message.getMap()); + }); + } + public emitGlobalMessage(message: PlayGlobalMessageInterface){ console.log('emitGlobalMessage', message); const playGlobalMessage = new PlayGlobalMessage(); diff --git a/front/src/Phaser/Game/GameScene.ts b/front/src/Phaser/Game/GameScene.ts index ca936e65..3cc9ef57 100644 --- a/front/src/Phaser/Game/GameScene.ts +++ b/front/src/Phaser/Game/GameScene.ts @@ -269,6 +269,11 @@ export class GameScene extends ResizableScene implements CenterListener { item.fire(message.event, message.state, message.parameters); })); + connection.receiveTeleportMessage((map: string) => { + //TODO + console.log('receiveTeleportMessage', map); + }) + // When connection is performed, let's connect SimplePeer this.simplePeer = new SimplePeer(this.connection); this.GlobalMessageManager = new GlobalMessageManager(this.connection); diff --git a/messages/messages.proto b/messages/messages.proto index 2d9b970a..bfd1958c 100644 --- a/messages/messages.proto +++ b/messages/messages.proto @@ -172,6 +172,10 @@ message WebRtcSignalToClientMessage { string signal = 2; } +message TeleportMessageMessage{ + string map = 1; +} + message ServerToClientMessage { oneof message { BatchMessage batchMessage = 1; @@ -184,5 +188,6 @@ message ServerToClientMessage { WebRtcDisconnectMessage webRtcDisconnectMessage = 8; PlayGlobalMessage playGlobalMessage = 9; StopGlobalMessage stopGlobalMessage = 10; + TeleportMessageMessage teleportMessageMessage = 11; } }