update serenity to 0.10

async stuff
This commit is contained in:
kageru 2021-05-04 00:01:36 +02:00
parent 23d8ed09df
commit e0015323a0
Signed by: kageru
GPG Key ID: 8282A2BEA4ADA3D2
2 changed files with 56 additions and 38 deletions

View File

@ -7,10 +7,12 @@ edition = "2018"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies] [dependencies]
async-trait = "0.1.42"
itertools = "0.10.0" itertools = "0.10.0"
lazy_static = "1.4.0" lazy_static = "1.4.0"
redis = "0.20.0" redis = "0.20.0"
serde = { version = "1.0.123", features = ["derive"] } serde = { version = "1.0.123", features = ["derive"] }
serde_json = "1.0.62" serde_json = "1.0.62"
serenity = "0.8.6" serenity = "0.10.5"
time = "0.2.10" time = "0.2.10"
tokio = { version = "1.2.0", features = ["full"] }

View File

@ -1,10 +1,11 @@
use async_trait::async_trait;
use inbox::*; use inbox::*;
use itertools::Itertools; use itertools::Itertools;
use lazy_static::lazy_static; use lazy_static::lazy_static;
use serenity::client::Client; use serenity::client::Client;
use serenity::framework::standard::{ use serenity::framework::standard::{
macros::{command, group}, macros::{command, group},
CommandError, CommandResult, StandardFramework, CommandResult, StandardFramework,
}; };
use serenity::model::{ use serenity::model::{
channel::Message, channel::Message,
@ -36,12 +37,15 @@ macro_rules! send_or_log {
#[commands(name, message, question, inbox)] #[commands(name, message, question, inbox)]
struct Fluff; struct Fluff;
struct Handler; struct Handler;
#[async_trait]
impl EventHandler for Handler { impl EventHandler for Handler {
fn guild_ban_addition(&self, ctx: Context, guild_id: GuildId, _: User) { async fn guild_ban_addition(&self, ctx: Context, guild_id: GuildId, _: User) {
if guild_id == 427456811973738498 { if guild_id == 427456811973738498 {
send_or_log!( send_or_log!({
ChannelId(562731470423064587).say(&ctx, "Dies ist eine flauschige Diktatur!") ChannelId(562731470423064587)
); .say(&ctx, "Dies ist eine flauschige Diktatur!")
.await
});
} }
} }
} }
@ -51,30 +55,34 @@ fn read_token() -> io::Result<String> {
reader.lines().next().unwrap() reader.lines().next().unwrap()
} }
fn main() { #[tokio::main]
let mut client = Client::new(&read_token().expect("no secret file"), Handler) async fn main() {
let mut client = Client::builder(&read_token().expect("no secret file"))
.event_handler(Handler)
.framework(
StandardFramework::new()
.configure(|c| c.prefix("!"))
.group(&FLUFF_GROUP),
)
.await
.expect("Error creating client"); .expect("Error creating client");
client.with_framework(
StandardFramework::new()
.configure(|c| c.prefix("!"))
.group(&FLUFF_GROUP),
);
INBOX.count_messages("test"); // initialize the lazy static so we know if redis is unavailable INBOX.count_messages("test"); // initialize the lazy static so we know if redis is unavailable
if let Err(why) = client.start() { if let Err(why) = client.start().await {
println!("An error occurred while running the client: {:?}", why); println!("An error occurred while running the client: {:?}", why);
} }
} }
#[command] #[command]
fn name(ctx: &mut Context, msg: &Message) -> CommandResult { async fn name(ctx: &Context, msg: &Message) -> CommandResult {
if let Some((_, name)) = msg.content.split_once(' ') { if let Some((_, name)) = msg.content.split_once(' ') {
let (name, adjustment) = name.split_once(" -").unwrap_or((name, "0")); let (name, adjustment) = name.split_once(" -").unwrap_or((name, "0"));
let adjustment = adjustment.strip_suffix("h").unwrap_or(adjustment); let adjustment = adjustment.strip_suffix("h").unwrap_or(adjustment);
msg.guild(&ctx) msg.guild(&ctx)
.await
.unwrap() .unwrap()
.read() .edit_member(&ctx, msg.author.id, |m| m.nickname(name))
.edit_member(&ctx, msg.author.id, |m| m.nickname(name))?; .await?;
let now = time::OffsetDateTime::now_utc() let now = time::OffsetDateTime::now_utc()
- adjustment - adjustment
.parse::<f32>() .parse::<f32>()
@ -91,47 +99,54 @@ fn name(ctx: &mut Context, msg: &Message) -> CommandResult {
now.unix_timestamp() now.unix_timestamp()
); );
} else { } else {
return Err(CommandError(String::from("Please specify a new name."))); send_or_log!(msg.reply(&ctx, "Please specify a new name.").await);
} }
Ok(()) Ok(())
} }
#[command] #[command]
fn inbox(ctx: &mut Context, msg: &Message) -> CommandResult { async fn inbox(ctx: &Context, msg: &Message) -> CommandResult {
if msg.author.id != INBOX_OWNER { if msg.author.id != INBOX_OWNER {
send_or_log!(msg.reply(&ctx, "You don’t have the permission to do that")); send_or_log!(
msg.reply(&ctx, "You don’t have the permission to do that")
.await
);
return Ok(()); return Ok(());
} }
if let Some((_, name)) = msg.content.split_once(' ') { if let Some((_, name)) = msg.content.split_once(' ') {
let messages = INBOX.fetch_messages(name); let messages = INBOX.fetch_messages(name);
if messages.is_empty() { if messages.is_empty() {
send_or_log!(msg.reply(&ctx, format!("Keine neuen Nachrichten für {}.", name))); send_or_log!(
msg.reply(&ctx, format!("Keine neuen Nachrichten für {}.", name))
.await
);
return Ok(()); return Ok(());
} }
let output = messages.into_iter().join("\n"); let output = messages.into_iter().join("\n");
send_or_log!(msg.reply(&ctx, output)); send_or_log!(msg.reply(&ctx, output).await);
} else { } else {
send_or_log!(msg.reply(&ctx, "Kein Name für die Abfrage.")); send_or_log!(msg.reply(&ctx, "Kein Name für die Abfrage.").await);
} }
Ok(()) Ok(())
} }
#[command] #[command]
fn message(ctx: &mut Context, msg: &Message) -> CommandResult { async fn message(ctx: &Context, msg: &Message) -> CommandResult {
message_internal(ctx, msg, &msg.content) message_internal(ctx, msg, &msg.content).await
} }
#[command] #[command]
fn question(ctx: &mut Context, msg: &Message) -> CommandResult { async fn question(ctx: &Context, msg: &Message) -> CommandResult {
message_internal( message_internal(
ctx, ctx,
msg, msg,
&msg.content.replacen("!question", "!message Stream:", 1), &msg.content.replacen("!question", "!message Stream:", 1),
) )
.await
} }
fn message_internal(ctx: &mut Context, msg: &Message, content: &str) -> CommandResult { async fn message_internal(ctx: &Context, msg: &Message, content: &str) -> CommandResult {
InboxMessage::parse(content, msg.author.id) let result = InboxMessage::parse(content, msg.author.id)
.ok_or_else(|| { .ok_or_else(|| {
String::from( String::from(
"Nachricht konnte nicht gesendet werden. "Nachricht konnte nicht gesendet werden.
@ -139,15 +154,16 @@ Bitte achte auf die richtige Formulierung: “!message <name>: <text>”,
z.B. !message Lana: Hawwu!", z.B. !message Lana: Hawwu!",
) )
}) })
.and_then(|m| INBOX.queue_message(&m)) .and_then(|m| INBOX.queue_message(&m));
.map(|n| { match result {
send_or_log!(msg.reply( Ok(name) => send_or_log!(
msg.reply(
&ctx, &ctx,
&format!("Deine Nachricht wurde erfolgreich an {} gesendet", n), format!("Deine Nachricht wurde erfolgreich an {} gesendet", name),
)); )
}) .await
.map_err(|e| { ),
send_or_log!(msg.reply(&ctx, &e)); Err(e) => send_or_log!(msg.reply(&ctx, e).await),
CommandError(e) };
}) Ok(())
} }