summaryrefslogtreecommitdiff
path: root/webcards/scripts/client.js
blob: acb3d906c437e17bd4fdca09912b44554ccf9569 (plain)
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
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
const VERSION = "1.0.0";

// Client acts as the message hub for the whole game.
// WebSocket messages come into Client and Client redirects them to the lobby or table based on the state of the game.
// Client also performs the handshake for first starting the connection and messages everyone if the connection errors or closes.
class Client{

    constructor (serveraddr, game)
    {
        this.socket = new SockWorker(serveraddr, VERSION);
        this.socket.addEventListener("error", this.socketError.bind(this));
        this.socket.addEventListener("closed", this.socketClose.bind(this));
        this.socket.addEventListener("handshake", this.handshake.bind(this));
        this.socket.addEventListener("menu", this.menu.bind(this));
        this.socket.addEventListener("game", this.game.bind(this));

        this.lobby = new Lobby(document.getElementsByClassName("lobby")[0], this.socket);

        this.drag = new MultiDrag();
        
        this.table = new Table(document.getElementsByClassName("table")[0], this.drag, this.socket);

        this.chat = new Chat(document.getElementsByClassName("chat")[0], this.socket);
        this.chat.addChannel("global");
        this.chat.switchChannel("global");

        this.game = game;
    }

    // Initialize the connection
    init ()
    {
        this.socket.init();
    }

    // Callbacks for if the socket fails or closes

    socketError() {
        this.lobby.setState("Error", "closed", this.socket.server);
        this.table.handleClose();
    }

    socketClose() {
        this.lobby.setState("Closed", "closed", this.socket.server);
        this.table.handleClose();
    }

    // Callback when negotiating with the server for the first time and we are determining versions
    handshake (m)
    {
        switch (m.type) {
            case "verr":
                this.socket.close();
                alert(`Error connecting to server: version of client (${this.version}) not accepted.`);
                console.error(`Error connecting to server: version of client (${this.version}) not accepted.`);
                console.error(m.data);
                return;
            case "ready":
                this.socket.send("ready", "");
                return;
        }
    }

    // Menu switch, called when in the lobby and a message arrives from the server
    menu (m)
    {
        switch (m.type) {
            case "plist":
                this.lobby.packList(m.data);
                break;
            case "glist":
                this.lobby.gameList(m.data, this.game);
                this.game = null;
                break;
            case "players":
                this.lobby.players(m.data);
                break;
            case "gdel":
                this.lobby.removeGame(m.data);
                break;
            case "gadd":
                this.lobby.addGame(m.data);
                break;
            case "pdel":
                this.lobby.removePlayer(m.data);
                break;
            case "padd":
                this.lobby.addPlayer(m.data);
                break;
            case "pmove":
                this.lobby.movePlayer(m.data);
                break;
        }
    }

    // Game switch, called when in game and a message arrives from the server
    game (m)
    {
        switch (m.type) {
            
        }
    }

    // Callback when a chat event is recieved from the server
    chat (m)
    {
        switch (m.type) {
            case "delchan":
                this.chat.deleteChannel(m.data);
                break;
            case "newchan":
                this.chat.addChannel(m.data);
                break;
            
            case "message":
                this.chat.recieveMessage(m.data.type, m.data.data);
        }
    }

    // Reset the lobby and table, then attempt to reopen the connection to the server.
    reset ()
    {
        this.lobby.reset();
        this.table.reset();

        this.socket.init();
    }
}