@@ -10,6 +10,10 @@ import { server as WebSocketServer } from "websocket";
1010import GameServer from "./GameServer.js" ;
1111import config from "@/config/gamebridge.json" with { type : "json" } ;
1212import 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
1418export 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 }
0 commit comments