bumped to rc.7. embed avatar inside executable. nudge now outputs the current nudge when ran with no arguments

This commit is contained in:
jude 2020-10-23 22:23:43 +01:00
parent 50fb28d226
commit 8e567bf10b
5 changed files with 38 additions and 40 deletions

2
Cargo.lock generated
View File

@ -1165,7 +1165,7 @@ dependencies = [
[[package]] [[package]]
name = "reminder_rs" name = "reminder_rs"
version = "1.0.0-rc.6" version = "1.0.0-rc.7"
dependencies = [ dependencies = [
"Inflector", "Inflector",
"async-trait", "async-trait",

View File

@ -1,6 +1,6 @@
[package] [package]
name = "reminder_rs" name = "reminder_rs"
version = "1.0.0-rc.6" version = "1.0.0-rc.7"
authors = ["jellywx <judesouthworth@pm.me>"] authors = ["jellywx <judesouthworth@pm.me>"]
edition = "2018" edition = "2018"

View File

@ -12,7 +12,7 @@ Serenity and Rust are proving wonders for SoundFX. This is all in an effort to r
You'll need rustc and cargo for compilation. To run, you'll need Python 3 still (due to no suitable replacement for dateparser in Rust) You'll need rustc and cargo for compilation. To run, you'll need Python 3 still (due to no suitable replacement for dateparser in Rust)
### Compiling ### Compiling
Reminder Bot can be built by running `cargo build --release` in the top level directory. Reminder Bot can be built by running `cargo build --release` in the top level directory. It is necessary to create a folder called 'assets' containing an image file with its name specified in the environment as `WEBHOOK_AVATAR`, of dimensions 128x128px to be used as the webhook avatar.
### Setting up Python ### Setting up Python
Reminder Bot by default looks for a venv within it's working directory to run Python out of. To set up a venv, install `python3-venv` and run `python3 -m venv venv`. Then, run `source venv/bin/activate` to activate the venv, and do `pip install dateparser` to install the required library Reminder Bot by default looks for a venv within it's working directory to run Python out of. To set up a venv, install `python3-venv` and run `python3 -m venv venv`. Then, run `source venv/bin/activate` to activate the venv, and do `pip install dateparser` to install the required library

View File

@ -6,7 +6,7 @@ use serenity::{
cache::Cache, cache::Cache,
client::Context, client::Context,
framework::standard::CommandResult, framework::standard::CommandResult,
http::{AttachmentType, CacheHttp}, http::CacheHttp,
model::{ model::{
channel::GuildChannel, channel::GuildChannel,
channel::Message, channel::Message,
@ -23,7 +23,7 @@ use crate::{
check_subscription_on_message, check_subscription_on_message,
consts::{ consts::{
CHARACTERS, DAY, HOUR, LOCAL_TIMEZONE, MAX_TIME, MINUTE, MIN_INTERVAL, PYTHON_LOCATION, CHARACTERS, DAY, HOUR, LOCAL_TIMEZONE, MAX_TIME, MINUTE, MIN_INTERVAL, PYTHON_LOCATION,
REGEX_CHANNEL, REGEX_CHANNEL_USER, WEBHOOK_AVATAR, REGEX_CHANNEL, REGEX_CHANNEL_USER,
}, },
framework::SendIterator, framework::SendIterator,
models::{ChannelData, GuildData, Timer, UserData}, models::{ChannelData, GuildData, Timer, UserData},
@ -47,7 +47,6 @@ use std::{
convert::TryInto, convert::TryInto,
default::Default, default::Default,
fmt::Display, fmt::Display,
path::Path,
string::ToString, string::ToString,
time::{SystemTime, UNIX_EPOCH}, time::{SystemTime, UNIX_EPOCH},
}; };
@ -55,10 +54,17 @@ use std::{
use regex::Regex; use regex::Regex;
fn shorthand_displacement(seconds: u64) -> String { fn shorthand_displacement(seconds: u64) -> String {
let (days, seconds) = seconds.div_rem(&DAY);
let (hours, seconds) = seconds.div_rem(&HOUR); let (hours, seconds) = seconds.div_rem(&HOUR);
let (minutes, seconds) = seconds.div_rem(&MINUTE); let (minutes, seconds) = seconds.div_rem(&MINUTE);
format!("{:02}:{:02}:{:02}", hours, minutes, seconds) let time_repr = format!("{:02}:{:02}:{:02}", hours, minutes, seconds);
if days > 0 {
format!("{} days, {}", days, time_repr)
} else {
time_repr
}
} }
fn longhand_displacement(seconds: u64) -> String { fn longhand_displacement(seconds: u64) -> String {
@ -84,15 +90,24 @@ async fn create_webhook(
ctx: impl CacheHttp, ctx: impl CacheHttp,
channel: GuildChannel, channel: GuildChannel,
name: impl Display, name: impl Display,
avatar: Option<String>,
) -> SerenityResult<Webhook> { ) -> SerenityResult<Webhook> {
if let Some(path) = avatar {
channel channel
.create_webhook_with_avatar(ctx.http(), name, AttachmentType::from(Path::new(&path))) .create_webhook_with_avatar(
ctx.http(),
name,
(
include_bytes!(concat!(
env!("CARGO_MANIFEST_DIR"),
"/assets/",
env!(
"WEBHOOK_AVATAR",
"WEBHOOK_AVATAR not provided for compilation"
)
)) as &[u8],
env!("WEBHOOK_AVATAR"),
),
)
.await .await
} else {
channel.create_webhook(ctx.http(), name).await
}
} }
#[command] #[command]
@ -249,10 +264,12 @@ async fn nudge(ctx: &Context, msg: &Message, args: String) -> CommandResult {
.unwrap(); .unwrap();
if args.is_empty() { if args.is_empty() {
let _ = msg let content = user_data
.channel_id .response(&pool, "nudge/no_argument")
.say(&ctx, user_data.response(&pool, "nudge/invalid_time").await) .await
.await; .replace("{nudge}", &format!("{}s", &channel.nudge.to_string()));
let _ = msg.channel_id.say(&ctx, content).await;
} else { } else {
let parser = TimeParser::new(args, user_data.timezone.parse().unwrap()); let parser = TimeParser::new(args, user_data.timezone.parse().unwrap());
let nudge_time = parser.displacement(); let nudge_time = parser.displacement();
@ -1234,10 +1251,7 @@ async fn create_reminder<T: TryInto<i64>, S: ToString + Type<MySql> + Encode<MyS
if let Some(guild_channel) = channel.guild() { if let Some(guild_channel) = channel.guild() {
if channel_data.webhook_token.is_none() || channel_data.webhook_id.is_none() { if channel_data.webhook_token.is_none() || channel_data.webhook_id.is_none() {
if let Ok(webhook) = if let Ok(webhook) = create_webhook(&ctx, guild_channel, "Reminder").await {
create_webhook(&ctx, guild_channel, "Reminder", WEBHOOK_AVATAR.clone())
.await
{
channel_data.webhook_id = Some(webhook.id.as_u64().to_owned()); channel_data.webhook_id = Some(webhook.id.as_u64().to_owned());
channel_data.webhook_token = Some(webhook.token); channel_data.webhook_token = Some(webhook.token);

View File

@ -6,12 +6,10 @@ pub const CHARACTERS: &str = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWX
const THEME_COLOR_FALLBACK: u32 = 0x8fb677; const THEME_COLOR_FALLBACK: u32 = 0x8fb677;
use std::{collections::HashSet, env, iter::FromIterator, path::Path}; use std::{collections::HashSet, env, iter::FromIterator};
use regex::Regex; use regex::Regex;
use log::warn;
lazy_static! { lazy_static! {
pub static ref SUBSCRIPTION_ROLES: HashSet<u64> = HashSet::from_iter( pub static ref SUBSCRIPTION_ROLES: HashSet<u64> = HashSet::from_iter(
env::var("SUBSCRIPTION_ROLES") env::var("SUBSCRIPTION_ROLES")
@ -55,18 +53,4 @@ lazy_static! {
THEME_COLOR_FALLBACK, THEME_COLOR_FALLBACK,
|inner| u32::from_str_radix(&inner, 16).unwrap_or(THEME_COLOR_FALLBACK) |inner| u32::from_str_radix(&inner, 16).unwrap_or(THEME_COLOR_FALLBACK)
); );
pub static ref WEBHOOK_AVATAR: Option<String> = env::var("WEBHOOK_AVATAR")
.ok()
.map(|s| {
let p = Path::new(&s);
if !p.exists() {
warn!("WEBHOOK_AVATAR path doesn't exist. Falling back");
None
} else {
Some(s)
}
})
.flatten();
} }