let proto = window.location.protocol === "https:" ? "wss:" : "ws:";
let uri = proto + "//" + window.location.host + "/api";
this.socket = new WebSocket(uri);
- this.socket.onopen = this.onopen.bind(this);
- this.socket.onmessage = this.onmessage.bind(this);
- this.socket.onclose = this.onclose.bind(this);
+ this.socket.onopen = () => this.onopen();
+ this.socket.onmessage = (msg) => this.onmessage(msg);
+ this.socket.onclose = () => this.onclose();
this.state = "Connecting";
}
this.state = "LoginSent";
}
+ logout() {
+ this.send({type: "Logout"});
+ }
+
onmessage(msg) {
- var message = JSON.parse(msg.data);
+ const message = JSON.parse(msg.data);
console.log("<<", message);
switch (message.type) {
case "LoginAuthChallenge":
break;
case "TakeActionSuccess":
this.add_action({username: this.auth.username, action: this.action});
- if (this.action.action === "Leave") {
- this.send({type: "JoinLobby", filter: ""});
- }
delete this.action;
break;
case "TakeActionFailure":
game_element(game) {
console.log("getting game element for ", game);
- var game_element = document.createElement("div");
+ const game_element = document.createElement("div");
game_element.classList.add("game-summary");
- var id = document.createElement("div");
+ const id = document.createElement("div");
id.innerText = "#" + game.id;
id.classList.add("game-id");
game_element.append(id);
- var title = document.createElement("div");
+ const title = document.createElement("div");
title.innerText = game.settings.title;
title.classList.add("game-title");
game_element.append(title);
- var format = document.createElement("div");
+ const format = document.createElement("div");
format.innerText = game.settings.format;
format.classList.add("game-format");
game_element.append(format);
- var settings = document.createElement("ul");
+ const settings = document.createElement("ul");
settings.classList.add("game-settings");
- for (var setting of Object.keys(game.settings)) {
+ for (const setting of Object.keys(game.settings)) {
if (setting !== "id" && setting !== "title" && setting !== "format") {
- var li = document.createElement("li");
+ const li = document.createElement("li");
li.innerText = setting + ": " + game.settings[setting];
settings.append(li);
}
}
new_game(game) {
- var is_at_end = this.game_list_container.scrollTop + this.game_list_container.clientHeight == this.game_list_container.scrollHeight;
+ const is_at_end = this.game_list_container.scrollTop + this.game_list_container.clientHeight == this.game_list_container.scrollHeight;
this.games.push(game);
- var game_element = this.game_element(game);
+ const game_element = this.game_element(game);
this.game_list.append(game_element);
if (is_at_end) {
this.game_list_container.scrollTo({
create_game_list() {
this.container.textContent = "";
+ const game_list_outside = document.createElement("div");
+ game_list_outside.classList.add("game-list-outside");
this.game_list_container = document.createElement("div");
this.game_list_container.classList.add("game-list-container");
this.game_list = document.createElement("div");
this.game_list.classList.add("game-list");
this.game_list_container.append(this.game_list);
- this.container.append(this.game_list_container);
+ game_list_outside.append(this.game_list_container);
+ this.game_list_filter_input = document.createElement("input");
+ game_list_outside.append(this.game_list_filter_input);
+ const game_list_options = document.createElement("button");
+ const game_list_option_menu = document.createElement("div");
+ game_list_option_menu.classList.add("game-list-option-menu");
+ game_list_option_menu.classList.add("hidden");
+ const game_list_option_logout = document.createElement("div");
+ game_list_option_logout.innerText = "Logout";
+ game_list_option_logout.onclick = () => this.logout();
+ game_list_option_menu.append(game_list_option_logout);
+ game_list_options.append(game_list_option_menu);
+ game_list_options.onclick = () => game_list_option_menu.classList.toggle("hidden");
+ game_list_outside.append(game_list_options);
+ this.container.append(game_list_outside);
this.redraw_games();
}
redraw_games() {
this.game_list.textContent = "";
- for (var game of this.games) {
- var game_element = this.game_element(game);
+ for (const game of this.games) {
+ const game_element = this.game_element(game);
this.game_list.append(game_element);
}
this.game_list_container.scrollTo({
- top: this.game_list.clientHeight - this.container.clientHeight,
+ top: this.game_list_container.scrollHeight - this.game_list_container.clientHeight,
behavior: "auto"
});
}
this.chatroom_input.value = "";
};
this.chatroom.append(this.chatroom_input);
- var chatroom_close = document.createElement("button");
+ const chatroom_close = document.createElement("button");
chatroom_close.classList.add("chatroom-close");
chatroom_close.innerText = "✗";
chatroom_close.onclick = () => this.take_action({action: "Leave"});
}
join_element(username) {
- var join_element = document.createElement("div");
+ const join_element = document.createElement("div");
join_element.classList.add("chatroom-join");
- var username_element = document.createElement("div");
+ const username_element = document.createElement("div");
username_element.classList.add("chatroom-username");
username_element.innerText = username;
join_element.append(username_element);
- var text_element = document.createElement("div");
+ const text_element = document.createElement("div");
text_element.classList.add("chatroom-text");
text_element.innerText = "Joined";
join_element.append(text_element);
}
message_element(username, message) {
- var message_element = document.createElement("div");
+ const message_element = document.createElement("div");
message_element.classList.add("chatroom-message");
- var username_element = document.createElement("div");
+ const username_element = document.createElement("div");
username_element.classList.add("chatroom-username");
username_element.innerText = username;
message_element.append(username_element);
- var text_element = document.createElement("div");
+ const text_element = document.createElement("div");
text_element.classList.add("chatroom-text");
text_element.innerText = message;
message_element.append(text_element);
}
leave_element(username) {
- var leave_element = document.createElement("div");
+ const leave_element = document.createElement("div");
leave_element.classList.add("chatroom-leave");
- var username_element = document.createElement("div");
+ const username_element = document.createElement("div");
username_element.classList.add("chatroom-username");
username_element.innerText = username;
leave_element.append(username_element);
- var text_element = document.createElement("div");
+ const text_element = document.createElement("div");
text_element.classList.add("chatroom-text");
text_element.innerText = "Left";
leave_element.append(text_element);
return leave_element;
}
- add_action(user_action) {
+ add_action(user_action, initialising) {
switch (this.game.summary.settings.format) {
case "Chatroom":
- var is_at_end = this.chatroom_chat.scrollTop + this.chatroom_chat.clientHeight == this.chatroom_chat.scrollHeight;
+ const is_at_end = this.chatroom_chat.scrollTop + this.chatroom_chat.clientHeight == this.chatroom_chat.scrollHeight;
switch (user_action.action.action) {
case "Join":
this.game.users.add(user_action.username);
case "Leave":
this.game.users.delete(user_action.username);
this.chatroom_chat.append(this.leave_element(user_action.username));
+ if (!initialising && user_action.username === this.auth.username) {
+ this.send({type: "JoinLobby", filter: ""});
+ }
break;
default:
console.error("Unknown action for chatroom", user_action);
redraw_chatroom() {
this.chatroom_chat.textContent = "";
- for (var user_action of this.game.state.actions) {
- this.add_action(user_action);
+ for (const user_action of this.game.state.actions) {
+ this.add_action(user_action, true);
}
}
}
onclose() {
- console.error("Websocket closed unexpectedly");
+ const reconnect_timeout = 3000;
+ console.error("Websocket closed unexpectedly - attempting reconnect in " + reconnect_timeout + "ms");
this.state = "Disconnected";
+ setTimeout(() => window.location.reload(), reconnect_timeout);
}
}