This repository has been archived by the owner on Mar 12, 2021. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 3
/
connect.js
107 lines (89 loc) · 2.7 KB
/
connect.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
import _ from 'lodash';
import { alert } from 'notie';
import nanoid from 'nanoid';
import delay from 'nanodelay';
import Vue from 'vue';
import User from './user.js';
import Game from './game.js';
import config from 'config/config.js';
import store from 'store';
import loadVoxels from './voxels.js';
import loadVue from './components';
import template from "html-loader!./components/help.html";
import firebase from 'firebase';
const socketEngine = {
userColor: (data) => {
store.user.color = data.data.color;
if (!store.game) {
const elem = document.getElementById("loader-container")
elem.innerHTML = template;
store.game = Game();
loadVue();
};
},
update: (data) => loadVoxels(data.data),
range: (data) => {
loadVoxels(data.data).then(() => {
if (store.firstLoad) return delay(2000).then(() => store.hideMainLoader());
});
},
error: (data) => {
if (data.error.conflict) loadVoxels(data.error.conflict);
if (data.error.message !== 'Space already occupied') {
return alert({
type: 'error',
text: data.error.message,
position: 'bottom',
});
}
},
userLogin: (data) => {
store.emitMessage(`${data.data.name} has joined the game`);
},
userLogout: (data) => {
store.emitMessage(`${data.data.name} has left the game`);
},
flagCaptured: (data) => {
store.emitMessage(`${data.data.name} has captured the flag "${data.data.flag}"`);
},
};
const connectGame = (token) => {
const socket = new WebSocket(`${config.ws}?token=${token}`);
store.ws = socket;
socket.sendWs = (type = 'range', args) => {
const id = nanoid();
const data = {
type,
id,
args,
};
socket.send(JSON.stringify(data));
};
socket.addEventListener('message', (res) => {
const data = JSON.parse(res.data);
const error = _.get(data, 'error.message');
const type = _.get(data, 'meta.type', 'error');
if (error) return socketEngine.error(data);
if (_.get(socketEngine, type)) socketEngine[type](data);
});
socket.addEventListener('close', () => delay(config.timeout)
.then(() => store.user.firebaseUser.getIdToken().then(token => connectGame(token))));
socket.addEventListener('error', (e) => {
alert({
type: 'error',
text: 'Something went wrong',
position: 'bottom',
});
firebase.auth().signOut()
.then(() => delay(5000))
.then(() => {
window.location.href=window.location.href;
});
});
socket.addEventListener('open', () => {
const userPositon = store.user.lastPosition;
const range = config.range;
socket.sendWs('range', { x: userPositon.x, y: userPositon.z, range: range });
});
};
export default connectGame;