From 391fd2576bee7ba281c22e275c2844e875f1c066 Mon Sep 17 00:00:00 2001
From: Garrett Hempy <124597769+ghempy53@users.noreply.github.com>
Date: Fri, 28 Nov 2025 17:47:03 -0700
Subject: [PATCH 01/99] Adding HondaBot trademark
---
src/discordTools/discordSelectMenus.js | 8 ++++----
1 file changed, 4 insertions(+), 4 deletions(-)
diff --git a/src/discordTools/discordSelectMenus.js b/src/discordTools/discordSelectMenus.js
index 0051b1f5a..a9cfc4a54 100644
--- a/src/discordTools/discordSelectMenus.js
+++ b/src/discordTools/discordSelectMenus.js
@@ -114,11 +114,11 @@ module.exports = {
Client.client.intlGet(guildId, 'notShowingCap') : trademark}`,
options: [
{
- label: 'rustplusplus',
+ label: 'HondaBot',
description: Client.client.intlGet(guildId, 'trademarkShownBeforeMessage', {
- trademark: 'rustplusplus'
+ trademark: 'HondaBot'
}),
- value: 'rustplusplus'
+ value: 'HondaBot'
},
{
label: 'Rust++',
@@ -319,4 +319,4 @@ module.exports = {
}]
}));
},
-}
\ No newline at end of file
+}
From 4916b4528d661c97b61d88c88babfe01ead60c8a Mon Sep 17 00:00:00 2001
From: Garrett Hempy <124597769+ghempy53@users.noreply.github.com>
Date: Wed, 3 Dec 2025 21:48:08 -0700
Subject: [PATCH 02/99] Update README.md
---
README.md | 22 ----------------------
1 file changed, 22 deletions(-)
diff --git a/README.md b/README.md
index 6bffc47fc..ea510e250 100644
--- a/README.md
+++ b/README.md
@@ -1,25 +1,3 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-rustplusplus ~ Rust+ Discord Bot
-
-
A NodeJS Discord Bot that uses the [rustplus.js](https://github.com/liamcottle/rustplus.js) library to utilize the power of the [Rust+ Companion App](https://rust.facepunch.com/companion) with additional Quality-of-Life features.
From 49c39f91fcc06762ce02f5cab7adf81fc27f6647 Mon Sep 17 00:00:00 2001
From: Garrett Hempy <124597769+ghempy53@users.noreply.github.com>
Date: Wed, 3 Dec 2025 21:48:37 -0700
Subject: [PATCH 03/99] Update README.md
---
README.md | 5 -----
1 file changed, 5 deletions(-)
diff --git a/README.md b/README.md
index ea510e250..fb1ea42db 100644
--- a/README.md
+++ b/README.md
@@ -1,10 +1,5 @@
A NodeJS Discord Bot that uses the [rustplus.js](https://github.com/liamcottle/rustplus.js) library to utilize the power of the [Rust+ Companion App](https://rust.facepunch.com/companion) with additional Quality-of-Life features.
-
-## **How-to Setup Video**
-
-[](https://youtu.be/GX03brJiMZg)
-
## **Features**
* Receive notifications for [In-Game Events](docs/discord_text_channels.md#events-channel) (Patrol Helicopter, Cargo Ship, Chinook 47, Oil Rigs triggered).
From afae51e4d06bca7d01fa843cc7e1eb0040a5aba7 Mon Sep 17 00:00:00 2001
From: Garrett Hempy <124597769+ghempy53@users.noreply.github.com>
Date: Wed, 3 Dec 2025 21:50:13 -0700
Subject: [PATCH 04/99] Update README.md
---
README.md | 4 ++++
1 file changed, 4 insertions(+)
diff --git a/README.md b/README.md
index fb1ea42db..c29d023a9 100644
--- a/README.md
+++ b/README.md
@@ -50,6 +50,10 @@ or
Make sure you use the correct values for DISCORD_CLIENT_ID as well as DISCORD_TOKEN in the docker command/docker-compose.yml
+## Running on Raspberry Pi
+
+ $ Coming soon...
+
## **Thanks to**
**liamcottle**@GitHub - for the [rustplus.js](https://github.com/liamcottle/rustplus.js) library.
From 06f5aba2a25822b456df30dc51908414b64e2aa6 Mon Sep 17 00:00:00 2001
From: Garrett Hempy <124597769+ghempy53@users.noreply.github.com>
Date: Wed, 3 Dec 2025 21:54:35 -0700
Subject: [PATCH 05/99] Update README.md
---
README.md | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index c29d023a9..205a53fd0 100644
--- a/README.md
+++ b/README.md
@@ -52,7 +52,9 @@ Make sure you use the correct values for DISCORD_CLIENT_ID as well as DISCORD_TO
## Running on Raspberry Pi
- $ Coming soon...
+ $ 1. Install Git
+ $ 2. Install npm and NodeJS v22 or higher
+ $ 3. Install Docker
## **Thanks to**
From 1729ffd44d5a7d71a5a23dad89e529a058cd3a55 Mon Sep 17 00:00:00 2001
From: Garrett Hempy <124597769+ghempy53@users.noreply.github.com>
Date: Wed, 3 Dec 2025 22:02:47 -0700
Subject: [PATCH 06/99] Update README.md
---
README.md | 10 ++++++++--
1 file changed, 8 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index 205a53fd0..cec67897e 100644
--- a/README.md
+++ b/README.md
@@ -53,8 +53,14 @@ Make sure you use the correct values for DISCORD_CLIENT_ID as well as DISCORD_TO
## Running on Raspberry Pi
$ 1. Install Git
- $ 2. Install npm and NodeJS v22 or higher
- $ 3. Install Docker
+ $ 2. Clone HondaBot onto the Raspberry Pi using SSH
+ $ 3. Install npm and NodeJS v22 or higher
+ $ 4. sudo ./update.sh
+ $ 5. Create .env file with secret Discord data
+ $ 6. Install Docker
+ $ 7. Disable IPv6 on your Raspberry Pi
+ $ 8. DOCKER_BUILDKIT=0 docker compose build --no-cache
+ $ 9. docker compose up -d
## **Thanks to**
From 19b6db471bdebc42eba36353d97c88060cf7e99b Mon Sep 17 00:00:00 2001
From: Garrett Hempy <124597769+ghempy53@users.noreply.github.com>
Date: Wed, 3 Dec 2025 22:12:15 -0700
Subject: [PATCH 07/99] Update README.md
---
README.md | 23 +++++++++++++++++------
1 file changed, 17 insertions(+), 6 deletions(-)
diff --git a/README.md b/README.md
index cec67897e..0b4077cd8 100644
--- a/README.md
+++ b/README.md
@@ -1,5 +1,3 @@
-A NodeJS Discord Bot that uses the [rustplus.js](https://github.com/liamcottle/rustplus.js) library to utilize the power of the [Rust+ Companion App](https://rust.facepunch.com/companion) with additional Quality-of-Life features.
-
## **Features**
* Receive notifications for [In-Game Events](docs/discord_text_channels.md#events-channel) (Patrol Helicopter, Cargo Ship, Chinook 47, Oil Rigs triggered).
@@ -59,11 +57,24 @@ Make sure you use the correct values for DISCORD_CLIENT_ID as well as DISCORD_TO
$ 5. Create .env file with secret Discord data
$ 6. Install Docker
$ 7. Disable IPv6 on your Raspberry Pi
+ $ a. Create /etc/docker/daemon.json
$ 8. DOCKER_BUILDKIT=0 docker compose build --no-cache
$ 9. docker compose up -d
-## **Thanks to**
+## Updating Docker IPv4 Hosts
+```
+sudo tee /usr/local/bin/update-docker-hosts << 'EOF'
+#!/bin/bash
+sudo sed -i '/registry-1.docker.io/d' /etc/hosts
+sudo sed -i '/auth.docker.io/d' /etc/hosts
+sudo sed -i '/production.cloudflare.docker.com/d' /etc/hosts
+
+echo "$(getent ahosts registry-1.docker.io | grep -v ':' | head -1 | awk '{print $1}') registry-1.docker.io" | sudo tee -a /etc/hosts
+echo "$(getent ahosts auth.docker.io | grep -v ':' | head -1 | awk '{print $1}') auth.docker.io" | sudo tee -a /etc/hosts
+echo "$(getent ahosts production.cloudflare.docker.com | grep -v ':' | head -1 | awk '{print $1}') production.cloudflare.docker.com" | sudo tee -a /etc/hosts
+
+echo "Docker hosts updated!"
+EOF
+sudo chmod +x /usr/local/bin/update-docker-hosts
+```
-**liamcottle**@GitHub - for the [rustplus.js](https://github.com/liamcottle/rustplus.js) library.
-
-**.Vegas.#4844**@Discord - for the awesome icons!
From 22794a0e73f4be504531c087c42c9c2ca47847db Mon Sep 17 00:00:00 2001
From: Garrett Hempy <124597769+ghempy53@users.noreply.github.com>
Date: Wed, 3 Dec 2025 22:12:45 -0700
Subject: [PATCH 08/99] Update README.md
---
README.md | 1 +
1 file changed, 1 insertion(+)
diff --git a/README.md b/README.md
index 0b4077cd8..146a81a3c 100644
--- a/README.md
+++ b/README.md
@@ -75,6 +75,7 @@ echo "$(getent ahosts production.cloudflare.docker.com | grep -v ':' | head -1 |
echo "Docker hosts updated!"
EOF
+
sudo chmod +x /usr/local/bin/update-docker-hosts
```
From 43339203d0e2faf5524ae0b05cee652eb5c40d0a Mon Sep 17 00:00:00 2001
From: Garrett Hempy <124597769+ghempy53@users.noreply.github.com>
Date: Wed, 3 Dec 2025 22:21:08 -0700
Subject: [PATCH 09/99] Update README.md
---
README.md | 17 ++++-------------
1 file changed, 4 insertions(+), 13 deletions(-)
diff --git a/README.md b/README.md
index 146a81a3c..7d75af519 100644
--- a/README.md
+++ b/README.md
@@ -37,18 +37,7 @@ or
$ ./update.sh
-
-## **Running via docker**
-
- $ docker run --rm -it -v ${pwd}/credentials:/app/credentials -v ${pwd}/instances:/app/instances -v ${pwd}/logs:/app/logs -e RPP_DISCORD_CLIENT_ID=111....1111 -e RPP_DISCORD_TOKEN=token --name rpp ghcr.io/alexemanuelol/rustplusplus
-
-or
-
- $ docker-compose up -d
-
-Make sure you use the correct values for DISCORD_CLIENT_ID as well as DISCORD_TOKEN in the docker command/docker-compose.yml
-
-## Running on Raspberry Pi
+## Running on Raspberry Pi with Docker
$ 1. Install Git
$ 2. Clone HondaBot onto the Raspberry Pi using SSH
@@ -57,7 +46,9 @@ Make sure you use the correct values for DISCORD_CLIENT_ID as well as DISCORD_TO
$ 5. Create .env file with secret Discord data
$ 6. Install Docker
$ 7. Disable IPv6 on your Raspberry Pi
- $ a. Create /etc/docker/daemon.json
+ $ a. Create /etc/docker/daemon.json
+ $ b. sudo systemctl daemon-reload
+ $ sudo systemctl restart docker
$ 8. DOCKER_BUILDKIT=0 docker compose build --no-cache
$ 9. docker compose up -d
From 84700787cbe59a4afbc7724936e1600991fc66e2 Mon Sep 17 00:00:00 2001
From: Garrett Hempy <124597769+ghempy53@users.noreply.github.com>
Date: Wed, 3 Dec 2025 22:22:15 -0700
Subject: [PATCH 10/99] Update README.md
---
README.md | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index 7d75af519..6ecc42428 100644
--- a/README.md
+++ b/README.md
@@ -48,7 +48,8 @@ or
$ 7. Disable IPv6 on your Raspberry Pi
$ a. Create /etc/docker/daemon.json
$ b. sudo systemctl daemon-reload
- $ sudo systemctl restart docker
+ $ c. sudo systemctl restart docker
+ $ d. sudo sysctl -p
$ 8. DOCKER_BUILDKIT=0 docker compose build --no-cache
$ 9. docker compose up -d
From bb6fc30f9beb82b27798e6e1bf5cc1eebe5e7616 Mon Sep 17 00:00:00 2001
From: Garrett Hempy <124597769+ghempy53@users.noreply.github.com>
Date: Wed, 3 Dec 2025 22:31:26 -0700
Subject: [PATCH 11/99] Update README.md
---
README.md | 22 ++++++++++++++++++----
1 file changed, 18 insertions(+), 4 deletions(-)
diff --git a/README.md b/README.md
index 6ecc42428..cdc9a57b2 100644
--- a/README.md
+++ b/README.md
@@ -46,10 +46,24 @@ or
$ 5. Create .env file with secret Discord data
$ 6. Install Docker
$ 7. Disable IPv6 on your Raspberry Pi
- $ a. Create /etc/docker/daemon.json
- $ b. sudo systemctl daemon-reload
- $ c. sudo systemctl restart docker
- $ d. sudo sysctl -p
+ $ a. sudo nano /etc/docker/daemon.json
+ Copy this text into the file
+ {
+ "ipv6": false,
+ "experimental": false,
+ "features": {
+ "buildkit": false
+ }
+ }
+ $ b. sudo nano /etc/sysctl.conf
+ $ c. Add these lines at the bottom of the file
+ $ net.ipv6.conf.all.disable_ipv6 = 1
+ $ net.ipv6.conf.default.disable_ipv6 = 1
+ $ d. sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1
+ sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1
+ $ e. sudo systemctl daemon-reload
+ $ f. sudo systemctl restart docker
+ $ g. sudo sysctl -p
$ 8. DOCKER_BUILDKIT=0 docker compose build --no-cache
$ 9. docker compose up -d
From cef1f0b879c05e11488f5117e27b14b6d72a22c6 Mon Sep 17 00:00:00 2001
From: Garrett Hempy <124597769+ghempy53@users.noreply.github.com>
Date: Wed, 3 Dec 2025 22:32:53 -0700
Subject: [PATCH 12/99] Update README.md
---
README.md | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/README.md b/README.md
index cdc9a57b2..928175e68 100644
--- a/README.md
+++ b/README.md
@@ -55,15 +55,15 @@ or
"buildkit": false
}
}
+ sudo systemctl daemon-reload
$ b. sudo nano /etc/sysctl.conf
$ c. Add these lines at the bottom of the file
$ net.ipv6.conf.all.disable_ipv6 = 1
$ net.ipv6.conf.default.disable_ipv6 = 1
$ d. sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1
sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1
- $ e. sudo systemctl daemon-reload
+ $ e. sudo sysctl -p
$ f. sudo systemctl restart docker
- $ g. sudo sysctl -p
$ 8. DOCKER_BUILDKIT=0 docker compose build --no-cache
$ 9. docker compose up -d
From 4721f3f692e340d5ca02cb0799fbef133569a08f Mon Sep 17 00:00:00 2001
From: Garrett Hempy <124597769+ghempy53@users.noreply.github.com>
Date: Wed, 3 Dec 2025 22:33:40 -0700
Subject: [PATCH 13/99] Update README.md
---
README.md | 13 +++++++------
1 file changed, 7 insertions(+), 6 deletions(-)
diff --git a/README.md b/README.md
index 928175e68..345c0afd6 100644
--- a/README.md
+++ b/README.md
@@ -42,10 +42,11 @@ or
$ 1. Install Git
$ 2. Clone HondaBot onto the Raspberry Pi using SSH
$ 3. Install npm and NodeJS v22 or higher
- $ 4. sudo ./update.sh
- $ 5. Create .env file with secret Discord data
- $ 6. Install Docker
- $ 7. Disable IPv6 on your Raspberry Pi
+ $ 4. npm install
+ $ 5. sudo ./update.sh
+ $ 6. Create .env file with secret Discord data
+ $ 7. Install Docker
+ $ 8. Disable IPv6 on your Raspberry Pi
$ a. sudo nano /etc/docker/daemon.json
Copy this text into the file
{
@@ -64,8 +65,8 @@ or
sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1
$ e. sudo sysctl -p
$ f. sudo systemctl restart docker
- $ 8. DOCKER_BUILDKIT=0 docker compose build --no-cache
- $ 9. docker compose up -d
+ $ 9. DOCKER_BUILDKIT=0 docker compose build --no-cache
+ $ 10. docker compose up -d
## Updating Docker IPv4 Hosts
```
From df62779896223c205a2a7b05736aebca1b6d5753 Mon Sep 17 00:00:00 2001
From: Garrett Hempy <124597769+ghempy53@users.noreply.github.com>
Date: Wed, 3 Dec 2025 23:02:46 -0700
Subject: [PATCH 14/99] Update README.md
---
README.md | 28 ++++++++++------------------
1 file changed, 10 insertions(+), 18 deletions(-)
diff --git a/README.md b/README.md
index 345c0afd6..dcb423110 100644
--- a/README.md
+++ b/README.md
@@ -47,24 +47,16 @@ or
$ 6. Create .env file with secret Discord data
$ 7. Install Docker
$ 8. Disable IPv6 on your Raspberry Pi
- $ a. sudo nano /etc/docker/daemon.json
- Copy this text into the file
- {
- "ipv6": false,
- "experimental": false,
- "features": {
- "buildkit": false
- }
- }
- sudo systemctl daemon-reload
- $ b. sudo nano /etc/sysctl.conf
- $ c. Add these lines at the bottom of the file
- $ net.ipv6.conf.all.disable_ipv6 = 1
- $ net.ipv6.conf.default.disable_ipv6 = 1
- $ d. sudo sysctl -w net.ipv6.conf.all.disable_ipv6=1
- sudo sysctl -w net.ipv6.conf.default.disable_ipv6=1
- $ e. sudo sysctl -p
- $ f. sudo systemctl restart docker
+ $ a. sudo nano /etc/hosts
+ $ b. getent ahosts registry-1.docker.io | grep -v ":" | head -1
+ $ c. getent ahosts auth.docker.io | grep -v ":" | head -1
+ $ d. getent ahosts production.cloudflare.docker.com | grep -v ":" | head -1
+ $ e. sudo tee -a /etc/hosts << 'EOF'
+ REGISTRY_IP registry-1.docker.io
+ AUTH_DOCKER_IP auth.docker.io
+ CLOUDFARE_IP production.cloudflare.docker.com
+ EOF
+ $ g. sudo systemctl restart docker
$ 9. DOCKER_BUILDKIT=0 docker compose build --no-cache
$ 10. docker compose up -d
From 4bee7ba9ca5dd6840d02cca5907c7ec0ed1a3cc4 Mon Sep 17 00:00:00 2001
From: Garrett Hempy <124597769+ghempy53@users.noreply.github.com>
Date: Wed, 3 Dec 2025 23:05:10 -0700
Subject: [PATCH 15/99] Update README.md
---
README.md | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/README.md b/README.md
index dcb423110..8a4d2bb51 100644
--- a/README.md
+++ b/README.md
@@ -46,7 +46,8 @@ or
$ 5. sudo ./update.sh
$ 6. Create .env file with secret Discord data
$ 7. Install Docker
- $ 8. Disable IPv6 on your Raspberry Pi
+ $ 8. Create and run update-docker-hosts OR
+ $ 8. Disable IPv6 on your Raspberry Pi (Manual Steps)
$ a. sudo nano /etc/hosts
$ b. getent ahosts registry-1.docker.io | grep -v ":" | head -1
$ c. getent ahosts auth.docker.io | grep -v ":" | head -1
From 6e2a65fbacfb2f3f8e62cf75a8836e94df36156d Mon Sep 17 00:00:00 2001
From: Garrett Hempy <124597769+ghempy53@users.noreply.github.com>
Date: Wed, 3 Dec 2025 23:08:51 -0700
Subject: [PATCH 16/99] Update README.md
---
README.md | 44 +++++++++++++++++++++++---------------------
1 file changed, 23 insertions(+), 21 deletions(-)
diff --git a/README.md b/README.md
index 8a4d2bb51..962d30894 100644
--- a/README.md
+++ b/README.md
@@ -39,27 +39,29 @@ or
## Running on Raspberry Pi with Docker
- $ 1. Install Git
- $ 2. Clone HondaBot onto the Raspberry Pi using SSH
- $ 3. Install npm and NodeJS v22 or higher
- $ 4. npm install
- $ 5. sudo ./update.sh
- $ 6. Create .env file with secret Discord data
- $ 7. Install Docker
- $ 8. Create and run update-docker-hosts OR
- $ 8. Disable IPv6 on your Raspberry Pi (Manual Steps)
- $ a. sudo nano /etc/hosts
- $ b. getent ahosts registry-1.docker.io | grep -v ":" | head -1
- $ c. getent ahosts auth.docker.io | grep -v ":" | head -1
- $ d. getent ahosts production.cloudflare.docker.com | grep -v ":" | head -1
- $ e. sudo tee -a /etc/hosts << 'EOF'
- REGISTRY_IP registry-1.docker.io
- AUTH_DOCKER_IP auth.docker.io
- CLOUDFARE_IP production.cloudflare.docker.com
- EOF
- $ g. sudo systemctl restart docker
- $ 9. DOCKER_BUILDKIT=0 docker compose build --no-cache
- $ 10. docker compose up -d
+```
+1. Install Git
+2. Clone HondaBot onto the Raspberry Pi using SSH
+3. Install npm and NodeJS v22 or higher
+4. npm install
+5. sudo ./update.sh
+6. Create .env file with secret Discord data
+7. Install Docker
+8. Create and run update-docker-hosts OR
+9. Disable IPv6 on your Raspberry Pi (Manual Steps)
+ a. getent ahosts registry-1.docker.io | grep -v ":" | head -1
+ b. getent ahosts auth.docker.io | grep -v ":" | head -1
+ c. getent ahosts production.cloudflare.docker.com | grep -v ":" | head -1
+ d. sudo nano /etc/hosts
+ e. Copy the IP address from each command to the end of the file
+ REGISTRY_IP registry-1.docker.io
+ AUTH_DOCKER_IP auth.docker.io
+ CLOUDFARE_IP production.cloudflare.docker.com
+
+ f. sudo systemctl restart docker
+10. DOCKER_BUILDKIT=0 docker compose build --no-cache
+11. docker compose up -d
+```
## Updating Docker IPv4 Hosts
```
From b85bc7982bdbaaa09fb7f9231cfa538c35106d16 Mon Sep 17 00:00:00 2001
From: ghempy53
Date: Wed, 17 Dec 2025 19:00:14 -0700
Subject: [PATCH 17/99] Updating Dockerfile
---
Dockerfile | 27 +++++++++++++++++----------
1 file changed, 17 insertions(+), 10 deletions(-)
diff --git a/Dockerfile b/Dockerfile
index 11807d2bf..ef73c18ee 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -1,17 +1,24 @@
-FROM node:18
+# Use ARM64 Node base image
+FROM arm64v8/node:22-bookworm
-RUN apt-get update && apt-get install -y graphicsmagick && apt-get clean
+# Install dependencies (GraphicsMagick if needed)
+RUN apt-get update \
+ && apt-get install -y graphicsmagick \
+ && apt-get clean \
+ && rm -rf /var/lib/apt/lists/*
+# Set working directory
WORKDIR /app
-COPY package.json /app/package.json
-COPY package-lock.json /app/package-lock.json
+# Copy package files and install
+COPY package.json package-lock.json ./
RUN npm install
-COPY . /app
-VOLUME [ "/app/credentials" ]
-VOLUME [ "/app/instances" ]
-VOLUME [ "/app/logs" ]
-VOLUME [ "/app/maps" ]
+# Copy all local code
+COPY . .
-CMD ["npm", "start"]
+# Expose volumes for persistent data
+VOLUME [ "/app/credentials", "/app/instances", "/app/logs", "/app/maps" ]
+
+# Run bot
+CMD ["npm", "start", "run"]
From cf0fa7783dd42227ecc749ceb6f040225e4b5e7c Mon Sep 17 00:00:00 2001
From: ghempy53
Date: Wed, 17 Dec 2025 19:02:48 -0700
Subject: [PATCH 18/99] Updating docker-compose.yml
---
docker-compose.yml | 28 ++++++++++++++++------------
1 file changed, 16 insertions(+), 12 deletions(-)
diff --git a/docker-compose.yml b/docker-compose.yml
index 5e2344988..d2ae68e41 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -1,13 +1,17 @@
-version: '3.3'
services:
- app:
- volumes:
- - ./credentials:/app/credentials
- - ./instances:/app/instances
- - ./logs:/app/logs
- - ./maps:/app/maps
- environment:
- - RPP_DISCORD_CLIENT_ID=111....1111
- - RPP_DISCORD_TOKEN=token
- container_name: rpp
- image: ghcr.io/alexemanuelol/rustplusplus
+ hondabot:
+ build: .
+ container_name: HondaBot
+ restart: always
+ volumes:
+ - ./credentials:/app/credentials
+ - ./instances:/app/instances
+ - ./logs:/app/logs
+ - ./maps:/app/maps
+ environment:
+ - RPP_DISCORD_CLIENT_ID=${RPP_DISCORD_CLIENT_ID}
+ - RPP_DISCORD_TOKEN=${RPP_DISCORD_TOKEN}
+ - RPP_DISCORD_USERNAME=${RPP_DISCORD_USERNAME}
+ mem_limit: 600m
+ cpus: 0.8
+
From 6f50ab8fca639cf319445ddca0267788502038a5 Mon Sep 17 00:00:00 2001
From: ghempy53
Date: Wed, 17 Dec 2025 19:03:30 -0700
Subject: [PATCH 19/99] Updating en,json to prevent time command breaking the
chat filter
---
src/languages/en.json | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/languages/en.json b/src/languages/en.json
index bb5fb961d..efb2050c2 100644
--- a/src/languages/en.json
+++ b/src/languages/en.json
@@ -713,7 +713,7 @@
"timeSinceWipe": "{time} since wipe.",
"timeTill": "Time till {event}",
"timeTillDaylight": "{time} before daylight.",
- "timeTillNightfall": "{time} before nightfall.",
+ "timeTillNightfall": "{time} before nitetime.",
"timeTillStructureDecay": "{time} before {type} wall decay.",
"timeUntilUnlocksAt": "{time} until unlocks at {location}.",
"timer": "Timer: {message}.",
@@ -787,4 +787,4 @@
"yield": "Yield",
"youAreAlreadyLeader": "You are already leader.",
"youAreNotPairedWithServer": "Leader command does not work because you're not paired with the server."
-}
\ No newline at end of file
+}
From 988294c780da9cff6328730bf6941f38dbf84638 Mon Sep 17 00:00:00 2001
From: ghempy53
Date: Wed, 17 Dec 2025 19:05:39 -0700
Subject: [PATCH 20/99] Updating package.json
---
package.json | 6 +++---
1 file changed, 3 insertions(+), 3 deletions(-)
diff --git a/package.json b/package.json
index 2657f40c2..314482b44 100644
--- a/package.json
+++ b/package.json
@@ -1,10 +1,10 @@
{
- "name": "rustplusplus",
+ "name": "HondaBot",
"version": "1.22.0",
"description": "A NodeJS Discord Bot that uses the rustplus.js library to utilize the power of the Rust+ Companion App with additional Quality-of-Life features.",
"main": "index.ts",
"scripts": {
- "start": "ts-node .",
+ "start": "node --max-old-space-size=1536 -r ts-node/register .",
"preinstall": "npx npm-force-resolutions",
"test": "tsc --noEmit -p ."
},
@@ -42,4 +42,4 @@
"jpeg-js": "0.4.4",
"protobufjs": "7.2.4"
}
-}
\ No newline at end of file
+}
From 3a7d8348644ba45dc5192830bf297e7419f840db Mon Sep 17 00:00:00 2001
From: Garrett Hempy
Date: Thu, 18 Dec 2025 11:02:53 -0700
Subject: [PATCH 21/99] Adding prices to market search sell commands in game
---
src/structures/RustPlus.js | 119 +++++++++++++++++++++++++++++++++++--
1 file changed, 114 insertions(+), 5 deletions(-)
diff --git a/src/structures/RustPlus.js b/src/structures/RustPlus.js
index 39820fa6a..f97abfc95 100644
--- a/src/structures/RustPlus.js
+++ b/src/structures/RustPlus.js
@@ -1713,6 +1713,8 @@ class RustPlus extends RustPlusLib {
switch (subcommand) {
case commandSearchEn:
case commandSearch: {
+ const MAX_MESSAGE_LENGTH = 129;
+
if (!['all', 'buy', 'sell'].includes(orderType)) {
return Client.client.intlGet(this.guildId, 'notAValidOrderType', {
order: orderType
@@ -1726,7 +1728,8 @@ class RustPlus extends RustPlusLib {
});
}
- const locations = [];
+ // Collect all matching orders with full details
+ const orders = [];
for (const vendingMachine of this.mapMarkers.vendingMachines) {
if (!vendingMachine.hasOwnProperty('sellOrders')) continue;
@@ -1744,17 +1747,123 @@ class RustPlus extends RustPlusLib {
(orderItemId === parseInt(itemId) || orderCurrencyId === parseInt(itemId))) ||
(orderType === 'buy' && orderCurrencyId === parseInt(itemId)) ||
(orderType === 'sell' && orderItemId === parseInt(itemId))) {
- if (locations.includes(vendingMachine.location.location)) continue;
- locations.push(vendingMachine.location.location);
+
+ const orderItemName = orderItemId ?
+ Client.client.items.getName(orderItemId) : 'Unknown';
+ const orderCurrencyName = orderCurrencyId ?
+ Client.client.items.getName(orderCurrencyId) : 'Unknown';
+
+ orders.push({
+ location: vendingMachine.location.location,
+ quantity: order.quantity,
+ itemName: orderItemName,
+ costPerItem: order.costPerItem,
+ currencyName: orderCurrencyName,
+ itemIsBlueprint: order.itemIsBlueprint,
+ currencyIsBlueprint: order.currencyIsBlueprint
+ });
}
}
}
- if (locations.length === 0) {
+ if (orders.length === 0) {
return Client.client.intlGet(this.guildId, 'noItemFound');
}
- return locations.join(', ');
+ // Group by currency, then sort:
+ // 1. Groups ordered by their lowest price (best deal currency first)
+ // 2. Within each group, sorted by price (lowest first)
+
+ // First, group orders by currency
+ const groupedByCurrency = {};
+ for (const order of orders) {
+ const key = order.currencyName;
+ if (!groupedByCurrency[key]) {
+ groupedByCurrency[key] = [];
+ }
+ groupedByCurrency[key].push(order);
+ }
+
+ // Sort each currency group by price (lowest first)
+ for (const currency in groupedByCurrency) {
+ groupedByCurrency[currency].sort((a, b) => a.costPerItem - b.costPerItem);
+ }
+
+ // Sort currency groups by their lowest price
+ const sortedCurrencies = Object.keys(groupedByCurrency).sort((a, b) => {
+ const lowestA = groupedByCurrency[a][0].costPerItem;
+ const lowestB = groupedByCurrency[b][0].costPerItem;
+ return lowestA - lowestB;
+ });
+
+ // Flatten back into a single sorted array
+ const sortedOrders = [];
+ for (const currency of sortedCurrencies) {
+ sortedOrders.push(...groupedByCurrency[currency]);
+ }
+ orders.length = 0;
+ orders.push(...sortedOrders);
+
+ // Format each order as a string: [G10] 1x AK47 for 500x Scrap
+ const formatOrder = (order) => {
+ const bpItem = order.itemIsBlueprint ? ' BP' : '';
+ const bpCurrency = order.currencyIsBlueprint ? ' BP' : '';
+ return `[${order.location}] ${order.quantity}x ${order.itemName}${bpItem} for ${order.costPerItem}x ${order.currencyName}${bpCurrency}`;
+ };
+
+ const formattedOrders = orders.map(formatOrder);
+
+ // Account for trademark in message length calculation
+ const trademark = this.generalSettings.trademark;
+ const trademarkString = (trademark === 'NOT SHOWING') ? '' : `${trademark} | `;
+ const availableLength = MAX_MESSAGE_LENGTH - trademarkString.length;
+
+ // If 1-2 orders and they fit in one message, return single string
+ if (orders.length <= 2) {
+ const combined = formattedOrders.join(' | ');
+ if (combined.length <= availableLength) {
+ return combined;
+ }
+ }
+
+ // Split into multiple messages, never splitting an order across messages
+ const messages = [];
+ let currentMessage = '';
+ const separator = ' | ';
+
+ for (const orderStr of formattedOrders) {
+ // If this single order is too long by itself, truncate it
+ if (orderStr.length > availableLength) {
+ if (currentMessage) {
+ messages.push(currentMessage);
+ currentMessage = '';
+ }
+ messages.push(orderStr.substring(0, availableLength - 3) + '...');
+ continue;
+ }
+
+ const potentialMessage = currentMessage
+ ? currentMessage + separator + orderStr
+ : orderStr;
+
+ if (potentialMessage.length <= availableLength) {
+ currentMessage = potentialMessage;
+ } else {
+ // Current message is full, push it and start new one
+ if (currentMessage) {
+ messages.push(currentMessage);
+ }
+ currentMessage = orderStr;
+ }
+ }
+
+ // Don't forget the last message
+ if (currentMessage) {
+ messages.push(currentMessage);
+ }
+
+ // Return array for multiple messages, or single string for one
+ return messages.length === 1 ? messages[0] : messages;
} break;
case commandSubEn:
From 74b2f539fb42b5d1df63fca645f2d1a8046025c2 Mon Sep 17 00:00:00 2001
From: Garrett Hempy
Date: Thu, 18 Dec 2025 11:20:31 -0700
Subject: [PATCH 22/99] Whitespace
---
docker-compose.yml | 1 -
1 file changed, 1 deletion(-)
diff --git a/docker-compose.yml b/docker-compose.yml
index d2ae68e41..56166c728 100644
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -14,4 +14,3 @@ services:
- RPP_DISCORD_USERNAME=${RPP_DISCORD_USERNAME}
mem_limit: 600m
cpus: 0.8
-
From 1c28ac1b04d114a18f91a9264851cfda677fffe9 Mon Sep 17 00:00:00 2001
From: Garrett Hempy
Date: Thu, 18 Dec 2025 11:34:17 -0700
Subject: [PATCH 23/99] Updating
---
src/discordEvents/ready.js | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)
diff --git a/src/discordEvents/ready.js b/src/discordEvents/ready.js
index e46a36053..1abae1885 100644
--- a/src/discordEvents/ready.js
+++ b/src/discordEvents/ready.js
@@ -46,12 +46,13 @@ module.exports = {
client.log(client.intlGet(null, 'warningCap'), client.intlGet(null, 'ignoreSetUsername'));
}
- try {
+ // COMMENTING THIS OUT FOR CUSTOM DISCORD BOT IMAGE
+ /*try {
await client.user.setAvatar(Path.join(__dirname, '..', 'resources/images/rustplusplus_logo.png'));
}
catch (e) {
client.log(client.intlGet(null, 'warningCap'), client.intlGet(null, 'ignoreSetAvatar'));
- }
+ }*/
client.user.setPresence({
activities: [{ name: '/help', type: Discord.ActivityType.Listening }],
From f8bf3c6ecfa1a69f6ef71dd962d2b0217804fb38 Mon Sep 17 00:00:00 2001
From: Garrett Hempy
Date: Thu, 18 Dec 2025 11:46:22 -0700
Subject: [PATCH 24/99] Adding HondaBot logo
---
src/resources/images/hondabot_logo.png | Bin 0 -> 403223 bytes
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 src/resources/images/hondabot_logo.png
diff --git a/src/resources/images/hondabot_logo.png b/src/resources/images/hondabot_logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..77bcf82f4f04c497e480360ff339302df32a9583
GIT binary patch
literal 403223
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
;qG>dg%bj5%ry;Y&wp1SOX
zX4?6YT;J?0F9LbXT{wLGksUXsvuihP5zn1oJ#jUbauDL_NBg6l@+GiUm
zD?cf_h5tq}nI<{T${dGqgu{jN{qZXzdOlQtxEfcSHto8iK!2+*BX0HO|J=-z7Q9Rr
z^Da;DY5p*$scw57zTIc)XF=bb9IyeKTXj9wd-@4%YW46sc|${Lx(;dPAO?3}V(x9U
zAMXMw8tTyc7WvPUmroX}y3m=bn*~-4NEtm)3AAKSE5k~hXmGe&4BIcPc@5b=W2cbb
z951mCgCoD8;<{ns;ItSh;H87}=)$XYdaTz$rHOjW
z(X#Vn8z3FWf|_U30Jjyp`CI9UANuBF)|CSBk&KZg+U~Qfhe||$39o-2=^`&KG1htf
zdrBi!Uli4QhRaZLoIs4L#3e@ZrBawMUMkLGC#9#XgcuTM$uy@zfX%*_$P~w{c)h|a
zp!WJhx{6&BktKZhv4$JmbKn^P)sMp1E~Se4mGRxbA8Iyq`idE8HDcBD*4HkuuNtHI
zC^Yh2R18n%bJX%v!`X0sd$dOCnDUOs&
zDAQ5-X_t!;k5|lq0B6{%{t8Vt`o{AZm2G9T>>JEBV&|TsjlggR8!H26D)X50f
zN&snL4Qh=z