Compare commits
No commits in common. "main" and "#40_Improve_Preformance" have entirely different histories.
main
...
#40_Improv
22 changed files with 120 additions and 143 deletions
|
@ -1,2 +0,0 @@
|
|||
# Fix typos
|
||||
7e90f451965b0edbd331765ad295a02f31d2bf24
|
|
@ -1,2 +0,0 @@
|
|||
[formatting]
|
||||
column_width = 120
|
|
@ -128,8 +128,6 @@
|
|||
User = "${cfg.user}";
|
||||
Group = "${cfg.user}";
|
||||
ExecStart = "${self.defaultPackage."${system}"}/bin/${script}";
|
||||
# kill each service if its ran for 9 min
|
||||
TimeoutStartSec=540;
|
||||
EnvironmentFile = [
|
||||
"${cfg.env.discord}"
|
||||
"${cfg.env.mail}"
|
||||
|
|
|
@ -18,8 +18,8 @@ use tokio::sync::RwLock;
|
|||
|
||||
/// Cleanup teh Committee server
|
||||
///
|
||||
/// This removes any invalid roles/channels which have been set up accidentally
|
||||
/// DO NOT run this locally unless you have a fresh copy of the live database handy.
|
||||
/// This removes any invalid roles/channels which ay have been set up accidentally
|
||||
/// DO NOT run this locally unless you have a fresh copy of teh live database handy.
|
||||
#[tokio::main]
|
||||
async fn main() {
|
||||
let config = get_config();
|
||||
|
@ -41,7 +41,7 @@ async fn main() {
|
|||
let mut data = client.data.write().await;
|
||||
|
||||
data.insert::<Config>(Arc::new(RwLock::new(config)));
|
||||
data.insert::<DataBase>(Arc::new(db));
|
||||
data.insert::<DataBase>(Arc::new(RwLock::new(db)));
|
||||
}
|
||||
|
||||
if let Err(why) = client.start().await {
|
||||
|
@ -52,28 +52,22 @@ async fn main() {
|
|||
struct Handler;
|
||||
#[async_trait]
|
||||
impl EventHandler for Handler {
|
||||
async fn cache_ready(&self, ctx: Context, _guilds: Vec<GuildId>) {
|
||||
let config_lock = {
|
||||
let data_read = ctx.data.read().await;
|
||||
data_read.get::<Config>().expect("Expected Config in TypeMap.").clone()
|
||||
};
|
||||
let config_global = config_lock.read().await;
|
||||
|
||||
let server = config_global.committee_server;
|
||||
|
||||
ctx.shard.chunk_guild(server, Some(2000), false, ChunkGuildFilter::None, None);
|
||||
|
||||
println!("Cache loaded");
|
||||
async fn cache_ready(&self, ctx: Context, guilds: Vec<GuildId>) {
|
||||
for guild in guilds {
|
||||
ctx.shard.chunk_guild(guild, Some(2000), false, ChunkGuildFilter::None, None);
|
||||
}
|
||||
println!("Cache built successfully!");
|
||||
}
|
||||
|
||||
async fn guild_members_chunk(&self, ctx: Context, chunk: GuildMembersChunkEvent) {
|
||||
if (chunk.chunk_index + 1) == chunk.chunk_count {
|
||||
println!("Cache built successfully!");
|
||||
let db = {
|
||||
let db_lock = {
|
||||
let data_read = ctx.data.read().await;
|
||||
data_read.get::<DataBase>().expect("Expected Config in TypeMap.").clone()
|
||||
};
|
||||
|
||||
let db = db_lock.read().await;
|
||||
|
||||
let config_lock = {
|
||||
let data_read = ctx.data.read().await;
|
||||
data_read.get::<Config>().expect("Expected Config in TypeMap.").clone()
|
||||
|
@ -96,7 +90,7 @@ async fn cleanup(db: &Pool<Sqlite>, ctx: &Context, config: &Config) {
|
|||
let name = &channel.name;
|
||||
let committee_tmp = committees.iter().filter(|x| &x.name_channel == name).collect::<Vec<_>>();
|
||||
let committee = match committee_tmp.first() {
|
||||
// if there are no committees which match then this is not a channel we care about
|
||||
// if there are no committees which match then this is not a channelw e care about
|
||||
None => {
|
||||
continue;
|
||||
}
|
||||
|
@ -118,7 +112,7 @@ async fn cleanup(db: &Pool<Sqlite>, ctx: &Context, config: &Config) {
|
|||
let name = &role.name;
|
||||
let committee_tmp = committees.iter().filter(|x| &x.name_role == name).collect::<Vec<_>>();
|
||||
let committee = match committee_tmp.first() {
|
||||
// if there are no committees which match then this is not a channel we care about
|
||||
// if there are no committees which match then this is not a channelw e care about
|
||||
None => {
|
||||
continue;
|
||||
}
|
||||
|
|
|
@ -36,7 +36,7 @@ async fn main() {
|
|||
let mut data = client.data.write().await;
|
||||
|
||||
data.insert::<Config>(Arc::new(RwLock::new(config)));
|
||||
data.insert::<DataBase>(Arc::new(db));
|
||||
data.insert::<DataBase>(Arc::new(RwLock::new(db)));
|
||||
}
|
||||
|
||||
if let Err(why) = client.start().await {
|
||||
|
@ -47,23 +47,15 @@ async fn main() {
|
|||
struct Handler;
|
||||
#[async_trait]
|
||||
impl EventHandler for Handler {
|
||||
async fn cache_ready(&self, ctx: Context, _guilds: Vec<GuildId>) {
|
||||
let config_lock = {
|
||||
let data_read = ctx.data.read().await;
|
||||
data_read.get::<Config>().expect("Expected Config in TypeMap.").clone()
|
||||
};
|
||||
let config_global = config_lock.read().await;
|
||||
|
||||
let server = config_global.committee_server;
|
||||
|
||||
ctx.shard.chunk_guild(server, Some(2000), false, ChunkGuildFilter::None, None);
|
||||
|
||||
println!("Cache loaded");
|
||||
async fn cache_ready(&self, ctx: Context, guilds: Vec<GuildId>) {
|
||||
for guild in guilds {
|
||||
ctx.shard.chunk_guild(guild, Some(2000), false, ChunkGuildFilter::None, None);
|
||||
}
|
||||
println!("Cache built successfully!");
|
||||
}
|
||||
|
||||
async fn guild_members_chunk(&self, ctx: Context, chunk: GuildMembersChunkEvent) {
|
||||
if (chunk.chunk_index + 1) == chunk.chunk_count {
|
||||
println!("Cache built successfully!");
|
||||
// u[date committee server
|
||||
committee::check_committee(&ctx).await;
|
||||
|
||||
|
|
|
@ -38,7 +38,7 @@ async fn main() {
|
|||
let mut data = client.data.write().await;
|
||||
|
||||
data.insert::<Config>(Arc::new(RwLock::new(config)));
|
||||
data.insert::<DataBase>(Arc::new(db));
|
||||
data.insert::<DataBase>(Arc::new(RwLock::new(db)));
|
||||
}
|
||||
|
||||
if let Err(why) = client.start().await {
|
||||
|
|
|
@ -35,7 +35,7 @@ async fn main() {
|
|||
let mut data = client.data.write().await;
|
||||
|
||||
data.insert::<Config>(Arc::new(RwLock::new(config)));
|
||||
data.insert::<DataBase>(Arc::new(db));
|
||||
data.insert::<DataBase>(Arc::new(RwLock::new(db)));
|
||||
}
|
||||
|
||||
if let Err(why) = client.start().await {
|
||||
|
@ -50,10 +50,11 @@ impl EventHandler for Handler {
|
|||
let ctx = Arc::new(ctx);
|
||||
println!("{} is connected!", ready.user.name);
|
||||
|
||||
let db = {
|
||||
let db_lock = {
|
||||
let data_read = ctx.data.read().await;
|
||||
data_read.get::<DataBase>().expect("Expected Config in TypeMap.").clone()
|
||||
};
|
||||
let db = db_lock.read().await;
|
||||
|
||||
let config_lock = {
|
||||
let data_read = ctx.data.read().await;
|
||||
|
|
|
@ -12,13 +12,7 @@ use skynet_discord_bot::{
|
|||
},
|
||||
get_config, Config,
|
||||
};
|
||||
use std::{
|
||||
process,
|
||||
sync::{
|
||||
atomic::{AtomicUsize, Ordering},
|
||||
Arc,
|
||||
},
|
||||
};
|
||||
use std::{process, sync::Arc};
|
||||
use tokio::sync::RwLock;
|
||||
|
||||
#[tokio::main]
|
||||
|
@ -33,10 +27,7 @@ async fn main() {
|
|||
let intents = GatewayIntents::GUILDS | GatewayIntents::GUILD_MESSAGES | GatewayIntents::MESSAGE_CONTENT | GatewayIntents::GUILD_MEMBERS;
|
||||
// Build our client.
|
||||
let mut client = Client::builder(&config.discord_token, intents)
|
||||
.event_handler(Handler {
|
||||
server_count: Default::default(),
|
||||
server_cached: Default::default(),
|
||||
})
|
||||
.event_handler(Handler {})
|
||||
.cache_settings(serenity::cache::Settings::default())
|
||||
.await
|
||||
.expect("Error creating client");
|
||||
|
@ -45,7 +36,7 @@ async fn main() {
|
|||
let mut data = client.data.write().await;
|
||||
|
||||
data.insert::<Config>(Arc::new(RwLock::new(config)));
|
||||
data.insert::<DataBase>(Arc::new(db));
|
||||
data.insert::<DataBase>(Arc::new(RwLock::new(db)));
|
||||
}
|
||||
|
||||
if let Err(why) = client.start().await {
|
||||
|
@ -53,42 +44,35 @@ async fn main() {
|
|||
}
|
||||
}
|
||||
|
||||
struct Handler {
|
||||
server_count: AtomicUsize,
|
||||
server_cached: AtomicUsize,
|
||||
}
|
||||
struct Handler;
|
||||
#[async_trait]
|
||||
impl EventHandler for Handler {
|
||||
async fn cache_ready(&self, ctx: Context, guilds: Vec<GuildId>) {
|
||||
self.server_count.swap(guilds.len(), Ordering::SeqCst);
|
||||
for guild in guilds {
|
||||
ctx.shard.chunk_guild(guild, Some(2000), false, ChunkGuildFilter::None, None);
|
||||
}
|
||||
println!("Cache loaded {}", &self.server_count.load(Ordering::SeqCst));
|
||||
println!("Cache built successfully!");
|
||||
}
|
||||
|
||||
async fn guild_members_chunk(&self, ctx: Context, chunk: GuildMembersChunkEvent) {
|
||||
if (chunk.chunk_index + 1) == chunk.chunk_count {
|
||||
self.server_cached.fetch_add(1, Ordering::SeqCst);
|
||||
if (self.server_cached.load(Ordering::SeqCst) + 1) == self.server_count.load(Ordering::SeqCst) {
|
||||
println!("Cache built successfully!");
|
||||
// this goes into each server and sets roles for each wolves member
|
||||
check_bulk(&ctx).await;
|
||||
|
||||
// this goes into each server and sets roles for each wolves member
|
||||
check_bulk(&ctx).await;
|
||||
|
||||
// finish up
|
||||
process::exit(0);
|
||||
}
|
||||
// finish up
|
||||
process::exit(0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async fn check_bulk(ctx: &Context) {
|
||||
let db = {
|
||||
let db_lock = {
|
||||
let data_read = ctx.data.read().await;
|
||||
data_read.get::<DataBase>().expect("Expected Config in TypeMap.").clone()
|
||||
};
|
||||
|
||||
let db = db_lock.read().await;
|
||||
|
||||
for server_config in get_server_config_bulk(&db).await {
|
||||
normal::update_server(ctx, &server_config, &[], &[]).await;
|
||||
}
|
||||
|
|
|
@ -56,10 +56,11 @@ pub async fn run(command: &CommandInteraction, ctx: &Context) -> String {
|
|||
return "Please provide a valid channel for ``Bot Channel``".to_string();
|
||||
};
|
||||
|
||||
let db = {
|
||||
let db_lock = {
|
||||
let data_read = ctx.data.read().await;
|
||||
data_read.get::<DataBase>().expect("Expected Databse in TypeMap.").clone()
|
||||
};
|
||||
let db = db_lock.read().await;
|
||||
|
||||
let server_data = Servers {
|
||||
server: command.guild_id.unwrap_or_default(),
|
||||
|
@ -101,7 +102,7 @@ async fn add_server(db: &Pool<Sqlite>, ctx: &Context, server: &Servers) -> Resul
|
|||
.fetch_optional(db)
|
||||
.await;
|
||||
|
||||
// if the entry does not exist already then do a user update
|
||||
// if the entry does not exist already tehn do a user update
|
||||
let (update, current_remove, current_role, past_remove, past_role) = match &existing {
|
||||
None => (true, false, None, false, None),
|
||||
Some(x) => {
|
||||
|
|
|
@ -27,10 +27,11 @@ pub mod committee {
|
|||
false
|
||||
};
|
||||
|
||||
let db = {
|
||||
let db_lock = {
|
||||
let data_read = ctx.data.read().await;
|
||||
data_read.get::<DataBase>().expect("Expected Databse in TypeMap.").clone()
|
||||
};
|
||||
let db = db_lock.read().await;
|
||||
|
||||
let mut cs = vec![];
|
||||
// pull it from a DB
|
||||
|
@ -94,16 +95,15 @@ pub mod servers {
|
|||
use std::collections::HashMap;
|
||||
|
||||
pub async fn run(_command: &CommandInteraction, ctx: &Context) -> String {
|
||||
let db = {
|
||||
let db_lock = {
|
||||
let data_read = ctx.data.read().await;
|
||||
data_read.get::<DataBase>().expect("Expected Databse in TypeMap.").clone()
|
||||
};
|
||||
let db = db_lock.read().await;
|
||||
|
||||
let mut committees = HashMap::new();
|
||||
if let Some(x) = get_committees(&db).await {
|
||||
for committee in x {
|
||||
committees.insert(committee.id, committee.to_owned());
|
||||
}
|
||||
for committee in get_committees(&db).await {
|
||||
committees.insert(committee.id, committee.to_owned());
|
||||
}
|
||||
|
||||
let mut cs = vec![];
|
||||
|
@ -150,7 +150,7 @@ pub mod servers {
|
|||
|
||||
let length = line.len() + 1;
|
||||
|
||||
// +3 is to account for the closing fence
|
||||
// +3 is to account for the closing fense
|
||||
if length < (limit + 3) {
|
||||
response.push(line);
|
||||
limit -= length;
|
||||
|
|
|
@ -23,10 +23,11 @@ pub(crate) mod user {
|
|||
use sqlx::Error;
|
||||
|
||||
pub async fn run(command: &CommandInteraction, ctx: &Context) -> String {
|
||||
let db = {
|
||||
let db_lock = {
|
||||
let data_read = ctx.data.read().await;
|
||||
data_read.get::<DataBase>().expect("Expected Databse in TypeMap.").clone()
|
||||
};
|
||||
let db = db_lock.read().await;
|
||||
|
||||
let config_lock = {
|
||||
let data_read = ctx.data.read().await;
|
||||
|
@ -195,7 +196,7 @@ pub(crate) mod server {
|
|||
model::id::GuildId,
|
||||
};
|
||||
use sqlx::Error;
|
||||
// this is to manage the server side of commands related to minecraft
|
||||
// this is to managfe the server side of commands related to minecraft
|
||||
use super::*;
|
||||
use skynet_discord_bot::{
|
||||
common::minecraft::{update_server, Minecraft},
|
||||
|
@ -228,10 +229,11 @@ pub(crate) mod server {
|
|||
return String::from("Expected Server ID");
|
||||
};
|
||||
|
||||
let db = {
|
||||
let db_lock = {
|
||||
let data_read = ctx.data.read().await;
|
||||
data_read.get::<DataBase>().expect("Expected Databse in TypeMap.").clone()
|
||||
};
|
||||
let db = db_lock.read().await;
|
||||
|
||||
match add_server(&db, &g_id, &server_minecraft).await {
|
||||
Ok(_) => {}
|
||||
|
@ -288,10 +290,11 @@ pub(crate) mod server {
|
|||
Some(x) => x,
|
||||
};
|
||||
|
||||
let db = {
|
||||
let db_lock = {
|
||||
let data_read = ctx.data.read().await;
|
||||
data_read.get::<DataBase>().expect("Expected Databse in TypeMap.").clone()
|
||||
};
|
||||
let db = db_lock.read().await;
|
||||
|
||||
let servers = get_minecraft_config_server(&db, g_id).await;
|
||||
|
||||
|
@ -363,10 +366,11 @@ pub(crate) mod server {
|
|||
return String::from("Expected Server ID");
|
||||
};
|
||||
|
||||
let db = {
|
||||
let data = ctx.data.read().await;
|
||||
data.get::<DataBase>().expect("Expected Databse in TypeMap.").clone()
|
||||
let db_lock = {
|
||||
let data_read = ctx.data.read().await;
|
||||
data_read.get::<DataBase>().expect("Expected Databse in TypeMap.").clone()
|
||||
};
|
||||
let db = db_lock.read().await;
|
||||
|
||||
match server_remove(&db, &g_id, &server_minecraft).await {
|
||||
Ok(_) => {}
|
||||
|
|
|
@ -62,10 +62,11 @@ pub mod edit {
|
|||
false
|
||||
};
|
||||
|
||||
let db = {
|
||||
let db_lock = {
|
||||
let data_read = ctx.data.read().await;
|
||||
data_read.get::<DataBase>().expect("Expected Databse in TypeMap.").clone()
|
||||
};
|
||||
let db = db_lock.read().await;
|
||||
|
||||
let server = command.guild_id.unwrap_or_default();
|
||||
let server_data = RoleAdder {
|
||||
|
@ -146,7 +147,7 @@ pub mod tools {
|
|||
use sqlx::{Pool, Sqlite};
|
||||
|
||||
pub async fn on_role_change(db: &Pool<Sqlite>, ctx: &Context, new_data: Member) {
|
||||
// check if the role changed is part of the ones for this server
|
||||
// check if the role changed is part of the oens for this server
|
||||
if let Ok(role_adders) = sqlx::query_as::<_, RoleAdder>(
|
||||
r#"
|
||||
SELECT *
|
||||
|
@ -162,7 +163,7 @@ pub mod tools {
|
|||
let mut roles_remove = vec![];
|
||||
|
||||
for role_adder in role_adders {
|
||||
// if the user has both A and B give them C
|
||||
// if the user has both A dnd B give them C
|
||||
if new_data.roles.contains(&role_adder.role_a) && new_data.roles.contains(&role_adder.role_b) && !new_data.roles.contains(&role_adder.role_c)
|
||||
{
|
||||
roles_add.push(role_adder.role_c);
|
||||
|
|
|
@ -18,10 +18,11 @@ pub(crate) mod admin {
|
|||
use super::*;
|
||||
|
||||
pub async fn run(_command: &CommandInteraction, ctx: &Context) -> String {
|
||||
let db = {
|
||||
let db_lock = {
|
||||
let data_read = ctx.data.read().await;
|
||||
data_read.get::<DataBase>().expect("Expected Databse in TypeMap.").clone()
|
||||
};
|
||||
let db = db_lock.read().await;
|
||||
|
||||
let config_lock = {
|
||||
let data_read = ctx.data.read().await;
|
||||
|
@ -68,10 +69,11 @@ pub(crate) mod user {
|
|||
use sqlx::{Pool, Sqlite};
|
||||
|
||||
pub async fn run(command: &CommandInteraction, ctx: &Context) -> String {
|
||||
let db = {
|
||||
let db_lock = {
|
||||
let data_read = ctx.data.read().await;
|
||||
data_read.get::<DataBase>().expect("Expected Databse in TypeMap.").clone()
|
||||
};
|
||||
let db = db_lock.read().await;
|
||||
|
||||
let config_toml = get_config_icons::minimal();
|
||||
|
||||
|
@ -143,10 +145,11 @@ pub(crate) mod user {
|
|||
use sqlx::{Pool, Sqlite};
|
||||
|
||||
pub async fn run(_command: &CommandInteraction, ctx: &Context) -> String {
|
||||
let db = {
|
||||
let db_lock = {
|
||||
let data_read = ctx.data.read().await;
|
||||
data_read.get::<DataBase>().expect("Expected Databse in TypeMap.").clone()
|
||||
};
|
||||
let db = db_lock.read().await;
|
||||
|
||||
let config_toml = get_config_icons::minimal();
|
||||
|
||||
|
@ -208,7 +211,7 @@ pub(crate) mod user {
|
|||
|
||||
let length = line.len() + 1;
|
||||
|
||||
// +3 is to account for the closing fence
|
||||
// +3 is to account for the closing fense
|
||||
if length < (limit + 3) {
|
||||
response.push(line);
|
||||
limit -= length;
|
||||
|
|
|
@ -21,10 +21,11 @@ pub mod link {
|
|||
use serenity::all::{CommandDataOption, CommandDataOptionValue, CommandInteraction};
|
||||
|
||||
pub async fn run(command: &CommandInteraction, ctx: &Context) -> String {
|
||||
let db = {
|
||||
let db_lock = {
|
||||
let data_read = ctx.data.read().await;
|
||||
data_read.get::<DataBase>().expect("Expected Databse in TypeMap.").clone()
|
||||
};
|
||||
let db = db_lock.read().await;
|
||||
|
||||
let config_lock = {
|
||||
let data_read = ctx.data.read().await;
|
||||
|
@ -100,7 +101,7 @@ pub mod link {
|
|||
return "Email already verified".to_string();
|
||||
}
|
||||
|
||||
// generate an auth key
|
||||
// generate a auth key
|
||||
let auth = random_string(20);
|
||||
match send_mail(&config, &details.email, &auth, &command.user.name) {
|
||||
Ok(_) => match save_to_db(&db, &details, &auth, &command.user.id).await {
|
||||
|
@ -209,7 +210,7 @@ pub mod link {
|
|||
.subject("Skynet: Link Discord to Wolves.")
|
||||
.multipart(
|
||||
// This is composed of two parts.
|
||||
// also helps not trip spam settings (uneven number of urls)
|
||||
// also helps not trip spam settings (uneven number of url's
|
||||
MultiPart::alternative()
|
||||
.singlepart(SinglePart::builder().header(header::ContentType::TEXT_PLAIN).body(body_text))
|
||||
.singlepart(SinglePart::builder().header(header::ContentType::TEXT_HTML).body(html.into_string())),
|
||||
|
@ -313,10 +314,11 @@ pub mod verify {
|
|||
use sqlx::Error;
|
||||
|
||||
pub async fn run(command: &CommandInteraction, ctx: &Context) -> String {
|
||||
let db = {
|
||||
let db_lock = {
|
||||
let data_read = ctx.data.read().await;
|
||||
data_read.get::<DataBase>().expect("Expected Database in TypeMap.").clone()
|
||||
};
|
||||
let db = db_lock.read().await;
|
||||
|
||||
// check if user has used /link_wolves
|
||||
let details = if let Some(x) = get_verify_from_db(&db, &command.user.id).await {
|
||||
|
@ -458,7 +460,7 @@ pub mod verify {
|
|||
let config = config_lock.read().await;
|
||||
|
||||
if let Some(x) = get_server_member_discord(db, &discord.id).await {
|
||||
// if they are a member of one or more committees, and in teh committee server then give them the general committee role
|
||||
// if they are a member of one or more committees, and in teh committee server then give the teh general committee role
|
||||
// they will get teh more specific vanity role later
|
||||
if !get_committees_id(db, x.id_wolves).await.is_empty() {
|
||||
let server = config.committee_server;
|
||||
|
@ -492,12 +494,13 @@ pub mod unlink {
|
|||
use sqlx::{Pool, Sqlite};
|
||||
|
||||
pub async fn run(command: &CommandInteraction, ctx: &Context) -> String {
|
||||
let db = {
|
||||
let db_lock = {
|
||||
let data_read = ctx.data.read().await;
|
||||
data_read.get::<DataBase>().expect("Expected Databse in TypeMap.").clone()
|
||||
};
|
||||
let db = db_lock.read().await;
|
||||
|
||||
// doesn't matter if there is one or not, it will be removed regardless
|
||||
// dosent matter if there is one or not, it will be removed regardless
|
||||
delete_link(&db, &command.user.id).await;
|
||||
|
||||
"Discord link removed".to_string()
|
||||
|
|
|
@ -12,10 +12,11 @@ use sqlx::{
|
|||
Error, FromRow, Pool, Row, Sqlite,
|
||||
};
|
||||
use std::{str::FromStr, sync::Arc};
|
||||
use tokio::sync::RwLock;
|
||||
|
||||
pub struct DataBase;
|
||||
impl TypeMapKey for DataBase {
|
||||
type Value = Arc<Pool<Sqlite>>;
|
||||
type Value = Arc<RwLock<Pool<Sqlite>>>;
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize, Serialize)]
|
||||
|
|
|
@ -24,7 +24,7 @@ impl<'r> FromRow<'r, SqliteRow> for Minecraft {
|
|||
/**
|
||||
loop through all members of server
|
||||
get a list of folks with mc accounts that are members
|
||||
and a list that aren't members
|
||||
and a list that arent members
|
||||
*/
|
||||
pub async fn update_server(server_id: &str, db: &Pool<Sqlite>, g_id: &GuildId, config: &Config) {
|
||||
let mut usernames = vec![];
|
||||
|
@ -109,7 +109,7 @@ pub async fn whitelist_wipe(server: &str, token: &str) {
|
|||
};
|
||||
post(&format!("{url_base}/files/delete"), &bearer, &deletion).await;
|
||||
|
||||
// recreate the file, passing in the type here so the compiler knows what type of Vec it is
|
||||
// recreate teh file, passing in the type here so the compiler knows what type of vec it is
|
||||
post::<Vec<&str>>(&format!("{url_base}/files/write?file=%2Fwhitelist.json"), &bearer, &vec![]).await;
|
||||
|
||||
// reload the whitelist
|
||||
|
|
|
@ -1,11 +1,12 @@
|
|||
// this code is taken from https://github.com/MCorange99/svg2colored-png/tree/main
|
||||
// I was unable to figure out how to use usvg myself so yoinked it from here.
|
||||
// I was unable to figure out how to use usvg myself so younked it from here.
|
||||
|
||||
use std::{
|
||||
ffi::OsStr,
|
||||
path::{Path, PathBuf},
|
||||
};
|
||||
|
||||
// use clap::builder::OsStr;
|
||||
use color_eyre::{eyre::bail, Result};
|
||||
use usvg_text_layout::TreeTextToPath;
|
||||
|
||||
|
@ -16,7 +17,7 @@ pub struct Args {
|
|||
/// Output folder where the PNG's will be placed
|
||||
pub output: PathBuf,
|
||||
|
||||
/// Comma separated colors that will be used in HEX Eg. 000000,ffffff
|
||||
/// Comma seperated colors that will be used in HEX Eg. 000000,ffffff
|
||||
/// Can be like an object: black:000000,white:ffffff
|
||||
pub colors: String,
|
||||
|
||||
|
|
|
@ -281,7 +281,7 @@ pub mod update_icon {
|
|||
|
||||
// check if exists
|
||||
if !path_new.exists() {
|
||||
// convert if it hasn't been converted already
|
||||
// convert if it hasnt been converted already
|
||||
match r.render(&path_local, &args) {
|
||||
Ok(_) => {}
|
||||
Err(_e) => {
|
||||
|
|
|
@ -17,11 +17,13 @@ pub mod normal {
|
|||
}
|
||||
|
||||
pub async fn update_server(ctx: &Context, server: &Servers, remove_roles: &[Option<RoleId>], members_changed: &[UserId]) {
|
||||
let db = {
|
||||
let db_lock = {
|
||||
let data_read = ctx.data.read().await;
|
||||
data_read.get::<DataBase>().expect("Expected Database in TypeMap.").clone()
|
||||
};
|
||||
|
||||
let db = db_lock.read().await;
|
||||
|
||||
let Servers {
|
||||
server,
|
||||
role_past,
|
||||
|
@ -46,7 +48,7 @@ pub mod normal {
|
|||
|
||||
if let Ok(x) = server.members(ctx, None, None).await {
|
||||
for member in x {
|
||||
// members_changed acts as an override to only deal with the users in it
|
||||
// members_changed acts as an override to only deal with teh users in it
|
||||
if !members_changed.is_empty() && !members_changed.contains(&member.user.id) {
|
||||
continue;
|
||||
}
|
||||
|
@ -82,7 +84,7 @@ pub mod normal {
|
|||
|
||||
if member.roles.contains(role_current) {
|
||||
roles_set.current_rem += 1;
|
||||
// if they're not a current member and have the role then remove it
|
||||
// if theya re not a current member and have the role then remove it
|
||||
if let Err(e) = member.remove_role(ctx, role_current).await {
|
||||
println!("{e:?}");
|
||||
}
|
||||
|
@ -172,11 +174,13 @@ pub mod committee {
|
|||
use std::collections::HashMap;
|
||||
|
||||
pub async fn check_committee(ctx: &Context) {
|
||||
let db = {
|
||||
let db_lock = {
|
||||
let data_read = ctx.data.read().await;
|
||||
data_read.get::<DataBase>().expect("Expected Config in TypeMap.").clone()
|
||||
};
|
||||
|
||||
let db = db_lock.read().await;
|
||||
|
||||
let config_lock = {
|
||||
let data_read = ctx.data.read().await;
|
||||
data_read.get::<Config>().expect("Expected Config in TypeMap.").clone()
|
||||
|
@ -192,17 +196,12 @@ pub mod committee {
|
|||
}
|
||||
|
||||
/**
|
||||
This function can take a Vec of members (or just one) and gives them the appropriate roles on teh committee server
|
||||
This function can take a vec of members (or just one) and gives tehm the appropiate roles on teh committee server
|
||||
*/
|
||||
pub async fn update_committees(db: &Pool<Sqlite>, ctx: &Context, config: &Config, members: &mut Vec<Member>) {
|
||||
let server = config.committee_server;
|
||||
let committee_member = config.committee_role;
|
||||
let committees = match get_committees(db).await {
|
||||
None => {
|
||||
return;
|
||||
}
|
||||
Some(x) => x,
|
||||
};
|
||||
let committees = get_committees(db).await;
|
||||
let categories = config.committee_category.clone();
|
||||
|
||||
// information about the server
|
||||
|
@ -224,11 +223,11 @@ pub mod committee {
|
|||
|
||||
let mut channels = server.channels(&ctx).await.unwrap_or_default();
|
||||
|
||||
// a map of users and the roles they are going to be getting
|
||||
// a map of users and the roles they are goign to be getting
|
||||
let mut users_roles = HashMap::new();
|
||||
|
||||
let mut re_order = false;
|
||||
// we need to create roles and channels if they don't already exist
|
||||
// we need to create roles and channels if tehy dont already exist
|
||||
let mut category_index = 0;
|
||||
let mut i = 0;
|
||||
loop {
|
||||
|
@ -329,10 +328,6 @@ pub mod committee {
|
|||
|
||||
// now we have a map of all users that should get roles time to go through all the folks on teh server
|
||||
for member in members {
|
||||
// if member.user.id != 136522490632601600 {
|
||||
// continue;
|
||||
// }
|
||||
//
|
||||
let roles_current = member.roles(ctx).unwrap_or_default();
|
||||
|
||||
let roles_required = match users_roles.get(&member.user.id) {
|
||||
|
@ -363,7 +358,7 @@ pub mod committee {
|
|||
let has_committee_role = roles_current_id.contains(&committee_member);
|
||||
|
||||
if on_committee && !has_committee_role {
|
||||
// if there are committee roles then give the general purpose role
|
||||
// if there are committee roles then give the general purporse role
|
||||
roles_add.push(committee_member);
|
||||
}
|
||||
if !on_committee && has_committee_role {
|
||||
|
@ -499,8 +494,8 @@ pub mod committee {
|
|||
})
|
||||
}
|
||||
|
||||
pub async fn get_committees(db: &Pool<Sqlite>) -> Option<Vec<Committees>> {
|
||||
match sqlx::query_as::<_, Committees>(
|
||||
pub async fn get_committees(db: &Pool<Sqlite>) -> Vec<Committees> {
|
||||
sqlx::query_as::<_, Committees>(
|
||||
r#"
|
||||
SELECT *
|
||||
FROM committees
|
||||
|
@ -508,13 +503,10 @@ pub mod committee {
|
|||
)
|
||||
.fetch_all(db)
|
||||
.await
|
||||
{
|
||||
Ok(x) => Some(x),
|
||||
Err(e) => {
|
||||
dbg!(e);
|
||||
None
|
||||
}
|
||||
}
|
||||
.unwrap_or_else(|e| {
|
||||
dbg!(e);
|
||||
vec![]
|
||||
})
|
||||
}
|
||||
|
||||
async fn get_server_member_discord(db: &Pool<Sqlite>, user: &i64) -> Option<Wolves> {
|
||||
|
|
|
@ -69,10 +69,11 @@ pub mod cns {
|
|||
}
|
||||
|
||||
pub async fn get_wolves(ctx: &Context) {
|
||||
let db = {
|
||||
let db_lock = {
|
||||
let data_read = ctx.data.read().await;
|
||||
data_read.get::<DataBase>().expect("Expected Database in TypeMap.").clone()
|
||||
};
|
||||
let db = db_lock.read().await;
|
||||
|
||||
let config_lock = {
|
||||
let data_read = ctx.data.read().await;
|
||||
|
@ -223,10 +224,11 @@ pub mod committees {
|
|||
}
|
||||
|
||||
pub async fn get_cns(ctx: &Context) {
|
||||
let db = {
|
||||
let db_lock = {
|
||||
let data_read = ctx.data.read().await;
|
||||
data_read.get::<DataBase>().expect("Expected Database in TypeMap.").clone()
|
||||
};
|
||||
let db = db_lock.read().await;
|
||||
|
||||
let config_lock = {
|
||||
let data_read = ctx.data.read().await;
|
||||
|
|
|
@ -36,7 +36,7 @@ pub struct Config {
|
|||
pub committee_role: RoleId,
|
||||
pub committee_category: Vec<ChannelId>,
|
||||
|
||||
// items pertaining to CompSoc only
|
||||
// items pertaining to compsoc only
|
||||
pub compsoc_server: GuildId,
|
||||
}
|
||||
impl TypeMapKey for Config {
|
||||
|
|
18
src/main.rs
18
src/main.rs
|
@ -41,11 +41,13 @@ impl EventHandler for Handler {
|
|||
|
||||
// handles previously linked accounts joining the server
|
||||
async fn guild_member_addition(&self, ctx: Context, new_member: Member) {
|
||||
let db = {
|
||||
let db_lock = {
|
||||
let data_read = ctx.data.read().await;
|
||||
data_read.get::<DataBase>().expect("Expected Config in TypeMap.").clone()
|
||||
};
|
||||
|
||||
let db = db_lock.read().await;
|
||||
|
||||
let config_lock = {
|
||||
let data_read = ctx.data.read().await;
|
||||
data_read.get::<Config>().expect("Expected Config in TypeMap.").clone()
|
||||
|
@ -107,12 +109,14 @@ Sign up on [UL Wolves]({}) and go to https://discord.com/channels/{}/{} and use
|
|||
// handles role updates
|
||||
async fn guild_member_update(&self, ctx: Context, _old_data: Option<Member>, new_data: Option<Member>, _: GuildMemberUpdateEvent) {
|
||||
// get config/db
|
||||
let db = {
|
||||
let db_lock = {
|
||||
let data_read = ctx.data.read().await;
|
||||
data_read.get::<DataBase>().expect("Expected Config in TypeMap.").clone()
|
||||
};
|
||||
|
||||
// check if the role changed is part of the ones for this server
|
||||
let db = db_lock.read().await;
|
||||
|
||||
// check if the role changed is part of the oens for this server
|
||||
if let Some(x) = new_data {
|
||||
on_role_change(&db, &ctx, x).await;
|
||||
}
|
||||
|
@ -154,13 +158,13 @@ Sign up on [UL Wolves]({}) and go to https://discord.com/channels/{}/{} and use
|
|||
}
|
||||
}
|
||||
|
||||
// CompSoc Server
|
||||
// compsoc Server
|
||||
match config
|
||||
.compsoc_server
|
||||
.set_commands(
|
||||
&ctx.http,
|
||||
vec![
|
||||
// commands just for the CompSoc server
|
||||
// commands just for the compsoc server
|
||||
commands::count::servers::register(),
|
||||
commands::server_icon::user::register(),
|
||||
],
|
||||
|
@ -177,7 +181,7 @@ Sign up on [UL Wolves]({}) and go to https://discord.com/channels/{}/{} and use
|
|||
async fn interaction_create(&self, ctx: Context, interaction: Interaction) {
|
||||
if let Interaction::Command(command) = interaction {
|
||||
let _ = command.defer_ephemeral(&ctx.http).await;
|
||||
// println!("Received command interaction: {:#?}", command);
|
||||
//println!("Received command interaction: {:#?}", command);
|
||||
|
||||
let content = match command.data.name.as_str() {
|
||||
// user commands
|
||||
|
@ -300,7 +304,7 @@ async fn main() {
|
|||
let mut data = client.data.write().await;
|
||||
|
||||
data.insert::<Config>(Arc::new(RwLock::new(config)));
|
||||
data.insert::<DataBase>(Arc::new(db));
|
||||
data.insert::<DataBase>(Arc::new(RwLock::new(db)));
|
||||
}
|
||||
|
||||
// Finally, start a single shard, and start listening to events.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue