Add version command, implement Docker support, make sqlx offline work
Run cargo test / Run tests (push) Failing after 3m2s

This commit is contained in:
Elias Wendland
2026-07-04 23:27:05 +02:00
parent 6f5d66a0bc
commit b06bb882a8
24 changed files with 405 additions and 6 deletions
+3
View File
@@ -11,6 +11,7 @@ env:
CARGO_TERM_COLOR: always
DATABASE_URL: postgres://postgres:postgres@postgres:5432/tg_dev_srv_bot
DISCORD_TOKEN: testing
SQLX_OFFLINE: true
jobs:
test:
@@ -40,6 +41,8 @@ jobs:
- name: Set up Rust
uses: actions-rust-lang/setup-rust-toolchain@v1
with:
cache: false
- name: Run tests
run: cargo test --verbose
+1 -2
View File
@@ -1,4 +1,3 @@
/target
Cargo.lock
.env
.sqlx
.env
@@ -0,0 +1,29 @@
{
"db_name": "PostgreSQL",
"query": "SELECT enabled FROM auto_roles WHERE guild_id = $1 AND role_id = $2;",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "enabled",
"type_info": "Bool",
"origin": {
"Table": {
"table": "auto_roles",
"name": "enabled"
}
}
}
],
"parameters": {
"Left": [
"Int8",
"Int8"
]
},
"nullable": [
false
]
},
"hash": "0c8f32cf64dc47758f2f8a46e94cc33baf557a366d1092b6c7cb507e3678e5d4"
}
@@ -0,0 +1,28 @@
{
"db_name": "PostgreSQL",
"query": "SELECT role_id FROM auto_roles WHERE guild_id = $1",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "role_id",
"type_info": "Int8",
"origin": {
"Table": {
"table": "auto_roles",
"name": "role_id"
}
}
}
],
"parameters": {
"Left": [
"Int8"
]
},
"nullable": [
false
]
},
"hash": "38f5e0b163af3bcbf798b03a6806afd9edf1ab08c721a768aeffe6c0d6b31d4c"
}
@@ -0,0 +1,15 @@
{
"db_name": "PostgreSQL",
"query": "INSERT INTO admin_users (guild_id, user_id) VALUES ($1, $2);",
"describe": {
"columns": [],
"parameters": {
"Left": [
"Int8",
"Int8"
]
},
"nullable": []
},
"hash": "45366b9229d05e7807d8ffcc7c0ed7dd1b50f588d03c5dbaa24ea8a5f461b527"
}
@@ -0,0 +1,15 @@
{
"db_name": "PostgreSQL",
"query": "INSERT INTO auto_roles (guild_id, role_id, enabled) VALUES ($1, $2, false) ON CONFLICT (guild_id) DO UPDATE SET role_id = $2;",
"describe": {
"columns": [],
"parameters": {
"Left": [
"Int8",
"Int8"
]
},
"nullable": []
},
"hash": "46c3745dede4d63c3c3af709d254ddf70ca3d1086cccb5df401d66fd8c25bd0d"
}
@@ -0,0 +1,15 @@
{
"db_name": "PostgreSQL",
"query": "INSERT INTO admin_roles (guild_id, role_id) VALUES ($1, $2);",
"describe": {
"columns": [],
"parameters": {
"Left": [
"Int8",
"Int8"
]
},
"nullable": []
},
"hash": "49ed234a3f4bc1b1fa4536507240fd8ab8db848a6a8e099e47cd16062b28f24a"
}
@@ -0,0 +1,28 @@
{
"db_name": "PostgreSQL",
"query": "SELECT role_id FROM admin_roles WHERE guild_id = $1;",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "role_id",
"type_info": "Int8",
"origin": {
"Table": {
"table": "admin_roles",
"name": "role_id"
}
}
}
],
"parameters": {
"Left": [
"Int8"
]
},
"nullable": [
false
]
},
"hash": "5acd90d552bf8c84510bdfaa924e546a0d22801cd655ebe78a11d0046974077a"
}
@@ -0,0 +1,15 @@
{
"db_name": "PostgreSQL",
"query": "UPDATE auto_roles SET enabled = true WHERE guild_id = $1 AND role_id = $2;",
"describe": {
"columns": [],
"parameters": {
"Left": [
"Int8",
"Int8"
]
},
"nullable": []
},
"hash": "5b795c3345490c840df662e7b196bd843b8672b719467d70aebf5e328fc552ef"
}
@@ -0,0 +1,52 @@
{
"db_name": "PostgreSQL",
"query": "SELECT * FROM auto_roles WHERE guild_id = $1",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "guild_id",
"type_info": "Int8",
"origin": {
"Table": {
"table": "auto_roles",
"name": "guild_id"
}
}
},
{
"ordinal": 1,
"name": "role_id",
"type_info": "Int8",
"origin": {
"Table": {
"table": "auto_roles",
"name": "role_id"
}
}
},
{
"ordinal": 2,
"name": "enabled",
"type_info": "Bool",
"origin": {
"Table": {
"table": "auto_roles",
"name": "enabled"
}
}
}
],
"parameters": {
"Left": [
"Int8"
]
},
"nullable": [
false,
false,
false
]
},
"hash": "92926fc1d382bfe17a5d59dee41869a0fb3e68cbbb6663cba45d31af473a2047"
}
@@ -0,0 +1,15 @@
{
"db_name": "PostgreSQL",
"query": "DELETE FROM admin_roles WHERE guild_id = $1 AND role_id = $2;",
"describe": {
"columns": [],
"parameters": {
"Left": [
"Int8",
"Int8"
]
},
"nullable": []
},
"hash": "bc03a95110e097a105d826771ccd48ba64ca89117d8c717170d969861e2e77a5"
}
@@ -0,0 +1,28 @@
{
"db_name": "PostgreSQL",
"query": "SELECT role_id FROM auto_roles WHERE guild_id = $1 AND enabled = true",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "role_id",
"type_info": "Int8",
"origin": {
"Table": {
"table": "auto_roles",
"name": "role_id"
}
}
}
],
"parameters": {
"Left": [
"Int8"
]
},
"nullable": [
false
]
},
"hash": "c6f456f23b18ede825326b1c810ba34c1bc45c61e0d1a8b6f84d344727b4e659"
}
@@ -0,0 +1,28 @@
{
"db_name": "PostgreSQL",
"query": "SELECT user_id FROM admin_users WHERE guild_id = $1;",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "user_id",
"type_info": "Int8",
"origin": {
"Table": {
"table": "admin_users",
"name": "user_id"
}
}
}
],
"parameters": {
"Left": [
"Int8"
]
},
"nullable": [
false
]
},
"hash": "d6b3a99d36ac18c2b566c510972008fcd400ebac195e46ffa1b4ae790486c59b"
}
@@ -0,0 +1,28 @@
{
"db_name": "PostgreSQL",
"query": "SELECT role_id FROM admin_roles WHERE guild_id = $1",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "role_id",
"type_info": "Int8",
"origin": {
"Table": {
"table": "admin_roles",
"name": "role_id"
}
}
}
],
"parameters": {
"Left": [
"Int8"
]
},
"nullable": [
false
]
},
"hash": "dadde8070c69694e2b28f94bc0e09aa372adc28161996a66034f3d9d0f4cd2fa"
}
@@ -0,0 +1,15 @@
{
"db_name": "PostgreSQL",
"query": "UPDATE auto_roles SET enabled = false WHERE guild_id = $1 AND role_id = $2;",
"describe": {
"columns": [],
"parameters": {
"Left": [
"Int8",
"Int8"
]
},
"nullable": []
},
"hash": "e7dfaed40c69930178c568b4c38d0674d6d9329040f408e295f42ed2188acca5"
}
@@ -0,0 +1,15 @@
{
"db_name": "PostgreSQL",
"query": "DELETE FROM admin_users WHERE guild_id = $1 AND user_id = $2;",
"describe": {
"columns": [],
"parameters": {
"Left": [
"Int8",
"Int8"
]
},
"nullable": []
},
"hash": "f16fb5cebae76c9cf8ce0a18ba0b3f01172d93f22df62715b01e769781a13b20"
}
+1 -1
View File
@@ -1,6 +1,6 @@
[package]
name = "tg-dev-srv-bot"
version = "0.0.1"
version = "0.0.2"
edition = "2024"
[dependencies]
+9
View File
@@ -0,0 +1,9 @@
FROM rust:latest AS builder
WORKDIR /usr/src/tg-dev-srv-bot
COPY . .
RUN SQLX_OFFLINE=true cargo install --path .
FROM debian:bullseye-slim
RUN apt-get update && apt-get install -y ca-certificates && rm -rf /var/lib/apt/lists/*
COPY --from=builder /usr/local/cargo/bin/tg-dev-srv-bot /usr/local/bin/tg-dev-srv-bot
CMD ["tg-dev-srv-bot"]
+34
View File
@@ -0,0 +1,34 @@
services:
postgres:
image: postgres:16-alpine
container_name: tg-dev-srv-bot-postgres
restart: always
environment:
POSTGRES_USER: ${TG_BOT_POSTGRES_USER:-postgres}
POSTGRES_PASSWORD: ${TG_BOT_POSTGRES_PASSWORD:-postgres}
POSTGRES_DB: ${TG_BOT_POSTGRES_DB:-tg_dev_srv_bot}
ports:
- "5432:5432"
volumes:
- postgres_data:/var/lib/postgresql/data
healthcheck:
test: [ "CMD-SHELL", "pg_isready -U $${POSTGRES_USER:-postgres} -d $${POSTGRES_DB:-tg_dev_srv_bot}" ]
interval: 5s
timeout: 5s
retries: 5
tg-dev-srv-bot:
build:
context: .
dockerfile: DOCKERFILE
container_name: tg-dev-srv-bot
restart: always
depends_on:
- postgres
environment:
TG_BOT_DISCORD_TOKEN: ${TG_BOT_DISCORD_TOKEN}
TG_BOT_DATABASE_URL: ${TG_BOT_DATABASE_URL}
TG_BOT_LOG: ${TG_BOT_LOG}
volumes:
postgres_data:
driver: local
+2
View File
@@ -2,8 +2,10 @@ pub mod ping;
pub mod calc;
pub mod manage_admins;
pub mod manage_auto_role;
pub mod version;
pub use ping::ping;
pub use calc::calc;
pub use manage_admins::manage_admins;
pub use manage_auto_role::manage_auto_role;
pub use version::version;
+11 -1
View File
@@ -1,14 +1,24 @@
use crate::{Context, Error};
use poise::serenity_prelude as sere;
use tracing::{trace, debug};
use crate::shared_functions::trace_message;
/// Get the bot's current ping (back and forth)
#[poise::command(slash_command, prefix_command)]
pub async fn ping(ctx: Context<'_>) -> Result<(), Error> {
trace!("ping command called by user {} in guild {}", ctx.author().id.get(), ctx.guild_id().unwrap().get());
trace!("Calculating ping");
let command_time_in_microseconds = ctx.created_at().timestamp_micros();
trace!("Saved command time in microseconds");
let current_time_in_microseconds = sere::Timestamp::now().timestamp_micros();
trace!("Saved current time in microseconds");
let ping = (current_time_in_microseconds - command_time_in_microseconds) / 500;
trace!("Calculated ping: {}", ping);
// We divide by 1000 since we get the time in microseconds, and then multiply by 2 to get the roundtrip time
// This is arguably not the best way to calculate ping, since it assumes perfect clock accuracy, but I'm lazy
ctx.say(format!("Current ping: {} ms", ping)).await?;
let msg = format!("Current ping: {} ms", ping);
trace_message(msg.clone(), ctx.channel_id().to_string(), ctx.guild_id().unwrap().to_string()).await;
ctx.say(msg).await?;
debug!("Ping command performed for user {} with ping {}", ctx.author().name, ping);
Ok(())
}
+16
View File
@@ -0,0 +1,16 @@
use crate::{Context, Error};
use tracing::{trace, debug};
use crate::shared_functions::trace_message;
/// Get the bot's current version
#[poise::command(slash_command, prefix_command)]
pub async fn version(ctx: Context<'_>) -> Result<(), Error> {
trace!("version command called by user {} in guild {}", ctx.author().id.get(), ctx.guild_id().unwrap().get());
trace!("Loading version from environment");
let version = std::env::var("CARGO_PKG_VERSION").unwrap_or_else(|_| "Unknown".to_string());
let msg = format!("Current version: {}", version);
trace_message(msg.clone(), ctx.channel_id().to_string(), ctx.guild_id().unwrap().to_string()).await;
ctx.say(msg).await?;
debug!("Version command performed for user {} with version {}", ctx.author().name, version);
Ok(())
}
+2 -2
View File
@@ -1,6 +1,6 @@
use std::env;
use poise::serenity_prelude as sere;
use tracing::{info, warn, error, debug, trace};
use tracing::{info, error, debug, trace};
use tracing_subscriber::EnvFilter;
pub mod commands;
pub mod event_handler;
@@ -72,7 +72,7 @@ async fn main() {
event_handler: |ctx, event, framework, user_data| {
Box::pin(event_handler::event_handler(ctx, event, framework, user_data))
},
commands: vec![commands::ping(), commands::calc(), commands::manage_admins(), commands::manage_auto_role()],
commands: vec![commands::ping(), commands::calc(), commands::manage_admins(), commands::manage_auto_role(), commands::version()],
..Default::default()
})
.setup(|ctx, _ready, framework| {