Compare commits

...

4 commits
0.1.7 ... main

Author SHA1 Message Date
ed492e9045
Use newer docker compose command
Some checks failed
Docker Build / build-and-push (push) Has been cancelled
2025-10-31 23:54:01 +01:00
24f65956ab Local development with webserver and demo files
Some checks failed
Docker Build / build-and-push (push) Has been cancelled
2025-07-10 17:25:29 +02:00
4e6668c2e5 Increased bot version to 0.1.8 2024-12-12 12:39:05 +01:00
696e8f1749 Added truncate for servers with long list of mods (discord max length 1024 chars) and feed parse optimization 2024-12-12 12:37:32 +01:00
11 changed files with 37 additions and 18 deletions

View file

@ -74,7 +74,7 @@ discord.js library to interact with Discord and fetches server stats via the XML
2. Build and start the container: 2. Build and start the container:
```bash ```bash
docker-compose up -d --build docker compose up -d --build
``` ```
3. The bot should now be running and posting server stats to the specified Discord channel. 3. The bot should now be running and posting server stats to the specified Discord channel.

View file

@ -1,8 +1,8 @@
{ {
"application": { "application": {
"serverPassword": "TypeMyServerPasswordHere", "serverPassword": "TypeMyServerPasswordHere",
"serverStatsUrl": "http://1.1.1.1:8080/feed/dedicated-server-stats.xml", "serverStatsUrl": "http://127.0.0.1:8080/feed/dedicated-server-stats.xml",
"serverMapUrl": "http://1.1.1.1:8080/feed/dedicated-server-stats-map.jpg", "serverMapUrl": "http://127.0.0.1:8080/feed/dedicated-server-stats-map.jpg",
"updateIntervalSeconds": 30 "updateIntervalSeconds": 30
}, },
"discord": { "discord": {

View file

@ -1,8 +1,8 @@
{ {
"application": { "application": {
"serverPassword": "TypeMyServerPasswordHere", "serverPassword": "TypeMyServerPasswordHere",
"serverStatsUrl": "http://1.1.1.1:8080/feed/dedicated-server-stats.xml", "serverStatsUrl": "http://127.0.0.1:8080/feed/dedicated-server-stats.xml",
"serverMapUrl": "http://1.1.1.1:8080/feed/dedicated-server-stats-map.jpg", "serverMapUrl": "http://127.0.0.1:8080/feed/dedicated-server-stats-map.jpg",
"updateIntervalSeconds": 30 "updateIntervalSeconds": 30
}, },
"discord": { "discord": {

View file

@ -1,5 +1,3 @@
version: "2"
services: services:
ls25bot: ls25bot:
build: build:
@ -24,4 +22,14 @@ services:
sleep 7200 # Each 2 hours sleep 7200 # Each 2 hours
echo "Restarting ls25bot container at $(date)" echo "Restarting ls25bot container at $(date)"
docker restart ls25bot docker restart ls25bot
done done
# This is used for development purposes only
webserver:
image: nginx:alpine
container_name: ls25bot-webserver
restart: always
volumes:
- ./misc/files:/usr/share/nginx/html
ports:
- "8080:80"

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.5 KiB

View file

@ -1,6 +1,6 @@
{ {
"name": "ls25-discord-bot", "name": "ls25-discord-bot",
"version": "0.1.7", "version": "0.1.8",
"description": "A simple discord bot for farming simulator 25", "description": "A simple discord bot for farming simulator 25",
"main": "source/Main.ts", "main": "source/Main.ts",
"scripts": { "scripts": {

View file

@ -92,6 +92,16 @@ export default class DiscordEmbed {
return true; return true;
} }
/**
* Truncates a string at a given length
* @param text The input text to truncate
* @param maxLength The allowed characters until truncation
* @returns The truncated string
*/
private async truncateText(text: string, maxLength = 1024): Promise<string> {
return text.length > maxLength ? text.slice(0, maxLength - 3) + '...' : text;
}
/** /**
* Send server stats embed in a channel * Send server stats embed in a channel
* @param serverStats * @param serverStats
@ -113,6 +123,8 @@ export default class DiscordEmbed {
embed.setThumbnail(config.application.serverMapUrl); embed.setThumbnail(config.application.serverMapUrl);
let playerListString: string; let playerListString: string;
let playerListTitleString = `${config.translation.discordEmbed.titlePlayerCount} (${serverStats.getPlayerCount()??0}/${serverStats.getMaxPlayerCount()??0}):`;
if(serverStats.getPlayerList().length === 0) { if(serverStats.getPlayerList().length === 0) {
playerListString = config.translation.discordEmbed.noPlayersOnline; playerListString = config.translation.discordEmbed.noPlayersOnline;
} else { } else {
@ -127,7 +139,7 @@ export default class DiscordEmbed {
let serverMods = serverStats.getServerMods(); let serverMods = serverStats.getServerMods();
let serverModsText = "-/-"; let serverModsText = "-/-";
if(serverMods.length > 0) { if(serverMods.length > 0) {
serverModsText = serverMods.map(mod => `${mod.name}`).join(', '); serverModsText = await this.truncateText(serverMods.map(mod => `${mod.name}`).join(', '));
} }
// @ts-ignore // @ts-ignore
@ -138,12 +150,11 @@ export default class DiscordEmbed {
{name: config.translation.discordEmbed.titleServerMap, value: serverStats.getServerMap()}, {name: config.translation.discordEmbed.titleServerMap, value: serverStats.getServerMap()},
{name: config.translation.discordEmbed.titleServerMods, value: serverModsText}, {name: config.translation.discordEmbed.titleServerMods, value: serverModsText},
{ {
name: `${config.translation.discordEmbed.titlePlayerCount} (${serverStats.getPlayerCount()}/${serverStats.getMaxPlayerCount()}):`, name: playerListTitleString,
value: playerListString value: playerListString
}, },
); );
} }
this.appLogger.debug(embed);
return embed; return embed;
} }
} }

View file

@ -161,18 +161,18 @@ export default class ServerStatusFeed {
/** /**
* Returns the server player count * Returns the server player count
* @returns {number} The server player count * @returns {number | null | undefined} The server player count
*/ */
public getPlayerCount(): number { public getPlayerCount(): number | null | undefined {
return <number>this.getServerStats()?.Server.Slots.numUsed; return <number>this.getServerStats()?.Server?.Slots?.numUsed;
} }
/** /**
* Returns the server player count * Returns the server player count
* @returns {number} The server player count * @returns {number | null | undefined} The server player count
*/ */
public getMaxPlayerCount(): number { public getMaxPlayerCount(): number | null | undefined {
return <number>this.getServerStats()?.Server.Slots.capacity; return <number>this.getServerStats()?.Server?.Slots?.capacity;
} }
/** /**