Compare commits

..

No commits in common. "main" and "0.1.0" have entirely different histories.
main ... 0.1.0

32 changed files with 889 additions and 4449 deletions

View file

@ -1,44 +0,0 @@
name: Docker Build
on:
push:
branches:
- main
pull_request:
branches:
- main
env:
REGISTRY: ghcr.io
IMAGE_NAME: ${{ github.repository }}
jobs:
build-and-push:
runs-on: ubuntu-latest
permissions:
contents: read
packages: write
steps:
- name: Checkout repository
uses: actions/checkout@v3
- name: Log in to the Container registry
uses: docker/login-action@v3
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@v5
with:
images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }}
- name: Build and push Docker image
uses: docker/build-push-action@v5
with:
context: .
push: true
tags: ${{ steps.meta.outputs.tags }}
labels: ${{ steps.meta.outputs.labels }}

3
.gitignore vendored
View file

@ -3,6 +3,3 @@
.idea
.ddev
config.json
config.prod.json
config.test.json
config.dev.json

View file

@ -1,16 +0,0 @@
FROM node:latest
LABEL name="LS25-Discord-Bot"
LABEL authors="Dennis Heinrich"
# Copy the source files
WORKDIR /app
COPY . /app
RUN npm install pnpm -g
RUN pnpm install
RUN pnpm run build
## Simplyfy the rm commands
RUN rm -rf .ddev/ source/ misc/ .git .gitignore config.example-en.json Dockerfile docker-compose.yml README.md
CMD ["npm", "run", "start-only"]
ENTRYPOINT ["npm", "run", "start-only"]

View file

@ -1,14 +0,0 @@
Copyright 2024 - Dennis Heinrich
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated
documentation files (the “Software”), to deal in the Software without restriction, including without limitation the
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit
persons to whom the Software is furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the
Software.
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

117
README.md
View file

@ -1,98 +1,27 @@
# Farming Simulator 25 - Discord Bot
## Create a Discord bot
This bot periodically updates a Discord channel with stats from a Farming Simulator 25 server.
It posts the server name, password, time, and player count. Written in Node.js, it uses the
discord.js library to interact with Discord and fetches server stats via the XML feed
(accessible through the server's web interface). The update interval is configurable.
1. Open the [Discord Developer Portal](https://discord.com/developers/applications)
2. Click on `New Application`
3. Name your application
4. Click on `Bot` in the left menu
5. Click on `Copy` to copy the bot token
6. Click on `Installation` in the left menu
7. Add the Permission 'Administrator' to the bot guild installation (bottom of the page)
8. Click on `Copy` to copy the URL to install the bot to a guild
9. Your installation link url should look like this: `https://discord.com/oauth2/authorize?client_id=CLIENT_ID`
## Screenshots
## Install the bot
<details>
<summary>Discord embed in english</summary>
![discord_en.png](misc%2Fimages%2Freadme%2Fdiscord_en.png)
</details>
<details>
<summary>Discord embed in german</summary>
![discord_de.png](misc%2Fimages%2Freadme%2Fdiscord_de.png)
</details>
<details>
<summary>Terminal output (NodeJS)</summary>
![bot_terminal.png](misc%2Fimages%2Freadme%2Fbot_terminal.png)
</details>
## Requirements
- **Node.js**: Required if you want to run the bot without Docker.
- **NPM**: Required if you want to run the bot without Docker.
- **Docker (optional)**: Use Docker if you prefer running the bot in a containerized environment.
---
## Installation Guide
### Step 1: Create a Discord Bot
1. Open the [Discord Developer Portal](https://discord.com/developers/applications).
2. Click on `New Application` and give your application a name.
3. Navigate to the `Bot` section in the left menu and click on `Add Bot`.
4. Copy the bot token by clicking `Copy` (you'll need this later).
5. Go to the `OAuth2` > `URL Generator` section in the left menu.
6. Under "Scopes," select `bot`, and under "Bot Permissions," select `Administrator`.
7. Copy the generated URL to invite the bot to your Discord server.
- The URL should look like this:
`https://discord.com/oauth2/authorize?client_id=CLIENT_ID&scope=bot&permissions=8`
---
### Step 2: Configure the Bot
1. Clone the repository to your server
2. Locate the configuration files:
- Use either
- `config.example-de.json` (for German)
- `config.example-en.json` (for English)
- Rename the chosen file to `config.json`.
3. Open `config.json` and fill in the required fields:
- Refer to `SETTINGS.md` for detailed descriptions of each field.
- Fields marked with `(*)` are important to check; other fields can be left empty for default values.
---
## Running the Bot
### Option 1: Run Inside a Docker Container (Recommended)
1. Navigate to the root directory of the cloned repository.
2. Build and start the container:
```bash
docker compose up -d --build
```
3. The bot should now be running and posting server stats to the specified Discord channel.
### Option 2: Run Without Docker (Using Node.js)
1. Navigate to the root directory of the cloned repository.
2. Install dependencies:
```bash
npm install
```
3. Start the bot:
```bash
npm start
```
4. The bot should now be running and posting server stats to the specified Discord channel.
- Note: Closing the terminal will stop the bot. Use a process manager like [PM2](https://pm2.io/) to keep it running.
1. Clone the repository
2. Move the `config.example.json` to `config.json`
1. serverPassword: The password to the server
2. serverStatsUrl: The feed URL to the server stats (from the web interface from the server)
3. serverMapUrl: The feed URL to the server map (from the web interface from the server)
4. guildId: The guild id where the bot should be installed
5. channelId: The channel id where the bot should post the server stats
6. botToken: The bot token from the Discord Developer Portal
3. Add the bot token to the `config.json`
4. Add the prefix to the `config.json`
5. Run `npm install`
6. Run `npm start`

View file

@ -1,36 +0,0 @@
# Settings and configuration
These are the settings that can be configured in the `config.json` file. The file is located in the root directory of the project. All
fields marked with `(*)` are required to be checked, or leave empty for default values.
| **- Key -** | **- Description -** |
|----------------------------------------------|---------------------------------------------------------------------------|
| (*) application.serverPassword | The password to join the server (or leave empty) |
| (*) application.serverStatsUrl | The feed URL to the server stats (from the web interface from the server) |
| (*) application.serverMapUrl | The feed URL to the server map (from the web interface from the server) |
| (*) application.updateIntervalSeconds | The interval in seconds to update the server stats |
| (*) discord.channelId | The channel id where the bot should post the server stats |
| (*) discord.botToken | The bot token from the Discord Developer Portal |
| translation.discordEmbed.title | The title of the Discord embed |
| translation.discordEmbed.descriptionOnline | The description when the server is online |
| translation.discordEmbed.descriptionOffline | The description when the server is offline |
| translation.discordEmbed.descriptionUnknown | The description when the server status is unknown |
| translation.discordEmbed.titleServerName | The title of the server name |
| translation.discordEmbed.titleServerPassword | The title of the server password |
| translation.discordEmbed.titleServerTime | The title of the server time |
| translation.discordEmbed.titlePlayerCount | The title of the player count |
| translation.discordEmbed.noPlayersOnline | The message when no players are online |
| translation.discordEmbed.titleServerMap | The title of the server map |
| translation.discordEmbed.titleServerMods | The title of the server mods |
| translation.common.monthJanuary | The month January in the language of the server |
| translation.common.monthFebruary | The month February in the language of the server |
| translation.common.monthMarch | The month March in the language of the server |
| translation.common.monthApril | The month April in the language of the server |
| translation.common.monthMay | The month May in the language of the server |
| translation.common.monthJune | The month June in the language of the server |
| translation.common.monthJuly | The month July in the language of the server |
| translation.common.monthAugust | The month August in the language of the server |
| translation.common.monthSeptember | The month September in the language of the server |
| translation.common.monthOctober | The month October in the language of the server |
| translation.common.monthNovember | The month November in the language of the server |
| translation.common.monthDecember | The month December in the language of the server |

View file

@ -1,41 +0,0 @@
{
"application": {
"serverPassword": "TypeMyServerPasswordHere",
"serverStatsUrl": "http://127.0.0.1:8080/feed/dedicated-server-stats.xml",
"serverMapUrl": "http://127.0.0.1:8080/feed/dedicated-server-stats-map.jpg",
"updateIntervalSeconds": 30
},
"discord": {
"channelId": "DiscordChannelId_12345",
"botToken": "DiscordSecretBotToken_XYZ"
},
"translation": {
"discordEmbed": {
"title": "LS25 Server Status",
"descriptionOnline": "Der Server ist online",
"descriptionOffline": "Der Server ist offline",
"descriptionUnknown": "Serverdaten werden abgerufen",
"titleServerName": "Server-Name:",
"titleServerMap": "Server-Karte:",
"titleServerMods": "Server-Mods:",
"titleServerPassword": "Server-Passwort:",
"titleServerTime": "Server-Zeit:",
"titlePlayerCount": "Spieler online:",
"noPlayersOnline": "Keine Spieler online"
},
"common": {
"monthJanuary": "Januar",
"monthFebruary": "Februar",
"monthMarch": "März",
"monthApril": "April",
"monthMay": "Mai",
"monthJune": "Juni",
"monthJuly": "Juli",
"monthAugust": "August",
"monthSeptember": "September",
"monthOctober": "Oktober",
"monthNovember": "November",
"monthDecember": "Dezember"
}
}
}

View file

@ -1,11 +1,12 @@
{
"application": {
"serverPassword": "TypeMyServerPasswordHere",
"serverStatsUrl": "http://127.0.0.1:8080/feed/dedicated-server-stats.xml",
"serverMapUrl": "http://127.0.0.1:8080/feed/dedicated-server-stats-map.jpg",
"serverStatsUrl": "http://1.1.1.1:8080/feed/dedicated-server-stats.xml",
"serverMapUrl": "http://1.1.1.1:8080/feed/dedicated-server-stats-map.jpg",
"updateIntervalSeconds": 30
},
"discord": {
"guildId": "DiscordServerId_12345",
"channelId": "DiscordChannelId_12345",
"botToken": "DiscordSecretBotToken_XYZ"
},
@ -16,26 +17,10 @@
"descriptionOffline": "Server is offline",
"descriptionUnknown": "Server status fetching",
"titleServerName": "Server name",
"titleServerMap": "Server map",
"titleServerMods": "Server mods",
"titleServerPassword": "Server password",
"titleServerTime": "Server time",
"titlePlayerCount": "Players online",
"noPlayersOnline": "No players online"
},
"common": {
"monthJanuary": "January",
"monthFebruary": "February",
"monthMarch": "March",
"monthApril": "April",
"monthMay": "May",
"monthJune": "June",
"monthJuly": "July",
"monthAugust": "August",
"monthSeptember": "September",
"monthOctober": "October",
"monthNovember": "November",
"monthDecember": "December"
}
}
}

View file

@ -1,35 +0,0 @@
services:
ls25bot:
build:
context: .
dockerfile: Dockerfile
container_name: ls25bot
restart: always
volumes:
- ./config.json:/app/config.json
restart:
image: docker:cli
restart: unless-stopped
container_name: ls25bot-restart
volumes:
- /var/run/docker.sock:/var/run/docker.sock
entrypoint: [ "/bin/sh","-c" ]
command:
- |
echo "Restarting ls25bot container is running"
while true; do
sleep 7200 # Each 2 hours
echo "Restarting ls25bot container at $(date)"
docker restart ls25bot
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.

Before

Width:  |  Height:  |  Size: 7.5 KiB

View file

@ -1,392 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<Server game="Farming Simulator 25" version="1.2.1.0" name="Server Name" mapName="Riverbend Springs" dayTime="58676855" mapOverviewFilename="data/maps/mapUS/textures/ui/overview.png" mapSize="2048">
<Slots capacity="16" numUsed="2">
<Player isUsed="true" isAdmin="false" uptime="42">Player 1</Player>
<Player isUsed="true" isAdmin="false" uptime="18">Player 2</Player>
<Player isUsed="false"/>
<Player isUsed="false"/>
<Player isUsed="false"/>
<Player isUsed="false"/>
<Player isUsed="false"/>
<Player isUsed="false"/>
<Player isUsed="false"/>
<Player isUsed="false"/>
<Player isUsed="false"/>
<Player isUsed="false"/>
<Player isUsed="false"/>
<Player isUsed="false"/>
<Player isUsed="false"/>
<Player isUsed="false"/>
</Slots>
<Vehicles>
<Vehicle name="Grain Wagon" category="MISC" type="trainTrailer" x="-971.130737" y="50.121727" z="80.606186" fillTypes="UNKNOWN" fillLevels="0.000"/>
<Vehicle name="Sugarbeet Wagon" category="MISC" type="trainTrailer" x="-989.009033" y="50.120846" z="78.294762" fillTypes="UNKNOWN" fillLevels="0.000"/>
<Vehicle name="Woodchips Wagon" category="MISC" type="trainTrailer" x="-1010.926758" y="50.106392" z="74.596596" fillTypes="UNKNOWN" fillLevels="0.000"/>
<Vehicle name="Timber Wagon" category="MISC" type="trainTimberTrailer" x="-1028.782593" y="50.225243" z="70.523880"/>
<Vehicle name="Flatbed Wagon" category="MISC" type="trainTimberTrailer" x="-1046.494263" y="50.120571" z="65.512520"/>
<Vehicle name="Universalschaufel" category="TELELOADERTOOLS" type="shovelLeveler" x="760.988770" y="51.871380" z="80.543571" fillTypes="UNKNOWN UNKNOWN" fillLevels="0.000 0.000"/>
<Vehicle name="Palettengabel" category="TELELOADERTOOLS" type="implementDynamicMountAttacher" x="-237.062439" y="84.713295" z="968.095764"/>
<Vehicle name="Palettengabel" category="TELELOADERTOOLS" type="implementDynamicMountAttacher" x="-690.269226" y="47.685276" z="147.608948"/>
<Vehicle name="Palettengabel" category="TELELOADERTOOLS" type="implementDynamicMountAttacher" x="761.061157" y="51.863247" z="77.164993"/>
<Vehicle name="Ballengabel" category="TELELOADERTOOLS" type="implementDynamicMountAttacher" x="-694.801941" y="47.019566" z="91.162010"/>
<Vehicle name="Ballengabel" category="TELELOADERTOOLS" type="implementDynamicMountAttacher" x="-125.073997" y="49.091980" z="-168.389847"/>
<Vehicle name="Flüssigdünger" category="IBC" type="pallet" x="-205.862976" y="84.000015" z="947.396973" fillTypes="LIQUIDFERTILIZER" fillLevels="500.000"/>
<Vehicle name="Flüssigdünger" category="IBC" type="pallet" x="-206.486053" y="83.987259" z="945.447021" fillTypes="LIQUIDFERTILIZER" fillLevels="800.000"/>
<Vehicle name="Flüssigdünger" category="IBC" type="pallet" x="-207.132965" y="83.999397" z="946.667053" fillTypes="LIQUIDFERTILIZER" fillLevels="800.000"/>
<Vehicle name="Flüssigdünger" category="IBC" type="pallet" x="-208.560638" y="84.000015" z="945.825012" fillTypes="LIQUIDFERTILIZER" fillLevels="2000.000"/>
<Vehicle name="Herbizid" category="IBC" type="pallet" x="-208.065002" y="84.000015" z="947.856018" fillTypes="HERBICIDE" fillLevels="2000.000"/>
<Vehicle name="Herbizid" category="IBC" type="pallet" x="-209.373993" y="84.000008" z="947.052002" fillTypes="HERBICIDE" fillLevels="11.777"/>
<Vehicle name="Herbizid" category="IBC" type="pallet" x="-205.047623" y="83.998566" z="946.285950" fillTypes="HERBICIDE" fillLevels="1475.996"/>
<Vehicle name="Herbizid" category="IBC" type="pallet" x="-106.252449" y="49.049614" z="-172.440796" fillTypes="HERBICIDE" fillLevels="800.000"/>
<Vehicle name="Herbizid" category="IBC" type="pallet" x="-208.320877" y="83.990028" z="944.404968" fillTypes="HERBICIDE" fillLevels="524.004"/>
<Vehicle name="Flüssigdünger" category="IBC" type="pallet" x="-194.134277" y="83.898079" z="952.736328" fillTypes="LIQUIDFERTILIZER" fillLevels="946.969"/>
<Vehicle name="Kalk" category="BIGBAGPALLETS" type="pallet" x="-192.668716" y="85.923225" z="976.920959" fillTypes="LIME" fillLevels="2000.000"/>
<Vehicle name="Kalk" category="BIGBAGPALLETS" type="pallet" x="-190.923141" y="85.377815" z="977.820312" fillTypes="LIME" fillLevels="2000.000"/>
<Vehicle name="Kalk" category="BIGBAGPALLETS" type="pallet" x="-191.846283" y="85.371216" z="977.169128" fillTypes="LIME" fillLevels="2000.000"/>
<Vehicle name="Kalk" category="BIGBAGPALLETS" type="pallet" x="-190.220139" y="85.386665" z="978.911926" fillTypes="LIME" fillLevels="2000.000"/>
<Vehicle name="Kalk" category="BIGBAGPALLETS" type="pallet" x="759.916992" y="51.863045" z="83.748985" fillTypes="LIME" fillLevels="2000.000"/>
<Vehicle name="Kalk" category="BIGBAGS" type="bigBag" x="-211.205994" y="84.000046" z="949.507019" fillTypes="LIME" fillLevels="2000.000"/>
<Vehicle name="Kalk" category="BIGBAGS" type="bigBag" x="-209.341873" y="84.000061" z="948.616028" fillTypes="LIME" fillLevels="2000.000"/>
<Vehicle name="Kalk" category="BIGBAGS" type="bigBag" x="-210.800003" y="84.000053" z="948.799011" fillTypes="LIME" fillLevels="2000.000"/>
<Vehicle name="Kalk" category="BIGBAGS" type="bigBag" x="-210.295990" y="84.000069" z="948.117004" fillTypes="LIME" fillLevels="2000.000"/>
<Vehicle name="Kalk" category="BIGBAGS" type="bigBag" x="-210.182663" y="84.000053" z="949.968994" fillTypes="LIME" fillLevels="2000.000"/>
<Vehicle name="Kalk" category="BIGBAGS" type="bigBag" x="-209.885681" y="84.000053" z="949.191040" fillTypes="LIME" fillLevels="2000.000"/>
<Vehicle name="Kalk" category="BIGBAGS" type="bigBag" x="-210.850006" y="84.000053" z="951.586975" fillTypes="LIME" fillLevels="2000.000"/>
<Vehicle name="Kalk" category="BIGBAGS" type="bigBag" x="-210.283005" y="84.000053" z="950.825989" fillTypes="LIME" fillLevels="2000.000"/>
<Vehicle name="Kalk" category="BIGBAGS" type="bigBag" x="-212.167007" y="84.000053" z="951.426025" fillTypes="LIME" fillLevels="2000.000"/>
<Vehicle name="K105" category="FERTILIZERSPREADERS" type="spreader" x="758.519043" y="51.899227" z="106.285095" fillTypes="LIME" fillLevels="12437.203"/>
<Vehicle name="K105" category="FERTILIZERSPREADERS" type="spreader" x="-268.388977" y="83.982605" z="951.856567" fillTypes="LIME" fillLevels="5041.400"/>
<Vehicle name="K105" category="FERTILIZERSPREADERS" type="spreader" x="417.696808" y="64.092598" z="747.238892" fillTypes="LIME" fillLevels="13137.535"/>
<Vehicle name="Diamant 8" category="CORNHEADERS" type="cutter" x="204.144485" y="82.387985" z="-862.125366"/>
<Vehicle name="VARIO 620" category="CUTTERS" type="cutter" x="-463.975281" y="42.988651" z="54.566219"/>
<Vehicle name="GMD 3123 F" category="MOWERS" type="mower" x="757.665894" y="51.889996" z="102.727875"/>
<Vehicle name="GMD 8730-FF" category="MOWERS" type="mower" x="755.899597" y="51.863472" z="102.264244"/>
<Vehicle name="ZA-TS 3200" category="FERTILIZERSPREADERS" type="spreader" x="236.073654" y="82.004219" z="-877.167603" fillTypes="FERTILIZER" fillLevels="20.797"/>
<Vehicle name="MES 400" category="LEVELER" type="leveler" x="770.543213" y="52.284325" z="142.988998" fillTypes="UNKNOWN" fillLevels="0.000"/>
<Vehicle name="3300" category="WEIGHTS" type="implement" x="-218.726013" y="83.997444" z="939.007019"/>
<Vehicle name="ZA-TS 3200" category="FERTILIZERSPREADERS" type="spreader" x="758.178467" y="51.888840" z="96.217773" fillTypes="FERTILIZER" fillLevels="2472.178"/>
<Vehicle name="MEGA 1200L TANK" category="SPRAYERS" type="fillableImplement" x="-185.055756" y="83.999176" z="971.308533" fillTypes="HERBICIDE" fillLevels="1500.000"/>
<Vehicle name="FreeFlow 25FT" category="CUTTERS" type="cutter" x="357.445892" y="59.217705" z="733.281067"/>
<Vehicle name="K-Force 400" category="SUBSOILERS" type="cultivator" x="384.232025" y="62.436989" z="757.603638"/>
<Vehicle name="Z2-840 H" category="WINDROWERS" type="windrower" x="756.275879" y="51.796539" z="115.398666"/>
<Vehicle name="Smaragd 9/500K" category="CULTIVATORS" type="cultivator" x="233.496338" y="82.009163" z="-860.212769"/>
<Vehicle name="Smaragd 9/500K" category="CULTIVATORS" type="cultivator" x="-251.862915" y="84.565491" z="950.325073"/>
<Vehicle name="W 900" category="WEIGHTS" type="implement" x="187.412018" y="49.488464" z="-208.348999"/>
<Vehicle name="1500" category="WEIGHTS" type="implement" x="191.842041" y="82.503487" z="-861.731995"/>
<Vehicle name="FARO 4010 D" category="LOADERWAGONS" type="forageWagon" x="-191.415039" y="84.083069" z="977.770874" fillTypes="UNKNOWN UNKNOWN" fillLevels="0.000 0.000"/>
<Vehicle name="FARO 4010 D" category="LOADERWAGONS" type="forageWagon" x="756.613953" y="52.008003" z="112.133774" fillTypes="UNKNOWN UNKNOWN" fillLevels="0.000 0.000"/>
<Vehicle name="SF900" category="FORESTRYSTUMPCUTTERS" type="stumpCutter" x="-923.269714" y="70.052986" z="-413.140778"/>
<Vehicle name="EVION 450" category="HARVESTERS" type="combineDrivable" x="-460.419250" y="41.962540" z="51.374596" fillTypes="CANOLA DIESEL DEF" fillLevels="5100.195 385.966 61.999" isAIActive="false"/>
<Vehicle name="TDK 301 RA" category="TRAILERS" type="trailer" x="187.700317" y="82.080879" z="-873.882690" fillTypes="UNKNOWN" fillLevels="0.000"/>
<Vehicle name="TDK 301 RA" category="TRAILERS" type="trailer" x="419.461578" y="64.500145" z="751.909058" fillTypes="UNKNOWN" fillLevels="0.000"/>
<Vehicle name="TDK 301 RA" category="TRAILERS" type="trailer" x="-517.529053" y="42.047150" z="167.806396" fillTypes="UNKNOWN" fillLevels="0.000"/>
<Vehicle name="DDK 2400" category="TRAILERS" type="trailer" x="-463.445679" y="41.965527" z="37.828789" fillTypes="UNKNOWN" fillLevels="0.000"/>
<Vehicle name="ESPRO 6000 RC" category="SEEDERS" type="fertilizingSowingMachine" x="-667.434998" y="47.053734" z="186.036926" fillTypes="SEEDS FERTILIZER" fillLevels="1705.302 1787.253"/>
<Vehicle name="GL 420" category="POTATOPLANTING" type="sowingMachine" x="199.599594" y="81.999931" z="-847.455750" fillTypes="SEEDS" fillLevels="2617.964"/>
<Vehicle name="Evo 290" category="POTATOHARVESTING" type="attachableCombineCutterFruitPreparer" x="135.030014" y="79.953560" z="-945.641846" fillTypes="UNKNOWN" fillLevels="0.000"/>
<Vehicle name="DPW 1800" category="BALELOADERS" type="dynamicMountAttacherTrailer" x="196.229202" y="82.338669" z="-883.670898" fillTypes="UNKNOWN" fillLevels="0.000"/>
<Vehicle name="DPW 1800" category="BALELOADERS" type="dynamicMountAttacherTrailer" x="-249.332535" y="84.012260" z="967.386658" fillTypes="UNKNOWN" fillLevels="0.000"/>
<Vehicle name="N20T" category="CUTTERTRAILERS" type="dynamicMountAttacherTrailer" x="-664.076294" y="47.053188" z="161.465607" fillTypes="" fillLevels=""/>
<Vehicle name="N40BX" category="CUTTERTRAILERS" type="dynamicMountAttacherTrailer" x="358.198456" y="58.615849" z="733.536316" fillTypes="" fillLevels=""/>
<Vehicle name="Siliermittel" category="PALLETSILAGE" type="pallet" x="759.026184" y="51.873234" z="89.536072" fillTypes="SILAGE_ADDITIVE" fillLevels="11.795"/>
<Vehicle name="Bindegarn für Quaderballen" category="PALLETS" type="pallet" x="-254.368011" y="84.001785" z="990.694946" fillTypes="BALE_TWINE" fillLevels="24.000"/>
<Vehicle name="Pappel" category="PALLETS" type="pallet" x="-932.681396" y="71.236343" z="-453.171143" fillTypes="POPLAR" fillLevels="2000.000"/>
<Vehicle name="Eier" category="PALLETS" type="pallet" x="777.390381" y="52.603931" z="76.583733" fillTypes="EGG" fillLevels="1000.000"/>
<Vehicle name="Eier" category="PALLETS" type="pallet" x="777.354980" y="52.078590" z="76.514160" fillTypes="EGG" fillLevels="1000.000"/>
<Vehicle name="Eier" category="PALLETS" type="pallet" x="773.235474" y="52.034748" z="75.641457" fillTypes="EGG" fillLevels="1000.000"/>
<Vehicle name="Eier" category="PALLETS" type="pallet" x="777.647827" y="52.088459" z="77.489037" fillTypes="EGG" fillLevels="1000.000"/>
<Vehicle name="Eier" category="PALLETS" type="pallet" x="777.663391" y="52.613644" z="77.558449" fillTypes="EGG" fillLevels="1000.000"/>
<Vehicle name="Eier" category="PALLETS" type="pallet" x="773.462891" y="52.038174" z="76.590698" fillTypes="EGG" fillLevels="1000.000"/>
<Vehicle name="Eier" category="PALLETS" type="pallet" x="775.335449" y="52.058525" z="75.954857" fillTypes="EGG" fillLevels="1000.000"/>
<Vehicle name="Eier" category="PALLETS" type="pallet" x="775.137756" y="52.584141" z="76.958046" fillTypes="EGG" fillLevels="1000.000"/>
<Vehicle name="Eier" category="PALLETS" type="pallet" x="774.959534" y="52.057175" z="76.871353" fillTypes="EGG" fillLevels="1000.000"/>
<Vehicle name="EFG S50" category="FORKLIFTS" type="teleHandler" x="992.576721" y="43.989136" z="660.256958" fillTypes="ELECTRICCHARGE" fillLevels="79.000" isAIActive="false"/>
<Vehicle name="EFG S50" category="FORKLIFTS" type="teleHandler" x="-948.045105" y="69.965645" z="-409.410889" fillTypes="ELECTRICCHARGE" fillLevels="80.000" isAIActive="false"/>
<Vehicle name="Palette Honig" category="PALLETS" type="pallet" x="536.638123" y="71.136955" z="-978.847168" fillTypes="HONEY" fillLevels="906.880"/>
<Vehicle name="700 Vario" category="TRACTORSM" type="tractor" x="58.334110" y="55.865597" z="-687.340271" controller="SteffenLogen" fillTypes="DIESEL DEF AIR" fillLevels="247.944 26.999 2408.150" isAIActive="false"/>
<Vehicle name="Cargo T740" category="TELELOADERVEHICLES" type="teleHandler" x="-232.851608" y="84.353584" z="968.112305" fillTypes="DIESEL DEF" fillLevels="97.993 16.000" isAIActive="false"/>
<Vehicle name="Cargo T740" category="TELELOADERVEHICLES" type="teleHandler" x="-692.180847" y="47.339668" z="151.438568" fillTypes="DIESEL DEF" fillLevels="136.998 16.000" isAIActive="false"/>
<Vehicle name="700 Vario" category="TRACTORSM" type="tractor" x="342.791046" y="55.572617" z="705.655029" fillTypes="DIESEL DEF AIR" fillLevels="229.939 48.000 3982.922" isAIActive="false"/>
<Vehicle name="UX 5201 Super" category="SPRAYERS" type="sprayer" x="190.356674" y="81.936928" z="-843.570068" fillTypes="LIQUIDFERTILIZER" fillLevels="731.289"/>
<Vehicle name="TRIUS" category="MISC" type="trailer" x="-942.672974" y="69.933426" z="-413.781219" fillTypes="UNKNOWN" fillLevels="0.000"/>
<Vehicle name="TRIUS" category="MISC" type="trailer" x="-720.478027" y="46.981789" z="110.480255" fillTypes="UNKNOWN" fillLevels="0.000"/>
<Vehicle name="GL 860 Compacta" category="POTATOPLANTING" type="sowingMachine" x="-271.019043" y="84.021828" z="955.941345" fillTypes="SEEDS" fillLevels="155.058"/>
<Vehicle name="MEGA 1200L" category="SPRAYERS" type="sprayer" x="-185.925247" y="83.978149" z="973.963623" fillTypes="HERBICIDE" fillLevels="82.790"/>
<Vehicle name="Big Body 750 S" category="TRAILERS" type="trailer" x="-195.231506" y="84.073761" z="982.215820" fillTypes="UNKNOWN" fillLevels="0.000"/>
<Vehicle name="Big Body 750 S" category="TRAILERS" type="trailer" x="758.043518" y="51.987045" z="109.415199" fillTypes="UNKNOWN" fillLevels="0.000"/>
<Vehicle name="Kodiaq" category="CARS" type="car" x="-942.870972" y="69.943642" z="-419.493317" fillTypes="DIESEL" fillLevels="59.000" isAIActive="false"/>
<Vehicle name="Kodiaq" category="CARS" type="car" x="-720.469971" y="46.992149" z="116.195923" fillTypes="DIESEL" fillLevels="54.000" isAIActive="false"/>
<Vehicle name="PL-75" category="FORESTRYPLANTERS" type="treePlanter" x="-934.131104" y="69.990326" z="-452.804596" fillTypes="UNKNOWN" fillLevels="0.000"/>
<Vehicle name="MKS 8" category="BARRELS" type="waterTrailer" x="-705.032776" y="46.929935" z="102.047394" fillTypes="WATER" fillLevels="7743.055"/>
<Vehicle name="FH16 RUL-HKR" category="TRUCKS" type="woodTruck" x="234.059769" y="36.540813" z="462.418671" fillTypes="DIESEL DEF AIR" fillLevels="682.965 58.000 2104.266" isAIActive="false"/>
<Vehicle name="5275 C SL" category="HARVESTERS" type="combineDrivable" x="363.117859" y="59.896736" z="741.435242" fillTypes="UNKNOWN DIESEL DEF" fillLevels="0.000 128.849 73.625" isAIActive="false"/>
<Vehicle name="SERVO T 6000 P" category="PLOWS" type="plow" x="-268.572723" y="84.143150" z="967.085388"/>
<Vehicle name="LandRoller 591A" category="ROLLERS" type="roller" x="416.845093" y="64.637283" z="758.541748"/>
<Vehicle name="K 300-T + SKA 1-Z" category="FORESTRYWINCHES" type="yarderTower" x="-814.009521" y="49.975986" z="85.640182"/>
<Vehicle name="ROTOCARE V 12400" category="WEEDERS" type="weeder" x="758.474548" y="51.871929" z="92.413712"/>
<Vehicle name="EDK 650" category="TRAILERS" type="trailer" x="781.522156" y="52.070648" z="72.521919" fillTypes="" fillLevels=""/>
<Vehicle name="FST 990" category="MISC" type="fuelTrailer" x="379.196991" y="64.901825" z="819.680115" fillTypes="DIESEL" fillLevels="1609.242"/>
<Vehicle name="MF44.9CS-170-CVTRONIC" category="TELELOADERVEHICLES" type="teleHandler" x="764.809082" y="52.010761" z="88.962845" fillTypes="DIESEL DEF" fillLevels="47.302 17.000" isAIActive="false"/>
<Vehicle name="RUH327" category="WOODTRANSPORT" type="trailer" x="-935.379578" y="70.018623" z="-447.135071" fillTypes="" fillLevels=""/>
<Vehicle name="6C RVshift" category="TRACTORSS" type="tractor" x="-705.188904" y="47.007118" z="95.609016" fillTypes="DIESEL DEF AIR" fillLevels="121.997 12.000 2548.144" isAIActive="false"/>
<Vehicle name="XB 190" category="FRONTLOADERS" type="attachableFrontloader" x="-668.447876" y="47.376064" z="176.834259"/>
<Vehicle name="FH Electric" category="TRUCKS" type="tractor" x="348.781952" y="41.593105" z="546.017212" fillTypes="ELECTRICCHARGE UNKNOWN UNKNOWN" fillLevels="332.995 0.000 0.000" isAIActive="false"/>
<Vehicle name="SKS 30/1050" category="TRAILERSSEMI" type="trailer" x="345.182404" y="42.188553" z="549.149475" fillTypes="WOODCHIPS" fillLevels="12686.328"/>
<Vehicle name="SKS 30/1050" category="TRAILERSSEMI" type="trailer" x="-307.416321" y="84.295639" z="958.224854" fillTypes="UNKNOWN" fillLevels="0.000"/>
<Vehicle name="Palettengabel" category="FRONTLOADERTOOLS" type="implementDynamicMountAttacher" x="-669.027344" y="48.478512" z="174.558395"/>
<Vehicle name="Dolly 10 L" category="MISC" type="dolly" x="-302.057526" y="83.882385" z="957.659180"/>
<Vehicle name="Saatgut" category="PALLETS" type="pallet" x="-107.468040" y="49.021782" z="-171.858093" fillTypes="SEEDS" fillLevels="780.000"/>
<Vehicle name="Saatgut" category="PALLETS" type="pallet" x="-113.447838" y="49.037056" z="-172.342102" fillTypes="SEEDS" fillLevels="43.590"/>
<Vehicle name="MF 7S" category="TRACTORSM" type="tractor" x="-469.130402" y="41.905167" z="43.002506" fillTypes="DIESEL DEF AIR" fillLevels="273.993 28.000 2630.636" isAIActive="false"/>
<Vehicle name="Ultima 800" category="SEEDERS" type="sowingMachine" x="417.248047" y="63.875179" z="743.427368" fillTypes="SEEDS" fillLevels="1710.147"/>
<Vehicle name="Poltergabel" category="TELELOADERTOOLS" type="logGrab" x="-275.233582" y="85.133904" z="946.783691"/>
<Vehicle name="550" category="BARRELS" type="waterTrailer" x="339.447113" y="55.234520" z="703.213562" fillTypes="UNKNOWN" fillLevels="0.000"/>
<Vehicle name="Palette Rapsöl" category="PALLETS" type="pallet" x="83.766335" y="79.978432" z="-923.739929" fillTypes="CANOLA_OIL" fillLevels="1000.000"/>
<Vehicle name="Palette Rapsöl" category="PALLETS" type="pallet" x="84.366188" y="79.978439" z="-924.319824" fillTypes="CANOLA_OIL" fillLevels="1000.000"/>
<Vehicle name="Palette Holzbalken" category="PALLETS" type="pallet" x="-198.347656" y="83.935143" z="951.060242" fillTypes="WOODBEAM" fillLevels="1000.000"/>
<Vehicle name="HM 10-500 KF" category="WOODCHIPPERS" type="woodCrusherTrailer" x="-796.659485" y="50.087917" z="90.516869" fillTypes="UNKNOWN" fillLevels="0.000"/>
<Vehicle name="Absolut CVT" category="TRACTORSM" type="tractor" x="-667.909485" y="46.933910" z="178.958572" fillTypes="DIESEL DEF AIR" fillLevels="169.942 43.000 2396.290" isAIActive="false"/>
<Vehicle name="M8 SERIE" category="TRACTORSM" type="tractor" x="188.730301" y="82.029350" z="-861.590637" fillTypes="DIESEL DEF AIR" fillLevels="149.948 22.000 2948.671" isAIActive="false"/>
<Vehicle name="1100" category="WEIGHTS" type="implement" x="214.235672" y="82.040054" z="-851.836304"/>
<Vehicle name="Palette Bretter" category="PALLETS" type="pallet" x="-200.174118" y="83.952919" z="950.152893" fillTypes="BOARDS" fillLevels="1000.000"/>
<Vehicle name="KEILER 2 RK22" category="POTATOHARVESTING" type="attachableCombineCutterFruitPreparer" x="-267.665405" y="83.991890" z="970.236328" fillTypes="UNKNOWN" fillLevels="0.000"/>
<Vehicle name="HR 6040 RCS + BTFR 6030" category="SEEDERS" type="sowingMachine" x="-267.998199" y="83.844788" z="962.390686" fillTypes="UNKNOWN" fillLevels="0.000"/>
<Vehicle name="Palette Bretter" category="PALLETS" type="pallet" x="-201.677094" y="83.944481" z="948.462097" fillTypes="PLANKS" fillLevels="1000.000"/>
<Vehicle name="TF 1512" category="SEEDTANKS" type="fillableImplement" x="-249.001404" y="83.982574" z="954.238647" fillTypes="SEEDS" fillLevels="1097.064"/>
<Vehicle name="FORTERRA HSX" category="TRACTORSS" type="tractor" x="-926.396912" y="70.286125" z="-411.164551" fillTypes="DIESEL DEF AIR" fillLevels="239.997 28.000 1501.860" isAIActive="false"/>
<Vehicle name="Eier" category="PALLETS" type="pallet" x="775.354919" y="52.583443" z="75.985947" fillTypes="EGG" fillLevels="1000.000"/>
<Vehicle name="Palette Honig" category="PALLETS" type="pallet" x="-705.803345" y="47.001793" z="58.047688" fillTypes="HONEY" fillLevels="265.415"/>
<Vehicle name="P8 - 890" category="TEDDERS" type="tedder" x="756.728210" y="51.776264" z="98.848053"/>
<Vehicle name="AgroStar 8.31" category="TRACTORSM" type="tractor" x="765.268311" y="52.214668" z="94.208778" fillTypes="DIESEL AIR" fillLevels="231.976 2442.745" isAIActive="false"/>
<Vehicle name="Palette Holzbalken" category="PALLETS" type="pallet" x="-198.888977" y="83.975357" z="951.783142" fillTypes="WOODBEAM" fillLevels="1000.000"/>
<Vehicle name="Eier" category="PALLETS" type="pallet" x="772.915466" y="51.962883" z="61.307163" fillTypes="EGG" fillLevels="1000.000"/>
<Vehicle name="Eier" category="PALLETS" type="pallet" x="770.969849" y="51.962883" z="60.844006" fillTypes="EGG" fillLevels="1000.000"/>
<Vehicle name="ROTOCARE V 12400" category="WEEDERS" type="weeder" x="-271.498230" y="84.000282" z="961.081726"/>
<Vehicle name="Rexius 1230" category="ROLLERS" type="roller" x="-117.761330" y="49.772636" z="-156.103485"/>
<Vehicle name="Palette Kartoffelchips" category="PALLETS" type="pallet" x="79.129478" y="79.978462" z="-926.559448" fillTypes="POTATOCHIPS" fillLevels="2000.000"/>
<Vehicle name="Optima RS" category="PLANTERS" type="fertilizingSowingMachine" x="-196.960953" y="84.273201" z="958.050598" fillTypes="SEEDS FERTILIZER" fillLevels="32.916 907.153"/>
<Vehicle name="Palette Bretter" category="PALLETS" type="pallet" x="-202.220764" y="83.979263" z="949.280518" fillTypes="PLANKS" fillLevels="1000.000"/>
<Vehicle name="Palette Sonnenblumenöl" category="PALLETS" type="pallet" x="981.150024" y="44.001793" z="663.000000" fillTypes="SUNFLOWER_OIL" fillLevels="1000.000"/>
<Vehicle name="Kartoffelsuppe" category="PALLETS" type="pallet" x="70.849998" y="80.001801" z="-976.750000" fillTypes="SOUPCANSPOTATO" fillLevels="2000.000"/>
<Vehicle name="QUADRANT 5300 FC" category="BALERSSQUARE" type="baler" x="-215.550659" y="84.016617" z="945.218018" fillTypes="STRAW BALE_TWINE" fillLevels="7277.793 18.000"/>
<Vehicle name="700 Vario" category="TRACTORSM" type="tractor" x="-252.657822" y="83.930290" z="946.192810" fillTypes="DIESEL DEF AIR" fillLevels="143.934 34.000 2698.759" isAIActive="false"/>
<Vehicle name="Palette Kartoffelchips" category="PALLETS" type="pallet" x="79.132271" y="79.978462" z="-928.559448" fillTypes="POTATOCHIPS" fillLevels="2000.000"/>
<Vehicle name="Kartoffelsuppe" category="PALLETS" type="pallet" x="68.850006" y="80.001808" z="-976.750000" fillTypes="SOUPCANSPOTATO" fillLevels="2000.000"/>
<Vehicle name="Palette Rapsöl" category="PALLETS" type="pallet" x="983.150024" y="44.001793" z="663.000000" fillTypes="CANOLA_OIL" fillLevels="1000.000"/>
<Vehicle name="Saatgut" category="BIGBAGPALLETS" type="pallet" x="759.236206" y="51.864830" z="86.885429" fillTypes="SEEDS" fillLevels="1000.000"/>
<Vehicle name="Saatgut" category="BIGBAGPALLETS" type="pallet" x="759.353882" y="52.920322" z="86.757286" fillTypes="SEEDS" fillLevels="246.009"/>
<Vehicle name="Eier" category="PALLETS" type="pallet" x="769.024170" y="51.962883" z="60.380848" fillTypes="EGG" fillLevels="1000.000"/>
<Vehicle name="Palette Sonnenblumenöl" category="PALLETS" type="pallet" x="985.150024" y="44.001793" z="663.000000" fillTypes="SUNFLOWER_OIL" fillLevels="1000.000"/>
<Vehicle name="Flüssigdünger" category="IBC" type="pallet" x="-271.140350" y="84.000008" z="947.690369" fillTypes="LIQUIDFERTILIZER" fillLevels="335.995"/>
<Vehicle name="Kartoffelsuppe" category="PALLETS" type="pallet" x="66.850006" y="80.001808" z="-976.750000" fillTypes="SOUPCANSPOTATO" fillLevels="2000.000"/>
<Vehicle name="Befüllbare Palette" category="PALLETS" type="pallet" x="282.466156" y="42.038940" z="539.785034" fillTypes="WOODCHIPS" fillLevels="1000.000"/>
<Vehicle name="Palette Kartoffelchips" category="PALLETS" type="pallet" x="79.135048" y="79.980667" z="-930.559509" fillTypes="POTATOCHIPS" fillLevels="2000.000"/>
<Vehicle name="Kartoffelsuppe" category="PALLETS" type="pallet" x="64.850006" y="80.001808" z="-976.750000" fillTypes="SOUPCANSPOTATO" fillLevels="2000.000"/>
<Vehicle name="Befüllbare Palette" category="PALLETS" type="pallet" x="283.881195" y="42.039711" z="538.371094" fillTypes="WOODCHIPS" fillLevels="1000.000"/>
<Vehicle name="Palette Rapsöl" category="PALLETS" type="pallet" x="987.150024" y="44.001793" z="663.000000" fillTypes="CANOLA_OIL" fillLevels="1000.000"/>
<Vehicle name="KDF 341 S" category="MOWERS" type="mower" x="57.709156" y="56.001034" z="-683.861389"/>
<Vehicle name="Eier" category="PALLETS" type="pallet" x="773.314148" y="51.962879" z="59.632465" fillTypes="EGG" fillLevels="1000.000"/>
<Vehicle name="Befüllbare Palette" category="PALLETS" type="pallet" x="285.295471" y="42.040482" z="536.956970" fillTypes="WOODCHIPS" fillLevels="1000.000"/>
<Vehicle name="Saatgut" category="PALLETS" type="pallet" x="-103.440109" y="48.992226" z="-159.229095" fillTypes="SEEDS" fillLevels="390.000"/>
<Vehicle name="Palette Sonnenblumenöl" category="PALLETS" type="pallet" x="989.150024" y="44.001793" z="663.000000" fillTypes="SUNFLOWER_OIL" fillLevels="1000.000"/>
<Vehicle name="Palette Kartoffelchips" category="PALLETS" type="pallet" x="79.137840" y="79.988884" z="-932.559631" fillTypes="POTATOCHIPS" fillLevels="2000.000"/>
<Vehicle name="Kartoffelsuppe" category="PALLETS" type="pallet" x="62.850010" y="80.001808" z="-976.750000" fillTypes="SOUPCANSPOTATO" fillLevels="2000.000"/>
<Vehicle name="Befüllbare Palette" category="PALLETS" type="pallet" x="286.709625" y="42.041256" z="535.542786" fillTypes="WOODCHIPS" fillLevels="1000.000"/>
<Vehicle name="Eier" category="PALLETS" type="pallet" x="-717.437500" y="47.001793" z="160.103363" fillTypes="EGG" fillLevels="1000.000"/>
<Vehicle name="Eier" category="PALLETS" type="pallet" x="-717.437500" y="47.001797" z="162.103348" fillTypes="EGG" fillLevels="762.917"/>
<Vehicle name="Kartoffelsuppe" category="PALLETS" type="pallet" x="70.850014" y="80.001801" z="-979.250000" fillTypes="SOUPCANSPOTATO" fillLevels="2000.000"/>
<Vehicle name="Befüllbare Palette" category="PALLETS" type="pallet" x="288.123871" y="42.042030" z="534.128601" fillTypes="WOODCHIPS" fillLevels="1000.000"/>
<Vehicle name="Palette Kartoffelchips" category="PALLETS" type="pallet" x="79.140648" y="79.996536" z="-934.559387" fillTypes="POTATOCHIPS" fillLevels="2000.000"/>
<Vehicle name="Palette Rapsöl" category="PALLETS" type="pallet" x="981.150024" y="44.001797" z="661.500000" fillTypes="CANOLA_OIL" fillLevels="1000.000"/>
<Vehicle name="Herbizid" category="IBC" type="pallet" x="212.637787" y="82.000000" z="-870.321167" fillTypes="HERBICIDE" fillLevels="2000.000"/>
<Vehicle name="Herbizid" category="IBC" type="pallet" x="214.410812" y="82.000008" z="-870.849304" fillTypes="HERBICIDE" fillLevels="407.996"/>
<Vehicle name="Befüllbare Palette" category="PALLETS" type="pallet" x="289.538025" y="42.042797" z="532.714355" fillTypes="WOODCHIPS" fillLevels="1000.000"/>
<Vehicle name="Palette Sonnenblumenöl" category="PALLETS" type="pallet" x="983.150024" y="44.001793" z="661.500000" fillTypes="SUNFLOWER_OIL" fillLevels="1000.000"/>
<Vehicle name="Palette Ziegenmilch" category="PALLETS" type="pallet" x="794.353210" y="51.958988" z="54.491245" fillTypes="GOATMILK" fillLevels="400.000"/>
<Vehicle name="Befüllbare Palette" category="PALLETS" type="pallet" x="290.952271" y="42.043571" z="531.300171" fillTypes="WOODCHIPS" fillLevels="1000.000"/>
<Vehicle name="Eier" category="PALLETS" type="pallet" x="771.368591" y="51.963249" z="59.169300" fillTypes="EGG" fillLevels="203.190"/>
<Vehicle name="Palette Kartoffelchips" category="PALLETS" type="pallet" x="81.129471" y="79.978462" z="-926.556702" fillTypes="POTATOCHIPS" fillLevels="2000.000"/>
<Vehicle name="Befüllbare Palette" category="PALLETS" type="pallet" x="292.366547" y="42.044426" z="529.885803" fillTypes="WOODCHIPS" fillLevels="1000.000"/>
<Vehicle name="Palette mit Ziegenkäse" category="PALLETS" type="pallet" x="762.037781" y="51.986229" z="132.339935" fillTypes="GOATCHEESE" fillLevels="1000.000"/>
<Vehicle name="700 Vario" category="TRACTORSM" type="tractor" x="-113.500099" y="48.921379" z="-158.317825" controller="Robbie" fillTypes="DIESEL DEF AIR" fillLevels="450.000 48.000 4000.000" isAIActive="false"/>
<Vehicle name="SERVO T 6000 P" category="PLOWS" type="plow" x="-107.928978" y="48.994789" z="-158.102753"/>
<Vehicle name="1100" category="WEIGHTS" type="implement" x="-99.349998" y="49.032288" z="-158.080139"/>
</Vehicles>
<Mods>
<Mod name="pdlc_macDonPack" author="GIANTS Software" version="1.1.0.0" hash="a910fbe59bd919187cacbfc7b63ec5a6">MacDon Pack</Mod>
</Mods>
<Farmlands>
<Farmland name="1" id="1" owner="6" area="180528" x="-687.160889" z="102.226006"/>
<Farmland name="2" id="2" owner="0" area="167760" x="-913.702454" z="202.690994"/>
<Farmland name="3" id="3" owner="6" area="107760" x="-783.200867" z="251.655685"/>
<Farmland name="4" id="4" owner="6" area="59568" x="-697.605957" z="253.983887"/>
<Farmland name="5" id="5" owner="6" area="102264" x="-629.161438" z="281.216370"/>
<Farmland name="6" id="6" owner="0" area="225696" x="-495.164825" z="253.142487"/>
<Farmland name="7" id="7" owner="6" area="185784" x="-450.340668" z="100.460793"/>
<Farmland name="8" id="8" owner="0" area="197736" x="-554.557251" z="-40.148682"/>
<Farmland name="9" id="9" owner="0" area="119280" x="-392.175049" z="-40.127968"/>
<Farmland name="10" id="10" owner="0" area="106776" x="-390.032135" z="-156.696106"/>
<Farmland name="11" id="11" owner="0" area="206328" x="-427.714661" z="-295.589966"/>
<Farmland name="12" id="12" owner="0" area="117096" x="-435.564880" z="-459.468140"/>
<Farmland name="13" id="13" owner="0" area="105816" x="-558.001160" z="-479.994324"/>
<Farmland name="14" id="14" owner="0" area="48960" x="-583.367676" z="-379.408813"/>
<Farmland name="15" id="15" owner="0" area="143376" x="-581.700378" z="-252.354538"/>
<Farmland name="16" id="16" owner="0" area="170976" x="-719.682739" z="-288.660034"/>
<Farmland name="17" id="17" owner="0" area="81600" x="-843.171753" z="-402.491760"/>
<Farmland name="18" id="18" owner="4" area="111792" x="-943.295837" z="-459.044647"/>
<Farmland name="19" id="19" owner="0" area="237792" x="-932.201233" z="-869.842163"/>
<Farmland name="20" id="20" owner="0" area="233520" x="-808.343262" z="-841.220581"/>
<Farmland name="21" id="21" owner="0" area="175776" x="-857.341064" z="-593.457703"/>
<Farmland name="22" id="22" owner="0" area="203832" x="-644.699524" z="-590.680420"/>
<Farmland name="23" id="23" owner="0" area="166824" x="-675.898315" z="-748.647522"/>
<Farmland name="24" id="24" owner="0" area="574128" x="-506.154175" z="-904.860718"/>
<Farmland name="25" id="25" owner="0" area="214320" x="-444.518463" z="-729.921387"/>
<Farmland name="26" id="26" owner="0" area="142752" x="-365.425354" z="-531.045044"/>
<Farmland name="27" id="27" owner="0" area="119760" x="-300.576355" z="-585.901428"/>
<Farmland name="28" id="28" owner="0" area="72000" x="-168.688660" z="-625.633972"/>
<Farmland name="29" id="29" owner="0" area="52848" x="-159.302460" z="-687.731140"/>
<Farmland name="30" id="30" owner="0" area="126696" x="-113.132599" z="-749.662598"/>
<Farmland name="31" id="31" owner="0" area="238560" x="-141.931183" z="-856.079651"/>
<Farmland name="32" id="32" owner="2" area="133176" x="-84.475220" z="-952.138245"/>
<Farmland name="33" id="33" owner="2" area="367272" x="167.347778" z="-893.992615"/>
<Farmland name="34" id="34" owner="0" area="25224" x="63.359657" z="-747.970520"/>
<Farmland name="35" id="35" owner="0" area="64632" x="160.136276" z="-741.432983"/>
<Farmland name="36" id="36" owner="1" area="118080" x="422.000000" z="-821.000000"/>
<Farmland name="37" id="37" owner="2" area="207360" x="422.000000" z="-934.000000"/>
<Farmland name="38" id="38" owner="1" area="328104" x="635.000000" z="-859.000000"/>
<Farmland name="39" id="39" owner="0" area="327264" x="910.735535" z="-867.448853"/>
<Farmland name="40" id="40" owner="0" area="162480" x="740.536194" z="-644.000305"/>
<Farmland name="41" id="41" owner="0" area="72576" x="612.000000" z="-628.000000"/>
<Farmland name="42" id="42" owner="0" area="179616" x="481.821747" z="-625.162476"/>
<Farmland name="43" id="43" owner="2" area="71016" x="265.915863" z="-627.181152"/>
<Farmland name="44" id="44" owner="0" area="87576" x="136.371887" z="-684.632202"/>
<Farmland name="45" id="45" owner="0" area="203808" x="82.635185" z="-591.193604"/>
<Farmland name="46" id="46" owner="0" area="164712" x="316.338196" z="-531.673462"/>
<Farmland name="47" id="47" owner="0" area="101448" x="322.874603" z="-403.535126"/>
<Farmland name="48" id="48" owner="0" area="124224" x="454.989960" z="-414.518158"/>
<Farmland name="49" id="49" owner="0" area="67944" x="536.395264" z="-479.196411"/>
<Farmland name="50" id="50" owner="0" area="188520" x="634.870911" z="-412.406494"/>
<Farmland name="51" id="51" owner="0" area="202104" x="879.699463" z="-517.842407"/>
<Farmland name="52" id="52" owner="0" area="125112" x="844.739868" z="-380.420685"/>
<Farmland name="53" id="53" owner="0" area="249528" x="941.796387" z="-257.083679"/>
<Farmland name="54" id="54" owner="0" area="154872" x="906.832031" z="-65.346504"/>
<Farmland name="55" id="55" owner="0" area="306024" x="582.822754" z="-224.962357"/>
<Farmland name="56" id="56" owner="0" area="115656" x="360.043365" z="-289.604675"/>
<Farmland name="57" id="57" owner="0" area="83832" x="435.036652" z="-126.435440"/>
<Farmland name="58" id="58" owner="3" area="52176" x="540.928223" z="-104.039558"/>
<Farmland name="59" id="59" owner="0" area="127128" x="637.151794" z="19.810270"/>
<Farmland name="60" id="60" owner="3" area="127224" x="532.877747" z="33.754574"/>
<Farmland name="61" id="61" owner="0" area="214584" x="430.449738" z="209.333969"/>
<Farmland name="62" id="62" owner="0" area="85152" x="553.062561" z="178.526489"/>
<Farmland name="63" id="63" owner="0" area="42144" x="505.537598" z="342.198181"/>
<Farmland name="64" id="64" owner="0" area="157680" x="659.655396" z="271.645966"/>
<Farmland name="65" id="65" owner="3" area="307824" x="819.230286" z="69.357552"/>
<Farmland name="66" id="66" owner="0" area="370368" x="881.886963" z="262.181305"/>
<Farmland name="67" id="67" owner="0" area="44664" x="717.584656" z="407.578186"/>
<Farmland name="68" id="68" owner="0" area="69096" x="560.953430" z="563.435547"/>
<Farmland name="69" id="69" owner="0" area="194064" x="411.850098" z="628.641602"/>
<Farmland name="70" id="70" owner="0" area="83016" x="577.733154" z="677.875427"/>
<Farmland name="71" id="71" owner="0" area="70080" x="675.161621" z="680.793823"/>
<Farmland name="72" id="72" owner="7" area="71088" x="786.002686" z="677.866333"/>
<Farmland name="73" id="73" owner="0" area="91464" x="937.431885" z="782.949097"/>
<Farmland name="74" id="74" owner="0" area="117504" x="815.837402" z="936.251648"/>
<Farmland name="75" id="75" owner="0" area="106704" x="649.019348" z="954.789490"/>
<Farmland name="76" id="76" owner="7" area="508464" x="598.152527" z="798.569885"/>
<Farmland name="77" id="77" owner="0" area="410160" x="227.551193" z="769.198242"/>
<Farmland name="78" id="78" owner="0" area="242616" x="1.865565" z="731.886963"/>
<Farmland name="79" id="79" owner="0" area="135840" x="118.326859" z="566.906372"/>
<Farmland name="80" id="80" owner="0" area="370416" x="24.263056" z="370.753906"/>
<Farmland name="81" id="81" owner="0" area="129840" x="-47.316822" z="180.941589"/>
<Farmland name="82" id="82" owner="1" area="86016" x="205.930252" z="-144.194748"/>
<Farmland name="83" id="83" owner="0" area="121104" x="146.708282" z="-269.483551"/>
<Farmland name="84" id="84" owner="0" area="225552" x="-70.756119" z="-379.190033"/>
<Farmland name="85" id="85" owner="0" area="194712" x="-181.156540" z="268.748810"/>
<Farmland name="86" id="86" owner="0" area="664128" x="-214.723190" z="537.485779"/>
<Farmland name="87" id="87" owner="0" area="266904" x="-197.747055" z="790.536194"/>
<Farmland name="88" id="88" owner="0" area="423528" x="-462.610931" z="789.477905"/>
<Farmland name="89" id="89" owner="5" area="337464" x="-395.426300" z="948.027954"/>
<Farmland name="90" id="90" owner="0" area="218544" x="-820.224915" z="947.860291"/>
<Farmland name="91" id="91" owner="0" area="588576" x="-700.178833" z="706.327087"/>
<Farmland name="92" id="92" owner="0" area="237072" x="-884.060913" z="578.941711"/>
<Farmland name="93" id="93" owner="0" area="480067" x="786.217346" z="-862.750854"/>
</Farmlands>
<Fields>
<Field id="19" x="-924.500000" z="-869.750000" isOwned="false"/>
<Field id="20" x="-808.437500" z="-832.271484" isOwned="false"/>
<Field id="23" x="-679.085938" z="-734.348083" isOwned="false"/>
<Field id="22" x="-678.737305" z="-590.278320" isOwned="false"/>
<Field id="24" x="-419.882202" z="-889.489014" isOwned="false"/>
<Field id="25" x="-452.750000" z="-730.000000" isOwned="false"/>
<Field id="31" x="-200.710114" z="-850.949341" isOwned="false"/>
<Field id="30" x="-71.459412" z="-746.243774" isOwned="false"/>
<Field id="29" x="-106.500000" z="-687.000000" isOwned="false"/>
<Field id="28" x="-165.941422" z="-632.424072" isOwned="false"/>
<Field id="27" x="-251.643692" z="-523.704529" isOwned="false"/>
<Field id="26" x="-308.903503" z="-476.918213" isOwned="false"/>
<Field id="12" x="-422.826477" z="-446.930573" isOwned="false"/>
<Field id="11" x="-440.006134" z="-290.573517" isOwned="false"/>
<Field id="84" x="-66.756210" z="-378.796295" isOwned="false"/>
<Field id="45" x="106.102158" z="-605.182800" isOwned="false"/>
<Field id="44" x="197.026321" z="-686.662903" isOwned="false"/>
<Field id="34" x="63.461937" z="-733.196289" isOwned="false"/>
<Field id="35" x="117.275040" z="-731.324463" isOwned="false"/>
<Field id="43" x="272.906006" z="-625.500000" isOwned="true"/>
<Field id="46" x="318.800903" z="-558.999817" isOwned="false"/>
<Field id="36" x="423.900024" z="-817.275024" isOwned="true"/>
<Field id="37" x="424.125000" z="-916.687500" isOwned="true"/>
<Field id="38" x="637.750000" z="-844.750000" isOwned="true"/>
<Field id="41" x="613.650024" z="-624.587524" isOwned="false"/>
<Field id="50" x="632.565613" z="-488.084351" isOwned="false"/>
<Field id="40" x="710.536072" z="-645.788940" isOwned="false"/>
<Field id="51" x="909.256287" z="-505.635132" isOwned="false"/>
<Field id="2" x="-917.273987" z="183.261292" isOwned="false"/>
<Field id="3" x="-772.997986" z="234.500000" isOwned="true"/>
<Field id="4" x="-697.000000" z="234.500000" isOwned="true"/>
<Field id="5" x="-628.860901" z="211.139114" isOwned="true"/>
<Field id="8" x="-549.823425" z="-20.338507" isOwned="false"/>
<Field id="10" x="-379.324158" z="-154.026367" isOwned="false"/>
<Field id="9" x="-391.939209" z="-11.890892" isOwned="false"/>
<Field id="15" x="-563.343811" z="-213.911987" isOwned="false"/>
<Field id="7" x="-429.020020" z="99.580505" isOwned="true"/>
<Field id="6" x="-465.831329" z="230.273621" isOwned="false"/>
<Field id="83" x="114.987961" z="-266.434998" isOwned="false"/>
<Field id="82" x="192.963440" z="-143.000000" isOwned="true"/>
<Field id="56" x="388.227936" z="-273.264038" isOwned="false"/>
<Field id="57" x="448.806976" z="-129.595200" isOwned="false"/>
<Field id="58" x="531.031738" z="-105.356049" isOwned="true"/>
<Field id="55" x="644.359985" z="-139.364532" isOwned="false"/>
<Field id="60" x="534.640015" z="33.000000" isOwned="true"/>
<Field id="59" x="635.421448" z="25.120499" isOwned="false"/>
<Field id="65" x="849.445496" z="76.520958" isOwned="true"/>
<Field id="62" x="534.639832" z="184.903091" isOwned="false"/>
<Field id="64" x="666.542847" z="289.177155" isOwned="false"/>
<Field id="61" x="440.700775" z="234.819427" isOwned="false"/>
<Field id="81" x="-39.984829" z="181.853943" isOwned="false"/>
<Field id="85" x="-163.209641" z="285.391357" isOwned="false"/>
<Field id="90" x="-812.500000" z="950.039978" isOwned="false"/>
<Field id="91" x="-709.718689" z="700.995789" isOwned="false"/>
<Field id="89" x="-514.377014" z="951.797485" isOwned="true"/>
<Field id="88" x="-412.871033" z="801.601257" isOwned="false"/>
<Field id="86" x="-259.533997" z="561.369507" isOwned="false"/>
<Field id="87" x="-177.900604" z="803.081787" isOwned="false"/>
<Field id="78" x="16.056406" z="702.664124" isOwned="false"/>
<Field id="79" x="118.893562" z="570.743530" isOwned="false"/>
<Field id="77" x="239.069778" z="777.540955" isOwned="false"/>
<Field id="69" x="396.975281" z="637.613403" isOwned="false"/>
<Field id="76" x="739.881775" z="813.611511" isOwned="true"/>
<Field id="70" x="586.825378" z="705.438232" isOwned="false"/>
<Field id="71" x="668.519836" z="701.129578" isOwned="false"/>
<Field id="72" x="758.569336" z="692.212036" isOwned="true"/>
<Field id="68" x="576.092346" z="560.671936" isOwned="false"/>
<Field id="32" x="-35.142231" z="-942.601440" isOwned="true"/>
<Field id="14" x="-611.272827" z="-378.069733" isOwned="false"/>
<Field id="21" x="-810.375488" z="-588.185181" isOwned="false"/>
<Field id="52" x="854.823120" z="-377.560303" isOwned="false"/>
<Field id="53" x="938.655090" z="-230.773575" isOwned="false"/>
<Field id="75" x="645.798584" z="951.250000" isOwned="false"/>
<Field id="13" x="-566.716614" z="-461.777313" isOwned="false"/>
<Field id="16" x="-747.907288" z="-338.541107" isOwned="false"/>
<Field id="49" x="543.078125" z="-505.328125" isOwned="false"/>
<Field id="66" x="771.528442" z="244.920227" isOwned="false"/>
</Fields>
</Server>

File diff suppressed because it is too large Load diff

View file

@ -1,69 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="no"?>
<careerSavegame revision="2" valid="true">
<settings>
<savegameName>Server Name</savegameName>
<creationDate>2024-11-12</creationDate>
<mapId>MapUS</mapId>
<mapTitle>Riverbend Springs</mapTitle>
<saveDateFormatted>18.11.2024</saveDateFormatted>
<saveDate>2024-11-18</saveDate>
<initialMoney>1000000</initialMoney>
<initialLoan>0</initialLoan>
<economicDifficulty>NORMAL</economicDifficulty>
<hasInitiallyOwnedFarmlands>false</hasInitiallyOwnedFarmlands>
<loadDefaultFarm>false</loadDefaultFarm>
<startWithGuidedTour>true</startWithGuidedTour>
<trafficEnabled>true</trafficEnabled>
<stopAndGoBraking>true</stopAndGoBraking>
<trailerFillLimit>false</trailerFillLimit>
<automaticMotorStartEnabled>false</automaticMotorStartEnabled>
<growthMode>2</growthMode>
<plannedDaysPerPeriod>1</plannedDaysPerPeriod>
<fruitDestruction>true</fruitDestruction>
<plowingRequiredEnabled>true</plowingRequiredEnabled>
<stonesEnabled>false</stonesEnabled>
<weedsEnabled>true</weedsEnabled>
<limeRequired>true</limeRequired>
<isSnowEnabled>true</isSnowEnabled>
<fuelUsage>2</fuelUsage>
<helperBuyFuel>false</helperBuyFuel>
<helperBuySeeds>false</helperBuySeeds>
<helperBuyFertilizer>false</helperBuyFertilizer>
<helperSlurrySource>1</helperSlurrySource>
<helperManureSource>1</helperManureSource>
<densityMapRevision>4</densityMapRevision>
<terrainTextureRevision>1</terrainTextureRevision>
<terrainLodTextureRevision>2</terrainLodTextureRevision>
<splitShapesRevision>2</splitShapesRevision>
<tipCollisionRevision>2</tipCollisionRevision>
<placementCollisionRevision>2</placementCollisionRevision>
<navigationCollisionRevision>2</navigationCollisionRevision>
<mapDensityMapRevision>1</mapDensityMapRevision>
<mapTerrainTextureRevision>1</mapTerrainTextureRevision>
<mapTerrainLodTextureRevision>1</mapTerrainLodTextureRevision>
<mapSplitShapesRevision>1</mapSplitShapesRevision>
<mapTipCollisionRevision>1</mapTipCollisionRevision>
<mapPlacementCollisionRevision>1</mapPlacementCollisionRevision>
<mapNavigationCollisionRevision>1</mapNavigationCollisionRevision>
<disasterDestructionState>VISUALS_ONLY</disasterDestructionState>
<dirtInterval>4</dirtInterval>
<timeScale>5.000000</timeScale>
<autoSaveInterval>60.000000</autoSaveInterval>
</settings>
<map>
<foundHelpIcons>00000000000000000000</foundHelpIcons>
</map>
<introductionHelp active="false">
<shownElements></shownElements>
<shownHints></shownHints>
</introductionHelp>
<statistics>
<money>233766</money>
<playTime>6849.572754</playTime>
</statistics>
<mapsSplitShapeFileIds count="1">
<id id="0"/>
</mapsSplitShapeFileIds>
<slotSystem slotUsage="1707"/>
<mod modName="pdlc_macDonPack" title="MacDon Pack" version="1.1.0.0" required="false" fileHash="a910fbe59bd919187cacbfc7b63ec5a6"/>
</careerSavegame>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 19 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 166 KiB

839
package-lock.json generated Normal file
View file

@ -0,0 +1,839 @@
{
"name": "ls25discord",
"version": "0.1.0",
"lockfileVersion": 3,
"requires": true,
"packages": {
"": {
"name": "ls25discord",
"version": "0.1.0",
"license": "proprietary",
"dependencies": {
"discord.js": "^14.16.3",
"fast-xml-parser": "^4.5.0",
"winston": "^3.17.0"
},
"devDependencies": {
"@types/node": "^22.9.0",
"json-schema-to-typescript": "^15.0.3",
"typescript": "^5.6.3"
}
},
"node_modules/@apidevtools/json-schema-ref-parser": {
"version": "11.7.2",
"resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-11.7.2.tgz",
"integrity": "sha512-4gY54eEGEstClvEkGnwVkTkrx0sqwemEFG5OSRRn3tD91XH0+Q8XIkYIfo7IwEWPpJZwILb9GUXeShtplRc/eA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@jsdevtools/ono": "^7.1.3",
"@types/json-schema": "^7.0.15",
"js-yaml": "^4.1.0"
},
"engines": {
"node": ">= 16"
},
"funding": {
"url": "https://github.com/sponsors/philsturgeon"
}
},
"node_modules/@colors/colors": {
"version": "1.6.0",
"resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz",
"integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==",
"license": "MIT",
"engines": {
"node": ">=0.1.90"
}
},
"node_modules/@dabh/diagnostics": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz",
"integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==",
"license": "MIT",
"dependencies": {
"colorspace": "1.1.x",
"enabled": "2.0.x",
"kuler": "^2.0.0"
}
},
"node_modules/@discordjs/builders": {
"version": "1.9.0",
"resolved": "https://registry.npmjs.org/@discordjs/builders/-/builders-1.9.0.tgz",
"integrity": "sha512-0zx8DePNVvQibh5ly5kCEei5wtPBIUbSoE9n+91Rlladz4tgtFbJ36PZMxxZrTEOQ7AHMZ/b0crT/0fCy6FTKg==",
"license": "Apache-2.0",
"dependencies": {
"@discordjs/formatters": "^0.5.0",
"@discordjs/util": "^1.1.1",
"@sapphire/shapeshift": "^4.0.0",
"discord-api-types": "0.37.97",
"fast-deep-equal": "^3.1.3",
"ts-mixer": "^6.0.4",
"tslib": "^2.6.3"
},
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/discordjs/discord.js?sponsor"
}
},
"node_modules/@discordjs/builders/node_modules/discord-api-types": {
"version": "0.37.97",
"resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.97.tgz",
"integrity": "sha512-No1BXPcVkyVD4ZVmbNgDKaBoqgeQ+FJpzZ8wqHkfmBnTZig1FcH3iPPersiK1TUIAzgClh2IvOuVUYfcWLQAOA==",
"license": "MIT"
},
"node_modules/@discordjs/collection": {
"version": "1.5.3",
"resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-1.5.3.tgz",
"integrity": "sha512-SVb428OMd3WO1paV3rm6tSjM4wC+Kecaa1EUGX7vc6/fddvw/6lg90z4QtCqm21zvVe92vMMDt9+DkIvjXImQQ==",
"license": "Apache-2.0",
"engines": {
"node": ">=16.11.0"
}
},
"node_modules/@discordjs/formatters": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/@discordjs/formatters/-/formatters-0.5.0.tgz",
"integrity": "sha512-98b3i+Y19RFq1Xke4NkVY46x8KjJQjldHUuEbCqMvp1F5Iq9HgnGpu91jOi/Ufazhty32eRsKnnzS8n4c+L93g==",
"license": "Apache-2.0",
"dependencies": {
"discord-api-types": "0.37.97"
},
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/discordjs/discord.js?sponsor"
}
},
"node_modules/@discordjs/formatters/node_modules/discord-api-types": {
"version": "0.37.97",
"resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.97.tgz",
"integrity": "sha512-No1BXPcVkyVD4ZVmbNgDKaBoqgeQ+FJpzZ8wqHkfmBnTZig1FcH3iPPersiK1TUIAzgClh2IvOuVUYfcWLQAOA==",
"license": "MIT"
},
"node_modules/@discordjs/rest": {
"version": "2.4.0",
"resolved": "https://registry.npmjs.org/@discordjs/rest/-/rest-2.4.0.tgz",
"integrity": "sha512-Xb2irDqNcq+O8F0/k/NaDp7+t091p+acb51iA4bCKfIn+WFWd6HrNvcsSbMMxIR9NjcMZS6NReTKygqiQN+ntw==",
"license": "Apache-2.0",
"dependencies": {
"@discordjs/collection": "^2.1.1",
"@discordjs/util": "^1.1.1",
"@sapphire/async-queue": "^1.5.3",
"@sapphire/snowflake": "^3.5.3",
"@vladfrangu/async_event_emitter": "^2.4.6",
"discord-api-types": "0.37.97",
"magic-bytes.js": "^1.10.0",
"tslib": "^2.6.3",
"undici": "6.19.8"
},
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/discordjs/discord.js?sponsor"
}
},
"node_modules/@discordjs/rest/node_modules/@discordjs/collection": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-2.1.1.tgz",
"integrity": "sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg==",
"license": "Apache-2.0",
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/discordjs/discord.js?sponsor"
}
},
"node_modules/@discordjs/rest/node_modules/discord-api-types": {
"version": "0.37.97",
"resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.97.tgz",
"integrity": "sha512-No1BXPcVkyVD4ZVmbNgDKaBoqgeQ+FJpzZ8wqHkfmBnTZig1FcH3iPPersiK1TUIAzgClh2IvOuVUYfcWLQAOA==",
"license": "MIT"
},
"node_modules/@discordjs/util": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@discordjs/util/-/util-1.1.1.tgz",
"integrity": "sha512-eddz6UnOBEB1oITPinyrB2Pttej49M9FZQY8NxgEvc3tq6ZICZ19m70RsmzRdDHk80O9NoYN/25AqJl8vPVf/g==",
"license": "Apache-2.0",
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/discordjs/discord.js?sponsor"
}
},
"node_modules/@discordjs/ws": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/@discordjs/ws/-/ws-1.1.1.tgz",
"integrity": "sha512-PZ+vLpxGCRtmr2RMkqh8Zp+BenUaJqlS6xhgWKEZcgC/vfHLEzpHtKkB0sl3nZWpwtcKk6YWy+pU3okL2I97FA==",
"license": "Apache-2.0",
"dependencies": {
"@discordjs/collection": "^2.1.0",
"@discordjs/rest": "^2.3.0",
"@discordjs/util": "^1.1.0",
"@sapphire/async-queue": "^1.5.2",
"@types/ws": "^8.5.10",
"@vladfrangu/async_event_emitter": "^2.2.4",
"discord-api-types": "0.37.83",
"tslib": "^2.6.2",
"ws": "^8.16.0"
},
"engines": {
"node": ">=16.11.0"
},
"funding": {
"url": "https://github.com/discordjs/discord.js?sponsor"
}
},
"node_modules/@discordjs/ws/node_modules/@discordjs/collection": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/@discordjs/collection/-/collection-2.1.1.tgz",
"integrity": "sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg==",
"license": "Apache-2.0",
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/discordjs/discord.js?sponsor"
}
},
"node_modules/@discordjs/ws/node_modules/discord-api-types": {
"version": "0.37.83",
"resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.83.tgz",
"integrity": "sha512-urGGYeWtWNYMKnYlZnOnDHm8fVRffQs3U0SpE8RHeiuLKb/u92APS8HoQnPTFbnXmY1vVnXjXO4dOxcAn3J+DA==",
"license": "MIT"
},
"node_modules/@jsdevtools/ono": {
"version": "7.1.3",
"resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz",
"integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==",
"dev": true,
"license": "MIT"
},
"node_modules/@sapphire/async-queue": {
"version": "1.5.5",
"resolved": "https://registry.npmjs.org/@sapphire/async-queue/-/async-queue-1.5.5.tgz",
"integrity": "sha512-cvGzxbba6sav2zZkH8GPf2oGk9yYoD5qrNWdu9fRehifgnFZJMV+nuy2nON2roRO4yQQ+v7MK/Pktl/HgfsUXg==",
"license": "MIT",
"engines": {
"node": ">=v14.0.0",
"npm": ">=7.0.0"
}
},
"node_modules/@sapphire/shapeshift": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/@sapphire/shapeshift/-/shapeshift-4.0.0.tgz",
"integrity": "sha512-d9dUmWVA7MMiKobL3VpLF8P2aeanRTu6ypG2OIaEv/ZHH/SUQ2iHOVyi5wAPjQ+HmnMuL0whK9ez8I/raWbtIg==",
"license": "MIT",
"dependencies": {
"fast-deep-equal": "^3.1.3",
"lodash": "^4.17.21"
},
"engines": {
"node": ">=v16"
}
},
"node_modules/@sapphire/snowflake": {
"version": "3.5.3",
"resolved": "https://registry.npmjs.org/@sapphire/snowflake/-/snowflake-3.5.3.tgz",
"integrity": "sha512-jjmJywLAFoWeBi1W7994zZyiNWPIiqRRNAmSERxyg93xRGzNYvGjlZ0gR6x0F4gPRi2+0O6S71kOZYyr3cxaIQ==",
"license": "MIT",
"engines": {
"node": ">=v14.0.0",
"npm": ">=7.0.0"
}
},
"node_modules/@types/json-schema": {
"version": "7.0.15",
"resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz",
"integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==",
"dev": true,
"license": "MIT"
},
"node_modules/@types/lodash": {
"version": "4.17.13",
"resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.13.tgz",
"integrity": "sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==",
"dev": true,
"license": "MIT"
},
"node_modules/@types/node": {
"version": "22.9.0",
"resolved": "https://registry.npmjs.org/@types/node/-/node-22.9.0.tgz",
"integrity": "sha512-vuyHg81vvWA1Z1ELfvLko2c8f34gyA0zaic0+Rllc5lbCnbSyuvb2Oxpm6TAUAC/2xZN3QGqxBNggD1nNR2AfQ==",
"license": "MIT",
"dependencies": {
"undici-types": "~6.19.8"
}
},
"node_modules/@types/triple-beam": {
"version": "1.3.5",
"resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz",
"integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==",
"license": "MIT"
},
"node_modules/@types/ws": {
"version": "8.5.13",
"resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.13.tgz",
"integrity": "sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==",
"license": "MIT",
"dependencies": {
"@types/node": "*"
}
},
"node_modules/@vladfrangu/async_event_emitter": {
"version": "2.4.6",
"resolved": "https://registry.npmjs.org/@vladfrangu/async_event_emitter/-/async_event_emitter-2.4.6.tgz",
"integrity": "sha512-RaI5qZo6D2CVS6sTHFKg1v5Ohq/+Bo2LZ5gzUEwZ/WkHhwtGTCB/sVLw8ijOkAUxasZ+WshN/Rzj4ywsABJ5ZA==",
"license": "MIT",
"engines": {
"node": ">=v14.0.0",
"npm": ">=7.0.0"
}
},
"node_modules/argparse": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz",
"integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==",
"dev": true,
"license": "Python-2.0"
},
"node_modules/async": {
"version": "3.2.6",
"resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz",
"integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==",
"license": "MIT"
},
"node_modules/color": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz",
"integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==",
"license": "MIT",
"dependencies": {
"color-convert": "^1.9.3",
"color-string": "^1.6.0"
}
},
"node_modules/color-convert": {
"version": "1.9.3",
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
"integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
"license": "MIT",
"dependencies": {
"color-name": "1.1.3"
}
},
"node_modules/color-name": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
"integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==",
"license": "MIT"
},
"node_modules/color-string": {
"version": "1.9.1",
"resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz",
"integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==",
"license": "MIT",
"dependencies": {
"color-name": "^1.0.0",
"simple-swizzle": "^0.2.2"
}
},
"node_modules/colorspace": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz",
"integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==",
"license": "MIT",
"dependencies": {
"color": "^3.1.3",
"text-hex": "1.0.x"
}
},
"node_modules/discord-api-types": {
"version": "0.37.100",
"resolved": "https://registry.npmjs.org/discord-api-types/-/discord-api-types-0.37.100.tgz",
"integrity": "sha512-a8zvUI0GYYwDtScfRd/TtaNBDTXwP5DiDVX7K5OmE+DRT57gBqKnwtOC5Ol8z0mRW8KQfETIgiB8U0YZ9NXiCA==",
"license": "MIT"
},
"node_modules/discord.js": {
"version": "14.16.3",
"resolved": "https://registry.npmjs.org/discord.js/-/discord.js-14.16.3.tgz",
"integrity": "sha512-EPCWE9OkA9DnFFNrO7Kl1WHHDYFXu3CNVFJg63bfU7hVtjZGyhShwZtSBImINQRWxWP2tgo2XI+QhdXx28r0aA==",
"license": "Apache-2.0",
"dependencies": {
"@discordjs/builders": "^1.9.0",
"@discordjs/collection": "1.5.3",
"@discordjs/formatters": "^0.5.0",
"@discordjs/rest": "^2.4.0",
"@discordjs/util": "^1.1.1",
"@discordjs/ws": "1.1.1",
"@sapphire/snowflake": "3.5.3",
"discord-api-types": "0.37.100",
"fast-deep-equal": "3.1.3",
"lodash.snakecase": "4.1.1",
"tslib": "^2.6.3",
"undici": "6.19.8"
},
"engines": {
"node": ">=18"
},
"funding": {
"url": "https://github.com/discordjs/discord.js?sponsor"
}
},
"node_modules/enabled": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz",
"integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==",
"license": "MIT"
},
"node_modules/fast-deep-equal": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz",
"integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==",
"license": "MIT"
},
"node_modules/fast-xml-parser": {
"version": "4.5.0",
"resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.0.tgz",
"integrity": "sha512-/PlTQCI96+fZMAOLMZK4CWG1ItCbfZ/0jx7UIJFChPNrx7tcEgerUgWbeieCM9MfHInUDyK8DWYZ+YrywDJuTg==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/NaturalIntelligence"
},
{
"type": "paypal",
"url": "https://paypal.me/naturalintelligence"
}
],
"license": "MIT",
"dependencies": {
"strnum": "^1.0.5"
},
"bin": {
"fxparser": "src/cli/cli.js"
}
},
"node_modules/fdir": {
"version": "6.4.2",
"resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.2.tgz",
"integrity": "sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==",
"dev": true,
"license": "MIT",
"peerDependencies": {
"picomatch": "^3 || ^4"
},
"peerDependenciesMeta": {
"picomatch": {
"optional": true
}
}
},
"node_modules/fecha": {
"version": "4.2.3",
"resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz",
"integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==",
"license": "MIT"
},
"node_modules/fn.name": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz",
"integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==",
"license": "MIT"
},
"node_modules/inherits": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
"integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
"license": "ISC"
},
"node_modules/is-arrayish": {
"version": "0.3.2",
"resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
"integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
"license": "MIT"
},
"node_modules/is-extglob": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
"integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/is-glob": {
"version": "4.0.3",
"resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz",
"integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==",
"dev": true,
"license": "MIT",
"dependencies": {
"is-extglob": "^2.1.1"
},
"engines": {
"node": ">=0.10.0"
}
},
"node_modules/is-stream": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz",
"integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==",
"license": "MIT",
"engines": {
"node": ">=8"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/js-yaml": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz",
"integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==",
"dev": true,
"license": "MIT",
"dependencies": {
"argparse": "^2.0.1"
},
"bin": {
"js-yaml": "bin/js-yaml.js"
}
},
"node_modules/json-schema-to-typescript": {
"version": "15.0.3",
"resolved": "https://registry.npmjs.org/json-schema-to-typescript/-/json-schema-to-typescript-15.0.3.tgz",
"integrity": "sha512-iOKdzTUWEVM4nlxpFudFsWyUiu/Jakkga4OZPEt7CGoSEsAsUgdOZqR6pcgx2STBek9Gm4hcarJpXSzIvZ/hKA==",
"dev": true,
"license": "MIT",
"dependencies": {
"@apidevtools/json-schema-ref-parser": "^11.5.5",
"@types/json-schema": "^7.0.15",
"@types/lodash": "^4.17.7",
"is-glob": "^4.0.3",
"js-yaml": "^4.1.0",
"lodash": "^4.17.21",
"minimist": "^1.2.8",
"prettier": "^3.2.5",
"tinyglobby": "^0.2.9"
},
"bin": {
"json2ts": "dist/src/cli.js"
},
"engines": {
"node": ">=16.0.0"
}
},
"node_modules/kuler": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz",
"integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==",
"license": "MIT"
},
"node_modules/lodash": {
"version": "4.17.21",
"resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz",
"integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==",
"license": "MIT"
},
"node_modules/lodash.snakecase": {
"version": "4.1.1",
"resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz",
"integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==",
"license": "MIT"
},
"node_modules/logform": {
"version": "2.7.0",
"resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz",
"integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==",
"license": "MIT",
"dependencies": {
"@colors/colors": "1.6.0",
"@types/triple-beam": "^1.3.2",
"fecha": "^4.2.0",
"ms": "^2.1.1",
"safe-stable-stringify": "^2.3.1",
"triple-beam": "^1.3.0"
},
"engines": {
"node": ">= 12.0.0"
}
},
"node_modules/magic-bytes.js": {
"version": "1.10.0",
"resolved": "https://registry.npmjs.org/magic-bytes.js/-/magic-bytes.js-1.10.0.tgz",
"integrity": "sha512-/k20Lg2q8LE5xiaaSkMXk4sfvI+9EGEykFS4b0CHHGWqDYU0bGUFSwchNOMA56D7TCs9GwVTkqe9als1/ns8UQ==",
"license": "MIT"
},
"node_modules/minimist": {
"version": "1.2.8",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
"dev": true,
"license": "MIT",
"funding": {
"url": "https://github.com/sponsors/ljharb"
}
},
"node_modules/ms": {
"version": "2.1.3",
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz",
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
"license": "MIT"
},
"node_modules/one-time": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz",
"integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==",
"license": "MIT",
"dependencies": {
"fn.name": "1.x.x"
}
},
"node_modules/picomatch": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz",
"integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==",
"dev": true,
"license": "MIT",
"engines": {
"node": ">=12"
},
"funding": {
"url": "https://github.com/sponsors/jonschlinkert"
}
},
"node_modules/prettier": {
"version": "3.3.3",
"resolved": "https://registry.npmjs.org/prettier/-/prettier-3.3.3.tgz",
"integrity": "sha512-i2tDNA0O5IrMO757lfrdQZCc2jPNDVntV0m/+4whiDfWaTKfMNgR7Qz0NAeGz/nRqF4m5/6CLzbP4/liHt12Ew==",
"dev": true,
"license": "MIT",
"bin": {
"prettier": "bin/prettier.cjs"
},
"engines": {
"node": ">=14"
},
"funding": {
"url": "https://github.com/prettier/prettier?sponsor=1"
}
},
"node_modules/readable-stream": {
"version": "3.6.2",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
"integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
"license": "MIT",
"dependencies": {
"inherits": "^2.0.3",
"string_decoder": "^1.1.1",
"util-deprecate": "^1.0.1"
},
"engines": {
"node": ">= 6"
}
},
"node_modules/safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
"integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
],
"license": "MIT"
},
"node_modules/safe-stable-stringify": {
"version": "2.5.0",
"resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz",
"integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==",
"license": "MIT",
"engines": {
"node": ">=10"
}
},
"node_modules/simple-swizzle": {
"version": "0.2.2",
"resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
"integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==",
"license": "MIT",
"dependencies": {
"is-arrayish": "^0.3.1"
}
},
"node_modules/stack-trace": {
"version": "0.0.10",
"resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz",
"integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==",
"license": "MIT",
"engines": {
"node": "*"
}
},
"node_modules/string_decoder": {
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
"license": "MIT",
"dependencies": {
"safe-buffer": "~5.2.0"
}
},
"node_modules/strnum": {
"version": "1.0.5",
"resolved": "https://registry.npmjs.org/strnum/-/strnum-1.0.5.tgz",
"integrity": "sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==",
"license": "MIT"
},
"node_modules/text-hex": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz",
"integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==",
"license": "MIT"
},
"node_modules/tinyglobby": {
"version": "0.2.10",
"resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.10.tgz",
"integrity": "sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==",
"dev": true,
"license": "MIT",
"dependencies": {
"fdir": "^6.4.2",
"picomatch": "^4.0.2"
},
"engines": {
"node": ">=12.0.0"
}
},
"node_modules/triple-beam": {
"version": "1.4.1",
"resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz",
"integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==",
"license": "MIT",
"engines": {
"node": ">= 14.0.0"
}
},
"node_modules/ts-mixer": {
"version": "6.0.4",
"resolved": "https://registry.npmjs.org/ts-mixer/-/ts-mixer-6.0.4.tgz",
"integrity": "sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==",
"license": "MIT"
},
"node_modules/tslib": {
"version": "2.8.1",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
"integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==",
"license": "0BSD"
},
"node_modules/typescript": {
"version": "5.6.3",
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.6.3.tgz",
"integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==",
"dev": true,
"license": "Apache-2.0",
"bin": {
"tsc": "bin/tsc",
"tsserver": "bin/tsserver"
},
"engines": {
"node": ">=14.17"
}
},
"node_modules/undici": {
"version": "6.19.8",
"resolved": "https://registry.npmjs.org/undici/-/undici-6.19.8.tgz",
"integrity": "sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==",
"license": "MIT",
"engines": {
"node": ">=18.17"
}
},
"node_modules/undici-types": {
"version": "6.19.8",
"resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz",
"integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==",
"license": "MIT"
},
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
"integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
"license": "MIT"
},
"node_modules/winston": {
"version": "3.17.0",
"resolved": "https://registry.npmjs.org/winston/-/winston-3.17.0.tgz",
"integrity": "sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==",
"license": "MIT",
"dependencies": {
"@colors/colors": "^1.6.0",
"@dabh/diagnostics": "^2.0.2",
"async": "^3.2.3",
"is-stream": "^2.0.0",
"logform": "^2.7.0",
"one-time": "^1.0.0",
"readable-stream": "^3.4.0",
"safe-stable-stringify": "^2.3.1",
"stack-trace": "0.0.x",
"triple-beam": "^1.3.0",
"winston-transport": "^4.9.0"
},
"engines": {
"node": ">= 12.0.0"
}
},
"node_modules/winston-transport": {
"version": "4.9.0",
"resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz",
"integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==",
"license": "MIT",
"dependencies": {
"logform": "^2.7.0",
"readable-stream": "^3.6.2",
"triple-beam": "^1.3.0"
},
"engines": {
"node": ">= 12.0.0"
}
},
"node_modules/ws": {
"version": "8.18.0",
"resolved": "https://registry.npmjs.org/ws/-/ws-8.18.0.tgz",
"integrity": "sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==",
"license": "MIT",
"engines": {
"node": ">=10.0.0"
},
"peerDependencies": {
"bufferutil": "^4.0.1",
"utf-8-validate": ">=5.0.2"
},
"peerDependenciesMeta": {
"bufferutil": {
"optional": true
},
"utf-8-validate": {
"optional": true
}
}
}
}
}

View file

@ -1,12 +1,10 @@
{
"name": "ls25-discord-bot",
"version": "0.1.8",
"name": "ls25discord",
"version": "0.1.0",
"description": "A simple discord bot for farming simulator 25",
"main": "source/Main.ts",
"scripts": {
"start": "npx tsc && node build/Main.js",
"start-only": "node build/Main.js",
"build": "npx tsc",
"schema": "npx json2ts -i source/Schema/ServerStats.json -o ./source/Schema/ServerStats.d.ts --unreachableDefinitions",
"test": "echo \"Error: no test specified\" && exit 1"
},

View file

@ -1,580 +0,0 @@
lockfileVersion: '9.0'
settings:
autoInstallPeers: true
excludeLinksFromLockfile: false
importers:
.:
dependencies:
discord.js:
specifier: ^14.16.3
version: 14.16.3
fast-xml-parser:
specifier: ^4.5.0
version: 4.5.0
winston:
specifier: ^3.17.0
version: 3.17.0
devDependencies:
'@types/node':
specifier: ^22.9.0
version: 22.10.1
json-schema-to-typescript:
specifier: ^15.0.3
version: 15.0.3
typescript:
specifier: ^5.6.3
version: 5.7.2
packages:
'@apidevtools/json-schema-ref-parser@11.7.2':
resolution: {integrity: sha512-4gY54eEGEstClvEkGnwVkTkrx0sqwemEFG5OSRRn3tD91XH0+Q8XIkYIfo7IwEWPpJZwILb9GUXeShtplRc/eA==}
engines: {node: '>= 16'}
'@colors/colors@1.6.0':
resolution: {integrity: sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==}
engines: {node: '>=0.1.90'}
'@dabh/diagnostics@2.0.3':
resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==}
'@discordjs/builders@1.9.0':
resolution: {integrity: sha512-0zx8DePNVvQibh5ly5kCEei5wtPBIUbSoE9n+91Rlladz4tgtFbJ36PZMxxZrTEOQ7AHMZ/b0crT/0fCy6FTKg==}
engines: {node: '>=18'}
'@discordjs/collection@1.5.3':
resolution: {integrity: sha512-SVb428OMd3WO1paV3rm6tSjM4wC+Kecaa1EUGX7vc6/fddvw/6lg90z4QtCqm21zvVe92vMMDt9+DkIvjXImQQ==}
engines: {node: '>=16.11.0'}
'@discordjs/collection@2.1.1':
resolution: {integrity: sha512-LiSusze9Tc7qF03sLCujF5iZp7K+vRNEDBZ86FT9aQAv3vxMLihUvKvpsCWiQ2DJq1tVckopKm1rxomgNUc9hg==}
engines: {node: '>=18'}
'@discordjs/formatters@0.5.0':
resolution: {integrity: sha512-98b3i+Y19RFq1Xke4NkVY46x8KjJQjldHUuEbCqMvp1F5Iq9HgnGpu91jOi/Ufazhty32eRsKnnzS8n4c+L93g==}
engines: {node: '>=18'}
'@discordjs/rest@2.4.0':
resolution: {integrity: sha512-Xb2irDqNcq+O8F0/k/NaDp7+t091p+acb51iA4bCKfIn+WFWd6HrNvcsSbMMxIR9NjcMZS6NReTKygqiQN+ntw==}
engines: {node: '>=18'}
'@discordjs/util@1.1.1':
resolution: {integrity: sha512-eddz6UnOBEB1oITPinyrB2Pttej49M9FZQY8NxgEvc3tq6ZICZ19m70RsmzRdDHk80O9NoYN/25AqJl8vPVf/g==}
engines: {node: '>=18'}
'@discordjs/ws@1.1.1':
resolution: {integrity: sha512-PZ+vLpxGCRtmr2RMkqh8Zp+BenUaJqlS6xhgWKEZcgC/vfHLEzpHtKkB0sl3nZWpwtcKk6YWy+pU3okL2I97FA==}
engines: {node: '>=16.11.0'}
'@jsdevtools/ono@7.1.3':
resolution: {integrity: sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==}
'@sapphire/async-queue@1.5.5':
resolution: {integrity: sha512-cvGzxbba6sav2zZkH8GPf2oGk9yYoD5qrNWdu9fRehifgnFZJMV+nuy2nON2roRO4yQQ+v7MK/Pktl/HgfsUXg==}
engines: {node: '>=v14.0.0', npm: '>=7.0.0'}
'@sapphire/shapeshift@4.0.0':
resolution: {integrity: sha512-d9dUmWVA7MMiKobL3VpLF8P2aeanRTu6ypG2OIaEv/ZHH/SUQ2iHOVyi5wAPjQ+HmnMuL0whK9ez8I/raWbtIg==}
engines: {node: '>=v16'}
'@sapphire/snowflake@3.5.3':
resolution: {integrity: sha512-jjmJywLAFoWeBi1W7994zZyiNWPIiqRRNAmSERxyg93xRGzNYvGjlZ0gR6x0F4gPRi2+0O6S71kOZYyr3cxaIQ==}
engines: {node: '>=v14.0.0', npm: '>=7.0.0'}
'@types/json-schema@7.0.15':
resolution: {integrity: sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==}
'@types/lodash@4.17.13':
resolution: {integrity: sha512-lfx+dftrEZcdBPczf9d0Qv0x+j/rfNCMuC6OcfXmO8gkfeNAY88PgKUbvG56whcN23gc27yenwF6oJZXGFpYxg==}
'@types/node@22.10.1':
resolution: {integrity: sha512-qKgsUwfHZV2WCWLAnVP1JqnpE6Im6h3Y0+fYgMTasNQ7V++CBX5OT1as0g0f+OyubbFqhf6XVNIsmN4IIhEgGQ==}
'@types/triple-beam@1.3.5':
resolution: {integrity: sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==}
'@types/ws@8.5.13':
resolution: {integrity: sha512-osM/gWBTPKgHV8XkTunnegTRIsvF6owmf5w+JtAfOw472dptdm0dlGv4xCt6GwQRcC2XVOvvRE/0bAoQcL2QkA==}
'@vladfrangu/async_event_emitter@2.4.6':
resolution: {integrity: sha512-RaI5qZo6D2CVS6sTHFKg1v5Ohq/+Bo2LZ5gzUEwZ/WkHhwtGTCB/sVLw8ijOkAUxasZ+WshN/Rzj4ywsABJ5ZA==}
engines: {node: '>=v14.0.0', npm: '>=7.0.0'}
argparse@2.0.1:
resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==}
async@3.2.6:
resolution: {integrity: sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==}
color-convert@1.9.3:
resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==}
color-name@1.1.3:
resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==}
color-name@1.1.4:
resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==}
color-string@1.9.1:
resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==}
color@3.2.1:
resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==}
colorspace@1.1.4:
resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==}
discord-api-types@0.37.100:
resolution: {integrity: sha512-a8zvUI0GYYwDtScfRd/TtaNBDTXwP5DiDVX7K5OmE+DRT57gBqKnwtOC5Ol8z0mRW8KQfETIgiB8U0YZ9NXiCA==}
discord-api-types@0.37.83:
resolution: {integrity: sha512-urGGYeWtWNYMKnYlZnOnDHm8fVRffQs3U0SpE8RHeiuLKb/u92APS8HoQnPTFbnXmY1vVnXjXO4dOxcAn3J+DA==}
discord-api-types@0.37.97:
resolution: {integrity: sha512-No1BXPcVkyVD4ZVmbNgDKaBoqgeQ+FJpzZ8wqHkfmBnTZig1FcH3iPPersiK1TUIAzgClh2IvOuVUYfcWLQAOA==}
discord.js@14.16.3:
resolution: {integrity: sha512-EPCWE9OkA9DnFFNrO7Kl1WHHDYFXu3CNVFJg63bfU7hVtjZGyhShwZtSBImINQRWxWP2tgo2XI+QhdXx28r0aA==}
engines: {node: '>=18'}
enabled@2.0.0:
resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==}
fast-deep-equal@3.1.3:
resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==}
fast-xml-parser@4.5.0:
resolution: {integrity: sha512-/PlTQCI96+fZMAOLMZK4CWG1ItCbfZ/0jx7UIJFChPNrx7tcEgerUgWbeieCM9MfHInUDyK8DWYZ+YrywDJuTg==}
hasBin: true
fdir@6.4.2:
resolution: {integrity: sha512-KnhMXsKSPZlAhp7+IjUkRZKPb4fUyccpDrdFXbi4QL1qkmFh9kVY09Yox+n4MaOb3lHZ1Tv829C3oaaXoMYPDQ==}
peerDependencies:
picomatch: ^3 || ^4
peerDependenciesMeta:
picomatch:
optional: true
fecha@4.2.3:
resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==}
fn.name@1.1.0:
resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==}
inherits@2.0.4:
resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==}
is-arrayish@0.3.2:
resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==}
is-extglob@2.1.1:
resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==}
engines: {node: '>=0.10.0'}
is-glob@4.0.3:
resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==}
engines: {node: '>=0.10.0'}
is-stream@2.0.1:
resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==}
engines: {node: '>=8'}
js-yaml@4.1.0:
resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==}
hasBin: true
json-schema-to-typescript@15.0.3:
resolution: {integrity: sha512-iOKdzTUWEVM4nlxpFudFsWyUiu/Jakkga4OZPEt7CGoSEsAsUgdOZqR6pcgx2STBek9Gm4hcarJpXSzIvZ/hKA==}
engines: {node: '>=16.0.0'}
hasBin: true
kuler@2.0.0:
resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==}
lodash.snakecase@4.1.1:
resolution: {integrity: sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==}
lodash@4.17.21:
resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==}
logform@2.7.0:
resolution: {integrity: sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==}
engines: {node: '>= 12.0.0'}
magic-bytes.js@1.10.0:
resolution: {integrity: sha512-/k20Lg2q8LE5xiaaSkMXk4sfvI+9EGEykFS4b0CHHGWqDYU0bGUFSwchNOMA56D7TCs9GwVTkqe9als1/ns8UQ==}
minimist@1.2.8:
resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==}
ms@2.1.3:
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
one-time@1.0.0:
resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==}
picomatch@4.0.2:
resolution: {integrity: sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==}
engines: {node: '>=12'}
prettier@3.4.1:
resolution: {integrity: sha512-G+YdqtITVZmOJje6QkXQWzl3fSfMxFwm1tjTyo9exhkmWSqC4Yhd1+lug++IlR2mvRVAxEDDWYkQdeSztajqgg==}
engines: {node: '>=14'}
hasBin: true
readable-stream@3.6.2:
resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==}
engines: {node: '>= 6'}
safe-buffer@5.2.1:
resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==}
safe-stable-stringify@2.5.0:
resolution: {integrity: sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==}
engines: {node: '>=10'}
simple-swizzle@0.2.2:
resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==}
stack-trace@0.0.10:
resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==}
string_decoder@1.3.0:
resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==}
strnum@1.0.5:
resolution: {integrity: sha512-J8bbNyKKXl5qYcR36TIO8W3mVGVHrmmxsd5PAItGkmyzwJvybiw2IVq5nqd0i4LSNSkB/sx9VHllbfFdr9k1JA==}
text-hex@1.0.0:
resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==}
tinyglobby@0.2.10:
resolution: {integrity: sha512-Zc+8eJlFMvgatPZTl6A9L/yht8QqdmUNtURHaKZLmKBE12hNPSrqNkUp2cs3M/UKmNVVAMFQYSjYIVHDjW5zew==}
engines: {node: '>=12.0.0'}
triple-beam@1.4.1:
resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==}
engines: {node: '>= 14.0.0'}
ts-mixer@6.0.4:
resolution: {integrity: sha512-ufKpbmrugz5Aou4wcr5Wc1UUFWOLhq+Fm6qa6P0w0K5Qw2yhaUoiWszhCVuNQyNwrlGiscHOmqYoAox1PtvgjA==}
tslib@2.8.1:
resolution: {integrity: sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==}
typescript@5.7.2:
resolution: {integrity: sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==}
engines: {node: '>=14.17'}
hasBin: true
undici-types@6.20.0:
resolution: {integrity: sha512-Ny6QZ2Nju20vw1SRHe3d9jVu6gJ+4e3+MMpqu7pqE5HT6WsTSlce++GQmK5UXS8mzV8DSYHrQH+Xrf2jVcuKNg==}
undici@6.19.8:
resolution: {integrity: sha512-U8uCCl2x9TK3WANvmBavymRzxbfFYG+tAu+fgx3zxQy3qdagQqBLwJVrdyO1TBfUXvfKveMKJZhpvUYoOjM+4g==}
engines: {node: '>=18.17'}
util-deprecate@1.0.2:
resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==}
winston-transport@4.9.0:
resolution: {integrity: sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==}
engines: {node: '>= 12.0.0'}
winston@3.17.0:
resolution: {integrity: sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==}
engines: {node: '>= 12.0.0'}
ws@8.18.0:
resolution: {integrity: sha512-8VbfWfHLbbwu3+N6OKsOMpBdT4kXPDDB9cJk2bJ6mh9ucxdlnNvH1e+roYkKmN9Nxw2yjz7VzeO9oOz2zJ04Pw==}
engines: {node: '>=10.0.0'}
peerDependencies:
bufferutil: ^4.0.1
utf-8-validate: '>=5.0.2'
peerDependenciesMeta:
bufferutil:
optional: true
utf-8-validate:
optional: true
snapshots:
'@apidevtools/json-schema-ref-parser@11.7.2':
dependencies:
'@jsdevtools/ono': 7.1.3
'@types/json-schema': 7.0.15
js-yaml: 4.1.0
'@colors/colors@1.6.0': {}
'@dabh/diagnostics@2.0.3':
dependencies:
colorspace: 1.1.4
enabled: 2.0.0
kuler: 2.0.0
'@discordjs/builders@1.9.0':
dependencies:
'@discordjs/formatters': 0.5.0
'@discordjs/util': 1.1.1
'@sapphire/shapeshift': 4.0.0
discord-api-types: 0.37.97
fast-deep-equal: 3.1.3
ts-mixer: 6.0.4
tslib: 2.8.1
'@discordjs/collection@1.5.3': {}
'@discordjs/collection@2.1.1': {}
'@discordjs/formatters@0.5.0':
dependencies:
discord-api-types: 0.37.97
'@discordjs/rest@2.4.0':
dependencies:
'@discordjs/collection': 2.1.1
'@discordjs/util': 1.1.1
'@sapphire/async-queue': 1.5.5
'@sapphire/snowflake': 3.5.3
'@vladfrangu/async_event_emitter': 2.4.6
discord-api-types: 0.37.97
magic-bytes.js: 1.10.0
tslib: 2.8.1
undici: 6.19.8
'@discordjs/util@1.1.1': {}
'@discordjs/ws@1.1.1':
dependencies:
'@discordjs/collection': 2.1.1
'@discordjs/rest': 2.4.0
'@discordjs/util': 1.1.1
'@sapphire/async-queue': 1.5.5
'@types/ws': 8.5.13
'@vladfrangu/async_event_emitter': 2.4.6
discord-api-types: 0.37.83
tslib: 2.8.1
ws: 8.18.0
transitivePeerDependencies:
- bufferutil
- utf-8-validate
'@jsdevtools/ono@7.1.3': {}
'@sapphire/async-queue@1.5.5': {}
'@sapphire/shapeshift@4.0.0':
dependencies:
fast-deep-equal: 3.1.3
lodash: 4.17.21
'@sapphire/snowflake@3.5.3': {}
'@types/json-schema@7.0.15': {}
'@types/lodash@4.17.13': {}
'@types/node@22.10.1':
dependencies:
undici-types: 6.20.0
'@types/triple-beam@1.3.5': {}
'@types/ws@8.5.13':
dependencies:
'@types/node': 22.10.1
'@vladfrangu/async_event_emitter@2.4.6': {}
argparse@2.0.1: {}
async@3.2.6: {}
color-convert@1.9.3:
dependencies:
color-name: 1.1.3
color-name@1.1.3: {}
color-name@1.1.4: {}
color-string@1.9.1:
dependencies:
color-name: 1.1.4
simple-swizzle: 0.2.2
color@3.2.1:
dependencies:
color-convert: 1.9.3
color-string: 1.9.1
colorspace@1.1.4:
dependencies:
color: 3.2.1
text-hex: 1.0.0
discord-api-types@0.37.100: {}
discord-api-types@0.37.83: {}
discord-api-types@0.37.97: {}
discord.js@14.16.3:
dependencies:
'@discordjs/builders': 1.9.0
'@discordjs/collection': 1.5.3
'@discordjs/formatters': 0.5.0
'@discordjs/rest': 2.4.0
'@discordjs/util': 1.1.1
'@discordjs/ws': 1.1.1
'@sapphire/snowflake': 3.5.3
discord-api-types: 0.37.100
fast-deep-equal: 3.1.3
lodash.snakecase: 4.1.1
tslib: 2.8.1
undici: 6.19.8
transitivePeerDependencies:
- bufferutil
- utf-8-validate
enabled@2.0.0: {}
fast-deep-equal@3.1.3: {}
fast-xml-parser@4.5.0:
dependencies:
strnum: 1.0.5
fdir@6.4.2(picomatch@4.0.2):
optionalDependencies:
picomatch: 4.0.2
fecha@4.2.3: {}
fn.name@1.1.0: {}
inherits@2.0.4: {}
is-arrayish@0.3.2: {}
is-extglob@2.1.1: {}
is-glob@4.0.3:
dependencies:
is-extglob: 2.1.1
is-stream@2.0.1: {}
js-yaml@4.1.0:
dependencies:
argparse: 2.0.1
json-schema-to-typescript@15.0.3:
dependencies:
'@apidevtools/json-schema-ref-parser': 11.7.2
'@types/json-schema': 7.0.15
'@types/lodash': 4.17.13
is-glob: 4.0.3
js-yaml: 4.1.0
lodash: 4.17.21
minimist: 1.2.8
prettier: 3.4.1
tinyglobby: 0.2.10
kuler@2.0.0: {}
lodash.snakecase@4.1.1: {}
lodash@4.17.21: {}
logform@2.7.0:
dependencies:
'@colors/colors': 1.6.0
'@types/triple-beam': 1.3.5
fecha: 4.2.3
ms: 2.1.3
safe-stable-stringify: 2.5.0
triple-beam: 1.4.1
magic-bytes.js@1.10.0: {}
minimist@1.2.8: {}
ms@2.1.3: {}
one-time@1.0.0:
dependencies:
fn.name: 1.1.0
picomatch@4.0.2: {}
prettier@3.4.1: {}
readable-stream@3.6.2:
dependencies:
inherits: 2.0.4
string_decoder: 1.3.0
util-deprecate: 1.0.2
safe-buffer@5.2.1: {}
safe-stable-stringify@2.5.0: {}
simple-swizzle@0.2.2:
dependencies:
is-arrayish: 0.3.2
stack-trace@0.0.10: {}
string_decoder@1.3.0:
dependencies:
safe-buffer: 5.2.1
strnum@1.0.5: {}
text-hex@1.0.0: {}
tinyglobby@0.2.10:
dependencies:
fdir: 6.4.2(picomatch@4.0.2)
picomatch: 4.0.2
triple-beam@1.4.1: {}
ts-mixer@6.0.4: {}
tslib@2.8.1: {}
typescript@5.7.2: {}
undici-types@6.20.0: {}
undici@6.19.8: {}
util-deprecate@1.0.2: {}
winston-transport@4.9.0:
dependencies:
logform: 2.7.0
readable-stream: 3.6.2
triple-beam: 1.4.1
winston@3.17.0:
dependencies:
'@colors/colors': 1.6.0
'@dabh/diagnostics': 2.0.3
async: 3.2.6
is-stream: 2.0.1
logform: 2.7.0
one-time: 1.0.0
readable-stream: 3.6.2
safe-stable-stringify: 2.5.0
stack-trace: 0.0.10
triple-beam: 1.4.1
winston-transport: 4.9.0
ws@8.18.0: {}

View file

@ -1,4 +1,5 @@
export default interface IDiscordConfiguration {
guildId: string;
channelId: string;
botToken: string;
}

View file

@ -1,7 +1,5 @@
import ITranslationDiscordEmbed from "./ITranslationDiscordEmbed";
import ITranslationCommon from "./ITranslationCommon";
export default interface ITranslation {
discordEmbed: ITranslationDiscordEmbed;
common: ITranslationCommon;
}

View file

@ -1,14 +0,0 @@
export default interface ITranslationCommon {
monthJanuary: string;
monthFebruary: string;
monthMarch: string;
monthApril: string;
monthMay: string;
monthJune: string;
monthJuly: string;
monthAugust: string;
monthSeptember: string;
monthOctober: string;
monthNovember: string;
monthDecember: string;
}

View file

@ -4,8 +4,6 @@ export default interface ITranslationDiscordEmbed {
descriptionOffline: string;
descriptionUnknown: string;
titleServerName: string;
titleServerMap: string;
titleServerMods: string;
titleServerPassword: string;
titleServerTime: string;
titlePlayerCount: string;

View file

@ -1,5 +0,0 @@
export default interface IMod {
name: string;
author: string;
version: string;
}

View file

@ -2,46 +2,9 @@ import {Client, IntentsBitField} from 'discord.js';
import Configuration from "./Services/Configuration";
import Logging from "./Services/Logging";
import DiscordService from "./Services/DiscordEmbed";
import VersionChecker from './Services/VersionChecker';
// Create a new logger instance and configuration instance
const appLogger = Logging.getLogger();
const appConfig: Configuration = new Configuration();
// Log the application start and version
const packageJson = require('../package.json');
appLogger.info(`Starting | App: ${packageJson.name} | Version: ${packageJson.version}`);
appLogger.info(`----------------------------------------------------`);
/**
* Check if the configuration is valid and exit the application if it is not
*/
if(!appConfig.isConfigurationValid()) {
appLogger.error("Configuration is not valid. Exiting application.");
process.exit(1);
}
/**
* Check the version of the bot and log if it is up to date
*/
const versionChecker = new VersionChecker();
versionChecker.checkVersionIsUpdated().then((isUpToDate: boolean): void => {
if (!isUpToDate) {
appLogger.warn(`====================================================`);
appLogger.warn(`====================================================`);
appLogger.warn(`The bot is not up to date. Please update it soon.`);
appLogger.warn(`Use the command 'git pull && docker compose up -d --build' to update the bot.`);
appLogger.warn(`====================================================`);
appLogger.warn(`====================================================`);
} else {
appLogger.info(`The bot is up to date. No update needed.`);
}
});
/**
* Create a new discord client instance
*/
const discordClient = new Client({
intents: [IntentsBitField.Flags.Guilds, IntentsBitField.Flags.GuildMessages]
});
@ -54,19 +17,7 @@ discordClient.login(appConfig.discord.botToken).then(() => {
appLogger.info(`Login successful to discord with token`);
});
/**
* Start the DiscordService and restart it if an error occurred
*/
async function startDiscordService(): Promise<void> {
try {
new DiscordService(discordClient);
} catch (exception) {
appLogger.error(`Restarting the discord service, an error occurred`, exception);
startDiscordService();
}
}
discordClient.on('ready', () => {
appLogger.info(`Discord client ready. Logged in as ${discordClient.user?.username}!`);
startDiscordService();
new DiscordService(discordClient);
});

View file

@ -2,130 +2,19 @@ import IDiscordConfiguration from "../Interfaces/Configuration/IDiscordConfigura
import IApplicationConfiguration from "../Interfaces/Configuration/IApplicationConfiguration";
import IConfiguration from "../Interfaces/Configuration/IConfiguration";
import ITranslation from "../Interfaces/Configuration/ITranslation";
import Logging from "./Logging";
import {Logger} from "winston";
export default class Configuration implements IConfiguration{
private readonly logger: Logger;
public readonly discord: IDiscordConfiguration;
public readonly application: IApplicationConfiguration;
public readonly translation: ITranslation;
constructor() {
this.logger = Logging.getLogger();
try {
let config = require('../../config.json');
this.discord = config.discord;
this.application = config.application;
this.translation = config.translation;
} catch (exception) {
this.logger.error("Error while loading configuration file, please check if the configuration file exists and is valid.");
process.exit(1);
}
let config = require('../../config.json');
this.discord = config.discord;
this.application = config.application;
this.translation = config.translation;
}
/**
* Returns true if the value is empty or undefined
* @param value
* @private
*/
private isValueEmptyOrUndefined(value: any): boolean {
return value == null || value == "" || value == undefined;
}
/**
* Returns true if the value is undefined
* @param value
* @private
*/
private isValueUndefined(value: any): boolean {
return value == undefined;
}
/**
* Validates the discord configuration and returns true if the configuration is valid
* @private
*/
private validateDiscordConfiguration(): boolean {
return !(this.isValueEmptyOrUndefined(this.discord?.botToken) || this.isValueEmptyOrUndefined(this.discord?.channelId));
}
/**
* Validates the application configuration and returns true if the configuration is valid
* @private
*/
private validateApplicationConfiguration(): boolean {
return !(
this.isValueUndefined(this.application?.serverPassword)
|| this.isValueEmptyOrUndefined(this.application?.serverStatsUrl)
|| this.isValueEmptyOrUndefined(this.application?.serverMapUrl)
|| this.isValueEmptyOrUndefined(this.application?.updateIntervalSeconds)
);
}
/**
* Validates the translation configuration and returns true if the configuration is valid
* @private
*/
private validateTranslationConfiguration(): boolean {
return !(
this.isValueEmptyOrUndefined(this?.translation?.discordEmbed?.title)
|| this.isValueEmptyOrUndefined(this?.translation?.discordEmbed?.descriptionOnline)
|| this.isValueEmptyOrUndefined(this?.translation?.discordEmbed?.descriptionOffline)
|| this.isValueEmptyOrUndefined(this?.translation?.discordEmbed?.descriptionUnknown)
|| this.isValueEmptyOrUndefined(this?.translation?.discordEmbed?.titleServerName)
|| this.isValueEmptyOrUndefined(this?.translation?.discordEmbed?.titleServerPassword)
|| this.isValueEmptyOrUndefined(this?.translation?.discordEmbed?.titleServerTime)
|| this.isValueEmptyOrUndefined(this?.translation?.discordEmbed?.titleServerMap)
|| this.isValueEmptyOrUndefined(this?.translation?.discordEmbed?.titleServerMods)
|| this.isValueEmptyOrUndefined(this?.translation?.discordEmbed?.titlePlayerCount)
|| this.isValueEmptyOrUndefined(this?.translation?.discordEmbed?.noPlayersOnline)
|| this.isValueEmptyOrUndefined(this?.translation?.common?.monthJanuary)
|| this.isValueEmptyOrUndefined(this?.translation?.common?.monthFebruary)
|| this.isValueEmptyOrUndefined(this?.translation?.common?.monthMarch)
|| this.isValueEmptyOrUndefined(this?.translation?.common?.monthApril)
|| this.isValueEmptyOrUndefined(this?.translation?.common?.monthMay)
|| this.isValueEmptyOrUndefined(this?.translation?.common?.monthJune)
|| this.isValueEmptyOrUndefined(this?.translation?.common?.monthJuly)
|| this.isValueEmptyOrUndefined(this?.translation?.common?.monthAugust)
|| this.isValueEmptyOrUndefined(this?.translation?.common?.monthSeptember)
|| this.isValueEmptyOrUndefined(this?.translation?.common?.monthOctober)
|| this.isValueEmptyOrUndefined(this?.translation?.common?.monthNovember)
|| this.isValueEmptyOrUndefined(this?.translation?.common?.monthDecember)
);
}
/**
* Validates the configuration file and returns true if the configuration is valid
* @returns boolean True if the configuration is valid
*/
public isConfigurationValid(): boolean {
if(!this.validateDiscordConfiguration()) {
this.logger.error("Discord configuration is not valid. Please check your configuration file.");
return false;
} else {
this.logger.info("Discord configuration is valid.");
}
if(!this.validateApplicationConfiguration()) {
this.logger.error("Application configuration is not valid. Please check your configuration file.");
return false;
} else {
this.logger.info("Application configuration is valid.");
}
if(!this.validateTranslationConfiguration()) {
this.logger.error("Translation configuration is not valid. Please check your configuration file.");
return false;
} else {
this.logger.info("Translation configuration is valid.");
}
return true;
}
/**
* Returns the configuration object
*/
public static getConfiguration(): IConfiguration {
return new Configuration();
}

View file

@ -41,30 +41,15 @@ export default class DiscordEmbed {
return;
}
this.discordAppClient.channels.fetch(this.appConfiguration.discord.channelId as Snowflake).then(async channel => {
/**
* Send the initial message to the channel (if the first message id is not set) or
* the message is meanwhile deleted
* @param embedMessage
*/
let sendInitialMessage = (embedMessage: EmbedBuilder) => {
// noinspection JSAnnotator
(channel as TextChannel).send({embeds: [embedMessage]}).then(message => {
this.firstMessageId = message.id;
});
};
this.generateEmbedFromStatusFeed(this.serverStatsFeed).then(embedMessage => {
if (this.firstMessageId !== null) {
(channel as TextChannel).messages.fetch(this.firstMessageId).then(message => {
this.appLogger.info(`Message found, editing message with new embed`);
message.edit({embeds: [embedMessage]});
}).catch(() => {
this.appLogger.warn('Message not found, sending new message');
sendInitialMessage(embedMessage);
});
} else {
this.appLogger.info(`No message found, sending new message`);
sendInitialMessage(embedMessage);
(channel as TextChannel).send({embeds: [embedMessage]}).then(message => {
this.firstMessageId = message.id;
})
}
});
});
@ -92,16 +77,6 @@ export default class DiscordEmbed {
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
* @param serverStats
@ -112,49 +87,33 @@ export default class DiscordEmbed {
embed.setTitle(config.translation.discordEmbed.title);
if (!serverStats.isOnline()) {
embed.setColor(0xCA0000);
embed.setDescription(config.translation.discordEmbed.descriptionOffline);
} else if (serverStats.isFetching()) {
embed.setDescription(config.translation.discordEmbed.descriptionUnknown);
} else {
embed.setColor(0x00CA00);
embed.setDescription(config.translation.discordEmbed.descriptionOnline);
embed.setTimestamp(new Date());
embed.setThumbnail(config.application.serverMapUrl);
let playerListString: string;
let playerListTitleString = `${config.translation.discordEmbed.titlePlayerCount} (${serverStats.getPlayerCount()??0}/${serverStats.getMaxPlayerCount()??0}):`;
let playerListString: string = '';
if(serverStats.getPlayerList().length === 0) {
playerListString = config.translation.discordEmbed.noPlayersOnline;
} else {
playerListString = serverStats.getPlayerList().map(p => p.username).join(', ');
}
let serverPassword = config.application.serverPassword;
if(config.application.serverPassword == "") {
serverPassword = "-/-";
}
let serverMods = serverStats.getServerMods();
let serverModsText = "-/-";
if(serverMods.length > 0) {
serverModsText = await this.truncateText(serverMods.map(mod => `${mod.name}`).join(', '));
}
// @ts-ignore
embed.addFields(
{name: config.translation.discordEmbed.titleServerName, value: serverStats.getServerName()},
{name: config.translation.discordEmbed.titleServerPassword, value: serverPassword},
{name: config.translation.discordEmbed.titleServerPassword, value: config.application.serverPassword},
{name: config.translation.discordEmbed.titleServerTime, value: serverStats.getServerTime()},
{name: config.translation.discordEmbed.titleServerMap, value: serverStats.getServerMap()},
{name: config.translation.discordEmbed.titleServerMods, value: serverModsText},
{
name: playerListTitleString,
name: `${config.translation.discordEmbed.titlePlayerCount} (${serverStats.getPlayerCount()}/${serverStats.getMaxPlayerCount()}):`,
value: playerListString
},
);
}
this.appLogger.debug(embed);
return embed;
}
}

View file

@ -5,12 +5,8 @@ export default class Logging {
return winston.createLogger({
level: 'info',
format: winston.format.combine(
winston.format.timestamp({
format: 'YYYY-MM-DD HH:mm:ss'
}),
winston.format.colorize(),
winston.format.simple(),
winston.format.printf(info => `${info.timestamp} ${info.level}: ${info.message}`)
),
transports: [
new winston.transports.Console(),

View file

@ -3,8 +3,6 @@ import Configuration from "./Configuration";
import {XMLParser} from "fast-xml-parser";
import Logging from "./Logging";
import IPlayer from "../Interfaces/Feed/IPlayer";
import IConfiguration from "../Interfaces/Configuration/IConfiguration";
import IMod from "../Interfaces/Feed/IMod";
export const CONNECTION_REFUSED = 'ECONNREFUSED';
export const NOT_FOUND = 'ENOTFOUND';
@ -104,7 +102,7 @@ export default class ServerStatusFeed {
* @returns {string} The server map name
*/
public getServerMap(): string {
return <string>this.getServerStats()?.Server.mapName;
return <string>this.getServerStats()?.Server.map;
}
/**
@ -119,24 +117,6 @@ export default class ServerStatusFeed {
return dayTime / (60 * 60 * 1000) + 0.0001;
}
/**
* Get the server mods from the server stats feed
* @returns {IMod[]} The server mods as an array of IMod objects
*/
public getServerMods(): IMod[] {
let modList = this.getServerStats()?.Server?.Mods?.Mod;
if(modList === undefined || !Array.isArray(modList) || modList == null) {
return [];
}
return modList.map((mod: any) => {
return {
name: mod['#text'],
author: mod.author,
version: mod.version
} as IMod;
});
}
/**
* Returns the server time in the format HH:MM
* @returns {string} The server time in the format HH:MM
@ -161,18 +141,18 @@ export default class ServerStatusFeed {
/**
* Returns the server player count
* @returns {number | null | undefined} The server player count
* @returns {number} The server player count
*/
public getPlayerCount(): number | null | undefined {
return <number>this.getServerStats()?.Server?.Slots?.numUsed;
public getPlayerCount(): number {
return <number>this.getServerStats()?.Server.Slots.numUsed;
}
/**
* Returns the server player count
* @returns {number | null | undefined} The server player count
* @returns {number} The server player count
*/
public getMaxPlayerCount(): number | null | undefined {
return <number>this.getServerStats()?.Server?.Slots?.capacity;
public getMaxPlayerCount(): number {
return <number>this.getServerStats()?.Server.Slots.capacity;
}
/**

View file

@ -1,41 +0,0 @@
export default class VersionChecker {
private readonly localPackageVersion: string;
private readonly versionUrl: string = "https://raw.githubusercontent.com/cloudmaker97/FS25-Discord-Bot/refs/heads/main/package.json";
constructor() {
this.localPackageVersion = require('../../package.json').version;
}
/**
* Check if the version of the bot is up to date
*/
public async checkVersionIsUpdated(): Promise<boolean> {
const latestVersion = await this.getLatestReleasedVersion();
return this.isNewerVersion(latestVersion, this.localPackageVersion);
}
/**
* Get the latest released version of the bot from the github repository
*/
public async getLatestReleasedVersion(): Promise<string> {
const response = await fetch(this.versionUrl);
const latestPackage = await response.text();
const latestVersion = JSON.parse(latestPackage)?.version;
return latestVersion;
}
/**
* Check if the latest version is newer than the current version
*/
public isNewerVersion(latestVersion: string, currentVersion: string) {
const v1Parts: number[] = latestVersion.split('.').map(Number);
const v2Parts: number[] = currentVersion.split('.').map(Number);
for (let i = 0; i < Math.max(v1Parts.length, v2Parts.length); i++) {
const part1 = v1Parts[i] || 0;
const part2 = v2Parts[i] || 0;
if (part1 > part2) return false;
if (part1 < part2) return true;
}
return true;
}
}