Skip to content

Commit 1d43666

Browse files
committed
add back resonite handler
1 parent bfba560 commit 1d43666

File tree

3 files changed

+116
-42
lines changed

3 files changed

+116
-42
lines changed

app/services/gamebridge/GameBridge.ts

Lines changed: 113 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,10 @@ import { server as WebSocketServer } from "websocket";
1010
import GameServer from "./GameServer.js";
1111
import config from "@/config/gamebridge.json" with { type: "json" };
1212
import servers from "@/config/gamebridge.servers.json" with { type: "json" };
13+
import resoniteConfig from "@/config/resonite.json" with { type: "json" };
14+
import pug from "pug";
15+
import path from "path";
16+
import nodeHtmlToImage from "node-html-to-image";
1317

1418
export default class GameBridge extends Service {
1519
name = "GameBridge";
@@ -51,7 +55,7 @@ export default class GameBridge extends Service {
5155

5256
console.log(`Web socket server listening on ${this.webApp.config.port}`);
5357
this.ready = true;
54-
// this.handleResoniteConnection();
58+
this.handleResoniteConnection();
5559
}
5660

5761
async handleConnection(req: WebSocketRequest): Promise<void> {
@@ -108,12 +112,13 @@ export default class GameBridge extends Service {
108112
.then(() => {
109113
const server = (this.servers[id] = new GameServer({
110114
bridge: this,
111-
serverConfig: servers.find(s => s.id === id) as GameServerConfig,
115+
serverConfig: {
116+
name: "#resonite 🇪🇺",
117+
id,
118+
discordToken: resoniteConfig.discordToken,
119+
},
112120
}));
113121
server.discord.on("clientReady", () => {
114-
server.changeIcon(
115-
"https://gitlab.com/metastruct/branding/-/raw/master/icons/seagull_resonite.png?&inline=true"
116-
);
117122
if (server.status.mapThumbnail) server.changeBanner(server.status.mapThumbnail);
118123
});
119124
})
@@ -153,7 +158,9 @@ export default class GameBridge extends Service {
153158

154159
discord.user?.setPresence(presence);
155160

156-
server.status.mapThumbnail = session.thumbnailUrl;
161+
const mapThumbnail = session.thumbnailUrl;
162+
server.changeBanner(mapThumbnail);
163+
server.status.mapThumbnail = mapThumbnail;
157164

158165
server.status.players = session.sessionUsers
159166
.filter(u => u.userID !== resonite.UserID)
@@ -173,42 +180,108 @@ export default class GameBridge extends Service {
173180
async u => (u.avatar = await resonite.GetResoniteUserAvatarURL(u.ip))
174181
);
175182

176-
const embed: Discord.APIEmbed = {
177-
title: session.name,
178-
description: `:busts_in_silhouette: **${count > 0 ? count : "no"} player${
183+
const container = new Discord.ContainerBuilder();
184+
185+
container.setAccentColor(4796260);
186+
187+
const desc =
188+
`### ${session.tags[0] ?? session.name}\n` +
189+
`:busts_in_silhouette: Player${
179190
count > 1 || count == 0 ? "s" : ""
180-
}**\n:repeat: <t:${
191+
}: **${count}**\n` +
192+
`:repeat: Last Update: <t:${
181193
(new Date(session.lastUpdate).getTime() / 1000) | 0
182-
}:R>\n:file_cabinet: <t:${
183-
(new Date(session.sessionBeginTime).getTime() / 1000) | 0
184-
}:R>`,
185-
color: 4796260,
186-
author: {
187-
name: server.config.name,
188-
icon_url: server.discordIcon,
189-
url: `https://go.resonite.com/session/${session.sessionId}`,
190-
},
191-
thumbnail: { url: session.thumbnailUrl },
192-
footer: {
193-
text: "metastruct @ Resonite",
194-
},
195-
};
196-
197-
if (server.status.players.length > 0)
198-
embed.image = {
199-
url: `http://${server.bridge.webApp.config.host}:${
200-
server.bridge.webApp.config.port
201-
}/server-status/${server.config.id}/${Date.now()}`,
202-
};
203-
204-
const messages = await channel.messages.fetch();
205-
const message = messages
206-
.filter((msg: Discord.Message) => msg.author.id == discord.user?.id)
207-
.first();
208-
if (message) {
209-
await message.edit({ embeds: [embed] }).catch();
210-
} else {
211-
channel.send({ embeds: [embed] }).catch();
194+
}:R\n` +
195+
`:file_cabinet: Server up since: <t:${(new Date(session.sessionBeginTime).getTime() / 1000) | 0}:R>`;
196+
197+
container.addSectionComponents(section =>
198+
section
199+
.addTextDisplayComponents(text => text.setContent(desc))
200+
.setThumbnailAccessory(accessory =>
201+
accessory
202+
.setURL("attachment://thumb.png")
203+
.setDescription(session.tags.join())
204+
)
205+
);
206+
207+
if (count > 0) {
208+
container.addSeparatorComponents();
209+
container.addMediaGalleryComponents(gallery =>
210+
gallery.addItems(item => item.setURL("attachment://players.png"))
211+
);
212+
}
213+
214+
container.addActionRowComponents(row =>
215+
row.setComponents(
216+
new Discord.ButtonBuilder()
217+
.setStyle(Discord.ButtonStyle.Link)
218+
.setLabel("Connect")
219+
.setURL(`https://go.resonite.com/session/${session.sessionId}`)
220+
)
221+
);
222+
223+
container.addSectionComponents();
224+
225+
container.addTextDisplayComponents(text =>
226+
text.setContent("-# metastruct @ Resonite")
227+
);
228+
229+
try {
230+
const html = pug.renderFile(
231+
path.join(process.cwd(), "resources/game-server-status/view.pug"),
232+
{
233+
server,
234+
mapThumbnail,
235+
image: true,
236+
}
237+
);
238+
239+
server.playerListImage = (await nodeHtmlToImage({
240+
html,
241+
transparent: true,
242+
selector: "main",
243+
puppeteerArgs: {
244+
args: ["--no-sandbox"],
245+
},
246+
})) as Buffer;
247+
248+
const messages = await channel.messages.fetch();
249+
const message = messages
250+
.filter((msg: Discord.Message) => msg.author.id == discord.user?.id)
251+
.first();
252+
if (message) {
253+
await message
254+
.edit({
255+
components: [container],
256+
files: [
257+
new Discord.AttachmentBuilder(
258+
server.playerListImage
259+
).setName("players.png"),
260+
new Discord.AttachmentBuilder(mapThumbnail).setName(
261+
"thumb.png"
262+
),
263+
],
264+
flags: Discord.MessageFlags.IsComponentsV2,
265+
})
266+
.catch();
267+
} else {
268+
channel
269+
.send({
270+
components: [container],
271+
files: [
272+
new Discord.AttachmentBuilder(
273+
server.playerListImage
274+
).setName("players.png"),
275+
new Discord.AttachmentBuilder(mapThumbnail).setName(
276+
"thumb.png"
277+
),
278+
],
279+
flags: Discord.MessageFlags.IsComponentsV2,
280+
})
281+
.catch();
282+
}
283+
} catch (error) {
284+
console.error("GameBridge:Resonite", error);
212285
}
213286
}
214287
}

app/services/gamebridge/GameServer.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ export type GameServerConfig = {
1414
defaultGamemode?: string;
1515
discordToken: string;
1616
id: number;
17-
ip: string;
17+
ip?: string;
1818
label?: string;
1919
name: string;
2020
ssh?: {

config/resonite.example.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
{
22
"username": "",
33
"userID": "",
4-
"password": ""
4+
"password": "",
5+
"discordToken": ""
56
}

0 commit comments

Comments
 (0)