mirror of
https://github.com/house-of-vanity/desubot.git
synced 2025-07-08 21:04:07 +00:00
Compare commits
15 Commits
Author | SHA1 | Date | |
---|---|---|---|
865fd3bbe4 | |||
30bdb23a32 | |||
f97562e9b7 | |||
2d000101c2 | |||
a26d227190 | |||
cc44f0e23b | |||
96df636195 | |||
a48e25800c | |||
36660d384d | |||
0d24976ec2 | |||
6ae3b2af1f | |||
a39f6a8c2a | |||
788c2cbbd4 | |||
9d5e5a3217 | |||
945da05794 |
27
.github/workflows/automerge.yml
vendored
Normal file
27
.github/workflows/automerge.yml
vendored
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
name: automerge
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
types:
|
||||||
|
- labeled
|
||||||
|
- unlabeled
|
||||||
|
- synchronize
|
||||||
|
- opened
|
||||||
|
- edited
|
||||||
|
- ready_for_review
|
||||||
|
- reopened
|
||||||
|
- unlocked
|
||||||
|
pull_request_review:
|
||||||
|
types:
|
||||||
|
- submitted
|
||||||
|
check_suite:
|
||||||
|
types:
|
||||||
|
- completed
|
||||||
|
status: {}
|
||||||
|
jobs:
|
||||||
|
automerge:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: automerge
|
||||||
|
uses: "pascalgn/automerge-action@v0.13.0"
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: "${{ secrets.GITHUB_TOKEN }}"
|
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "desubot"
|
name = "desubot"
|
||||||
version = "0.5.0"
|
version = "0.5.3"
|
||||||
authors = ["AB <ab@hexor.ru>"]
|
authors = ["AB <ab@hexor.ru>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
@ -30,7 +30,8 @@ subprocess = "0.2.6"
|
|||||||
serde_json = "1.0"
|
serde_json = "1.0"
|
||||||
markov = "1.1.0"
|
markov = "1.1.0"
|
||||||
rand = "0.7.3"
|
rand = "0.7.3"
|
||||||
mystem = "0.2.1"
|
mystem = "^0.2"
|
||||||
|
#mystem = { path = "../mystem-rs" }
|
||||||
async-trait = "0.1.42"
|
async-trait = "0.1.42"
|
||||||
sqlparser = "0.7.0"
|
sqlparser = "0.7.0"
|
||||||
|
|
||||||
|
2
README
2
README
@ -7,8 +7,6 @@ Telegram bot with light group statistic and heavy spy features.
|
|||||||
* /here command to mention all members.
|
* /here command to mention all members.
|
||||||
* Alongside with saving whole message bot perform blacklist filter and stemming for every word (only Russian). "Красивую собаку мыли негры" -> "красивый собака мыть негр"
|
* Alongside with saving whole message bot perform blacklist filter and stemming for every word (only Russian). "Красивую собаку мыли негры" -> "красивый собака мыть негр"
|
||||||
* Generate sentences using Markov Chains trained on history with /markov_all.
|
* Generate sentences using Markov Chains trained on history with /markov_all.
|
||||||
|
|
||||||
== TODO ==
|
|
||||||
* Syntax highlighting for CODE exported to image.
|
* Syntax highlighting for CODE exported to image.
|
||||||
|
|
||||||
== Important ==
|
== Important ==
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
static CODE: &str = "<b>Code highlighter</b>
|
#[allow(dead_code)]
|
||||||
|
static CODE_HELP: &str = "<b>Code highlighter</b>
|
||||||
|
|
||||||
<i>Usage</i>
|
<i>Usage</i>
|
||||||
<pre>/CODE
|
<pre>/code
|
||||||
#<theme - Dracula by default>
|
|
||||||
<CODE>
|
<CODE>
|
||||||
#<lang - JS by default></pre>
|
#<lang - JS by default> #<theme - Dracula by default></pre>
|
||||||
|
|
||||||
Language may be defined by both name and extension - Rust, rs...
|
Language may be defined by both name and extension - Rust, rs...
|
||||||
Max lines - 80
|
Max lines - 80
|
||||||
@ -34,3 +34,10 @@ gruvbox-light
|
|||||||
gruvbox-white
|
gruvbox-white
|
||||||
zenburn
|
zenburn
|
||||||
";
|
";
|
||||||
|
|
||||||
|
#[allow(dead_code)]
|
||||||
|
pub static SQL_HELP: &str = "<b>Perform an SQL command</b>
|
||||||
|
<i>* Only one sentence per message.
|
||||||
|
* Only SELECT command.
|
||||||
|
* Max result length is 100 lines. Use LIMIT 100.
|
||||||
|
* SQLITE syntax is available only.</i>";
|
@ -17,11 +17,13 @@ use sqlparser::ast::Statement;
|
|||||||
use sqlparser::dialect::GenericDialect;
|
use sqlparser::dialect::GenericDialect;
|
||||||
use sqlparser::parser::Parser;
|
use sqlparser::parser::Parser;
|
||||||
use syntect::easy::HighlightLines;
|
use syntect::easy::HighlightLines;
|
||||||
|
use syntect::highlighting::Theme;
|
||||||
use syntect::parsing::SyntaxReference;
|
use syntect::parsing::SyntaxReference;
|
||||||
use syntect::util::LinesWithEndings;
|
use syntect::util::LinesWithEndings;
|
||||||
use telegram_bot::prelude::*;
|
use telegram_bot::prelude::*;
|
||||||
use telegram_bot::{Api, Message, ParseMode};
|
use telegram_bot::{Api, Message, ParseMode};
|
||||||
use syntect::highlighting::Theme;
|
|
||||||
|
include!("../assets/help_text.rs");
|
||||||
|
|
||||||
pub struct Here {
|
pub struct Here {
|
||||||
pub data: String,
|
pub data: String,
|
||||||
@ -65,6 +67,10 @@ impl Execute for Sql {
|
|||||||
|
|
||||||
async fn exec_with_result(&self, api: &Api, message: &Message) -> Result<String, Error> {
|
async fn exec_with_result(&self, api: &Api, message: &Message) -> Result<String, Error> {
|
||||||
let mut sql = self.data.clone();
|
let mut sql = self.data.clone();
|
||||||
|
debug!("PIZDA - {}", sql);
|
||||||
|
if sql == "/sql" || sql == "/sql-" {
|
||||||
|
return Ok(SQL_HELP.to_string())
|
||||||
|
}
|
||||||
let is_head = if sql.starts_with('-') {
|
let is_head = if sql.starts_with('-') {
|
||||||
sql = sql.replacen("-", "", 1);
|
sql = sql.replacen("-", "", 1);
|
||||||
false
|
false
|
||||||
@ -137,7 +143,7 @@ impl Execute for Sql {
|
|||||||
}
|
}
|
||||||
res.push(tmp);
|
res.push(tmp);
|
||||||
}
|
}
|
||||||
if res.len() > 100 {
|
if res.len() >= 100 {
|
||||||
return Err(Error::SQLResultTooLong(
|
return Err(Error::SQLResultTooLong(
|
||||||
"SQL result too long. Lines limit is 100. Use LIMIT".to_string(),
|
"SQL result too long. Lines limit is 100. Use LIMIT".to_string(),
|
||||||
));
|
));
|
||||||
@ -551,11 +557,16 @@ impl Execute for Code {
|
|||||||
unimplemented!()
|
unimplemented!()
|
||||||
}
|
}
|
||||||
async fn exec_with_result(&self, api: &Api, message: &Message) -> Result<String, Error> {
|
async fn exec_with_result(&self, api: &Api, message: &Message) -> Result<String, Error> {
|
||||||
let mut lines: Vec<String> = self.data.trim().split("\n").map(|s| s.to_string()).collect();
|
let mut lines: Vec<String> = self
|
||||||
|
.data
|
||||||
|
.trim()
|
||||||
|
.split("\n")
|
||||||
|
.map(|s| s.to_string())
|
||||||
|
.collect();
|
||||||
if lines.len() >= 81 {
|
if lines.len() >= 81 {
|
||||||
return Err(CodeHighlightningError);
|
return Err(CodeHighlightningError);
|
||||||
}
|
}
|
||||||
let last_line = &lines[lines.len()-1];
|
let last_line = &lines[lines.len() - 1];
|
||||||
|
|
||||||
let tags = last_line
|
let tags = last_line
|
||||||
.trim()
|
.trim()
|
||||||
@ -593,7 +604,6 @@ impl Execute for Code {
|
|||||||
.map(|s| s.unwrap())
|
.map(|s| s.unwrap())
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
|
|
||||||
let theme = if theme.len() != 1 {
|
let theme = if theme.len() != 1 {
|
||||||
ts.themes.get("Dracula").unwrap()
|
ts.themes.get("Dracula").unwrap()
|
||||||
} else {
|
} else {
|
||||||
@ -606,6 +616,7 @@ impl Execute for Code {
|
|||||||
.collect::<Vec<_>>();
|
.collect::<Vec<_>>();
|
||||||
let formatter = silicon::formatter::ImageFormatterBuilder::<String>::new()
|
let formatter = silicon::formatter::ImageFormatterBuilder::<String>::new()
|
||||||
.window_controls(false)
|
.window_controls(false)
|
||||||
|
.line_offset(1)
|
||||||
.round_corner(false);
|
.round_corner(false);
|
||||||
let mut formatter = formatter.build().unwrap();
|
let mut formatter = formatter.build().unwrap();
|
||||||
let image = formatter.format(&highlight, &theme);
|
let image = formatter.format(&highlight, &theme);
|
||||||
|
12
src/db.rs
12
src/db.rs
@ -214,7 +214,7 @@ pub(crate) async fn add_conf(message: Message) -> Result<(), Error> {
|
|||||||
|
|
||||||
match get_conf(message.chat.id()) {
|
match get_conf(message.chat.id()) {
|
||||||
Ok(_) => {
|
Ok(_) => {
|
||||||
//info!("Group found: {:?}", message.chat.id());
|
debug!("Group found: {:?}", message.chat.id());
|
||||||
let update = Conf {
|
let update = Conf {
|
||||||
id: message.chat.id(),
|
id: message.chat.id(),
|
||||||
title,
|
title,
|
||||||
@ -228,10 +228,10 @@ pub(crate) async fn add_conf(message: Message) -> Result<(), Error> {
|
|||||||
id = :id",
|
id = :id",
|
||||||
)?;
|
)?;
|
||||||
stmt.execute_named(&[(":id", &update.id.to_string()), (":title", &update.title)])?;
|
stmt.execute_named(&[(":id", &update.id.to_string()), (":title", &update.title)])?;
|
||||||
//info!("Conf {:?} updated: {:?}", update.title, get_conf(update.id));
|
debug!("Conf {:?} updated: {:?}", update.title, get_conf(update.id));
|
||||||
}
|
}
|
||||||
Err(_) => {
|
Err(_) => {
|
||||||
//info!("Group didn't found: {:?}", message.chat.id());
|
debug!("Group didn't found: {:?}", message.chat.id());
|
||||||
|
|
||||||
let update = Conf {
|
let update = Conf {
|
||||||
id: message.chat.id(),
|
id: message.chat.id(),
|
||||||
@ -250,7 +250,7 @@ pub(crate) async fn add_conf(message: Message) -> Result<(), Error> {
|
|||||||
(":title", &update.title),
|
(":title", &update.title),
|
||||||
(":date", &unix_time),
|
(":date", &unix_time),
|
||||||
])?;
|
])?;
|
||||||
//info!("Conf {:?} added: {:?}", update.title, get_conf(update.id));
|
debug!("Conf {:?} added: {:?}", update.title, get_conf(update.id));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
@ -283,7 +283,7 @@ pub(crate) async fn add_user(message: Message) -> Result<(), Error> {
|
|||||||
(":first_name", &update.first_name),
|
(":first_name", &update.first_name),
|
||||||
(":last_name", &update.last_name),
|
(":last_name", &update.last_name),
|
||||||
])?;
|
])?;
|
||||||
//println!("User {} updated: {:?}", update.first_name, get_user(user.id));
|
debug!("User {} updated: {:?}", update.first_name, get_user(update.id));
|
||||||
}
|
}
|
||||||
Err(_) => {
|
Err(_) => {
|
||||||
let unix_time = SystemTime::now()
|
let unix_time = SystemTime::now()
|
||||||
@ -310,7 +310,7 @@ pub(crate) async fn add_user(message: Message) -> Result<(), Error> {
|
|||||||
(":last_name", &user.last_name),
|
(":last_name", &user.last_name),
|
||||||
(":date", &unix_time),
|
(":date", &unix_time),
|
||||||
])?;
|
])?;
|
||||||
//println!("User added: {:?}", user);
|
debug!("User added: {:?}", user);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
|
@ -6,7 +6,6 @@ use crate::utils;
|
|||||||
use mystem::MyStem;
|
use mystem::MyStem;
|
||||||
use telegram_bot::*;
|
use telegram_bot::*;
|
||||||
|
|
||||||
|
|
||||||
include!("../assets/help_text.rs");
|
include!("../assets/help_text.rs");
|
||||||
|
|
||||||
pub async fn handler(
|
pub async fn handler(
|
||||||
@ -25,19 +24,18 @@ pub async fn handler(
|
|||||||
title,
|
title,
|
||||||
&message.from.id,
|
&message.from.id,
|
||||||
&message.from.first_name,
|
&message.from.first_name,
|
||||||
{if data.len() <= 200 {data} else {&data[..200]}}.replace("\n", " ")
|
data.replace("\n", " ")
|
||||||
);
|
);
|
||||||
|
|
||||||
let cleaned_message = data.replace(&format!("@{}", me.clone().username.unwrap()), "");
|
let cleaned_message = data.replace(&format!("@{}", me.clone().username.unwrap()), "");
|
||||||
match cleaned_message.as_str() {
|
match cleaned_message.as_str() {
|
||||||
s if s.to_string().starts_with("/code") => {
|
s if s.to_string().starts_with("/code") => {
|
||||||
|
|
||||||
match {
|
match {
|
||||||
Code {
|
Code {
|
||||||
data: s.replace("/code", ""),
|
data: s.replace("/code", ""),
|
||||||
}
|
}
|
||||||
.exec_with_result(&api, &message)
|
.exec_with_result(&api, &message)
|
||||||
.await
|
.await
|
||||||
} {
|
} {
|
||||||
Ok(path) => {
|
Ok(path) => {
|
||||||
let file = InputFileUpload::with_path(path.clone());
|
let file = InputFileUpload::with_path(path.clone());
|
||||||
@ -50,12 +48,12 @@ pub async fn handler(
|
|||||||
}
|
}
|
||||||
Err(_) => {
|
Err(_) => {
|
||||||
let _ = api
|
let _ = api
|
||||||
.send(message.text_reply(CODE).parse_mode(ParseMode::Html))
|
.send(message.text_reply(CODE_HELP).parse_mode(ParseMode::Html))
|
||||||
.await?;
|
.await?;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
s if s.contains("/here") => {
|
s if s.contains("/here") || s.contains("@here") => {
|
||||||
db::add_sentence(&message, mystem).await?;
|
db::add_sentence(&message, mystem).await?;
|
||||||
Here {
|
Here {
|
||||||
data: "".to_string(),
|
data: "".to_string(),
|
||||||
@ -120,7 +118,9 @@ pub async fn handler(
|
|||||||
.exec_mystem(&api, &message, mystem)
|
.exec_mystem(&api, &message, mystem)
|
||||||
.await?
|
.await?
|
||||||
}
|
}
|
||||||
_ => db::add_sentence(&message, mystem).await?,
|
_ => {
|
||||||
|
db::add_sentence(&message, mystem).await?
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
MessageKind::Photo { ref caption, .. } => {
|
MessageKind::Photo { ref caption, .. } => {
|
||||||
|
Reference in New Issue
Block a user