mirror of
https://github.com/house-of-vanity/desubot.git
synced 2025-07-08 13:04:06 +00:00
Compare commits
19 Commits
add-docker
...
0.5.8
Author | SHA1 | Date | |
---|---|---|---|
20f366572b | |||
e5079fa584 | |||
fdc52b7198 | |||
789b918bab | |||
66a93e85b8 | |||
e13a2688ab | |||
04220703a3 | |||
9518ffd69b | |||
5a6cb37ebb | |||
6c2837a76f | |||
d97eaf4284 | |||
e7e0c6923e | |||
382cc56492 | |||
6f48f116c9 | |||
4175fe9029 | |||
d5879a82b6 | |||
456c887a53 | |||
da53927288 | |||
049a3c4987 |
35
.github/workflows/build-push.yml
vendored
35
.github/workflows/build-push.yml
vendored
@ -31,6 +31,41 @@ jobs:
|
||||
with:
|
||||
name: desubot.exe
|
||||
path: ./target/release/desubot.exe
|
||||
build-push-docker:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Branch name
|
||||
id: branch_name
|
||||
run: |
|
||||
echo ::set-output name=SOURCE_NAME::${GITHUB_REF#refs/*/}
|
||||
echo ::set-output name=SOURCE_BRANCH::${GITHUB_REF#refs/heads/}
|
||||
echo ::set-output name=SOURCE_TAG::${GITHUB_REF#refs/tags/}
|
||||
-
|
||||
name: Set up QEMU
|
||||
uses: docker/setup-qemu-action@v1
|
||||
-
|
||||
name: Set up Docker Buildx
|
||||
uses: docker/setup-buildx-action@v1
|
||||
-
|
||||
name: Login to DockerHub
|
||||
uses: docker/login-action@v1
|
||||
with:
|
||||
username: ${{ secrets.DOCKERHUB_USERNAME }}
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
-
|
||||
name: Build and push
|
||||
id: docker_build_latest
|
||||
uses: docker/build-push-action@v2
|
||||
with:
|
||||
push: true
|
||||
tags: ultradesu/desubot:latest
|
||||
-
|
||||
name: Build and push
|
||||
id: docker_build_tag
|
||||
uses: docker/build-push-action@v2
|
||||
with:
|
||||
push: true
|
||||
tags: ultradesu/desubot:${{ steps.branch_name.outputs.SOURCE_TAG }}
|
||||
|
||||
publish:
|
||||
name: Publish release
|
||||
|
1
.gitignore
vendored
1
.gitignore
vendored
@ -8,3 +8,4 @@ memory.sqlite3
|
||||
/.idea
|
||||
Cargo.lock
|
||||
k8s/k8s-deploy.yaml
|
||||
/identifier.sqlite
|
||||
|
@ -1,6 +1,6 @@
|
||||
[package]
|
||||
name = "desubot"
|
||||
version = "0.5.7"
|
||||
version = "0.5.9"
|
||||
authors = ["AB <ab@hexor.ru>"]
|
||||
edition = "2018"
|
||||
|
||||
|
@ -1,3 +1,5 @@
|
||||
[](https://app.fossa.com/projects/git%2Bgithub.com%2Fhouse-of-vanity%2Fdesubot?ref=badge_shield)
|
||||
|
||||
Desubot
|
||||
Telegram bot with light group statistic and heavy spy features.
|
||||
|
||||
@ -11,4 +13,8 @@ Telegram bot with light group statistic and heavy spy features.
|
||||
|
||||
== Important ==
|
||||
* 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
|
||||
[](https://app.fossa.com/projects/git%2Bgithub.com%2Fhouse-of-vanity%2Fdesubot?ref=badge_large)
|
@ -1,5 +1,5 @@
|
||||
#[allow(dead_code)]
|
||||
static CODE_HELP: &str = "<b>Code highlighter</b>
|
||||
pub(crate) static CODE_HELP: &str = "<b>Code highlighter</b>
|
||||
|
||||
<i>Usage</i>
|
||||
<pre>/code
|
||||
@ -7,7 +7,7 @@ static CODE_HELP: &str = "<b>Code highlighter</b>
|
||||
#<lang - JS by default> #<theme - Dracula by default></pre>
|
||||
|
||||
Language may be defined by both name and extension - Rust, rs...
|
||||
Max lines - 80
|
||||
Max length - 4000
|
||||
|
||||
List of themes:
|
||||
1337
|
||||
|
427
assets/stop-words.txt
Normal file
427
assets/stop-words.txt
Normal file
@ -0,0 +1,427 @@
|
||||
а
|
||||
в
|
||||
г
|
||||
е
|
||||
ж
|
||||
и
|
||||
к
|
||||
м
|
||||
о
|
||||
с
|
||||
т
|
||||
у
|
||||
я
|
||||
бы
|
||||
stat
|
||||
вообще
|
||||
ThreadTopBot
|
||||
/stat
|
||||
во
|
||||
вы
|
||||
да
|
||||
до
|
||||
ее
|
||||
ей
|
||||
ею
|
||||
её
|
||||
же
|
||||
за
|
||||
из
|
||||
им
|
||||
их
|
||||
ли
|
||||
мы
|
||||
на
|
||||
не
|
||||
ни
|
||||
но
|
||||
ну
|
||||
нх
|
||||
об
|
||||
он
|
||||
от
|
||||
по
|
||||
со
|
||||
та
|
||||
те
|
||||
то
|
||||
ту
|
||||
ты
|
||||
уж
|
||||
без
|
||||
был
|
||||
вам
|
||||
вас
|
||||
ваш
|
||||
вон
|
||||
вот
|
||||
все
|
||||
всю
|
||||
вся
|
||||
всё
|
||||
где
|
||||
год
|
||||
два
|
||||
две
|
||||
дел
|
||||
для
|
||||
его
|
||||
ему
|
||||
еще
|
||||
ещё
|
||||
или
|
||||
ими
|
||||
имя
|
||||
как
|
||||
кем
|
||||
ком
|
||||
кто
|
||||
лет
|
||||
мне
|
||||
мог
|
||||
мож
|
||||
мои
|
||||
мой
|
||||
мор
|
||||
моя
|
||||
моё
|
||||
над
|
||||
нам
|
||||
нас
|
||||
наш
|
||||
нее
|
||||
ней
|
||||
нем
|
||||
нет
|
||||
нею
|
||||
неё
|
||||
них
|
||||
оба
|
||||
она
|
||||
они
|
||||
оно
|
||||
под
|
||||
пор
|
||||
при
|
||||
про
|
||||
раз
|
||||
сам
|
||||
сих
|
||||
так
|
||||
там
|
||||
тем
|
||||
тех
|
||||
том
|
||||
тот
|
||||
тою
|
||||
три
|
||||
тут
|
||||
уже
|
||||
чем
|
||||
что
|
||||
эта
|
||||
эти
|
||||
это
|
||||
эту
|
||||
алло
|
||||
буду
|
||||
будь
|
||||
бывь
|
||||
была
|
||||
были
|
||||
было
|
||||
быть
|
||||
вами
|
||||
ваша
|
||||
ваше
|
||||
ваши
|
||||
ведь
|
||||
весь
|
||||
вниз
|
||||
всем
|
||||
всех
|
||||
всею
|
||||
года
|
||||
году
|
||||
даже
|
||||
двух
|
||||
день
|
||||
если
|
||||
есть
|
||||
зато
|
||||
кого
|
||||
кому
|
||||
куда
|
||||
лишь
|
||||
люди
|
||||
мало
|
||||
меля
|
||||
меня
|
||||
мимо
|
||||
мира
|
||||
мной
|
||||
мною
|
||||
мочь
|
||||
надо
|
||||
нами
|
||||
наша
|
||||
наше
|
||||
наши
|
||||
него
|
||||
нему
|
||||
ниже
|
||||
ними
|
||||
один
|
||||
пока
|
||||
пора
|
||||
пять
|
||||
рано
|
||||
сама
|
||||
сами
|
||||
само
|
||||
саму
|
||||
свое
|
||||
свои
|
||||
свою
|
||||
себе
|
||||
себя
|
||||
семь
|
||||
стал
|
||||
суть
|
||||
твой
|
||||
твоя
|
||||
твоё
|
||||
тебе
|
||||
тебя
|
||||
теми
|
||||
того
|
||||
тоже
|
||||
тому
|
||||
туда
|
||||
хоть
|
||||
хотя
|
||||
чаще
|
||||
чего
|
||||
чему
|
||||
чтоб
|
||||
чуть
|
||||
этим
|
||||
этих
|
||||
этой
|
||||
этом
|
||||
этот
|
||||
более
|
||||
будем
|
||||
будет
|
||||
будто
|
||||
будут
|
||||
вверх
|
||||
вдали
|
||||
вдруг
|
||||
везде
|
||||
внизу
|
||||
время
|
||||
всего
|
||||
всеми
|
||||
всему
|
||||
всюду
|
||||
давно
|
||||
даром
|
||||
долго
|
||||
друго
|
||||
занят
|
||||
затем
|
||||
зачем
|
||||
здесь
|
||||
иметь
|
||||
какая
|
||||
какой
|
||||
когда
|
||||
кроме
|
||||
лучше
|
||||
между
|
||||
менее
|
||||
много
|
||||
могут
|
||||
может
|
||||
можно
|
||||
можхо
|
||||
назад
|
||||
низко
|
||||
нужно
|
||||
одной
|
||||
около
|
||||
опять
|
||||
очень
|
||||
перед
|
||||
позже
|
||||
после
|
||||
потом
|
||||
почти
|
||||
пятый
|
||||
разве
|
||||
рядом
|
||||
самим
|
||||
самих
|
||||
самой
|
||||
самом
|
||||
своей
|
||||
своих
|
||||
сеаой
|
||||
снова
|
||||
собой
|
||||
собою
|
||||
такая
|
||||
также
|
||||
такие
|
||||
такое
|
||||
такой
|
||||
тобой
|
||||
тобою
|
||||
тогда
|
||||
тысяч
|
||||
уметь
|
||||
часто
|
||||
через
|
||||
чтобы
|
||||
шесть
|
||||
этими
|
||||
этого
|
||||
этому
|
||||
близко
|
||||
больше
|
||||
будете
|
||||
будешь
|
||||
бывает
|
||||
важная
|
||||
важное
|
||||
важные
|
||||
важный
|
||||
вокруг
|
||||
восемь
|
||||
всегда
|
||||
второй
|
||||
далеко
|
||||
дальше
|
||||
девять
|
||||
десять
|
||||
должно
|
||||
другая
|
||||
другие
|
||||
других
|
||||
другое
|
||||
другой
|
||||
занята
|
||||
занято
|
||||
заняты
|
||||
значит
|
||||
именно
|
||||
иногда
|
||||
каждая
|
||||
каждое
|
||||
каждые
|
||||
каждый
|
||||
кругом
|
||||
меньше
|
||||
начала
|
||||
нельзя
|
||||
нибудь
|
||||
никуда
|
||||
ничего
|
||||
обычно
|
||||
однако
|
||||
одного
|
||||
отсюда
|
||||
первый
|
||||
потому
|
||||
почему
|
||||
просто
|
||||
против
|
||||
раньше
|
||||
самими
|
||||
самого
|
||||
самому
|
||||
своего
|
||||
сейчас
|
||||
сказал
|
||||
совсем
|
||||
теперь
|
||||
только
|
||||
третий
|
||||
хорошо
|
||||
хотеть
|
||||
хочешь
|
||||
четыре
|
||||
шестой
|
||||
восьмой
|
||||
впрочем
|
||||
времени
|
||||
говорил
|
||||
говорит
|
||||
девятый
|
||||
десятый
|
||||
кажется
|
||||
конечно
|
||||
которая
|
||||
которой
|
||||
которые
|
||||
который
|
||||
которых
|
||||
наверху
|
||||
наконец
|
||||
недавно
|
||||
немного
|
||||
нередко
|
||||
никогда
|
||||
однажды
|
||||
посреди
|
||||
сегодня
|
||||
седьмой
|
||||
сказала
|
||||
сказать
|
||||
сколько
|
||||
слишком
|
||||
сначала
|
||||
спасибо
|
||||
двадцать
|
||||
довольно
|
||||
которого
|
||||
наиболее
|
||||
недалеко
|
||||
особенно
|
||||
отовсюду
|
||||
двадцатый
|
||||
миллионов
|
||||
несколько
|
||||
прекрасно
|
||||
процентов
|
||||
четвертый
|
||||
двенадцать
|
||||
непрерывно
|
||||
пожалуйста
|
||||
пятнадцать
|
||||
семнадцать
|
||||
тринадцать
|
||||
двенадцатый
|
||||
одиннадцать
|
||||
пятнадцатый
|
||||
семнадцатый
|
||||
тринадцатый
|
||||
шестнадцать
|
||||
восемнадцать
|
||||
девятнадцать
|
||||
одиннадцатый
|
||||
четырнадцать
|
||||
шестнадцатый
|
||||
восемнадцатый
|
||||
девятнадцатый
|
||||
действительно
|
||||
четырнадцатый
|
||||
многочисленная
|
||||
многочисленное
|
||||
многочисленные
|
||||
многочисленный
|
||||
ага
|
||||
делать
|
||||
писать
|
||||
бот
|
@ -21,6 +21,7 @@ use syntect::highlighting::Theme;
|
||||
use syntect::parsing::SyntaxReference;
|
||||
use syntect::util::LinesWithEndings;
|
||||
use telegram_bot::prelude::*;
|
||||
use telegram_bot::*;
|
||||
use telegram_bot::{Api, Message, ParseMode, UserId};
|
||||
|
||||
include!("../assets/help_text.rs");
|
||||
@ -46,6 +47,9 @@ pub struct Sql {
|
||||
pub struct Code {
|
||||
pub data: String,
|
||||
}
|
||||
pub struct Scheme {
|
||||
pub data: String,
|
||||
}
|
||||
|
||||
#[async_trait]
|
||||
pub trait Execute {
|
||||
@ -59,6 +63,68 @@ pub trait Execute {
|
||||
) -> 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]
|
||||
impl Execute for Sql {
|
||||
async fn exec(&self, api: &Api, message: &Message) -> Result<(), Error> {
|
||||
@ -328,7 +394,7 @@ impl Execute for Markov {
|
||||
let mut sentences = chain.generate();
|
||||
let mut msg = String::new();
|
||||
for _ in 1..rand::thread_rng().gen_range(2, 10) {
|
||||
msg = format!("{} {}", msg, sentences.pop().unwrap());
|
||||
msg = format!("{} {}", msg, sentences.pop().unwrap_or(" ".into()));
|
||||
}
|
||||
match api
|
||||
.send(message.text_reply(msg.trim()).parse_mode(ParseMode::Html))
|
||||
@ -571,9 +637,6 @@ impl Execute for Code {
|
||||
.split("\n")
|
||||
.map(|s| s.to_string())
|
||||
.collect();
|
||||
if lines.len() >= 81 {
|
||||
return Err(CodeHighlightningError);
|
||||
}
|
||||
let last_line = &lines[lines.len() - 1];
|
||||
|
||||
let tags = last_line
|
||||
|
28
src/db.rs
28
src/db.rs
@ -1,3 +1,5 @@
|
||||
#[allow(unused_mut)]
|
||||
#[allow(dead_code)]
|
||||
use crate::errors;
|
||||
use crate::utils;
|
||||
use rusqlite::{named_params, params, Connection, Error, Result};
|
||||
@ -34,6 +36,30 @@ pub(crate) fn update_scheme() -> Result<()> {
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub(crate) fn load_stopwords() -> Result<()> {
|
||||
info!("Populating stop words wait please.");
|
||||
let conn = open()?;
|
||||
for table in include_str!("../assets/stop-words.txt")
|
||||
.split('\n')
|
||||
.into_iter()
|
||||
{
|
||||
let word = table.trim();
|
||||
if word != "" {
|
||||
let mut _stmt = conn
|
||||
.prepare_cached(
|
||||
"
|
||||
INSERT OR IGNORE INTO
|
||||
stop_words('word')
|
||||
VALUES (:word)
|
||||
",
|
||||
)?
|
||||
.insert(params![word]);
|
||||
}
|
||||
}
|
||||
info!("Stop words updated.");
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub(crate) fn get_user(id: telegram_bot::UserId) -> Result<telegram_bot::User, errors::Error> {
|
||||
let conn = open()?;
|
||||
let mut stmt = conn.prepare_cached(
|
||||
@ -447,7 +473,7 @@ pub(crate) async fn add_sentence(
|
||||
Err(e) => panic!("SQLITE3 Error: Relations failed: {:?}", e),
|
||||
}
|
||||
}
|
||||
Err(_) => debug!("Word {} is in stop list.", &word.lex[0].lex),
|
||||
Err(_) => debug!("Word {} is in a stop list.", &word.lex[0].lex),
|
||||
}
|
||||
}
|
||||
conn.execute("END TRANSACTION", params![]);
|
||||
|
@ -1,5 +1,5 @@
|
||||
//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::errors;
|
||||
use crate::utils;
|
||||
@ -38,11 +38,30 @@ pub async fn handler(
|
||||
.await
|
||||
} {
|
||||
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());
|
||||
info!("lines: {}, chars: {}", cnt_lines, cnt_chars);
|
||||
// api.send(message.chat.document(&file)).await?;
|
||||
//
|
||||
// // Send an image from disk
|
||||
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);
|
||||
let _ = std::fs::remove_file(&path);
|
||||
}
|
||||
@ -116,6 +135,13 @@ pub async fn handler(
|
||||
.exec(&api, &message)
|
||||
.await?
|
||||
}
|
||||
s if s =="/scheme" || s == "/schema" => {
|
||||
Scheme {
|
||||
data: "".to_string(),
|
||||
}
|
||||
.exec(&api, &message)
|
||||
.await?
|
||||
}
|
||||
"/omedeto" => {
|
||||
Omedeto {
|
||||
data: "".to_string(),
|
||||
|
@ -30,6 +30,10 @@ async fn main() -> Result<(), errors::Error> {
|
||||
Ok(_) => {}
|
||||
Err(e) => panic!("Database error: {:?}", e),
|
||||
}
|
||||
match db::load_stopwords() {
|
||||
Ok(_) => {}
|
||||
Err(e) => panic!("Database error: {:?}", e),
|
||||
}
|
||||
let token = match env::var("TELEGRAM_BOT_TOKEN") {
|
||||
Ok(token) => token,
|
||||
Err(_) => {
|
||||
|
Reference in New Issue
Block a user