Port sedbot
This commit is contained in:
parent
4a27aa42a3
commit
14184e9d49
|
@ -22,3 +22,5 @@ arrayvec = "0.7"
|
|||
rand = "0.8"
|
||||
meval = "0.2"
|
||||
async-circe = { git = "https://git.karx.xyz/circe/async-circe" }
|
||||
lazy_static = "1.4.0"
|
||||
sedregex = "0.2.5"
|
||||
|
|
|
@ -1,3 +1,4 @@
|
|||
pub mod leek;
|
||||
pub mod title;
|
||||
pub mod misc;
|
||||
pub mod sed;
|
||||
|
|
69
src/bots/sed.rs
Normal file
69
src/bots/sed.rs
Normal file
|
@ -0,0 +1,69 @@
|
|||
use std::{fmt::Display, error::Error};
|
||||
|
||||
use arrayvec::{ArrayString, CapacityError};
|
||||
use fancy_regex::Regex;
|
||||
use lazy_static::lazy_static;
|
||||
use sedregex::find_and_replace;
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum SedErrorKind {
|
||||
Capacity(CapacityError),
|
||||
Regex(fancy_regex::Error),
|
||||
SedRegex(sedregex::ErrorKind)
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub struct SedCapacityError(SedErrorKind);
|
||||
|
||||
impl Display for SedCapacityError {
|
||||
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
|
||||
// yeah it's ugly but there's no better way afaik
|
||||
match &self.0 {
|
||||
SedErrorKind::Capacity(e) => Display::fmt(e, f),
|
||||
SedErrorKind::Regex(e) => Display::fmt(e, f),
|
||||
SedErrorKind::SedRegex(e) => Display::fmt(e, f),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Error for SedCapacityError {}
|
||||
|
||||
impl<T> From<CapacityError<T>> for SedCapacityError {
|
||||
fn from(e: CapacityError<T>) -> Self {
|
||||
Self { 0: SedErrorKind::Capacity(e.simplify()) }
|
||||
}
|
||||
}
|
||||
|
||||
impl From<fancy_regex::Error> for SedCapacityError {
|
||||
fn from(e: fancy_regex::Error) -> Self {
|
||||
Self { 0: SedErrorKind::Regex(e) }
|
||||
}
|
||||
}
|
||||
|
||||
impl From<sedregex::ErrorKind> for SedCapacityError {
|
||||
fn from(e: sedregex::ErrorKind) -> Self {
|
||||
Self { 0: SedErrorKind::SedRegex(e) }
|
||||
}
|
||||
}
|
||||
|
||||
type SedResult = Result<Option<ArrayString<512>>, SedCapacityError>;
|
||||
|
||||
pub fn resolve(prev_msg: &str, cmd: &str) -> SedResult {
|
||||
lazy_static! {
|
||||
static ref RE: Regex = Regex::new(r"^s/.*/.*").unwrap(); // yes this regex is valid, don't worry about it
|
||||
}
|
||||
|
||||
if RE.is_match(cmd)? {
|
||||
if let Some(mat) = RE.find(cmd)? {
|
||||
let slice = &cmd[mat.start()..mat.end()];
|
||||
|
||||
let formatted = find_and_replace(&prev_msg, [slice])?;
|
||||
|
||||
return Ok(Some(ArrayString::from(&formatted)?));
|
||||
} else {
|
||||
return Ok(None);
|
||||
}
|
||||
}
|
||||
|
||||
Ok(None)
|
||||
}
|
|
@ -167,6 +167,13 @@ async fn handle_privmsg(
|
|||
if let Some(titlebot_msg) = state.titlebot.resolve(&message).await? {
|
||||
state.client.privmsg(&channel, &titlebot_msg).await?;
|
||||
}
|
||||
|
||||
if let Some(prev_msg) = state.last_msgs.get(&nick) {
|
||||
if let Some(formatted) = bots::sed::resolve(prev_msg, &message)? {
|
||||
state.client.privmsg(&channel, &formatted).await?;
|
||||
}
|
||||
}
|
||||
|
||||
state.last_msgs.insert(nick, message);
|
||||
return Ok(());
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue