2020-04-23 03:28:51 +00:00
|
|
|
#[macro_use]
|
2020-04-27 23:16:03 +00:00
|
|
|
extern crate log;
|
|
|
|
extern crate log4rs;
|
2021-01-09 21:45:16 +00:00
|
|
|
extern crate serde;
|
|
|
|
|
|
|
|
use std::path::Path;
|
|
|
|
use std::process::exit;
|
2021-01-28 22:31:07 +00:00
|
|
|
use std::sync::Arc;
|
2020-04-23 03:28:51 +00:00
|
|
|
|
2020-04-26 20:06:55 +00:00
|
|
|
use clap::{App, Arg};
|
2021-01-16 03:51:26 +00:00
|
|
|
use log::LevelFilter;
|
2020-05-23 03:57:11 +00:00
|
|
|
use log4rs::append::console::ConsoleAppender;
|
|
|
|
use log4rs::append::rolling_file::policy::compound::roll::fixed_window::FixedWindowRoller;
|
|
|
|
use log4rs::append::rolling_file::policy::compound::trigger::size::SizeTrigger;
|
2021-01-16 03:51:26 +00:00
|
|
|
use log4rs::append::rolling_file::policy::compound::CompoundPolicy;
|
2020-08-08 23:09:07 +00:00
|
|
|
use log4rs::append::rolling_file::RollingFileAppender;
|
|
|
|
use log4rs::config::{Appender, Config, Root};
|
|
|
|
use log4rs::encode::pattern::PatternEncoder;
|
2020-05-23 03:57:11 +00:00
|
|
|
use log4rs::filter::threshold::ThresholdFilter;
|
|
|
|
use log4rs::init_config;
|
2021-01-16 03:51:26 +00:00
|
|
|
use serenity::client::Client;
|
2021-01-28 22:31:07 +00:00
|
|
|
use serenity::framework::standard::macros::group;
|
|
|
|
use serenity::framework::standard::StandardFramework;
|
2020-04-23 03:28:51 +00:00
|
|
|
|
2021-01-16 03:51:26 +00:00
|
|
|
use database::*;
|
|
|
|
use discord::events::{CANCEL_COMMAND, CONFIRM_COMMAND, CREATE_COMMAND};
|
2021-03-05 01:07:31 +00:00
|
|
|
use discord::handler::Handler;
|
2021-01-28 22:31:07 +00:00
|
|
|
use discord::BOT_HELP;
|
2021-03-05 01:07:31 +00:00
|
|
|
use discord::{log_error, permission_check, DraftEvent};
|
2020-04-23 03:28:51 +00:00
|
|
|
use hypebot_config::HypeBotConfig;
|
2021-01-28 22:31:07 +00:00
|
|
|
use reminder::Reminders;
|
2021-01-09 21:45:16 +00:00
|
|
|
|
2021-03-05 01:07:31 +00:00
|
|
|
mod database;
|
|
|
|
mod discord;
|
|
|
|
mod hypebot_config;
|
|
|
|
mod reminder;
|
|
|
|
|
2021-01-09 21:45:16 +00:00
|
|
|
const INTERESTED_EMOJI: char = '\u{2705}';
|
|
|
|
const UNINTERESTED_EMOJI: char = '\u{274C}';
|
2020-04-23 03:28:51 +00:00
|
|
|
|
2020-04-27 23:16:03 +00:00
|
|
|
type HypeBotResult<T> = std::result::Result<T, Box<dyn std::error::Error>>;
|
|
|
|
|
2020-05-02 18:35:47 +00:00
|
|
|
/// Event command group
|
2020-04-23 03:28:51 +00:00
|
|
|
#[group]
|
2020-04-27 22:13:23 +00:00
|
|
|
#[only_in(guilds)]
|
|
|
|
#[description("Commands for Creating Events")]
|
|
|
|
#[commands(create, confirm, cancel)]
|
2020-04-23 03:28:51 +00:00
|
|
|
struct EventCommands;
|
|
|
|
|
2020-04-29 00:41:10 +00:00
|
|
|
/// Does the setup for logging
|
|
|
|
fn setup_logging(config: &HypeBotConfig) -> HypeBotResult<()> {
|
2020-05-23 03:57:11 +00:00
|
|
|
// Build log file path
|
|
|
|
let log_file_path = Path::new(&config.log_path);
|
|
|
|
let log_file_path = log_file_path.join("hype_bot.log");
|
2020-05-28 02:45:33 +00:00
|
|
|
let archive = log_file_path.join("hype_bot.{}.log");
|
2020-04-26 21:23:13 +00:00
|
|
|
|
2020-05-23 03:57:11 +00:00
|
|
|
// Number of logs to keep
|
|
|
|
let window_size = 10;
|
2020-04-26 20:06:55 +00:00
|
|
|
|
2020-05-23 03:57:11 +00:00
|
|
|
// 10MB file size limit
|
2020-05-28 02:45:33 +00:00
|
|
|
let size_limit = 10 * 1024 * 1024;
|
2020-05-23 03:57:11 +00:00
|
|
|
let size_trigger = SizeTrigger::new(size_limit);
|
2020-04-26 20:06:55 +00:00
|
|
|
|
2020-05-23 03:57:11 +00:00
|
|
|
let fixed_window_roller = FixedWindowRoller::builder()
|
2020-05-28 02:45:33 +00:00
|
|
|
.build(archive.to_str().unwrap(), window_size)
|
2020-05-23 03:57:11 +00:00
|
|
|
.unwrap();
|
|
|
|
|
|
|
|
let compound_policy =
|
|
|
|
CompoundPolicy::new(Box::new(size_trigger), Box::new(fixed_window_roller));
|
|
|
|
|
|
|
|
let config = Config::builder()
|
|
|
|
.appender(
|
|
|
|
Appender::builder()
|
2021-03-05 01:20:32 +00:00
|
|
|
.filter(Box::new(ThresholdFilter::new(LevelFilter::Warn)))
|
2020-05-23 03:57:11 +00:00
|
|
|
.build(
|
|
|
|
"logfile",
|
|
|
|
Box::new(
|
|
|
|
RollingFileAppender::builder()
|
|
|
|
.encoder(Box::new(PatternEncoder::new("{d} {l}::{m}{n}")))
|
|
|
|
.build(log_file_path, Box::new(compound_policy))?,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
.appender(
|
|
|
|
Appender::builder()
|
|
|
|
.filter(Box::new(ThresholdFilter::new(LevelFilter::Info)))
|
|
|
|
.build(
|
|
|
|
"stdout",
|
|
|
|
Box::new(
|
|
|
|
ConsoleAppender::builder()
|
|
|
|
.encoder(Box::new(PatternEncoder::new("{l}::{m}{n}")))
|
|
|
|
.build(),
|
|
|
|
),
|
|
|
|
),
|
|
|
|
)
|
|
|
|
.build(
|
|
|
|
Root::builder()
|
|
|
|
.appender("logfile")
|
|
|
|
.appender("stdout")
|
|
|
|
.build(LevelFilter::Info),
|
|
|
|
)?;
|
|
|
|
|
|
|
|
init_config(config)?;
|
2020-04-27 02:49:04 +00:00
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|
|
|
|
|
2021-01-09 21:45:16 +00:00
|
|
|
#[tokio::main]
|
|
|
|
async fn main() -> HypeBotResult<()> {
|
2020-04-26 21:23:13 +00:00
|
|
|
// Initialize arg parser
|
|
|
|
let mut app = App::new("Hype Bot")
|
|
|
|
.about("Hype Bot: Hype Up Your Discord Events!")
|
|
|
|
.arg(
|
|
|
|
Arg::with_name("config")
|
|
|
|
.index(1)
|
|
|
|
.short("c")
|
|
|
|
.long("config")
|
|
|
|
.value_name("CONFIG_PATH")
|
|
|
|
.help("Config file path"),
|
|
|
|
);
|
|
|
|
|
|
|
|
// Get arg parser
|
|
|
|
let matches = app.clone().get_matches();
|
|
|
|
|
|
|
|
// Check if config is set
|
|
|
|
if let Some(config_path) = matches.value_of("config") {
|
|
|
|
// Load config
|
|
|
|
let cfg = match hypebot_config::HypeBotConfig::new(config_path) {
|
|
|
|
Ok(cfg) => cfg,
|
|
|
|
Err(err) => {
|
|
|
|
println!("Error opening config file: {}", err);
|
|
|
|
exit(-1);
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2020-04-27 23:16:03 +00:00
|
|
|
// Setup logging
|
2020-04-29 00:41:10 +00:00
|
|
|
setup_logging(&cfg)?;
|
2020-04-27 23:16:03 +00:00
|
|
|
|
2020-04-26 21:23:13 +00:00
|
|
|
// New client
|
2021-01-16 03:51:26 +00:00
|
|
|
let mut client = Client::builder(cfg.discord_key.clone())
|
|
|
|
.event_handler(Handler)
|
|
|
|
.framework(
|
2021-01-09 21:45:16 +00:00
|
|
|
StandardFramework::new()
|
|
|
|
.configure(|c| {
|
2021-01-16 03:51:26 +00:00
|
|
|
c.prefix(cfg.prefix.as_str())
|
2021-01-09 21:45:16 +00:00
|
|
|
.allow_dm(false)
|
|
|
|
.ignore_bots(true)
|
|
|
|
.ignore_webhooks(true)
|
|
|
|
})
|
|
|
|
.before(permission_check)
|
|
|
|
.after(log_error)
|
|
|
|
.group(&EVENTCOMMANDS_GROUP)
|
|
|
|
.help(&BOT_HELP),
|
2021-01-16 03:51:26 +00:00
|
|
|
)
|
|
|
|
.await?;
|
2020-04-26 21:23:13 +00:00
|
|
|
|
2020-05-23 01:03:09 +00:00
|
|
|
// Copy config data to client data and setup scheduler
|
2020-04-26 21:23:13 +00:00
|
|
|
{
|
2021-03-05 01:07:31 +00:00
|
|
|
let db = database::Database::new(&cfg.db_location)?;
|
2021-01-09 21:45:16 +00:00
|
|
|
let mut data = client.data.write().await;
|
2021-01-16 19:58:46 +00:00
|
|
|
data.insert::<HypeBotConfig>(Arc::new(cfg));
|
|
|
|
data.insert::<DraftEvent>(Arc::new(DraftEvent::default()));
|
2021-01-28 22:31:07 +00:00
|
|
|
data.insert::<Reminders>(Reminders::default());
|
2021-03-05 01:07:31 +00:00
|
|
|
data.insert::<database::Database>(Arc::new(db));
|
2020-05-23 01:03:09 +00:00
|
|
|
}
|
|
|
|
|
2020-04-26 21:23:13 +00:00
|
|
|
// Start bot
|
2020-04-27 23:16:03 +00:00
|
|
|
info!("Starting HypeBot!");
|
2021-01-09 21:45:16 +00:00
|
|
|
if let Err(why) = client.start().await {
|
2020-05-23 03:57:11 +00:00
|
|
|
error!("An error occurred while running the client: {:?}", why);
|
2020-04-26 21:23:13 +00:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// Print help
|
|
|
|
app.print_help()?;
|
|
|
|
}
|
|
|
|
|
|
|
|
Ok(())
|
|
|
|
}
|