mirror of
https://github.com/house-of-vanity/desubot.git
synced 2025-07-08 13:04:06 +00:00
Compare commits
3 Commits
Author | SHA1 | Date | |
---|---|---|---|
20f366572b | |||
e5079fa584 | |||
fdc52b7198 |
@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "desubot"
|
name = "desubot"
|
||||||
version = "0.5.8"
|
version = "0.5.9"
|
||||||
authors = ["AB <ab@hexor.ru>"]
|
authors = ["AB <ab@hexor.ru>"]
|
||||||
edition = "2018"
|
edition = "2018"
|
||||||
|
|
||||||
|
@ -13,7 +13,7 @@ Telegram bot with light group statistic and heavy spy features.
|
|||||||
|
|
||||||
== 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.
|
* ubuntu deps: libssl-dev libsqlite3-dev cmake libfreetype-dev
|
||||||
|
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
#[allow(dead_code)]
|
#[allow(dead_code)]
|
||||||
static CODE_HELP: &str = "<b>Code highlighter</b>
|
pub(crate) static CODE_HELP: &str = "<b>Code highlighter</b>
|
||||||
|
|
||||||
<i>Usage</i>
|
<i>Usage</i>
|
||||||
<pre>/code
|
<pre>/code
|
||||||
@ -7,7 +7,7 @@ static CODE_HELP: &str = "<b>Code highlighter</b>
|
|||||||
#<lang - JS by default> #<theme - Dracula 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 length - 4000
|
||||||
|
|
||||||
List of themes:
|
List of themes:
|
||||||
1337
|
1337
|
||||||
|
@ -21,6 +21,7 @@ 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::*;
|
||||||
use telegram_bot::{Api, Message, ParseMode, UserId};
|
use telegram_bot::{Api, Message, ParseMode, UserId};
|
||||||
|
|
||||||
include!("../assets/help_text.rs");
|
include!("../assets/help_text.rs");
|
||||||
@ -46,6 +47,9 @@ pub struct Sql {
|
|||||||
pub struct Code {
|
pub struct Code {
|
||||||
pub data: String,
|
pub data: String,
|
||||||
}
|
}
|
||||||
|
pub struct Scheme {
|
||||||
|
pub data: String,
|
||||||
|
}
|
||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
pub trait Execute {
|
pub trait Execute {
|
||||||
@ -59,6 +63,68 @@ pub trait Execute {
|
|||||||
) -> Result<(), Error>;
|
) -> Result<(), Error>;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[async_trait]
|
||||||
|
impl Execute for Scheme {
|
||||||
|
async fn exec(&self, api: &Api, message: &Message) -> Result<(), Error> {
|
||||||
|
match api
|
||||||
|
.send(
|
||||||
|
message
|
||||||
|
.text_reply(format!(
|
||||||
|
"{}{}{}",
|
||||||
|
"<pre>",
|
||||||
|
include_str!("../assets/scheme.sql").to_string(),
|
||||||
|
"</pre>"
|
||||||
|
))
|
||||||
|
.parse_mode(ParseMode::Html),
|
||||||
|
)
|
||||||
|
.await
|
||||||
|
{
|
||||||
|
Ok(_) => debug!("/scheme command sent to {}", message.chat.id()),
|
||||||
|
Err(_) => warn!("/scheme command sent failed to {}", message.chat.id()),
|
||||||
|
};
|
||||||
|
match {
|
||||||
|
Code {
|
||||||
|
data: format!(
|
||||||
|
"{}{}",
|
||||||
|
include_str!("../assets/scheme.sql").to_string(),
|
||||||
|
"\n#sql"
|
||||||
|
),
|
||||||
|
}
|
||||||
|
.exec_with_result(&api, &message)
|
||||||
|
.await
|
||||||
|
} {
|
||||||
|
Ok(path) => {
|
||||||
|
let file = InputFileUpload::with_path(path.clone());
|
||||||
|
// api.send(message.chat.document(&file)).await?;
|
||||||
|
//
|
||||||
|
// // Send an image from disk
|
||||||
|
api.send(message.chat.document(&file)).await?;
|
||||||
|
//debug!("{:#?}", formatter);
|
||||||
|
let _ = std::fs::remove_file(&path);
|
||||||
|
}
|
||||||
|
Err(_) => {
|
||||||
|
let _ = api
|
||||||
|
.send(message.text_reply(CODE_HELP).parse_mode(ParseMode::Html))
|
||||||
|
.await?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn exec_with_result(&self, api: &Api, message: &Message) -> Result<String, Error> {
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
|
||||||
|
async fn exec_mystem(
|
||||||
|
&self,
|
||||||
|
api: &Api,
|
||||||
|
message: &Message,
|
||||||
|
mystem: &mut MyStem,
|
||||||
|
) -> Result<(), Error> {
|
||||||
|
unimplemented!()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#[async_trait]
|
#[async_trait]
|
||||||
impl Execute for Sql {
|
impl Execute for Sql {
|
||||||
async fn exec(&self, api: &Api, message: &Message) -> Result<(), Error> {
|
async fn exec(&self, api: &Api, message: &Message) -> Result<(), Error> {
|
||||||
@ -571,9 +637,6 @@ impl Execute for Code {
|
|||||||
.split("\n")
|
.split("\n")
|
||||||
.map(|s| s.to_string())
|
.map(|s| s.to_string())
|
||||||
.collect();
|
.collect();
|
||||||
if lines.len() >= 81 {
|
|
||||||
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
|
||||||
|
17
src/db.rs
17
src/db.rs
@ -1,3 +1,5 @@
|
|||||||
|
#[allow(unused_mut)]
|
||||||
|
#[allow(dead_code)]
|
||||||
use crate::errors;
|
use crate::errors;
|
||||||
use crate::utils;
|
use crate::utils;
|
||||||
use rusqlite::{named_params, params, Connection, Error, Result};
|
use rusqlite::{named_params, params, Connection, Error, Result};
|
||||||
@ -35,18 +37,23 @@ pub(crate) fn update_scheme() -> Result<()> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn load_stopwords() -> Result<()> {
|
pub(crate) fn load_stopwords() -> Result<()> {
|
||||||
|
info!("Populating stop words wait please.");
|
||||||
let conn = open()?;
|
let conn = open()?;
|
||||||
for table in include_str!("../assets/stop-words.txt").split('\n').into_iter() {
|
for table in include_str!("../assets/stop-words.txt")
|
||||||
|
.split('\n')
|
||||||
|
.into_iter()
|
||||||
|
{
|
||||||
let word = table.trim();
|
let word = table.trim();
|
||||||
if word != "" {
|
if word != "" {
|
||||||
let mut stmt = conn.prepare_cached(
|
let mut _stmt = conn
|
||||||
"
|
.prepare_cached(
|
||||||
|
"
|
||||||
INSERT OR IGNORE INTO
|
INSERT OR IGNORE INTO
|
||||||
stop_words('word')
|
stop_words('word')
|
||||||
VALUES (:word)
|
VALUES (:word)
|
||||||
",
|
",
|
||||||
)?.insert(params![word]);
|
)?
|
||||||
//let mut rows = stmt.word(named_params! {":conf_id": conf_id})?;
|
.insert(params![word]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
info!("Stop words updated.");
|
info!("Stop words updated.");
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
//use crate::commands::Command;
|
//use crate::commands::Command;
|
||||||
use crate::commands::{Code, Execute, Here, Markov, MarkovAll, Omedeto, Sql, Top};
|
use crate::commands::{Code, Execute, Here, Markov, MarkovAll, Omedeto, Scheme, Sql, Top};
|
||||||
use crate::db;
|
use crate::db;
|
||||||
use crate::errors;
|
use crate::errors;
|
||||||
use crate::utils;
|
use crate::utils;
|
||||||
@ -38,11 +38,30 @@ pub async fn handler(
|
|||||||
.await
|
.await
|
||||||
} {
|
} {
|
||||||
Ok(path) => {
|
Ok(path) => {
|
||||||
|
let mut cnt_lines = 0;
|
||||||
|
for _ in s.lines() {
|
||||||
|
cnt_lines = cnt_lines + 1;
|
||||||
|
}
|
||||||
|
let mut cnt_chars = 0;
|
||||||
|
for _ in s.chars() {
|
||||||
|
cnt_chars = cnt_chars + 1;
|
||||||
|
}
|
||||||
let file = InputFileUpload::with_path(path.clone());
|
let file = InputFileUpload::with_path(path.clone());
|
||||||
|
info!("lines: {}, chars: {}", cnt_lines, cnt_chars);
|
||||||
// api.send(message.chat.document(&file)).await?;
|
// api.send(message.chat.document(&file)).await?;
|
||||||
//
|
//
|
||||||
// // Send an image from disk
|
// // Send an image from disk
|
||||||
api.send(message.chat.photo(&file)).await?;
|
if cnt_chars > 4000 {
|
||||||
|
let _ = api
|
||||||
|
.send(message.text_reply(CODE_HELP).parse_mode(ParseMode::Html))
|
||||||
|
.await?;
|
||||||
|
return Ok(());
|
||||||
|
}
|
||||||
|
if cnt_lines < 81 {
|
||||||
|
api.send(message.chat.photo(&file)).await?;
|
||||||
|
} else {
|
||||||
|
api.send(message.chat.document(&file)).await?;
|
||||||
|
}
|
||||||
//debug!("{:#?}", formatter);
|
//debug!("{:#?}", formatter);
|
||||||
let _ = std::fs::remove_file(&path);
|
let _ = std::fs::remove_file(&path);
|
||||||
}
|
}
|
||||||
@ -116,6 +135,13 @@ pub async fn handler(
|
|||||||
.exec(&api, &message)
|
.exec(&api, &message)
|
||||||
.await?
|
.await?
|
||||||
}
|
}
|
||||||
|
s if s =="/scheme" || s == "/schema" => {
|
||||||
|
Scheme {
|
||||||
|
data: "".to_string(),
|
||||||
|
}
|
||||||
|
.exec(&api, &message)
|
||||||
|
.await?
|
||||||
|
}
|
||||||
"/omedeto" => {
|
"/omedeto" => {
|
||||||
Omedeto {
|
Omedeto {
|
||||||
data: "".to_string(),
|
data: "".to_string(),
|
||||||
|
Reference in New Issue
Block a user