respond to some events and dbl api interactions

This commit is contained in:
jude 2020-10-18 17:26:07 +01:00
parent d022bac73e
commit 25a637665c
3 changed files with 104 additions and 19 deletions

4
Cargo.lock generated
View File

@ -1537,9 +1537,9 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
[[package]] [[package]]
name = "syn" name = "syn"
version = "1.0.44" version = "1.0.45"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e03e57e4fcbfe7749842d53e24ccb9aa12b7252dbe5e91d2acad31834c8b8fdd" checksum = "ea9c5432ff16d6152371f808fb5a871cd67368171b09bb21b43df8e4a47a3556"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",

View File

@ -7,23 +7,23 @@ edition = "2018"
[dependencies] [dependencies]
serenity = { version = "0.9.0-rc.2", features = ["collector", "rustls_backend"] } serenity = { version = "0.9.0-rc.2", features = ["collector", "rustls_backend"] }
dotenv = "0.15" dotenv = "0.15"
tokio = { version = "0.2.19", features = ["process"] } tokio = { version = "0.2", features = ["process"] }
reqwest = "0.10.6" reqwest = { version = "0.10", features = ["rustls-tls"] }
sqlx = { version = "0.3.5", default-features = false, features = ["runtime-tokio", "macros", "mysql", "bigdecimal", "chrono"] } sqlx = { version = "0.3", default-features = false, features = ["runtime-tokio", "macros", "mysql", "bigdecimal", "chrono"] }
regex = "1.3.9" regex = "1.3"
async-trait = "0.1.36" async-trait = "0.1"
log = "0.4.11" log = "0.4"
env_logger = "0.8.1" env_logger = "0.8"
chrono = "0.4" chrono = "0.4"
chrono-tz = "0.5" chrono-tz = "0.5"
lazy_static = "1.4.0" lazy_static = "1.4"
num-integer = "0.1.43" num-integer = "0.1"
num-traits = "0.2.12" num-traits = "0.2"
custom_error = "1.7.1" custom_error = "1.7"
serde = "1.0.115" serde = "1.0"
serde_json = "1.0.57" serde_json = "1.0"
rand = "0.7.3" rand = "0.7"
Inflector = "0.11.4" Inflector = "0.11"
[dependencies.regex_command_attr] [dependencies.regex_command_attr]
path = "./regex_command_attr" path = "./regex_command_attr"

View File

@ -8,15 +8,18 @@ mod models;
mod time_parser; mod time_parser;
use serenity::{ use serenity::{
async_trait,
cache::Cache, cache::Cache,
client::{bridge::gateway::GatewayIntents, Client}, client::{bridge::gateway::GatewayIntents, Client},
framework::Framework, framework::Framework,
http::{client::Http, CacheHttp}, http::{client::Http, CacheHttp},
model::{ model::{
channel::GuildChannel,
channel::Message, channel::Message,
guild::{Guild, PartialGuild},
id::{GuildId, UserId}, id::{GuildId, UserId},
}, },
prelude::TypeMapKey, prelude::{Context, EventHandler, TypeMapKey},
}; };
use sqlx::{ use sqlx::{
@ -26,7 +29,7 @@ use sqlx::{
use dotenv::dotenv; use dotenv::dotenv;
use std::{env, sync::Arc}; use std::{collections::HashMap, env, sync::Arc};
use crate::{ use crate::{
commands::{info_cmds, moderation_cmds, reminder_cmds, todo_cmds}, commands::{info_cmds, moderation_cmds, reminder_cmds, todo_cmds},
@ -56,6 +59,87 @@ impl TypeMapKey for FrameworkCtx {
type Value = Arc<Box<dyn Framework + Send + Sync>>; type Value = Arc<Box<dyn Framework + Send + Sync>>;
} }
struct Handler;
#[async_trait]
impl EventHandler for Handler {
async fn channel_delete(&self, ctx: Context, channel: &GuildChannel) {
let pool = ctx
.data
.read()
.await
.get::<SQLPool>()
.cloned()
.expect("Could not get SQLPool from data");
sqlx::query!(
"
DELETE FROM channels WHERE channel = ?
",
channel.id.as_u64()
)
.execute(&pool)
.await
.unwrap();
}
async fn guild_create(&self, ctx: Context, _guild: Guild, is_new: bool) {
if is_new {
if let Ok(token) = env::var("DISCORDBOTS_TOKEN") {
let guild_count = ctx.cache.guild_count().await;
let mut hm = HashMap::new();
hm.insert("server_count", guild_count);
let client = ctx
.data
.read()
.await
.get::<ReqwestClient>()
.cloned()
.expect("Could not get ReqwestClient from data");
let response = client
.post(
format!(
"https://top.gg/api/bots/{}/stats",
ctx.cache.current_user_id().await.as_u64()
)
.as_str(),
)
.header("Authorization", token)
.json(&hm)
.send()
.await;
if let Err(res) = response {
println!("DiscordBots Response: {:?}", res);
}
}
}
}
async fn guild_delete(&self, ctx: Context, guild: PartialGuild, _guild: Option<Guild>) {
let pool = ctx
.data
.read()
.await
.get::<SQLPool>()
.cloned()
.expect("Could not get SQLPool from data");
sqlx::query!(
"
DELETE FROM guilds WHERE guild = ?
",
guild.id.as_u64()
)
.execute(&pool)
.await
.unwrap();
}
}
#[tokio::main] #[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> { async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
env_logger::init(); env_logger::init();
@ -123,6 +207,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error + Send + Sync>> {
| GatewayIntents::GUILDS | GatewayIntents::GUILDS
| GatewayIntents::DIRECT_MESSAGES, | GatewayIntents::DIRECT_MESSAGES,
) )
.event_handler(Handler)
.framework_arc(framework_arc.clone()) .framework_arc(framework_arc.clone())
.await .await
.expect("Error occurred creating client"); .expect("Error occurred creating client");