Schmot
This commit is contained in:
parent
d92a067934
commit
7c16eaec98
4 changed files with 171 additions and 33 deletions
1
Cargo.lock
generated
1
Cargo.lock
generated
|
@ -1373,6 +1373,7 @@ version = "0.1.0"
|
|||
dependencies = [
|
||||
"anyhow",
|
||||
"matrix-sdk",
|
||||
"rand 0.8.5",
|
||||
"tokio",
|
||||
"tracing-subscriber",
|
||||
]
|
||||
|
|
|
@ -8,5 +8,6 @@ edition = "2021"
|
|||
[dependencies]
|
||||
anyhow = "1.0.71"
|
||||
matrix-sdk = { git = "https://github.com/matrix-org/matrix-rust-sdk.git", package = "matrix-sdk" }
|
||||
rand = "0.8.5"
|
||||
tokio = { version = "1.29.1", features = ["macros", "rt-multi-thread"] }
|
||||
tracing-subscriber = "0.3.17"
|
||||
|
|
128
src/main.rs
128
src/main.rs
|
@ -1,12 +1,16 @@
|
|||
use std::{env, process::exit};
|
||||
|
||||
mod utils;
|
||||
use crate::utils::schmfy;
|
||||
use rand::Rng;
|
||||
|
||||
use matrix_sdk::{
|
||||
config::SyncSettings,
|
||||
room::Room,
|
||||
ruma::events::{room::{
|
||||
member::StrippedRoomMemberEvent,
|
||||
message::{MessageType, OriginalSyncRoomMessageEvent, RoomMessageEventContent},
|
||||
}, relation::Annotation, reaction::ReactionEventContent},
|
||||
message::{MessageType, OriginalSyncRoomMessageEvent, RoomMessageEventContent, OriginalRoomMessageEvent},
|
||||
}, relation::Annotation, reaction::ReactionEventContent, OriginalMessageLikeEvent},
|
||||
Client,
|
||||
};
|
||||
use tokio::time::{sleep, Duration};
|
||||
|
@ -150,40 +154,40 @@ async fn on_room_message(event: OriginalSyncRoomMessageEvent, room: Room) {
|
|||
println!("message sent");
|
||||
}
|
||||
|
||||
if text_content.body.contains("!timo") {
|
||||
let reaction = ReactionEventContent::new(
|
||||
Annotation::new(
|
||||
event.event_id.to_owned(),
|
||||
"TIMO".to_owned()
|
||||
)
|
||||
);
|
||||
if is_allowed_room(room.name()) {
|
||||
if text_content.body.contains("!timo") {
|
||||
let reaction = ReactionEventContent::new(
|
||||
Annotation::new(
|
||||
event.event_id.to_owned(),
|
||||
"TIMO".to_owned()
|
||||
)
|
||||
);
|
||||
|
||||
room.send(reaction, None).await.unwrap();
|
||||
}
|
||||
|
||||
if text_content.body.contains("\\") {
|
||||
let reaction = ReactionEventContent::new(
|
||||
Annotation::new(
|
||||
event.event_id.to_owned(),
|
||||
text_content.body.replace("\\", "λ").replace("!lambda ","").to_owned()
|
||||
)
|
||||
);
|
||||
|
||||
room.send(reaction, None).await.unwrap();
|
||||
}
|
||||
|
||||
let room_name = match room.name() {
|
||||
Some(name) => {
|
||||
name
|
||||
|
||||
},
|
||||
_ => {
|
||||
String::from("")
|
||||
room.send(reaction, None).await.unwrap();
|
||||
}
|
||||
};
|
||||
|
||||
if event.sender.as_str().contains("conduit.rs") {
|
||||
let reaction = ReactionEventContent::new(
|
||||
Annotation::new(
|
||||
event.event_id.to_owned(),
|
||||
"⚡️".to_owned()
|
||||
)
|
||||
);
|
||||
|
||||
room.send(reaction, None).await.unwrap();
|
||||
}
|
||||
|
||||
if text_content.body.contains("\\") {
|
||||
let reaction = ReactionEventContent::new(
|
||||
Annotation::new(
|
||||
event.event_id.to_owned(),
|
||||
text_content.body.replace("\\", "λ").replace("!lambda ","").to_owned()
|
||||
)
|
||||
);
|
||||
|
||||
room.send(reaction, None).await.unwrap();
|
||||
}
|
||||
|
||||
if room_name.contains("Spam") {
|
||||
if text_content.body.contains("!lambda") {
|
||||
let reaction = ReactionEventContent::new(
|
||||
Annotation::new(
|
||||
|
@ -191,10 +195,68 @@ async fn on_room_message(event: OriginalSyncRoomMessageEvent, room: Room) {
|
|||
"FuPro".to_owned()
|
||||
)
|
||||
);
|
||||
|
||||
|
||||
room.send(reaction, None).await.unwrap();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if is_allowed_room(room.name()) && is_allowed_user(event.sender.as_str()){
|
||||
if text_content.body.split_whitespace().count() < 2 {
|
||||
|
||||
let reaction = ReactionEventContent::new(
|
||||
Annotation::new(
|
||||
event.event_id.to_owned(),
|
||||
schmfy(text_content.body.to_lowercase())
|
||||
)
|
||||
);
|
||||
|
||||
room.send(reaction, None).await.unwrap();
|
||||
}
|
||||
|
||||
if {let mut rng = rand::thread_rng(); rng.gen_range(0..2)} == 0 {
|
||||
let msg = text_content.body
|
||||
.split_whitespace()
|
||||
.map(|x| schmfy(String::from(x.to_lowercase())))
|
||||
.collect::<Vec<String>>()
|
||||
.join(" ");
|
||||
|
||||
let content = RoomMessageEventContent::text_plain(msg);
|
||||
|
||||
//let content = event.content.make_reply_to(event.content., matrix_sdk::ruma::events::room::message::ForwardThread::Yes)
|
||||
|
||||
room.send(content, None).await.unwrap();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
fn is_allowed_user(user: &str) -> bool {
|
||||
println!("User: {}, bool: {}", user, !(
|
||||
user.contains("bot_jonathan")
|
||||
|| user.contains("bot_jan")
|
||||
|| user.contains("bot_")
|
||||
));
|
||||
return !(
|
||||
user.contains("bot_jonathan")
|
||||
|| user.contains("bot_jan")
|
||||
|| user.contains("bot_")
|
||||
)
|
||||
}
|
||||
|
||||
fn is_allowed_room(name: Option<String>) -> bool {
|
||||
let room_name = match name {
|
||||
Some(name) => {
|
||||
name
|
||||
},
|
||||
_ => {
|
||||
String::from("")
|
||||
}
|
||||
};
|
||||
|
||||
if room_name.to_lowercase().contains("spam") {
|
||||
return true
|
||||
}
|
||||
|
||||
|
||||
false
|
||||
}
|
74
src/utils.rs
Normal file
74
src/utils.rs
Normal file
|
@ -0,0 +1,74 @@
|
|||
// Schmfies any String
|
||||
pub fn schmfy(source: String) -> String {
|
||||
if source.starts_with("schm") {
|
||||
return source;
|
||||
}
|
||||
|
||||
// if source is subsite (e.g. news/fsr), schmfy all parts separately
|
||||
if source.contains('/') {
|
||||
return source
|
||||
.split('/')
|
||||
.map(|s| schmfy(String::from(s)))
|
||||
.collect::<Vec<String>>()
|
||||
.join("/");
|
||||
}
|
||||
|
||||
if source.is_empty() {
|
||||
return source;
|
||||
}
|
||||
|
||||
// schmfy first char if word is no longer than 3
|
||||
if source.len() <= 3 {
|
||||
let (prefix, suffix) = source.split_at(1);
|
||||
let c = prefix.chars().next().unwrap_or('-');
|
||||
return schmfy_char(c) + suffix;
|
||||
}
|
||||
|
||||
// Normal words - replace prefix before first vocal
|
||||
// with "schm"
|
||||
let vok_pos = source
|
||||
.chars()
|
||||
.position(|c| "aeiouäöü".contains(c))
|
||||
.unwrap_or(0);
|
||||
|
||||
let (_, suffix) = source.split_at(vok_pos);
|
||||
|
||||
String::from("schm") + suffix
|
||||
}
|
||||
|
||||
// Schmfies single char
|
||||
fn schmfy_char(c: char) -> String {
|
||||
let mut ret = String::from("schm");
|
||||
match c {
|
||||
'a' | 'e' | 'i' | 'o' | 'u' | 'ä' | 'ö' | 'ü' => {
|
||||
ret.push(c);
|
||||
}
|
||||
'b' | 'c' | 'd' | 'g' | 'p' | 't' | 'w' => ret.push('e'),
|
||||
'f' | 'l' | 'm' | 'n' | 'r' | 's' => {
|
||||
ret.push('e');
|
||||
ret.push(c)
|
||||
}
|
||||
'h' | 'k' => ret.push('a'),
|
||||
'j' => {
|
||||
ret.push('o');
|
||||
ret.push('t')
|
||||
}
|
||||
'q' => ret.push('u'),
|
||||
'v' => {
|
||||
ret.push('a');
|
||||
ret.push('u')
|
||||
}
|
||||
'x' => {
|
||||
ret.push('i');
|
||||
ret.push('x')
|
||||
}
|
||||
'y' => ret.push(c),
|
||||
'z' => {
|
||||
ret.push('e');
|
||||
ret.push('t')
|
||||
}
|
||||
_ => ret.push(c),
|
||||
}
|
||||
|
||||
ret
|
||||
}
|
Loading…
Reference in a new issue