Added event organizer and event location
+ Event location is a new required field + Event organizer defaults to user that ran the command, or can be specified + Formatted codemaster
parent
9d8688ad92
commit
81660a72df
|
@ -467,6 +467,7 @@ dependencies = [
|
||||||
"serde_derive 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)",
|
"serde_derive 1.0.106 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"serenity 0.8.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
"serenity 0.8.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
"strfmt 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
"strfmt 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
|
"url 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|
|
@ -18,6 +18,7 @@ diesel_migrations = "1.4.0"
|
||||||
log = "0.4.8"
|
log = "0.4.8"
|
||||||
log4rs = "0.11.0"
|
log4rs = "0.11.0"
|
||||||
strfmt = "0.1.6"
|
strfmt = "0.1.6"
|
||||||
|
url = "2.1.1"
|
||||||
|
|
||||||
[dependencies.serenity]
|
[dependencies.serenity]
|
||||||
version = "0.8.4"
|
version = "0.8.4"
|
||||||
|
|
|
@ -3,6 +3,8 @@ CREATE TABLE events (
|
||||||
id INTEGER AUTO_INCREMENT PRIMARY KEY,
|
id INTEGER AUTO_INCREMENT PRIMARY KEY,
|
||||||
event_name VARCHAR(255) NOT NULL,
|
event_name VARCHAR(255) NOT NULL,
|
||||||
event_desc VARCHAR(255) NOT NULL,
|
event_desc VARCHAR(255) NOT NULL,
|
||||||
|
event_loc VARCHAR(255) NOT NULL,
|
||||||
|
organizer VARCHAR(255) NOT NULL,
|
||||||
event_time DATETIME NOT NULL,
|
event_time DATETIME NOT NULL,
|
||||||
message_id VARCHAR(255) NOT NULL,
|
message_id VARCHAR(255) NOT NULL,
|
||||||
thumbnail_link VARCHAR(255) NOT NULL,
|
thumbnail_link VARCHAR(255) NOT NULL,
|
||||||
|
|
|
@ -9,6 +9,10 @@ pub struct Event {
|
||||||
pub event_name: String,
|
pub event_name: String,
|
||||||
/// Event long description
|
/// Event long description
|
||||||
pub event_desc: String,
|
pub event_desc: String,
|
||||||
|
/// Event location
|
||||||
|
pub event_loc: String,
|
||||||
|
/// Event organizer
|
||||||
|
pub organizer: String,
|
||||||
/// Event datetime
|
/// Event datetime
|
||||||
pub event_time: NaiveDateTime,
|
pub event_time: NaiveDateTime,
|
||||||
/// Event discord message id
|
/// Event discord message id
|
||||||
|
@ -24,6 +28,8 @@ impl Into<NewEvent> for Event {
|
||||||
NewEvent {
|
NewEvent {
|
||||||
event_name: self.event_name.clone(),
|
event_name: self.event_name.clone(),
|
||||||
event_desc: self.event_desc.clone(),
|
event_desc: self.event_desc.clone(),
|
||||||
|
organizer: self.organizer.clone(),
|
||||||
|
event_loc: self.event_loc.clone(),
|
||||||
event_time: self.event_time.clone(),
|
event_time: self.event_time.clone(),
|
||||||
message_id: self.message_id.clone(),
|
message_id: self.message_id.clone(),
|
||||||
thumbnail_link: self.message_id.clone(),
|
thumbnail_link: self.message_id.clone(),
|
||||||
|
@ -39,6 +45,10 @@ pub struct NewEvent {
|
||||||
pub event_name: String,
|
pub event_name: String,
|
||||||
/// Event long description
|
/// Event long description
|
||||||
pub event_desc: String,
|
pub event_desc: String,
|
||||||
|
/// Event location
|
||||||
|
pub event_loc: String,
|
||||||
|
/// Event organizer
|
||||||
|
pub organizer: String,
|
||||||
/// Event datetime
|
/// Event datetime
|
||||||
pub event_time: NaiveDateTime,
|
pub event_time: NaiveDateTime,
|
||||||
/// Event discord message id
|
/// Event discord message id
|
||||||
|
|
|
@ -3,6 +3,8 @@ table! {
|
||||||
id -> Integer,
|
id -> Integer,
|
||||||
event_name -> Varchar,
|
event_name -> Varchar,
|
||||||
event_desc -> Varchar,
|
event_desc -> Varchar,
|
||||||
|
event_loc -> Varchar,
|
||||||
|
organizer -> Varchar,
|
||||||
event_time -> Datetime,
|
event_time -> Datetime,
|
||||||
message_id -> Varchar,
|
message_id -> Varchar,
|
||||||
thumbnail_link -> Varchar,
|
thumbnail_link -> Varchar,
|
||||||
|
|
|
@ -5,10 +5,11 @@ use crate::{DraftEvent, INTERESTED_EMOJI};
|
||||||
use chrono::offset::TimeZone;
|
use chrono::offset::TimeZone;
|
||||||
use chrono::{Datelike, NaiveDateTime, Timelike, Utc};
|
use chrono::{Datelike, NaiveDateTime, Timelike, Utc};
|
||||||
use chrono_tz::Tz;
|
use chrono_tz::Tz;
|
||||||
use serenity::framework::standard::{macros::command, Args, CommandError, CommandResult};
|
use serenity::framework::standard::{macros::command, Args, CommandResult};
|
||||||
use serenity::model::prelude::{Message, User};
|
use serenity::model::prelude::{Mentionable, Message, User};
|
||||||
use serenity::prelude::Context;
|
use serenity::prelude::Context;
|
||||||
use serenity::utils::{content_safe, ContentSafeOptions};
|
use serenity::utils::{content_safe, ContentSafeOptions};
|
||||||
|
use url::Url;
|
||||||
|
|
||||||
#[command]
|
#[command]
|
||||||
/// Posts a previewed event
|
/// Posts a previewed event
|
||||||
|
@ -46,47 +47,61 @@ fn confirm(ctx: &mut Context, msg: &Message, _args: Args) -> CommandResult {
|
||||||
#[command]
|
#[command]
|
||||||
/// Creates an event and previews the announcement
|
/// Creates an event and previews the announcement
|
||||||
///
|
///
|
||||||
/// `~create "event name" "04:20pm 2069-04-20" "event description" <http://optional.thumbnail.link>`
|
/// `~create "event name" "04:20pm 2069-04-20" "event description" "http://optional.thumbnail.link" "optional organizer`
|
||||||
///
|
///
|
||||||
/// **Time format**
|
/// **Time format**
|
||||||
/// The time format is HH:MMam YYYY-MM-DD
|
/// The time format is HH:MMam YYYY-MM-DD
|
||||||
///
|
///
|
||||||
/// **Thumbnail Link**
|
/// **Thumbnail Link**
|
||||||
/// The thumbnail link is optional, if one is not provided, a default image is shown
|
/// The thumbnail link is optional, if one is not provided, a default image is shown
|
||||||
|
///
|
||||||
|
/// **Organizer**
|
||||||
|
/// The user or group that is organizing the event, defaults to the user creating the event
|
||||||
fn create(ctx: &mut Context, msg: &Message, mut args: Args) -> CommandResult {
|
fn create(ctx: &mut Context, msg: &Message, mut args: Args) -> CommandResult {
|
||||||
// Get config
|
// Get config
|
||||||
let config = get_config(&ctx.data)?;
|
let config = get_config(&ctx.data)?;
|
||||||
let guild_id = msg
|
|
||||||
.guild_id
|
|
||||||
.ok_or(CommandError("Unable to get guild ID".to_string()))?;
|
|
||||||
|
|
||||||
// Parse args
|
// Parse args
|
||||||
let event_name = match args.single::<String>() {
|
let event_name = match args.find::<String>() {
|
||||||
Ok(event_name) => event_name.replace("\"", ""),
|
Ok(event_name) => event_name.replace("\"", ""),
|
||||||
Err(_) => {
|
Err(_) => {
|
||||||
msg.reply(&ctx, "No event name provided.".to_string())?;
|
msg.reply(&ctx, "No event name provided.".to_string())?;
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
let date_string = match args.single::<String>() {
|
let date_string = match args.find::<String>() {
|
||||||
Ok(date_string) => date_string.replace("\"", ""),
|
Ok(date_string) => date_string.replace("\"", ""),
|
||||||
Err(_) => {
|
Err(_) => {
|
||||||
msg.reply(&ctx, "No date provided.".to_string())?;
|
msg.reply(&ctx, "No date provided.".to_string())?;
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
let description = match args.single::<String>() {
|
let description = match args.find::<String>() {
|
||||||
Ok(desc) => desc.replace("\"", ""),
|
Ok(desc) => desc.replace("\"", ""),
|
||||||
Err(_) => {
|
Err(_) => {
|
||||||
msg.reply(&ctx, "No description provided.".to_string())?;
|
msg.reply(&ctx, "No description provided.".to_string())?;
|
||||||
return Ok(());
|
return Ok(());
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
let thumbnail_link = match args.single::<String>() {
|
|
||||||
Ok(link) => link.replace("<", "").replace(">", ""),
|
let location = match args.find::<String>() {
|
||||||
|
Ok(desc) => desc.replace("\"", ""),
|
||||||
|
Err(_) => {
|
||||||
|
msg.reply(&ctx, "No location provided.".to_string())?;
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
let thumbnail_link = match args.find::<Url>() {
|
||||||
|
Ok(link) => link.into_string(),
|
||||||
Err(_) => config.default_thumbnail_link.clone(),
|
Err(_) => config.default_thumbnail_link.clone(),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
let organizer = match args.find::<String>() {
|
||||||
|
Ok(link) => link.replace("\"", ""),
|
||||||
|
Err(_) => msg.author.mention(),
|
||||||
|
};
|
||||||
|
|
||||||
// Parse date
|
// Parse date
|
||||||
let tz: Tz = config.event_timezone;
|
let tz: Tz = config.event_timezone;
|
||||||
let input_date = match NaiveDateTime::parse_from_str(date_string.as_str(), "%I:%M%P %Y-%m-%d") {
|
let input_date = match NaiveDateTime::parse_from_str(date_string.as_str(), "%I:%M%P %Y-%m-%d") {
|
||||||
|
@ -114,21 +129,29 @@ fn create(ctx: &mut Context, msg: &Message, mut args: Args) -> CommandResult {
|
||||||
|
|
||||||
let event_time = input_date.with_timezone(&Utc).naive_utc();
|
let event_time = input_date.with_timezone(&Utc).naive_utc();
|
||||||
|
|
||||||
|
if Utc::now().naive_utc() > event_time {
|
||||||
|
msg.reply(&ctx, "The scheduled time has already passed!")?;
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
|
||||||
// Clean channel, role, and everyone pings
|
// Clean channel, role, and everyone pings
|
||||||
let settings = ContentSafeOptions::default()
|
let settings = ContentSafeOptions::default()
|
||||||
.clean_role(true)
|
.clean_role(true)
|
||||||
.clean_here(true)
|
.clean_here(true)
|
||||||
.clean_user(true)
|
.clean_user(false)
|
||||||
.clean_everyone(true)
|
.clean_everyone(true);
|
||||||
.display_as_member_from(guild_id);
|
|
||||||
|
|
||||||
let description = content_safe(&ctx.cache, description, &settings);
|
let description = content_safe(&ctx.cache, description, &settings);
|
||||||
let event_name = content_safe(&ctx.cache, event_name, &settings);
|
let event_name = content_safe(&ctx.cache, event_name, &settings);
|
||||||
|
let location = content_safe(&ctx.cache, location, &settings);
|
||||||
|
let organizer = content_safe(&ctx.cache, organizer, &settings);
|
||||||
|
|
||||||
update_draft_event(
|
update_draft_event(
|
||||||
&ctx,
|
&ctx,
|
||||||
event_name,
|
event_name,
|
||||||
description,
|
description,
|
||||||
|
organizer,
|
||||||
|
location,
|
||||||
thumbnail_link,
|
thumbnail_link,
|
||||||
event_time,
|
event_time,
|
||||||
msg.author.id.0,
|
msg.author.id.0,
|
||||||
|
|
|
@ -9,9 +9,9 @@ use serenity::model::prelude::{ChannelId, Message, Reaction, User};
|
||||||
use serenity::prelude::{Context, RwLock, ShareMap};
|
use serenity::prelude::{Context, RwLock, ShareMap};
|
||||||
use serenity::utils::Colour;
|
use serenity::utils::Colour;
|
||||||
use serenity::Result;
|
use serenity::Result;
|
||||||
|
use std::collections::HashMap;
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
use strfmt::strfmt;
|
use strfmt::strfmt;
|
||||||
use std::collections::HashMap;
|
|
||||||
|
|
||||||
pub mod events;
|
pub mod events;
|
||||||
|
|
||||||
|
@ -38,12 +38,10 @@ pub fn send_message_to_reaction_users(ctx: &Context, reaction: &Reaction, msg_te
|
||||||
let mut fmt = HashMap::new();
|
let mut fmt = HashMap::new();
|
||||||
fmt.insert("event".to_string(), event.event_name);
|
fmt.insert("event".to_string(), event.event_name);
|
||||||
msg = strfmt(msg_text, &fmt).unwrap();
|
msg = strfmt(msg_text, &fmt).unwrap();
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
msg = format!("**{}** has already started!", &event.event_name)
|
msg = format!("**{}** has already started!", &event.event_name)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if let Ok(user) = reaction.user(&ctx.http) {
|
if let Ok(user) = reaction.user(&ctx.http) {
|
||||||
send_dm_message(&ctx.http, user, &msg);
|
send_dm_message(&ctx.http, user, &msg);
|
||||||
}
|
}
|
||||||
|
@ -85,6 +83,8 @@ pub fn send_event_msg(
|
||||||
.thumbnail(event.thumbnail_link.clone())
|
.thumbnail(event.thumbnail_link.clone())
|
||||||
.footer(|f| f.text("Local Event Time"))
|
.footer(|f| f.text("Local Event Time"))
|
||||||
.timestamp(utc_time.to_rfc3339())
|
.timestamp(utc_time.to_rfc3339())
|
||||||
|
.field("Location", &event.event_loc, true)
|
||||||
|
.field("Organizer", &event.organizer, true)
|
||||||
})
|
})
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
|
@ -102,6 +102,8 @@ pub fn update_draft_event(
|
||||||
ctx: &Context,
|
ctx: &Context,
|
||||||
event_name: String,
|
event_name: String,
|
||||||
event_desc: String,
|
event_desc: String,
|
||||||
|
organizer: String,
|
||||||
|
location: String,
|
||||||
thumbnail: String,
|
thumbnail: String,
|
||||||
event_time: NaiveDateTime,
|
event_time: NaiveDateTime,
|
||||||
creator_id: u64,
|
creator_id: u64,
|
||||||
|
@ -113,6 +115,8 @@ pub fn update_draft_event(
|
||||||
|
|
||||||
draft_event.event.event_name = event_name;
|
draft_event.event.event_name = event_name;
|
||||||
draft_event.event.event_desc = event_desc;
|
draft_event.event.event_desc = event_desc;
|
||||||
|
draft_event.event.event_loc = location;
|
||||||
|
draft_event.event.organizer = organizer;
|
||||||
draft_event.event.thumbnail_link = thumbnail;
|
draft_event.event.thumbnail_link = thumbnail;
|
||||||
draft_event.event.message_id = String::new();
|
draft_event.event.message_id = String::new();
|
||||||
draft_event.event.event_time = event_time;
|
draft_event.event.event_time = event_time;
|
||||||
|
|
|
@ -48,7 +48,7 @@ const UNINTERESTED_EMOJI: &str = "\u{274C}";
|
||||||
|
|
||||||
type HypeBotResult<T> = std::result::Result<T, Box<dyn std::error::Error>>;
|
type HypeBotResult<T> = std::result::Result<T, Box<dyn std::error::Error>>;
|
||||||
|
|
||||||
/// Event discord group
|
/// Event command group
|
||||||
#[group]
|
#[group]
|
||||||
#[only_in(guilds)]
|
#[only_in(guilds)]
|
||||||
#[description("Commands for Creating Events")]
|
#[description("Commands for Creating Events")]
|
||||||
|
@ -241,7 +241,9 @@ fn main() -> HypeBotResult<()> {
|
||||||
message_id: String::new(),
|
message_id: String::new(),
|
||||||
event_time: Utc::now().naive_utc(),
|
event_time: Utc::now().naive_utc(),
|
||||||
event_name: String::new(),
|
event_name: String::new(),
|
||||||
|
organizer: String::new(),
|
||||||
event_desc: String::new(),
|
event_desc: String::new(),
|
||||||
|
event_loc: String::new(),
|
||||||
thumbnail_link: String::new(),
|
thumbnail_link: String::new(),
|
||||||
reminder_sent: 0 as i32,
|
reminder_sent: 0 as i32,
|
||||||
},
|
},
|
||||||
|
|
Loading…
Reference in New Issue