feat: let's gong
This commit is contained in:
parent
34501bc413
commit
b7d1faebcf
36
apps/bot/src/bot/help.rs
Normal file
36
apps/bot/src/bot/help.rs
Normal file
@ -0,0 +1,36 @@
|
|||||||
|
use crate::bot::{Context, Error};
|
||||||
|
use poise::samples::HelpConfiguration;
|
||||||
|
use tracing::instrument;
|
||||||
|
|
||||||
|
/// Show help message
|
||||||
|
#[instrument(skip(ctx), level = "info",fields(channel = ctx.channel_id().get(), guild = ?ctx.guild_id().unwrap().get()))]
|
||||||
|
#[poise::command(prefix_command, slash_command, track_edits, category = "Utility")]
|
||||||
|
pub async fn help(
|
||||||
|
ctx: Context<'_>,
|
||||||
|
#[description = "Command to get help for"]
|
||||||
|
#[rest]
|
||||||
|
mut command: Option<String>,
|
||||||
|
) -> Result<(), Error> {
|
||||||
|
// This makes it possible to just make `help` a subcommand of any command
|
||||||
|
// `/fruit help` turns into `/help fruit`
|
||||||
|
// `/fruit help apple` turns into `/help fruit apple`
|
||||||
|
if ctx.invoked_command_name() != "help" {
|
||||||
|
command = match command {
|
||||||
|
Some(c) => Some(format!("{} {}", ctx.invoked_command_name(), c)),
|
||||||
|
None => Some(ctx.invoked_command_name().to_string()),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
let extra_text_at_bottom = "\
|
||||||
|
Provided by Mak with ❤️ and too much ☕";
|
||||||
|
|
||||||
|
let config = HelpConfiguration {
|
||||||
|
show_subcommands: true,
|
||||||
|
show_context_menu_commands: false,
|
||||||
|
ephemeral: true,
|
||||||
|
extra_text_at_bottom,
|
||||||
|
|
||||||
|
..Default::default()
|
||||||
|
};
|
||||||
|
poise::builtins::help(ctx, command.as_deref(), config).await?;
|
||||||
|
Ok(())
|
||||||
|
}
|
@ -1,12 +1,15 @@
|
|||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
|
|
||||||
use clickhouse_pool::pool_manager::PoolManager;
|
use clickhouse_pool::pool_manager::PoolManager;
|
||||||
|
use help::help;
|
||||||
use poise::serenity_prelude as serenity;
|
use poise::serenity_prelude as serenity;
|
||||||
use poise::serenity_prelude::GatewayIntents;
|
use poise::serenity_prelude::GatewayIntents;
|
||||||
use tracing::{info, instrument};
|
use tracing::{info, instrument};
|
||||||
|
|
||||||
use crate::config::Config;
|
use crate::config::Config;
|
||||||
|
|
||||||
|
pub mod help;
|
||||||
|
|
||||||
/// Displays your or another user's account creation date
|
/// Displays your or another user's account creation date
|
||||||
#[instrument(skip(ctx), level = "info", fields(channel_id = ctx.channel_id().get() , guild_id = ?ctx.guild_id(), user_id = ?ctx.author().id.get(), user_name = ctx.author().name))]
|
#[instrument(skip(ctx), level = "info", fields(channel_id = ctx.channel_id().get() , guild_id = ?ctx.guild_id(), user_id = ?ctx.author().id.get(), user_name = ctx.author().name))]
|
||||||
#[poise::command(slash_command, prefix_command)]
|
#[poise::command(slash_command, prefix_command)]
|
||||||
@ -44,7 +47,7 @@ pub async fn start_bot(config: Config, datalake_config: Arc<PoolManager>) {
|
|||||||
|
|
||||||
let framework = poise::Framework::builder()
|
let framework = poise::Framework::builder()
|
||||||
.options(poise::FrameworkOptions {
|
.options(poise::FrameworkOptions {
|
||||||
commands: vec![age()],
|
commands: vec![age(), help()],
|
||||||
prefix_options: poise::PrefixFrameworkOptions {
|
prefix_options: poise::PrefixFrameworkOptions {
|
||||||
prefix: Some(prefix),
|
prefix: Some(prefix),
|
||||||
..Default::default()
|
..Default::default()
|
||||||
|
135
libs/database/src/guild.rs
Normal file
135
libs/database/src/guild.rs
Normal file
@ -0,0 +1,135 @@
|
|||||||
|
use std::collections::HashMap;
|
||||||
|
|
||||||
|
use chrono::{DateTime, Utc};
|
||||||
|
use clickhouse::Row;
|
||||||
|
use clickhouse_pool::traits::Model;
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
#[derive(Debug, Clone, PartialEq, Row, Serialize, Deserialize)]
|
||||||
|
pub struct Guild {
|
||||||
|
pub id: u64,
|
||||||
|
pub bot_name: String,
|
||||||
|
pub enrolled: bool,
|
||||||
|
pub prefix: String,
|
||||||
|
pub moderator: Vec<u64>,
|
||||||
|
|
||||||
|
pub feature_flags: HashMap<String, bool>,
|
||||||
|
|
||||||
|
#[serde(with = "clickhouse::serde::chrono::datetime64::millis")]
|
||||||
|
pub created_at: DateTime<Utc>,
|
||||||
|
#[serde(with = "clickhouse::serde::chrono::datetime64::millis")]
|
||||||
|
pub updated_at: DateTime<Utc>,
|
||||||
|
pub creator_id: u64,
|
||||||
|
pub updater_id: u64,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Model for Guild {
|
||||||
|
type T = Guild;
|
||||||
|
|
||||||
|
fn table_name() -> &'static str {
|
||||||
|
"guild"
|
||||||
|
}
|
||||||
|
|
||||||
|
fn create_table_sql() -> &'static str {
|
||||||
|
r#"
|
||||||
|
CREATE TABLE IF NOT EXISTS guild (
|
||||||
|
id UInt64 PRIMARY KEY,
|
||||||
|
bot_name String,
|
||||||
|
enrolled Bool,
|
||||||
|
prefix String,
|
||||||
|
moderator Array(UInt64),
|
||||||
|
feature_flags Map(String, Bool),
|
||||||
|
created_at DateTime64(3),
|
||||||
|
updated_at DateTime64(3),
|
||||||
|
creator_id UInt64,
|
||||||
|
updater_id UInt64
|
||||||
|
) ENGINE = MergeTree()
|
||||||
|
ORDER BY (id)
|
||||||
|
"#
|
||||||
|
.trim()
|
||||||
|
}
|
||||||
|
|
||||||
|
fn column_names() -> Vec<&'static str> {
|
||||||
|
vec![
|
||||||
|
"id",
|
||||||
|
"bot_name",
|
||||||
|
"enrolled",
|
||||||
|
"prefix",
|
||||||
|
"moderator",
|
||||||
|
"feature_flags",
|
||||||
|
"created_at",
|
||||||
|
"updated_at",
|
||||||
|
"creator_id",
|
||||||
|
"updater_id",
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_row(&self) -> (Vec<&'static str>, Vec<String>) {
|
||||||
|
(
|
||||||
|
Self::column_names(),
|
||||||
|
vec![
|
||||||
|
self.id.to_string(),
|
||||||
|
self.bot_name.clone(),
|
||||||
|
self.enrolled.to_string(),
|
||||||
|
self.prefix.clone(),
|
||||||
|
format!("{:?}", self.moderator),
|
||||||
|
format!("{:?}", self.feature_flags),
|
||||||
|
self.created_at.to_rfc3339(),
|
||||||
|
self.updated_at.to_rfc3339(),
|
||||||
|
self.creator_id.to_string(),
|
||||||
|
self.updater_id.to_string(),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn insert_query(&self) -> String {
|
||||||
|
let (columns, values) = self.to_row();
|
||||||
|
let columns_str = columns.join(", ");
|
||||||
|
let values_str = values.join(", ");
|
||||||
|
|
||||||
|
format!(
|
||||||
|
"INSERT INTO {} ({}) VALUES ({})",
|
||||||
|
Self::table_name(),
|
||||||
|
columns_str,
|
||||||
|
values_str
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn batch_insert_query(items: &[Self::T]) -> String {
|
||||||
|
let mut queries = Vec::new();
|
||||||
|
for item in items {
|
||||||
|
let (columns, values) = item.to_row();
|
||||||
|
let columns_str = columns.join(", ");
|
||||||
|
let values_str = values.join(", ");
|
||||||
|
queries.push(format!(
|
||||||
|
"INSERT INTO {} ({}) VALUES ({})",
|
||||||
|
Self::table_name(),
|
||||||
|
columns_str,
|
||||||
|
values_str
|
||||||
|
));
|
||||||
|
}
|
||||||
|
queries.join("; ")
|
||||||
|
}
|
||||||
|
|
||||||
|
fn build_select_query(
|
||||||
|
where_clause: Option<&str>,
|
||||||
|
limit: Option<u64>,
|
||||||
|
offset: Option<u64>,
|
||||||
|
) -> String {
|
||||||
|
let mut query = format!(
|
||||||
|
"SELECT {} FROM {}",
|
||||||
|
Self::column_names().join(", "),
|
||||||
|
Self::table_name()
|
||||||
|
);
|
||||||
|
if let Some(where_clause) = where_clause {
|
||||||
|
query.push_str(&format!(" WHERE {}", where_clause));
|
||||||
|
}
|
||||||
|
if let Some(limit) = limit {
|
||||||
|
query.push_str(&format!(" LIMIT {}", limit));
|
||||||
|
}
|
||||||
|
if let Some(offset) = offset {
|
||||||
|
query.push_str(&format!(" OFFSET {}", offset));
|
||||||
|
}
|
||||||
|
query
|
||||||
|
}
|
||||||
|
}
|
@ -2,6 +2,7 @@ pub mod config;
|
|||||||
|
|
||||||
use std::{error::Error, sync::Arc};
|
use std::{error::Error, sync::Arc};
|
||||||
|
|
||||||
|
pub mod guild;
|
||||||
pub mod trivial;
|
pub mod trivial;
|
||||||
pub mod trivial_point;
|
pub mod trivial_point;
|
||||||
pub mod trivial_question;
|
pub mod trivial_question;
|
||||||
@ -12,6 +13,7 @@ use clickhouse_pool::{
|
|||||||
pool_manager::PoolManager,
|
pool_manager::PoolManager,
|
||||||
traits::Model,
|
traits::Model,
|
||||||
};
|
};
|
||||||
|
use guild::Guild;
|
||||||
use tracing::{error, info, instrument};
|
use tracing::{error, info, instrument};
|
||||||
use trivial::Trivial;
|
use trivial::Trivial;
|
||||||
use trivial_point::TrivialPoint;
|
use trivial_point::TrivialPoint;
|
||||||
@ -75,6 +77,13 @@ pub async fn create_manager_and_init(
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
manager = match create_table::<Guild>(manager).await {
|
||||||
|
Ok(manager) => manager,
|
||||||
|
Err(e) => {
|
||||||
|
return Err(e);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
info!("All tables created successfully");
|
info!("All tables created successfully");
|
||||||
|
|
||||||
Ok(Arc::new(manager))
|
Ok(Arc::new(manager))
|
||||||
|
Loading…
Reference in New Issue
Block a user