2022-05-30 20:43:18 +02:00
use async_trait ::async_trait ;
2022-05-30 18:37:21 +02:00
use lazy_static ::lazy_static ;
2022-05-30 21:49:08 +02:00
use serenity ::{
model ::{
channel ::ReactionType ,
id ::{ ChannelId , EmojiId , GuildId } ,
prelude ::* ,
} ,
prelude ::* ,
Client ,
} ;
2020-08-28 09:45:19 +02:00
struct Handler ;
lazy_static! {
static ref SERVER_ID : GuildId = GuildId ( std ::env ::args ( ) . nth ( 1 ) . unwrap ( ) . parse ( ) . unwrap ( ) ) ;
2020-09-08 18:29:15 +02:00
static ref MEME_CHANNEL : ChannelId =
ChannelId ( std ::env ::args ( ) . nth ( 2 ) . unwrap ( ) . parse ( ) . unwrap ( ) ) ;
2020-08-28 09:45:19 +02:00
}
2022-05-30 20:43:18 +02:00
#[ async_trait ]
2020-08-28 09:45:19 +02:00
impl EventHandler for Handler {
2022-05-30 20:43:18 +02:00
async fn message ( & self , ctx : Context , message : Message ) {
2022-05-30 21:49:08 +02:00
if let Err ( e ) = handle_message ( ctx , message ) . await {
eprintln! ( " Error during command execution: {e} " ) ;
2020-09-08 18:29:15 +02:00
}
2022-05-30 21:49:08 +02:00
}
2023-11-15 11:57:26 +01:00
async fn reaction_add ( & self , ctx : Context , reaction : Reaction ) {
if reaction . channel_id = = * MEME_CHANNEL
// you know who you are
& & reaction . user_id = = Some ( UserId ( 921332064056389663 ) )
{
if let Err ( e ) = reaction . delete ( & ctx ) . await {
eprintln! ( " Could not delete reaction spam: {e} " ) ;
}
}
}
2022-05-30 21:49:08 +02:00
}
async fn handle_message ( ctx : Context , message : Message ) -> Result < ( ) , serenity ::Error > {
if message . guild_id ! = Some ( * SERVER_ID ) {
return Ok ( ( ) ) ;
}
if message . channel_id = = * MEME_CHANNEL & & is_meme ( & message ) {
2023-11-15 11:57:26 +01:00
react ( & ctx , & message , 748564944449962017 , " based " )
. await
. inspect_err ( | e | eprintln! ( " Could not react to meme: {e} " ) ) ? ;
2022-05-30 21:49:08 +02:00
react ( & ctx , & message , 748564944819060856 , " cringe " ) . await ? ;
} ;
2023-11-15 11:52:11 +01:00
let content = message . content_safe ( & ctx ) . to_lowercase ( ) ;
2022-05-30 21:49:08 +02:00
if content . contains ( " everyone " ) & & content . contains ( " nitro " ) & & content . contains ( " http " ) {
2022-06-07 19:37:09 +02:00
println! (
" Deleting probable spam from user {}: “{}” " ,
message . author . name , content
) ;
2022-05-30 21:49:08 +02:00
message . delete ( & ctx ) . await ? ;
message . channel_id . say (
& ctx ,
& format! ( " {} : your message has been deleted because it triggered my spam filter. If you believe this to be in error, please contact the mods. " , message . author . mention ( ) )
) . await ? ;
2020-10-16 18:05:39 +02:00
}
2022-05-30 21:49:08 +02:00
Ok ( ( ) )
2020-08-28 09:45:19 +02:00
}
2022-05-30 21:49:08 +02:00
async fn react (
ctx : & Context ,
msg : & Message ,
emoji : u64 ,
name : & str ,
) -> Result < ( ) , serenity ::Error > {
2020-09-08 18:29:15 +02:00
let reaction = ReactionType ::Custom {
animated : false ,
id : EmojiId ( emoji ) ,
name : Some ( name . to_string ( ) ) ,
} ;
2022-05-30 21:49:08 +02:00
msg . react ( ctx , reaction ) . await ? ;
Ok ( ( ) )
2020-08-28 10:05:52 +02:00
}
2020-09-08 18:29:15 +02:00
fn is_meme ( msg : & Message ) -> bool {
2020-10-16 18:05:39 +02:00
! msg . attachments . is_empty ( ) | | msg . content . to_lowercase ( ) . contains ( " http " )
2020-09-08 18:29:15 +02:00
}
2022-05-30 20:43:18 +02:00
#[ tokio::main ]
async fn main ( ) {
2023-11-15 11:52:11 +01:00
let mut client = Client ::builder (
std ::env ::var ( " DISCORD_TOKEN " ) . expect ( " no token in environment " ) ,
2023-11-15 11:57:26 +01:00
GatewayIntents ::non_privileged ( ) | GatewayIntents ::MESSAGE_CONTENT ,
2023-11-15 11:52:11 +01:00
)
. event_handler ( Handler )
. await
. expect ( " Could not create client " ) ;
2022-05-30 20:43:18 +02:00
client . start ( ) . await . expect ( " could not start " ) ;
2020-08-28 09:45:19 +02:00
}