Skip to content

Commit fab9250

Browse files
committed
Fix #421
* Doesn't address `ghost lobbies`, as those are a feature * Removes discord integration * Adds back explicit protocol, host and port in websocket connection > Some browsers (other than chromium and firefox) seem to not support relativ URLs for websockets, as this isn't spec compliant.
1 parent b523714 commit fab9250

5 files changed

Lines changed: 62 additions & 122 deletions

File tree

internal/api/v1.go

Lines changed: 12 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -269,34 +269,6 @@ func (handler *V1Handler) postPlayer(writer http.ResponseWriter, request *http.R
269269
}
270270
}
271271

272-
func GetDiscordInstanceId(request *http.Request) string {
273-
discordInstanceId := request.URL.Query().Get("instance_id")
274-
if discordInstanceId == "" {
275-
cookie, _ := request.Cookie("discord-instance-id")
276-
if cookie != nil {
277-
discordInstanceId = cookie.Value
278-
}
279-
}
280-
return discordInstanceId
281-
}
282-
283-
const discordDomain = "1320396325925163070.discordsays.com"
284-
285-
func SetDiscordCookies(w http.ResponseWriter, request *http.Request) {
286-
discordInstanceId := GetDiscordInstanceId(request)
287-
if discordInstanceId != "" {
288-
http.SetCookie(w, &http.Cookie{
289-
Name: "discord-instance-id",
290-
Value: discordInstanceId,
291-
Domain: discordDomain,
292-
Path: "/",
293-
SameSite: http.SameSiteNoneMode,
294-
Partitioned: true,
295-
Secure: true,
296-
})
297-
}
298-
}
299-
300272
// SetGameplayCookies takes the players usersession and lobby id
301273
// and sets them as a cookie.
302274
func SetGameplayCookies(
@@ -305,42 +277,18 @@ func SetGameplayCookies(
305277
player *game.Player,
306278
lobby *game.Lobby,
307279
) {
308-
discordInstanceId := GetDiscordInstanceId(request)
309-
if discordInstanceId != "" {
310-
http.SetCookie(w, &http.Cookie{
311-
Name: "usersession",
312-
Value: player.GetUserSession().String(),
313-
Domain: discordDomain,
314-
Path: "/",
315-
SameSite: http.SameSiteNoneMode,
316-
Partitioned: true,
317-
Secure: true,
318-
})
319-
http.SetCookie(w, &http.Cookie{
320-
Name: "lobby-id",
321-
Value: lobby.LobbyID,
322-
Domain: discordDomain,
323-
Path: "/",
324-
SameSite: http.SameSiteNoneMode,
325-
Partitioned: true,
326-
Secure: true,
327-
})
328-
} else {
329-
// For the discord case, we need both, as the discord specific cookies
330-
// aren't available during the readirect from ssrCreate to ssrEnter.
331-
http.SetCookie(w, &http.Cookie{
332-
Name: "usersession",
333-
Value: player.GetUserSession().String(),
334-
Path: "/",
335-
SameSite: http.SameSiteStrictMode,
336-
})
337-
http.SetCookie(w, &http.Cookie{
338-
Name: "lobby-id",
339-
Value: lobby.LobbyID,
340-
Path: "/",
341-
SameSite: http.SameSiteStrictMode,
342-
})
343-
}
280+
http.SetCookie(w, &http.Cookie{
281+
Name: "usersession",
282+
Value: player.GetUserSession().String(),
283+
Path: "/",
284+
SameSite: http.SameSiteStrictMode,
285+
})
286+
http.SetCookie(w, &http.Cookie{
287+
Name: "lobby-id",
288+
Value: lobby.LobbyID,
289+
Path: "/",
290+
SameSite: http.SameSiteStrictMode,
291+
})
344292
}
345293

346294
func (handler *V1Handler) patchLobby(writer http.ResponseWriter, request *http.Request) {

internal/frontend/index.go

Lines changed: 1 addition & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -134,19 +134,6 @@ func (handler *SSRHandler) indexPageHandler(writer http.ResponseWriter, request
134134
createPageData.Translation = translation
135135
createPageData.Locale = locale
136136

137-
api.SetDiscordCookies(writer, request)
138-
discordInstanceId := api.GetDiscordInstanceId(request)
139-
if discordInstanceId != "" {
140-
lobby := state.GetLobby(discordInstanceId)
141-
if lobby != nil {
142-
handler.ssrEnterLobbyNoChecks(lobby, writer, request,
143-
func() *game.Player {
144-
return api.GetPlayer(lobby, request)
145-
})
146-
return
147-
}
148-
}
149-
150137
err := pageTemplates.ExecuteTemplate(writer, "index", createPageData)
151138
if err != nil {
152139
log.Printf("Error templating home page: %s\n", err)
@@ -207,7 +194,6 @@ func (handler *SSRHandler) ssrCreateLobby(writer http.ResponseWriter, request *h
207194
}
208195
customWords, customWordsInvalid := api.ParseCustomWords(lowercaser, request.Form.Get("custom_words"))
209196

210-
api.SetDiscordCookies(writer, request)
211197
// Prevent resetting the form, since that would be annoying as hell.
212198
pageData := IndexPageData{
213199
BasePageConfig: handler.basePageConfig,
@@ -277,15 +263,6 @@ func (handler *SSRHandler) ssrCreateLobby(writer http.ResponseWriter, request *h
277263

278264
playerName := api.GetPlayername(request)
279265

280-
var lobbyId string
281-
discordInstanceId := api.GetDiscordInstanceId(request)
282-
if discordInstanceId != "" {
283-
lobbyId = discordInstanceId
284-
// Workaround, since the discord proxy potentially always has the same
285-
// IP address, preventing all players from connecting.
286-
clientsPerIPLimit = maxPlayers
287-
}
288-
289266
lobbySettings := &game.EditableLobbySettings{
290267
Rounds: rounds,
291268
DrawingTime: drawingTime,
@@ -295,7 +272,7 @@ func (handler *SSRHandler) ssrCreateLobby(writer http.ResponseWriter, request *h
295272
Public: publicLobby,
296273
WordsPerTurn: wordsPerTurn,
297274
}
298-
player, lobby, err := game.CreateLobby(lobbyId, playerName, languageKey,
275+
player, lobby, err := game.CreateLobby("", playerName, languageKey,
299276
lobbySettings, customWords, scoreCalculation)
300277
if err != nil {
301278
pageData.Errors = append(pageData.Errors, err.Error())
@@ -314,15 +291,5 @@ func (handler *SSRHandler) ssrCreateLobby(writer http.ResponseWriter, request *h
314291
// We only add the lobby if we could do all necessary pre-steps successfully.
315292
state.AddLobby(lobby)
316293

317-
// Workaround for discord activity case not correctly being able to read
318-
// user session, as the cookie isn't being passed.
319-
if discordInstanceId != "" {
320-
handler.ssrEnterLobbyNoChecks(lobby, writer, request,
321-
func() *game.Player {
322-
return player
323-
})
324-
return
325-
}
326-
327294
http.Redirect(writer, request, handler.basePageConfig.RootPath+"/lobby/"+lobby.LobbyID, http.StatusFound)
328295
}

internal/frontend/index.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
const discordInstanceId = getCookie("discord-instance-id");
2-
const rootPath = `${discordInstanceId ? ".proxy/" : ""}{{.RootPath}}`;
1+
const rootPath = `{{.RootPath}}`;
32

43
Array.from(document.getElementsByClassName("number-input")).forEach(
54
(number_input) => {

internal/frontend/lobby.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,6 @@ func (handler *SSRHandler) ssrEnterLobbyNoChecks(
7676
) {
7777
translation, locale := determineTranslation(request)
7878
requestAddress := api.GetIPAddressFromRequest(request)
79-
api.SetDiscordCookies(writer, request)
8079

8180
var pageData *lobbyPageData
8281
lobby.Synchronized(func() {

internal/frontend/lobby.js

Lines changed: 48 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
1-
import KeyboardManager from "./resources/keyboardManager.js"
1+
import KeyboardManager from "./resources/keyboardManager.js";
22

33
String.prototype.format = function () {
44
return [...arguments].reduce((p, c) => p.replace(/%s/, c), this);
55
};
66

7-
const discordInstanceId = getCookie("discord-instance-id");
8-
const rootPath = `${discordInstanceId ? ".proxy/" : ""}{{.RootPath}}`;
7+
const rootPath = `{{.RootPath}}`;
98
const keyboardManager = new KeyboardManager();
109

1110
let socketIsConnecting = false;
@@ -174,11 +173,14 @@ function showHelpDialog() {
174173
const controlsLabel = document.createElement("b");
175174
controlsLabel.innerText = '{{.Translation.Get "controls"}}';
176175

177-
const undoModifierKeysString = keyboardManager.get("undoModifier").split("+").map(k => `<kbd>${k}</kbd>`).join("+");
176+
const undoModifierKeysString = keyboardManager
177+
.get("undoModifier")
178+
.split("+")
179+
.map((k) => `<kbd>${k}</kbd>`)
180+
.join("+");
178181
const controlsText = document.createElement("div");
179182
controlsText.classList.add("help-controls-grid");
180-
controlsText.innerHTML =
181-
`
183+
controlsText.innerHTML = `
182184
<span>{{.Translation.Get "pencil"}}</span><span dir="ltr"><kbd>${keyboardManager.get("pen")}</kbd></span>
183185
<span>{{.Translation.Get "fill-bucket"}}</span><span dir="ltr"><kbd>${keyboardManager.get("bucket")}</kbd></span>
184186
<span>{{.Translation.Get "eraser"}}</span><span dir="ltr"><kbd>${keyboardManager.get("rubber")}</kbd></span>
@@ -452,21 +454,31 @@ const toolButtonPen = document.getElementById("tool-type-pencil");
452454
const toolButtonRubber = document.getElementById("tool-type-rubber");
453455
const toolButtonFill = document.getElementById("tool-type-fill");
454456

455-
const pencilImage = document.getElementById("use-pencil-button-image");
456-
const eraserImage = document.getElementById("use-eraser-button-image");
457-
const bucketImage = document.getElementById("use-fill-bucket-button-image");
458-
const undoImage = document.getElementById("undo-button-image");
457+
const pencilImage = document.getElementById("use-pencil-button-image");
458+
const eraserImage = document.getElementById("use-eraser-button-image");
459+
const bucketImage = document.getElementById("use-fill-bucket-button-image");
460+
const undoImage = document.getElementById("undo-button-image");
459461
const size8buttonWrapper = document.getElementById("size-8-button-wrapper");
460462
const size16buttonWrapper = document.getElementById("size-16-button-wrapper");
461463
const size24buttonWrapper = document.getElementById("size-24-button-wrapper");
462464
const size32buttonWrapper = document.getElementById("size-32-button-wrapper");
463465

464-
465-
pencilImage.setAttribute("title", `${pencilImage.getAttribute("title")} (${keyboardManager.get("pencil")})`);
466-
eraserImage.setAttribute("title", `${eraserImage.getAttribute("title")} (${keyboardManager.get("rubber")})`);
467-
bucketImage.setAttribute("title", `${bucketImage.getAttribute("title")} (${keyboardManager.get("bucket")})`);
468-
undoImage.setAttribute("title", `${undoImage.getAttribute("title")} (${keyboardManager.get("undoModifier")}+${keyboardManager.get("undo")})`);
469-
466+
pencilImage.setAttribute(
467+
"title",
468+
`${pencilImage.getAttribute("title")} (${keyboardManager.get("pencil")})`,
469+
);
470+
eraserImage.setAttribute(
471+
"title",
472+
`${eraserImage.getAttribute("title")} (${keyboardManager.get("rubber")})`,
473+
);
474+
bucketImage.setAttribute(
475+
"title",
476+
`${bucketImage.getAttribute("title")} (${keyboardManager.get("bucket")})`,
477+
);
478+
undoImage.setAttribute(
479+
"title",
480+
`${undoImage.getAttribute("title")} (${keyboardManager.get("undoModifier")}+${keyboardManager.get("undo")})`,
481+
);
470482

471483
if (sizeButton8.checked) {
472484
setLineWidthNoUpdate(8);
@@ -1894,10 +1906,9 @@ function isAnyDialogVisible() {
18941906
function getModifierKey(event, modifierKey) {
18951907
// Split by "+" and ensure every specified modifier property is true on the event.
18961908
// e.g. "ctrl+shift" checks event.ctrlKey AND event.shiftKey
1897-
return modifierKey.split("+").every(modifier => event[`${modifier}Key`]);
1909+
return modifierKey.split("+").every((modifier) => event[`${modifier}Key`]);
18981910
}
18991911

1900-
19011912
function onKeyDown(event) {
19021913
//Avoid firing actions if the user is in the chat.
19031914
if (document.activeElement instanceof HTMLInputElement) {
@@ -1921,7 +1932,7 @@ function onKeyDown(event) {
19211932
} else if (event.key === keyboardManager.get("bucket")) {
19221933
toolButtonFill.click();
19231934
chooseTool(fillBucket);
1924-
} else if (event.key === keyboardManager.get("rubber")){
1935+
} else if (event.key === keyboardManager.get("rubber")) {
19251936
toolButtonRubber.click();
19261937
chooseTool(rubber);
19271938
} else if (event.key === keyboardManager.get("size8")) {
@@ -1936,7 +1947,10 @@ function onKeyDown(event) {
19361947
} else if (event.key === keyboardManager.get("size32")) {
19371948
sizeButton32.click();
19381949
setLineWidth(32);
1939-
} else if (getModifierKey(event, keyboardManager.get("undoModifier")) && event.key.toLowerCase() === keyboardManager.get("undo")) {
1950+
} else if (
1951+
getModifierKey(event, keyboardManager.get("undoModifier")) &&
1952+
event.key.toLowerCase() === keyboardManager.get("undo")
1953+
) {
19401954
undoAndSendEvent();
19411955
}
19421956
}
@@ -2066,7 +2080,20 @@ const connectToWebsocket = () => {
20662080

20672081
socketIsConnecting = true;
20682082

2069-
socket = new WebSocket(`${rootPath}/v1/lobby/ws`);
2083+
// rootPath is required to always contain a trailing slash OR be empty.
2084+
const socketPath = `${rootPath}/v1/lobby/ws`;
2085+
let host = location.hostname;
2086+
if (location.port && location.port !== "") {
2087+
host += ":" + location.port;
2088+
}
2089+
2090+
if (location.protocol === "https:") {
2091+
console.log("Attempting secure socket connection ...");
2092+
socket = new WebSocket(`wss://${host}${socketPath}`);
2093+
} else {
2094+
console.log("Attempting socket connection ...");
2095+
socket = new WebSocket(`ws://${host}${socketPath}`);
2096+
}
20702097

20712098
socket.onerror = (error) => {
20722099
//Is not connected and we haven't yet said that we are done trying to

0 commit comments

Comments
 (0)