Prefix configuration

This commit is contained in:
Sakuhl 2018-02-12 11:02:45 +01:00
parent 4d9dbf9899
commit 005b629a21
7 changed files with 78 additions and 16 deletions

View File

@ -0,0 +1 @@
DROP TABLE prefixes

View File

@ -0,0 +1,4 @@
CREATE TABLE prefixes (
id BIGINT PRIMARY KEY,
prefix VARCHAR NOT NULL
)

View File

@ -4,7 +4,6 @@ use serenity::model::*;
use ::diesel;
use ::diesel::prelude::*;
use ::diesel::pg::PgConnection;
use ::diesel::result::DatabaseErrorKind;
use ::serde_json;
@ -12,11 +11,13 @@ use ::serde_json::Value;
use ::reqwest;
use ::std::{env, thread};
use ::std::thread;
use failure;
use failure::Error;
use super::establish_connection;
pub fn territory_livefeed() {
use models::LivefeedListener;
use schema::livefeedlisteners::dsl::*;
@ -179,10 +180,3 @@ pub fn wc_unwarfeed(msg: &Message) -> Result<(), Error> {
Ok(())
}
fn establish_connection() -> PgConnection {
let database_url = env::var("DATABASE_URL")
.expect("DATABASE_URL must be set");
PgConnection::establish(&database_url)
.expect(&format!("Error connecting to {}", database_url))
}

View File

@ -8,9 +8,15 @@ use ::reqwest;
use ::serde_json;
use ::serde_json::Value;
use diesel;
use diesel::pg::PgConnection;
use diesel::prelude::*;
use failure;
use failure::Error;
use std::env;
pub mod player;
pub mod guild;
pub mod feed;
@ -19,6 +25,29 @@ pub use player::*;
pub use guild::*;
pub use feed::{wc_livefeed, wc_unlivefeed, wc_warfeed, wc_unwarfeed};
pub fn wc_prefix(command: &str, msg: &Message) -> Result<(), Error> {
use models::PrefixConfig;
use schema::prefixes::dsl::*;
let connection = establish_connection();
let new_prefix = &command[7..].to_owned();
diesel::insert_into(prefixes)
.values(&PrefixConfig {
id: msg.guild_id().unwrap().0 as i64,
prefix: new_prefix.clone()
})
.on_conflict(id)
.do_update()
.set(prefix.eq(new_prefix))
.execute(&connection)?;
msg.channel_id.say(format!("Prefix is now {:?}", new_prefix))?;
Ok(())
}
pub fn wc_status(msg: &Message) -> Result<(), Error> {
let resp = reqwest::get("https://api.wynncraft.com/public_api.php?action=onlinePlayersSum")?.text().unwrap();
@ -205,4 +234,11 @@ pub fn wc_shout(command: &str, msg: &Message) -> Result<(), Error> {
}
msg.channel_id.say("Success!")?;
Ok(())
}
pub fn establish_connection() -> PgConnection {
let database_url = env::var("DATABASE_URL")
.expect("DATABASE_URL must be set");
PgConnection::establish(&database_url)
.expect(&format!("Error connecting to {}", database_url))
}

View File

@ -10,6 +10,7 @@ extern crate serde_json;
#[macro_use]
extern crate diesel;
use diesel::prelude::*;
#[macro_use]
extern crate failure;
@ -36,6 +37,7 @@ use std::thread;
mod models;
mod schema;
use schema::prefixes;
mod commands;
use commands::*;
@ -84,7 +86,19 @@ impl EventHandler for Handler {
// Event handlers are dispatched through multi-threading, and so multiple
// of a single event can be dispatched simultaneously.
fn on_message(&self, _: Context, msg: Message) {
if let Err(error) = self.process_message(&msg) {
let cfg = Config::generate().unwrap();
let prefix = cfg.prefix;
let connection = commands::establish_connection();
let prefix = prefixes::table
.select(prefixes::prefix)
.filter(prefixes::id.eq(msg.guild_id().unwrap_or(GuildId(0)).0 as i64))
.load::<String>(&connection)
.expect("Error loading prefix").get(0)
.map(|x| x.to_owned())
.unwrap_or(prefix);
if let Err(error) = self.process_message(&msg, &prefix) {
//eprintln!("Error: {}", error);
let _ = msg.channel_id.say(format!("Error: {}", error));
for cause in error.causes().skip(1) {
@ -92,8 +106,7 @@ impl EventHandler for Handler {
let _ = msg.channel_id.say(format!("caused by: {}", cause));
}
}
let cfg = Config::generate().unwrap();
let prefix = cfg.prefix;
if msg.content.starts_with(&prefix) {
let command = &msg.content[prefix.len()..];
// log
@ -117,10 +130,7 @@ impl EventHandler for Handler {
}
impl Handler {
fn process_message(&self, msg: &Message) -> Result<(), Error> {
let cfg = Config::generate()?;
let prefix = cfg.prefix;
fn process_message(&self, msg: &Message, prefix: &str) -> Result<(), Error> {
if msg.content == "<@392763365409292298> has big gay" {
let _ = msg.channel_id.broadcast_typing();
thread::sleep_ms(5000);
@ -165,6 +175,8 @@ impl Handler {
} else {
"<@210743594061922306>".parse::<User>().unwrap().dm(|f| f.content(format!("{} tried to shout {:?}", msg.author, &command[6..]))).unwrap();
}
} else if command.starts_with("prefix ") {
wc_prefix(command, msg)?;
} else {
bail!(ResponseError::UnknownCommand { name: command.to_owned() });
}

View File

@ -10,4 +10,11 @@ pub struct LivefeedListener {
#[table_name="warfeedlisteners"]
pub struct WarfeedListener {
pub id: i64
}
#[derive(Queryable, Insertable)]
#[table_name="prefixes"]
pub struct PrefixConfig {
pub id: i64,
pub prefix: String
}

View File

@ -4,6 +4,13 @@ table! {
}
}
table! {
prefixes (id) {
id -> Int8,
prefix -> Varchar,
}
}
table! {
warfeedlisteners (id) {
id -> Int8,
@ -12,5 +19,6 @@ table! {
allow_tables_to_appear_in_same_query!(
livefeedlisteners,
prefixes,
warfeedlisteners,
);