Moved some more files into separate folders

This commit is contained in:
2026-03-01 11:39:19 +01:00
parent ae9b1f3ba0
commit df7583263a
8 changed files with 137 additions and 120 deletions
+2 -78
View File
@@ -1,83 +1,7 @@
use std::fmt::Display; use poise::serenity_prelude::{ChannelId, Mentionable};
use poise::serenity_prelude::{ChannelId, Mentionable, User};
use tokio::sync::MutexGuard; use tokio::sync::MutexGuard;
use crate::{Context, Error, db::generic::get_json_mutex, lang, messages::{http_send_msg, send_msg}}; use crate::{Context, Error, db::generic::get_json_mutex, games::wwrps::{RPS, RPSGame, RPSPlayer}, lang, messages::{http_send_msg, send_msg}};
#[derive(poise::ChoiceParameter, PartialEq, Clone, Debug)]
#[repr(u8)]
pub enum RPS {
Paper = 0,
Rock = 1,
Scissors = 2
}
#[derive(Clone)]
pub struct RPSPlayer {
pub selection: RPS,
pub user: User,
pub wwrps_channel: ChannelId,
pub anonymous: bool
}
#[derive(Clone)]
pub struct RPSGame {
pub players: [Option<RPSPlayer>; 2],
}
impl Display for RPS {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
return match self {
Self::Paper => write!(f, "Paper"),
Self::Rock => write!(f, "Rock"),
Self::Scissors => write!(f, "Scissors")
};
}
}
impl RPSGame {
pub fn new() -> Self {
return RPSGame {
players: [None, None],
}
}
/// Returns wether the lobby is filled or not
pub fn add_player(&mut self, player: RPSPlayer) -> Result<bool, Error> {
if let Some(p1) = &self.players[0]
{ if p1.user == player.user { return Err(Error::from("Cannot add player, it already exists!")); }}
if self.players[0].is_none() { self.players[0] = Some(player); return Ok(false); }
else if self.players[1].is_none() { self.players[1] = Some(player); return Ok(true); }
else { return Err(Error::from("Cannot add player, list is full!")); }
}
pub fn clear(&mut self)
{ self.players = [None, None]; }
pub fn get_winner(&self) -> Option<i8> {
if self.players.iter().any(|i| i.is_none())
{ return None; }
let Some(p1) = self.players[0].clone() else { return None; };
let Some(p2) = self.players[1].clone() else { return None; };
let i1 = p1.selection as u8;
let i2 = p2.selection as u8;
if i1 == i2 { return None; }
else if (i1 + 1) % 3 == i2 { return Some(0); }
else { return Some(1); }
}
pub fn is_full_lobby(&self) -> bool
{ return self.players.iter().all(|i| i.is_some()); }
}
#[poise::command( #[poise::command(
+2
View File
@@ -1,4 +1,6 @@
pub mod bot_data;
pub mod cfg; pub mod cfg;
pub mod terminal_args;
pub mod discord; pub mod discord;
pub mod generic; pub mod generic;
pub mod keys; pub mod keys;
+18
View File
@@ -0,0 +1,18 @@
use serde_json::Value;
use tokio::sync::Mutex;
use crate::{db::terminal_args::Args, games::wwrps::RPSGame, lang::Lang};
pub struct Data {
pub owners: Vec<u64>,
pub ball_prompts: [Vec<String>; 2],
pub rps_game: Mutex<RPSGame>,
pub reddit_data: Mutex<Option<Value>>,
pub discord_data: Mutex<Option<Value>>,
pub cfg: Mutex<Option<toml::Value>>,
pub bk_mods: Vec<u64>,
pub args: Args,
pub lang_name: Mutex<String>,
pub lang: Mutex<Lang>
}
+30
View File
@@ -0,0 +1,30 @@
use clap::Parser;
use serde::Serialize;
#[derive(Parser, Serialize, Clone)]
pub struct Args {
#[arg(short = 'p', long, default_value = "2920", help = "Sets the port number, e.g 2200.")]
pub port: u16,
#[arg(long, help = "Runs only the Python part of the program.")]
pub py: bool,
#[arg(long, help = "Runs only the Rust part of the program.")]
pub rs: bool,
#[arg(short = 'd', long, help = "Enables dev mode. Dev mode shows more debug info and turns off certain security measures.")]
pub dev: bool,
#[arg(short = 'w', long, help = "Wipes all data before running the program.")]
pub wipe: bool,
#[arg(short = 't', long, help = "Makes the program use the ASSISTANT_TOKEN_TEST env var instead of ASSISTANT_TOKEN. This env var should hold the token of a non-production bot.")]
pub test: bool,
#[arg(long, help = "Adds annoying prints when the websockets send a ping. Why though?")]
pub ping: bool,
#[arg(long, help = "Makes the program not use the schedule system.")]
pub nosched: bool
}
+1
View File
@@ -0,0 +1 @@
pub mod wwrps;
+79
View File
@@ -0,0 +1,79 @@
use std::fmt::Display;
use poise::serenity_prelude::{ChannelId, User};
use crate::Error;
#[derive(poise::ChoiceParameter, PartialEq, Clone, Debug)]
#[repr(u8)]
pub enum RPS {
Paper = 0,
Rock = 1,
Scissors = 2
}
#[derive(Clone)]
pub struct RPSPlayer {
pub selection: RPS,
pub user: User,
pub wwrps_channel: ChannelId,
pub anonymous: bool
}
#[derive(Clone)]
pub struct RPSGame {
pub players: [Option<RPSPlayer>; 2],
}
impl Display for RPS {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
return match self {
Self::Paper => write!(f, "Paper"),
Self::Rock => write!(f, "Rock"),
Self::Scissors => write!(f, "Scissors")
};
}
}
impl RPSGame {
pub fn new() -> Self {
return RPSGame {
players: [None, None],
}
}
/// Returns wether the lobby is filled or not
pub fn add_player(&mut self, player: RPSPlayer) -> Result<bool, Error> {
if let Some(p1) = &self.players[0]
{ if p1.user == player.user { return Err(Error::from("Cannot add player, it already exists!")); }}
if self.players[0].is_none() { self.players[0] = Some(player); return Ok(false); }
else if self.players[1].is_none() { self.players[1] = Some(player); return Ok(true); }
else { return Err(Error::from("Cannot add player, list is full!")); }
}
pub fn clear(&mut self)
{ self.players = [None, None]; }
pub fn get_winner(&self) -> Option<i8> {
if self.players.iter().any(|i| i.is_none())
{ return None; }
let Some(p1) = self.players[0].clone() else { return None; };
let Some(p2) = self.players[1].clone() else { return None; };
let i1 = p1.selection as u8;
let i2 = p2.selection as u8;
if i1 == i2 { return None; }
else if (i1 + 1) % 3 == i2 { return Some(0); }
else { return Some(1); }
}
pub fn is_full_lobby(&self) -> bool
{ return self.players.iter().all(|i| i.is_some()); }
}
+1 -1
View File
@@ -6,9 +6,9 @@ use poise::serenity_prelude::Client;
use tokio::sync::Mutex; use tokio::sync::Mutex;
use toml::Value; use toml::Value;
use crate::cmds::generic::wwrps::RPSGame;
use crate::db::{cfg, discord, reddit}; use crate::db::{cfg, discord, reddit};
use crate::db::generic::get_toml_mutex; use crate::db::generic::get_toml_mutex;
use crate::games::wwrps::RPSGame;
use crate::lang::Lang; use crate::lang::Lang;
use crate::{Args, Cmd, Data, cmds, events, rs_println}; use crate::{Args, Cmd, Data, cmds, events, rs_println};
+4 -41
View File
@@ -11,73 +11,36 @@ mod macros;
mod websocket; mod websocket;
mod cmds; mod cmds;
mod db; mod db;
mod games;
mod schedule; mod schedule;
mod gen; mod gen;
mod lang; mod lang;
use std::process; use std::process;
use std::thread; use std::thread;
use std::time::Duration; use std::time::Duration;
use std::vec; use std::vec;
use std::error::Error as StdErr; use std::error::Error as StdErr;
use clap::Parser;
use r#gen::gen_bot; use r#gen::gen_bot;
use r#gen::gen_data; use r#gen::gen_data;
use poise::Command; use poise::Command;
use schedule::run_schedules; use schedule::run_schedules;
use serde::Serialize;
use serde_json::Value;
use tokio::runtime::Runtime; use tokio::runtime::Runtime;
use tokio::sync::Mutex;
use websocket::send_cmd_json; use websocket::send_cmd_json;
use crate::cmds::generic::wwrps::RPSGame; use crate::db::bot_data::Data;
use crate::db::terminal_args::Args;
use crate::db::generic::get_toml_mutex; use crate::db::generic::get_toml_mutex;
use crate::lang::Lang;
use crate::schedule::Schedule; use crate::schedule::Schedule;
#[derive(Parser, Serialize, Clone)]
struct Args {
#[arg(short = 'p', long, default_value = "2920", help = "Sets the port number, e.g 2200.")]
port: u16,
#[arg(long, help = "Runs only the Python part of the program.")]
py: bool,
#[arg(long, help = "Runs only the Rust part of the program.")]
rs: bool,
#[arg(short = 'd', long, help = "Enables dev mode. Dev mode shows more debug info and turns off certain security measures.")]
dev: bool,
#[arg(short = 'w', long, help = "Wipes all data before running the program.")]
wipe: bool,
#[arg(short = 't', long, help = "Makes the program use the ASSISTANT_TOKEN_TEST env var instead of ASSISTANT_TOKEN. This env var should hold the token of a non-production bot.")]
test: bool,
#[arg(long, help = "Adds annoying prints when the websockets send a ping. Why though?")]
ping: bool,
#[arg(long, help = "Makes the program not use the schedule system.")]
nosched: bool
}
type Error = Box<dyn std::error::Error + Send + Sync>; type Error = Box<dyn std::error::Error + Send + Sync>;
type Context<'a> = poise::Context<'a, Data, Error>; type Context<'a> = poise::Context<'a, Data, Error>;
type Cmd = Command<Data, Box<dyn StdErr + Send + Sync>>; type Cmd = Command<Data, Box<dyn StdErr + Send + Sync>>;
struct Data {
owners: Vec<u64>,
ball_prompts: [Vec<String>; 2],
rps_game: Mutex<RPSGame>,
reddit_data: Mutex<Option<Value>>,
discord_data: Mutex<Option<Value>>,
cfg: Mutex<Option<toml::Value>>,
bk_mods: Vec<u64>,
args: Args,
lang_name: Mutex<String>,
lang: Mutex<Lang>
}
#[tokio::main] #[tokio::main]
async fn main() { async fn main() {
let args = <Args as clap::Parser>::parse(); let args = <Args as clap::Parser>::parse();