troll
This commit is contained in:
Generated
+814
-28
File diff suppressed because it is too large
Load Diff
@@ -12,6 +12,7 @@ time = "0.3.41"
|
|||||||
itertools = "0.14"
|
itertools = "0.14"
|
||||||
tokio = {version = "1.47", features = ["rt-multi-thread", "signal"]}
|
tokio = {version = "1.47", features = ["rt-multi-thread", "signal"]}
|
||||||
dashmap = "6.1.0"
|
dashmap = "6.1.0"
|
||||||
|
reqwest = { version = "0.13.2", features = ["json"] }
|
||||||
|
|
||||||
[dependencies.serenity]
|
[dependencies.serenity]
|
||||||
version = "0.12"
|
version = "0.12"
|
||||||
|
|||||||
+50
-3
@@ -1,7 +1,7 @@
|
|||||||
use dashmap::DashMap;
|
use dashmap::DashMap;
|
||||||
use itertools::Itertools;
|
use itertools::Itertools;
|
||||||
use log::{debug, error, info};
|
use log::{debug, error, info};
|
||||||
use serenity::all::{ActivityData, CreateEmbed, CreateMessage};
|
use serenity::all::{ActivityData, CreateEmbed, CreateMessage, TypingStartEvent};
|
||||||
use serenity::client::{Context, EventHandler};
|
use serenity::client::{Context, EventHandler};
|
||||||
use serenity::model::channel::Message;
|
use serenity::model::channel::Message;
|
||||||
use serenity::model::colour::Colour;
|
use serenity::model::colour::Colour;
|
||||||
@@ -12,7 +12,8 @@ use std::cmp::Reverse;
|
|||||||
use std::collections::HashMap;
|
use std::collections::HashMap;
|
||||||
use std::fmt::Display;
|
use std::fmt::Display;
|
||||||
use std::ops::RangeInclusive;
|
use std::ops::RangeInclusive;
|
||||||
use std::time::Duration;
|
use std::sync::Mutex;
|
||||||
|
use std::time::{Duration, Instant};
|
||||||
use time::OffsetDateTime;
|
use time::OffsetDateTime;
|
||||||
use tokio::sync::mpsc;
|
use tokio::sync::mpsc;
|
||||||
|
|
||||||
@@ -28,6 +29,7 @@ type Contests = DashMap<ChannelId, mpsc::Sender<Message>>;
|
|||||||
#[derive(Default)]
|
#[derive(Default)]
|
||||||
pub struct Handler {
|
pub struct Handler {
|
||||||
contests: Contests,
|
contests: Contests,
|
||||||
|
ntfy_typing_last: Mutex<Option<Instant>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Handler {
|
impl Handler {
|
||||||
@@ -36,9 +38,54 @@ impl Handler {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const NTFY_USER_ID: u64 = 313015629659635713;
|
||||||
|
const NTFY_URL: &str = "https://ntfy.noisruker.de/up123456789TestTest";
|
||||||
|
const NTFY_TYPING_TIMEOUT: Duration = Duration::from_secs(60);
|
||||||
|
|
||||||
#[serenity::async_trait]
|
#[serenity::async_trait]
|
||||||
impl EventHandler for Handler {
|
impl EventHandler for Handler {
|
||||||
|
async fn typing_start(&self, _ctx: Context, event: TypingStartEvent) {
|
||||||
|
if event
|
||||||
|
.member
|
||||||
|
.is_some_and(|m| m.user.id.get() == NTFY_USER_ID)
|
||||||
|
&& { self.ntfy_typing_last.lock() }
|
||||||
|
.unwrap()
|
||||||
|
.is_none_or(|i| i.elapsed() > NTFY_TYPING_TIMEOUT)
|
||||||
|
{
|
||||||
|
let client = reqwest::Client::new();
|
||||||
|
let res = client.post(NTFY_URL)
|
||||||
|
.header("Title", "Ich höre zu ...")
|
||||||
|
.header("Priority", "max")
|
||||||
|
.header("Tags", "ear")
|
||||||
|
.body("Du tippst gerade eine Nachricht auf Discord. Weiter so! Ich (wer auch immer ich sein mag) bin empfangsbereit.").send().await;
|
||||||
|
match res {
|
||||||
|
Ok(_) => info!("NTFY typing message sent"),
|
||||||
|
Err(error) => error!("NTFY error: {error}"),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
*self.ntfy_typing_last.lock().unwrap() = Some(Instant::now());
|
||||||
|
}
|
||||||
|
|
||||||
async fn message(&self, ctx: Context, msg: Message) {
|
async fn message(&self, ctx: Context, msg: Message) {
|
||||||
|
if msg.author.id.get() == NTFY_USER_ID {
|
||||||
|
let client = reqwest::Client::new();
|
||||||
|
let res = client
|
||||||
|
.post(NTFY_URL)
|
||||||
|
.header("Title", "Ich habe deine Nachricht erhalten!")
|
||||||
|
.header("Priority", "max")
|
||||||
|
.header("Tags", "mailbox_with_mail")
|
||||||
|
.body(format!("Du hast geschrieben: {}", msg.content))
|
||||||
|
.send()
|
||||||
|
.await;
|
||||||
|
match res {
|
||||||
|
Ok(_) => info!("NTFY message message sent"),
|
||||||
|
Err(error) => error!("NTFY error: {error}"),
|
||||||
|
}
|
||||||
|
|
||||||
|
*self.ntfy_typing_last.lock().unwrap() = None;
|
||||||
|
}
|
||||||
|
|
||||||
if let Some(contest) = self.contests.get(&msg.channel_id) {
|
if let Some(contest) = self.contests.get(&msg.channel_id) {
|
||||||
debug!(
|
debug!(
|
||||||
"Counting message {} (from {} in channel {})",
|
"Counting message {} (from {} in channel {})",
|
||||||
@@ -90,7 +137,7 @@ impl EventHandler for Handler {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async fn ready(&self, ctx: Context, ready: Ready) {
|
async fn ready(&self, ctx: Context, ready: Ready) {
|
||||||
info!("Connected as {}", ready.user.tag());
|
info!("Connected as {} (troll)", ready.user.tag());
|
||||||
ctx.set_activity(Some(ActivityData::listening("Spam")));
|
ctx.set_activity(Some(ActivityData::listening("Spam")));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user