workadventure/back/src/Model/Websocket/ProtobufUtils.ts

118 lines
3.9 KiB
TypeScript
Raw Normal View History

2021-06-24 10:09:10 +02:00
import { PointInterface } from "./PointInterface";
2020-10-20 16:39:23 +02:00
import {
CharacterLayerMessage,
ItemEventMessage,
PointMessage,
2021-06-24 10:09:10 +02:00
PositionMessage,
2020-10-20 16:39:23 +02:00
} from "../../Messages/generated/messages_pb";
2021-06-24 10:09:10 +02:00
import { CharacterLayer } from "_Model/Websocket/CharacterLayer";
2020-09-18 18:16:26 +02:00
import Direction = PositionMessage.Direction;
2021-06-24 10:09:10 +02:00
import { ItemEventMessageInterface } from "_Model/Websocket/ItemEventMessage";
import { PositionInterface } from "_Model/PositionInterface";
2020-09-18 18:16:26 +02:00
export class ProtobufUtils {
public static toPositionMessage(point: PointInterface): PositionMessage {
let direction: Direction;
switch (point.direction) {
2021-06-24 10:09:10 +02:00
case "up":
direction = Direction.UP;
break;
2021-06-24 10:09:10 +02:00
case "down":
direction = Direction.DOWN;
break;
2021-06-24 10:09:10 +02:00
case "left":
direction = Direction.LEFT;
break;
2021-06-24 10:09:10 +02:00
case "right":
direction = Direction.RIGHT;
break;
default:
2021-06-24 10:09:10 +02:00
throw new Error("unexpected direction");
}
const position = new PositionMessage();
position.setX(point.x);
position.setY(point.y);
position.setMoving(point.moving);
position.setDirection(direction);
return position;
}
2020-09-24 17:24:37 +02:00
2020-09-28 18:52:54 +02:00
public static toPointInterface(position: PositionMessage): PointInterface {
let direction: string;
switch (position.getDirection()) {
case Direction.UP:
2021-06-24 10:09:10 +02:00
direction = "up";
2020-09-28 18:52:54 +02:00
break;
case Direction.DOWN:
2021-06-24 10:09:10 +02:00
direction = "down";
2020-09-28 18:52:54 +02:00
break;
case Direction.LEFT:
2021-06-24 10:09:10 +02:00
direction = "left";
2020-09-28 18:52:54 +02:00
break;
case Direction.RIGHT:
2021-06-24 10:09:10 +02:00
direction = "right";
2020-09-28 18:52:54 +02:00
break;
default:
throw new Error("Unexpected direction");
}
// sending to all clients in room except sender
return {
x: position.getX(),
y: position.getY(),
direction,
moving: position.getMoving(),
};
}
public static toPointMessage(point: PositionInterface): PointMessage {
const position = new PointMessage();
position.setX(Math.floor(point.x));
position.setY(Math.floor(point.y));
return position;
}
2020-09-24 17:24:37 +02:00
public static toItemEvent(itemEventMessage: ItemEventMessage): ItemEventMessageInterface {
return {
itemId: itemEventMessage.getItemid(),
event: itemEventMessage.getEvent(),
parameters: JSON.parse(itemEventMessage.getParametersjson()),
state: JSON.parse(itemEventMessage.getStatejson()),
2021-06-24 10:09:10 +02:00
};
2020-09-24 17:24:37 +02:00
}
public static toItemEventProtobuf(itemEvent: ItemEventMessageInterface): ItemEventMessage {
const itemEventMessage = new ItemEventMessage();
itemEventMessage.setItemid(itemEvent.itemId);
itemEventMessage.setEvent(itemEvent.event);
itemEventMessage.setParametersjson(JSON.stringify(itemEvent.parameters));
itemEventMessage.setStatejson(JSON.stringify(itemEvent.state));
return itemEventMessage;
}
2020-10-20 16:39:23 +02:00
public static toCharacterLayerMessages(characterLayers: CharacterLayer[]): CharacterLayerMessage[] {
2021-06-24 10:09:10 +02:00
return characterLayers.map(function (characterLayer): CharacterLayerMessage {
2020-10-20 16:39:23 +02:00
const message = new CharacterLayerMessage();
message.setName(characterLayer.name);
if (characterLayer.url) {
message.setUrl(characterLayer.url);
}
return message;
});
}
public static toCharacterLayerObjects(characterLayers: CharacterLayerMessage[]): CharacterLayer[] {
2021-06-24 10:09:10 +02:00
return characterLayers.map(function (characterLayer): CharacterLayer {
const url = characterLayer.getUrl();
return {
name: characterLayer.getName(),
url: url ? url : undefined,
};
});
}
}