make things a bit better
This commit is contained in:
parent
fb6894e9c5
commit
79429c0694
|
@ -336,7 +336,7 @@ checksum = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7"
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "furbooru"
|
name = "furbooru"
|
||||||
version = "0.3.1"
|
version = "0.3.1"
|
||||||
source = "git+https://github.com/Xe/furbooru#589dcaf2b5a0cc5c32c9ea5f1ad291b00183e10b"
|
source = "git+https://github.com/Xe/furbooru#175b0973dc0db4e4f385be2b94042e594859e5c7"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"async-trait",
|
"async-trait",
|
||||||
|
@ -1511,7 +1511,7 @@ checksum = "e987b6bf443f4b5b3b6f38704195592cca41c5bb7aedd3c3693c7081f8289860"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tron"
|
name = "tron"
|
||||||
version = "0.1.1"
|
version = "0.2.1"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"async-trait",
|
"async-trait",
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "tron"
|
name = "tron"
|
||||||
version = "0.1.1"
|
version = "0.2.1"
|
||||||
authors = ["Christine Dodrill <me@christine.website>"]
|
authors = ["Christine Dodrill <me@christine.website>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
repository = "https://tulpa.dev/cadey/tron"
|
repository = "https://tulpa.dev/cadey/tron"
|
||||||
|
|
|
@ -17,4 +17,9 @@ in [ Rule::{ regex = "(n|z)igg(er|a)", why = "racism" }
|
||||||
, regex = "transsexual"
|
, regex = "transsexual"
|
||||||
, why = "probably false alarm, but transphobia"
|
, why = "probably false alarm, but transphobia"
|
||||||
}
|
}
|
||||||
|
, Rule::{ regex = "chimp out", why = "racism" }
|
||||||
|
, Rule::{ regex = "kike", why = "antisemitism" }
|
||||||
|
, Rule::{ regex = "fat trixie", why = "icjb" }
|
||||||
|
, Rule::{ regex = "soros", why = "conspiracy theories" }
|
||||||
|
, Rule::{ regex = "(foal|loli)con", why = "illegal stuff" }
|
||||||
]
|
]
|
||||||
|
|
115
src/main.rs
115
src/main.rs
|
@ -1,10 +1,10 @@
|
||||||
use anyhow::Result;
|
use anyhow::Result;
|
||||||
use async_trait::async_trait;
|
use async_trait::async_trait;
|
||||||
use discord_webhook::Body;
|
use discord_webhook::Body;
|
||||||
use furbooru::{Client, Comment, FirehoseAdaptor, Image};
|
use furbooru::{Client, Comment, FirehoseAdaptor, Forum, Image, Post, Topic};
|
||||||
use regex::Regex;
|
use regex::Regex;
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
use std::path::PathBuf;
|
use std::{fmt, path::PathBuf};
|
||||||
|
|
||||||
#[derive(Deserialize, Debug, Clone)]
|
#[derive(Deserialize, Debug, Clone)]
|
||||||
pub(crate) struct Config {
|
pub(crate) struct Config {
|
||||||
|
@ -43,66 +43,112 @@ struct Hit{
|
||||||
why: String,
|
why: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl fmt::Display for Hit {
|
||||||
|
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
|
||||||
|
write!(f, "- match on rule `{}` ({})", self.matches, self.why)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
struct Rules(Vec<CompiledRule>, Config);
|
struct Rules(Vec<CompiledRule>, Config);
|
||||||
|
|
||||||
impl Rules {
|
impl Rules {
|
||||||
fn check(&self, text: String) -> Option<Vec<Hit>> {
|
fn check(&self, text: &String) -> Option<Vec<Hit>> {
|
||||||
|
let mut result: Vec<Hit> = vec![];
|
||||||
|
let mut found = false;
|
||||||
|
|
||||||
|
for rule in &self.0 {
|
||||||
|
if rule.regex.is_match(text) {
|
||||||
|
log::debug!("{:?} matches {}", text, rule.raw);
|
||||||
|
found = true;
|
||||||
|
result.push(Hit {
|
||||||
|
matches: rule.raw.clone(),
|
||||||
|
why: rule.why.clone(),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if found {
|
||||||
|
Some(result)
|
||||||
|
} else {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
impl FirehoseAdaptor for Rules {
|
impl FirehoseAdaptor for Rules {
|
||||||
async fn image_created(&self, img: Image) -> Result<()> {
|
async fn image_created(&self, img: Image) -> Result<()> {
|
||||||
|
let url = img.view_url;
|
||||||
|
log::debug!("got image {}", url);
|
||||||
|
if let Some(hits) = self.check(&img.description.to_lowercase()) {
|
||||||
let mut buf: String = String::new();
|
let mut buf: String = String::new();
|
||||||
let mut found = false;
|
|
||||||
|
|
||||||
for rule in &self.0 {
|
for hit in hits {
|
||||||
if rule.regex.is_match(&img.description.to_lowercase()) {
|
buf.push_str(&format!("\n{}", hit));
|
||||||
log::debug!("{:?} matches {}", img.description, rule.raw);
|
|
||||||
found = true;
|
|
||||||
buf.push_str(&format!("\n- match on rule `{}` ({})", rule.raw, rule.why));
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if found {
|
|
||||||
discord_webhook::execute(
|
discord_webhook::execute(
|
||||||
self.1.discord_webhook_url.clone(),
|
self.1.discord_webhook_url.clone(),
|
||||||
Body::new(format!("matches found on <{}>:{}", img.view_url, buf)),
|
Body::new(format!(
|
||||||
|
"matches from **{}** found on <{}>:{}",
|
||||||
|
img.uploader.or(Some("An anonymous user".into())).unwrap(),
|
||||||
|
url,
|
||||||
|
buf
|
||||||
|
)),
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
log::info!("the description of {} has naughty words", img.view_url);
|
log::info!("the description of {} has naughty words", url);
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn comment_created(&self, cmt: Comment) -> Result<()> {
|
async fn comment_created(&self, cmt: Comment) -> Result<()> {
|
||||||
|
let url = format!("https://furbooru.org/{}#comment_{}", cmt.image_id, cmt.id);
|
||||||
|
log::debug!("got comment {}", url);
|
||||||
|
if let Some(hits) = self.check(&cmt.body.to_lowercase()) {
|
||||||
let mut buf: String = String::new();
|
let mut buf: String = String::new();
|
||||||
let mut found = false;
|
|
||||||
|
|
||||||
for rule in &self.0 {
|
for hit in hits {
|
||||||
if rule.regex.is_match(&cmt.body.to_lowercase()) {
|
buf.push_str(&format!("\n{}", hit));
|
||||||
log::debug!("{:?} matches {}", cmt.body, rule.raw);
|
|
||||||
found = true;
|
|
||||||
buf.push_str(&format!("\n- match on rule `{}` ({})", rule.raw, rule.why));
|
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
|
||||||
if found {
|
|
||||||
discord_webhook::execute(
|
discord_webhook::execute(
|
||||||
self.1.discord_webhook_url.clone(),
|
self.1.discord_webhook_url.clone(),
|
||||||
Body::new(format!(
|
Body::new(format!(
|
||||||
"matches found on <https://furbooru.org/{}#comment_{}>:{}",
|
"matches from **{}** found on <{}>:{}",
|
||||||
cmt.image_id, cmt.id, buf
|
cmt.author, url, buf
|
||||||
)),
|
)),
|
||||||
)
|
)
|
||||||
.await?;
|
.await?;
|
||||||
log::info!(
|
log::info!("comment {} has naughty words", url);
|
||||||
"comment https://furbooru.org/{}#comment_{} has naughty words",
|
}
|
||||||
cmt.image_id,
|
|
||||||
cmt.id
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn post_created(&self, frm: Forum, top: Topic, pst: Post) -> Result<()> {
|
||||||
|
let url = format!(
|
||||||
|
"https://furbooru.org/forums/{forum}/topics/{topic}?post_id={post}#post_{post}",
|
||||||
|
forum = frm.short_name,
|
||||||
|
topic = top.slug,
|
||||||
|
post = pst.id
|
||||||
);
|
);
|
||||||
|
log::debug!("got post {}", url);
|
||||||
|
|
||||||
|
if let Some(hits) = self.check(&pst.body.to_lowercase()) {
|
||||||
|
let mut buf: String = String::new();
|
||||||
|
|
||||||
|
for hit in hits {
|
||||||
|
buf.push_str(&format!("\n{}", hit));
|
||||||
|
}
|
||||||
|
discord_webhook::execute(
|
||||||
|
self.1.discord_webhook_url.clone(),
|
||||||
|
Body::new(format!(
|
||||||
|
"matches from **{}** found on <{}>:{}",
|
||||||
|
pst.author, url, buf
|
||||||
|
)),
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
log::info!("post {} has naughty words", url);
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
|
@ -115,9 +161,20 @@ async fn main() -> Result<()> {
|
||||||
pretty_env_logger::init();
|
pretty_env_logger::init();
|
||||||
let cfg: Config = envy::from_env()?;
|
let cfg: Config = envy::from_env()?;
|
||||||
log::debug!("cfg: {:?}", cfg);
|
log::debug!("cfg: {:?}", cfg);
|
||||||
|
|
||||||
|
log::debug!("loaded list of words to watch");
|
||||||
let rexes: Vec<Rule> = serde_dhall::from_file(cfg.regexes.clone()).parse()?;
|
let rexes: Vec<Rule> = serde_dhall::from_file(cfg.regexes.clone()).parse()?;
|
||||||
let mut compiled_rules: Vec<CompiledRule> = Vec::new();
|
let mut compiled_rules: Vec<CompiledRule> = Vec::new();
|
||||||
|
|
||||||
|
#[cfg(not(debug_assertions))]
|
||||||
|
{
|
||||||
|
discord_webhook::execute(
|
||||||
|
cfg.discord_webhook_url.clone(),
|
||||||
|
Body::new("I fight for the user!"),
|
||||||
|
)
|
||||||
|
.await?;
|
||||||
|
}
|
||||||
|
|
||||||
for rule in rexes {
|
for rule in rexes {
|
||||||
log::debug!("{} -> {}", rule.regex, rule.why);
|
log::debug!("{} -> {}", rule.regex, rule.why);
|
||||||
compiled_rules.push(CompiledRule {
|
compiled_rules.push(CompiledRule {
|
||||||
|
|
Loading…
Reference in New Issue