Add pekofy command

Signed-off-by: trivernis <trivernis@protonmail.com>
pull/2/head
trivernis 3 years ago
parent 5ab22fd343
commit f0d2111628
Signed by: Trivernis
GPG Key ID: DFFFCC2C7A02DB45

@ -6,8 +6,8 @@ use crate::utils::store::Store;
#[command]
#[description("Provides information for a single enchantment")]
#[usage("enchantment <enchantment-name>")]
#[example("item unbreaking")]
#[usage("<enchantment-name>")]
#[example("unbreaking")]
#[min_args(1)]
#[aliases("ench")]
pub(crate) async fn enchantment(ctx: &Context, msg: &Message, args: Args) -> CommandResult {

@ -6,8 +6,8 @@ use crate::utils::store::Store;
#[command]
#[description("Provides information for a single minecraft item")]
#[usage("item <item-name>")]
#[example("item bread")]
#[usage("<item-name>")]
#[example("bread")]
#[min_args(1)]
#[aliases("i")]
pub(crate) async fn item(ctx: &Context, msg: &Message, args: Args) -> CommandResult {

@ -8,5 +8,5 @@ mod item;
#[group]
#[commands(item, enchantment)]
#[prefix("mc")]
#[prefixes("mc", "minecraft")]
pub(crate) struct Minecraft;

@ -1,14 +1,16 @@
use serenity::framework::standard::macros::group;
use pekofy::PEKOFY_COMMAND;
use ping::PING_COMMAND;
use shutdown::SHUTDOWN_COMMAND;
use stats::STATS_COMMAND;
pub(crate) mod help;
mod pekofy;
mod ping;
mod shutdown;
mod stats;
#[group]
#[commands(ping, stats, shutdown)]
#[commands(ping, stats, shutdown, pekofy)]
pub struct Misc;

@ -0,0 +1,98 @@
use serenity::framework::standard::{Args, CommandError, CommandResult};
use serenity::model::channel::Message;
use serenity::{framework::standard::macros::command, prelude::*};
static MESSAGE_DELIMITERS: &[char] = &['.', '?', '!', '"'];
static MARKDOWN_SPECIAL_CHARACTERS: &[&str] = &["~~", "**", "*"];
#[command]
#[description("Pekofy messages")]
#[usage("(<content>)")]
#[example("Hello")]
async fn pekofy(ctx: &Context, msg: &Message, args: Args) -> CommandResult {
let mut reference_message = msg.id;
let mut content = args.message().to_string();
if args.is_empty() {
if let Some(reference) = &msg.referenced_message {
reference_message = reference.id;
content = reference.content.clone();
} else {
let messages = msg
.channel_id
.messages(ctx, |ret| ret.before(&msg.id).limit(1))
.await?;
let reference = messages
.first()
.ok_or(CommandError::from("No message to pekofy"))?;
reference_message = reference.id;
content = reference.content.clone();
};
let _ = msg.delete(ctx).await;
}
if content.is_empty() {
return Err(CommandError::from("Can't pekofy empty message"));
}
log::debug!("Pekofying message '{}'", content);
let pekofied: String = content
.lines()
.into_iter()
.map(pekofy_line)
.collect::<Vec<String>>()
.join("\n");
let message = ctx
.http
.get_message(msg.channel_id.0, reference_message.0)
.await?;
log::debug!("Pekofied message is '{}'", pekofied);
message.reply(ctx, pekofied).await?;
Ok(())
}
/// Pekofies a single line
fn pekofy_line(mut line: &str) -> String {
log::debug!("Pekofying line '{}'", line);
let original = line;
let mut md_index = None;
for pattern in MARKDOWN_SPECIAL_CHARACTERS {
if let Some(i) = line.rfind(pattern) {
log::debug!("Found markdown at index {}", i);
md_index = Some(i);
break;
}
}
let mut md = "";
if let Some(index) = md_index {
let (line_part, md_part) = line.split_at(index);
line = line_part;
md = md_part;
}
if line.ends_with("peko") {
log::debug!("Peko already found in message. Returning original");
return original.to_string();
}
let punctuation_index = line.rfind(MESSAGE_DELIMITERS);
let mut peko = "peko".to_string();
if line
.chars()
.filter(|c| c.is_alphabetic())
.all(char::is_uppercase)
{
log::debug!("Message is all uppercase. Peko will also be uppercase");
peko = peko.to_uppercase();
}
if let Some(index) = punctuation_index {
log::debug!("Found punctuation at index {}", index);
let (before, after) = line.split_at(index);
format!("{} {}{}{}", before, peko, after, md)
} else {
format!("{} {}{}", line, peko, md)
}
}

@ -5,8 +5,7 @@ use serenity::model::channel::Message;
#[command]
#[description("Simple ping test command")]
#[usage("ping")]
#[example("ping")]
#[usage("")]
async fn ping(ctx: &Context, msg: &Message) -> CommandResult {
msg.reply(ctx, "Pong!").await?;

@ -6,8 +6,7 @@ use std::process;
#[command]
#[description("Shutdown")]
#[usage("shutdown")]
#[example("shutdown")]
#[usage("")]
#[owners_only]
async fn shutdown(ctx: &Context, msg: &Message) -> CommandResult {
log::info!("Shutting down...");

@ -9,8 +9,7 @@ use sysinfo::{ProcessExt, SystemExt};
#[command]
#[description("Shows some statistics about the bot")]
#[usage("stats")]
#[example("stats")]
#[usage("")]
async fn stats(ctx: &Context, msg: &Message) -> CommandResult {
log::debug!("Reading system stats");
let mut system = sysinfo::System::new_all();

@ -8,7 +8,7 @@ use crate::commands::music::get_queue_for_guild;
#[command]
#[only_in(guilds)]
#[description("Clears the queue")]
#[usage("clear")]
#[usage("")]
#[aliases("cl")]
#[allowed_roles("DJ")]
async fn clear(ctx: &Context, msg: &Message) -> CommandResult {

@ -8,7 +8,7 @@ use crate::commands::music::get_queue_for_guild;
#[command]
#[only_in(guilds)]
#[description("Displays the currently playing song")]
#[usage("current")]
#[usage("")]
#[aliases("nowplaying", "np")]
async fn current(ctx: &Context, msg: &Message) -> CommandResult {
let guild = msg.guild(&ctx.cache).await.unwrap();

@ -8,7 +8,7 @@ use crate::commands::music::{get_channel_for_author, join_channel};
#[command]
#[only_in(guilds)]
#[description("Joins a voice channel")]
#[usage("join")]
#[usage("")]
async fn join(ctx: &Context, msg: &Message) -> CommandResult {
let guild = msg.guild(&ctx.cache).await.unwrap();
let channel_id = get_channel_for_author(&msg.author.id, &guild)?;

@ -8,7 +8,7 @@ use crate::commands::music::{get_queue_for_guild, get_voice_manager};
#[command]
#[only_in(guilds)]
#[description("Leaves a voice channel")]
#[usage("leave")]
#[usage("")]
#[aliases("stop")]
#[allowed_roles("DJ")]
async fn leave(ctx: &Context, msg: &Message) -> CommandResult {

@ -48,7 +48,7 @@ mod skip;
#[commands(
join, leave, play, queue, skip, shuffle, current, play_next, clear, pause
)]
#[prefix("m")]
#[prefixes("m", "music")]
pub struct Music;
struct SongEndNotifier {

@ -8,7 +8,7 @@ use crate::commands::music::get_queue_for_guild;
#[command]
#[only_in(guilds)]
#[description("Pauses playback")]
#[usage("pause")]
#[usage("")]
#[allowed_roles("DJ")]
async fn pause(ctx: &Context, msg: &Message) -> CommandResult {
let guild = msg.guild(&ctx.cache).await.unwrap();

@ -13,7 +13,7 @@ use crate::database::guild::SETTING_AUTOSHUFFLE;
#[command]
#[only_in(guilds)]
#[description("Plays a song in a voice channel")]
#[usage("play <url>")]
#[usage("(<spotify_url,youtube_url,query>)")]
#[min_args(1)]
#[aliases("p")]
async fn play(ctx: &Context, msg: &Message, args: Args) -> CommandResult {

@ -11,7 +11,7 @@ use crate::commands::music::{
#[command]
#[only_in(guilds)]
#[description("Puts a song as the next to play in the queue")]
#[usage("play_next <song-url>")]
#[usage("<song-url>")]
#[min_args(1)]
#[aliases("pn")]
#[allowed_roles("DJ")]

@ -10,7 +10,7 @@ use crate::commands::music::get_queue_for_guild;
#[command]
#[only_in(guilds)]
#[description("Shows the song queue")]
#[usage("queue")]
#[usage("")]
#[aliases("q")]
async fn queue(ctx: &Context, msg: &Message) -> CommandResult {
let guild = msg.guild(&ctx.cache).await.unwrap();

@ -8,7 +8,7 @@ use crate::commands::music::get_queue_for_guild;
#[command]
#[only_in(guilds)]
#[description("Shuffles the queue")]
#[usage("shuffle")]
#[usage("")]
#[aliases("sh")]
#[allowed_roles("DJ")]
async fn shuffle(ctx: &Context, msg: &Message) -> CommandResult {

@ -8,7 +8,7 @@ use crate::commands::music::get_queue_for_guild;
#[command]
#[only_in(guilds)]
#[description("Skips to the next song")]
#[usage("skip")]
#[usage("")]
#[aliases("next")]
#[allowed_roles("DJ")]
async fn skip(ctx: &Context, msg: &Message) -> CommandResult {

@ -9,8 +9,8 @@ use crate::database::guild::GUILD_SETTINGS;
#[command]
#[only_in(guilds)]
#[description("Get a guild setting")]
#[usage("get (<setting>)")]
#[example("get music.autoshuffle")]
#[usage("(<setting>)")]
#[example("music.autoshuffle")]
#[min_args(0)]
#[max_args(1)]
#[required_permissions("MANAGE_GUILD")]

@ -8,8 +8,8 @@ use crate::database::get_database_from_context;
#[command]
#[only_in(guilds)]
#[description("Set a guild setting")]
#[usage("set <setting> <value>")]
#[example("set music.autoshuffle true")]
#[usage("<setting> <value>")]
#[example("music.autoshuffle true")]
#[min_args(2)]
#[max_args(2)]
#[required_permissions("MANAGE_GUILD")]

Loading…
Cancel
Save