make things a bit better

This commit is contained in:
Cadey Ratio 2020-07-05 08:36:08 -04:00
parent fb6894e9c5
commit 79429c0694
4 changed files with 99 additions and 37 deletions

4
Cargo.lock generated
View File

@ -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",

View File

@ -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"

View File

@ -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" }
] ]

View File

@ -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 {
@ -38,71 +38,117 @@ pub(crate) fn user_agent(username: String) -> String {
) )
} }
struct Hit{ struct Hit {
matches: String, matches: String,
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>> {
None 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
}
} }
} }
#[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 mut buf: String = String::new(); let url = img.view_url;
let mut found = false; log::debug!("got image {}", url);
if let Some(hits) = self.check(&img.description.to_lowercase()) {
let mut buf: String = String::new();
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 mut buf: String = String::new(); let url = format!("https://furbooru.org/{}#comment_{}", cmt.image_id, cmt.id);
let mut found = false; log::debug!("got comment {}", url);
if let Some(hits) = self.check(&cmt.body.to_lowercase()) {
let mut buf: String = String::new();
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 {