Merge remote-tracking branch 'origin/main' into main

# Conflicts:
#	assets/help_text.rs
This commit is contained in:
AB
2021-01-11 11:22:47 +03:00
5 changed files with 36 additions and 18 deletions

View File

@@ -1,6 +1,6 @@
[package] [package]
name = "desubot" name = "desubot"
version = "0.5.0" version = "0.5.1"
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"

4
README
View File

@@ -7,10 +7,8 @@ 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 ==
* Desubot uses MyStem by Yandex for word stemming and assume that mystem binary is available in PATH. * Desubot uses MyStem by Yandex for word stemming and assume that mystem binary is available in PATH.
On Windows it may be placed on working directory. Both Linux and Windows mystem binary is in repo. On Windows it may be placed on working directory. Both Linux and Windows mystem binary is in repo.

View File

@@ -1,4 +1,5 @@
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
@@ -32,4 +33,11 @@ gruvbox
gruvbox-light 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>";

View File

@@ -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
@@ -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);

View File

@@ -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,7 +48,7 @@ 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?;
} }
} }
@@ -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, .. } => {