Skip to content

Commit a403246

Browse files
committed
Update discord.js to fix random message cache crashes
update other gateway deps too
1 parent 582de47 commit a403246

File tree

12 files changed

+584
-507
lines changed

12 files changed

+584
-507
lines changed

game-api/gman-nginx.conf

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,14 @@ server {
66
include snippets/ssl-params.conf;
77

88
root /var/www/html/gmanman/;
9+
client_max_body_size 10M;
910

1011
location / {
1112
try_files $uri $uri/ =404;
1213
}
14+
location /gmanman/ {
15+
rewrite ^/gmanman/(.*)$ /$1 break;
16+
}
1317
location /gateway/ {
1418
rewrite ^/(?:[a-z\-]+)/?(.*)$ /$1 break;
1519
proxy_set_header Host $host;

game-api/src/games/garrysmod.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ module.exports = class GarrysmodManager extends GenericDockerManager {
1919
})
2020
.catch(e => {
2121
console.error("update error: ", e);
22+
this.setStatus("stopped");
2223
});
2324
}
2425
async getModsTodo() {}

game-setups/ark/docker-compose.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ services:
2424
volumes:
2525
- ./volume:/ark
2626
- ./Saved:/ark/server/ShooterGame/Saved
27+
- ./overrides/arkmanager:/usr/bin/arkmanager
2728
ports:
2829
- 7776:7776 # wat
2930
- 7776:7776/udp # wat

game-setups/barotrauma/docker-compose.yml

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@ services:
1515
- '27015:27015/udp'
1616
- '27016:27016/udp'
1717
volumes:
18+
- './volume/saves:/home/steam/.local/share/Daedalic Entertainment GmbH/Barotrauma/Multiplayer'
19+
- './volume:/home/steam/barotrauma-dedicated'
1820
- './volume/Submarines:/home/steam/barotrauma-dedicated/Submarines/mounted'
19-
- './volume/Mods:/home/steam/barotrauma-dedicated/Mods'
20-
- './volume/serversettings.xml:/home/steam/barotrauma-dedicated/serversettings.xml'
21-
- './volume/config_player.xml:/home/steam/barotrauma-dedicated/config_player.xml'
22-
- './volume/saves:/home/steam/.local/share/Daedalic Entertainment GmbH/Barotrauma/Multiplayer'

game-setups/project-zomboid/docker-compose.yml

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@ services:
77
restart: unless-stopped
88
environment:
99
SERVER_NAME: "pzserver"
10-
SERVER_PUBLIC_NAME: "Zombies!"
11-
SERVER_PASSWORD: ""
12-
ADMIN_PASSWORD: "admin-pass"
13-
RCON_PASSWORD: "rcon-pass"
10+
SERVER_PUBLIC_NAME: "Nebtown Zombie Apocalypse"
11+
SERVER_PASSWORD: "candyland"
12+
ADMIN_PASSWORD: "candyland"
13+
RCON_PASSWORD: "candyland"
1414
ports:
1515
- "8766:8766/udp"
1616
- "8767:8767/udp"
@@ -19,3 +19,4 @@ services:
1919
- "27015:27015"
2020
volumes:
2121
- ./server-data:/server-data
22+
- ./server-files:/server-files

gateway/package.json

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,20 +8,22 @@
88
"local": "npm start"
99
},
1010
"dependencies": {
11-
"@discordjs/opus": "^0.4.0",
12-
"axios": "^0.21.1",
11+
"@discordjs/opus": "^0.7.0",
12+
"@discordjs/voice": "^0.9.0",
13+
"axios": "^0.26.1",
1314
"cors": "^2.8.5",
14-
"discord.js": "^12.5.0",
15-
"express": "^4.17.1",
16-
"express-prettify": "^0.1.1",
15+
"discord.js": "^13.6.0",
16+
"express": "^4.17.3",
17+
"express-prettify": "^0.1.2",
1718
"jsonwebtoken": "^8.5.1",
18-
"jwks-rsa": "^1.12.0",
19+
"jwks-rsa": "^2.0.5",
1920
"md5": "^2.3.0",
20-
"minimist": "^1.2.5",
21-
"moment": "^2.29.1",
22-
"moment-timezone": "^0.5.32",
21+
"minimist": "^1.2.6",
22+
"moment": "^2.29.3",
23+
"moment-timezone": "^0.5.34",
2324
"otplib": "^12.0.1",
25+
"sodium": "^3.0.2",
2426
"ws": "^7.4.2",
25-
"ytdl-core": "^4.4.5"
27+
"ytdl-core": "^4.11.0"
2628
}
2729
}

gateway/src/cliArgs.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ const argv = require("minimist")(process.argv.slice(2), {
44

55
function debugLog(...args) {
66
if (argv.v) {
7-
console.log(...args);
7+
console.log(new Date().toISOString(), ...args);
88
}
99
}
1010

gateway/src/lib/login.js

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,15 @@ const googleJWKSClient = jwksClient({
66
jwksUri: "https://www.googleapis.com/oauth2/v3/certs",
77
cache: true,
88
});
9-
function getGoogleJWTKey(header, callback) {
10-
googleJWKSClient.getSigningKey(header.kid, function(err, key) {
11-
if (err) {
12-
console.log("failed getting Google JWT Key:", err);
13-
callback(err);
14-
return;
15-
}
9+
async function getGoogleJWTKey(header, callback) {
10+
try {
11+
const key = await googleJWKSClient.getSigningKey(header.kid);
1612
const signingKey = key.publicKey || key.rsaPublicKey;
1713
callback(null, signingKey);
18-
});
14+
} catch (err) {
15+
console.log("failed getting Google JWT Key:", err);
16+
callback(err);
17+
}
1918
}
2019

2120
function verifyGoogleJWT(token) {

gateway/src/routes/bedtime.js

Lines changed: 28 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,12 @@
11
const momentTz = require("moment-timezone");
22
const ytdl = require("ytdl-core");
3+
const {
4+
joinVoiceChannel,
5+
VoiceConnectionStatus,
6+
createAudioPlayer,
7+
createAudioResource,
8+
AudioPlayerStatus,
9+
} = require("@discordjs/voice");
310

411
const { findMember, arrayRandom } = require("./discordUtil");
512

@@ -61,17 +68,28 @@ function processBedtime(memberId, playSound = false) {
6168
return;
6269
}
6370
const member = bedtimes[memberId].member;
64-
member.fetch().then(async member => {
71+
member.fetch().then(async (member) => {
6572
console.log("inside fetch", member, member.voice.channel);
6673
if (member && member.voice.channel) {
67-
const connection = await member.voice.channel.join();
68-
const stream = connection.play(
69-
ytdl(arrayRandom(bedtimeSounds), { filter: "audioonly" }),
70-
{ volume: 0.5 }
71-
);
72-
stream.on("finish", () => {
73-
member.voice.kick("Bedtime!");
74-
connection.disconnect();
74+
const connection = joinVoiceChannel({
75+
channelId: member.voice.channelId,
76+
guildId: member.guild.id,
77+
adapterCreator: member.guild.voiceAdapterCreator,
78+
});
79+
80+
connection.on(VoiceConnectionStatus.Ready, () => {
81+
const player = createAudioPlayer();
82+
const ytStream = ytdl(arrayRandom(bedtimeSounds), {
83+
filter: "audioonly",
84+
});
85+
const resource = createAudioResource(ytStream, { inlineVolume: true });
86+
resource.volume.setVolume(0.5);
87+
connection.subscribe(player);
88+
player.play(resource);
89+
player.on(AudioPlayerStatus.Idle, () => {
90+
member.voice.kick("Bedtime!");
91+
connection.destroy();
92+
});
7593
});
7694

7795
bedtimes[memberId].reply(
@@ -93,7 +111,7 @@ function handleCommandBedtime(msg, bedtimeMatch) {
93111
if (targetTime) {
94112
msg.guild.members
95113
.fetch({ query: nickSearch })
96-
.then(guildMembers => {
114+
.then((guildMembers) => {
97115
const target = findMember(guildMembers, nickSearch);
98116
if (target) {
99117
const targetId = target.id;

gateway/src/routes/messages.js

Lines changed: 64 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,13 @@ const axios = require("axios");
66

77
const ytdl = require("ytdl-core");
88
const Discord = require("discord.js");
9-
const client = new Discord.Client();
9+
const {
10+
joinVoiceChannel,
11+
VoiceConnectionStatus,
12+
createAudioPlayer,
13+
createAudioResource,
14+
AudioPlayerStatus,
15+
} = require("@discordjs/voice");
1016

1117
const { debugLog, discordToken, discordChannel } = require("../cliArgs");
1218
const { findMember } = require("./discordUtil");
@@ -17,6 +23,13 @@ const {
1723
handleCommandBedtimeClear,
1824
} = require("./bedtime");
1925

26+
const client = new Discord.Client({
27+
intents: [
28+
Discord.Intents.FLAGS.GUILD_MESSAGES,
29+
Discord.Intents.FLAGS.GUILD_VOICE_STATES,
30+
],
31+
});
32+
2033
/** @type TextChannel */
2134
let mainChannel;
2235
let channels = {};
@@ -55,7 +68,7 @@ async function getChannel(id) {
5568
return channels[id];
5669
}
5770

58-
client.on("message", async (msg) => {
71+
client.on("messageCreate", async (msg) => {
5972
msg = /** @type Message */ msg;
6073
if (msg.author.id === client.user.id) {
6174
return;
@@ -99,13 +112,25 @@ client.on("message", async (msg) => {
99112
const playMatch = msg.content.match(/\bplay \b(http.*youtu.*)\b/i);
100113
if (playMatch) {
101114
const url = playMatch[1];
102-
if (msg.member.voice.channel) {
103-
const connection = await msg.member.voice.channel.join();
104-
const stream = connection.play(ytdl(url, { filter: "audioonly" }), {
105-
volume: 0.5,
115+
if (msg.member.voice.channelId) {
116+
const connection = joinVoiceChannel({
117+
channelId: msg.member.voice.channelId,
118+
guildId: msg.member.guild.id,
119+
adapterCreator: msg.member.guild.voiceAdapterCreator,
106120
});
107-
stream.on("finish", () => {
108-
connection.disconnect();
121+
122+
connection.on(VoiceConnectionStatus.Ready, () => {
123+
const player = createAudioPlayer();
124+
const ytStream = ytdl(url, { filter: "audioonly" });
125+
const resource = createAudioResource(ytStream, {
126+
inlineVolume: true,
127+
});
128+
resource.volume.setVolume(0.5);
129+
connection.subscribe(player);
130+
player.play(resource);
131+
player.on(AudioPlayerStatus.Idle, () => {
132+
connection.destroy();
133+
});
109134
});
110135
} else {
111136
msg.reply(
@@ -215,7 +240,7 @@ async function sendMessage(nickname, message, channelId) {
215240
const channel = channelId
216241
? await getChannel(channelId)
217242
: await getMainChannel();
218-
debugLog(`Discord sending ${nickname}: ${message}`);
243+
debugLog(`Discord sending ${nickname}: `, message);
219244
if (!channel) {
220245
console.warn("Discord: Not connected to channel", channelId);
221246
return;
@@ -344,9 +369,13 @@ async function initPlayerStatusPoller(_knownGameApis) {
344369
if (!gameMessageMeta[id]) {
345370
gameMessageMeta[id] = {};
346371
}
347-
gameMessageMeta[id].message = await mainChannel.messages.fetch(
348-
storedMessages[id]
349-
);
372+
try {
373+
gameMessageMeta[id].message = await mainChannel.messages.fetch(
374+
storedMessages[id]
375+
);
376+
} catch (e) {
377+
console.warn("Discord: startup failed to read message", id, e);
378+
}
350379
})
351380
);
352381
}
@@ -355,18 +384,29 @@ async function initPlayerStatusPoller(_knownGameApis) {
355384
}
356385

357386
setInterval(async () => {
358-
await Promise.all(Object.values(knownGameApis).map(pollGameHealth));
359-
await fs.promises.writeFile(
360-
savedMessagesFilePath,
361-
JSON.stringify(
362-
Object.keys(gameMessageMeta).reduce((carry, id) => {
363-
if (gameMessageMeta[id].message) {
364-
carry[id] = gameMessageMeta[id].message.id;
365-
}
366-
return carry;
367-
}, {})
368-
)
369-
);
387+
try {
388+
await Promise.all(Object.values(knownGameApis).map(pollGameHealth));
389+
} catch (err) {
390+
console.warn("Discord PlayerStatusPoller error: ", err.message);
391+
}
392+
try {
393+
await fs.promises.writeFile(
394+
savedMessagesFilePath,
395+
JSON.stringify(
396+
Object.keys(gameMessageMeta).reduce((carry, id) => {
397+
if (gameMessageMeta[id].message) {
398+
carry[id] = gameMessageMeta[id].message.id;
399+
}
400+
return carry;
401+
}, {})
402+
)
403+
);
404+
} catch (err) {
405+
console.warn(
406+
"Discord failed to write savedMessages error: ",
407+
err.message
408+
);
409+
}
370410
}, 8000);
371411
}
372412

0 commit comments

Comments
 (0)