mirror of
https://github.com/house-of-vanity/desubot.git
synced 2025-07-08 21:04:07 +00:00
Add top.
This commit is contained in:
@ -1,12 +1,13 @@
|
|||||||
use crate::db;
|
use crate::db;
|
||||||
use html_escape::encode_text;
|
use html_escape::encode_text;
|
||||||
use telegram_bot::prelude::*;
|
use telegram_bot::prelude::*;
|
||||||
use telegram_bot::{Api, Error, Message, ParseMode, };
|
use telegram_bot::{Api, Message, ParseMode};
|
||||||
|
use crate::errors::Error;
|
||||||
|
|
||||||
pub(crate) async fn here(api: Api, message: Message) -> Result<(), Error> {
|
pub(crate) async fn here(api: Api, message: Message) -> Result<(), Error> {
|
||||||
let members: Vec<telegram_bot::User> = db::get_members(message.chat.id()).unwrap();
|
let members: Vec<telegram_bot::User> = db::get_members(message.chat.id()).unwrap();
|
||||||
for u in &members {
|
for u in &members {
|
||||||
debug!("Found user {:?}", u);
|
debug!("Found user {:?} in chat {}", u, message.chat.id());
|
||||||
}
|
}
|
||||||
let mut msg = "<b>I summon you</b>, ".to_string();
|
let mut msg = "<b>I summon you</b>, ".to_string();
|
||||||
for user in members {
|
for user in members {
|
||||||
@ -25,10 +26,30 @@ pub(crate) async fn here(api: Api, message: Message) -> Result<(), Error> {
|
|||||||
.send(message.text_reply(msg).parse_mode(ParseMode::Html))
|
.send(message.text_reply(msg).parse_mode(ParseMode::Html))
|
||||||
.await
|
.await
|
||||||
{
|
{
|
||||||
Ok(_) => debug!("@here command sent to {}", message.from.id),
|
Ok(_) => debug!("/here command sent to {}", message.chat.id()),
|
||||||
Err(_) => warn!("@here command sent failed to {}", message.from.id),
|
Err(_) => warn!("/here command sent failed to {}", message.chat.id()),
|
||||||
}
|
}
|
||||||
//api.send(message.chat.text("Text to message chat")).await?;
|
//api.send(message.chat.text("Text to message chat")).await?;
|
||||||
//api.send(message.from.text("Private text")).await?;
|
//api.send(message.from.text("Private text")).await?;
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) async fn top(api: Api, message: Message) -> Result<(), Error> {
|
||||||
|
let top = db::get_top(&message).await?;
|
||||||
|
let mut msg = "<b>Your top using words:</b>\n<pre>".to_string();
|
||||||
|
let mut counter = 1;
|
||||||
|
for word in top.iter() {
|
||||||
|
msg = format!("{} <b>{}</b> {} - {}\n", msg, counter, word.word, word.count);
|
||||||
|
counter += 1;
|
||||||
|
}
|
||||||
|
msg = format!("{}{}", msg, "</pre>");
|
||||||
|
match api
|
||||||
|
.send(message.text_reply(msg).parse_mode(ParseMode::Html))
|
||||||
|
.await
|
||||||
|
{
|
||||||
|
Ok(_) => debug!("/top command sent to {}", message.chat.id()),
|
||||||
|
Err(_) => warn!("/top command sent failed to {}", message.chat.id()),
|
||||||
|
}
|
||||||
|
//api.send(message.chat.text("Text to message chat")).await?;
|
||||||
|
//api.send(message.from.text("Private text")).await?;
|
||||||
|
Ok(())}
|
||||||
|
51
src/db.rs
51
src/db.rs
@ -1,6 +1,6 @@
|
|||||||
use crate::errors;
|
use crate::errors;
|
||||||
use crate::utils;
|
use crate::utils;
|
||||||
use rusqlite::{params, Connection, Error, Result};
|
use rusqlite::{params, named_params, Connection, Error, Result};
|
||||||
use std::time::SystemTime;
|
use std::time::SystemTime;
|
||||||
use telegram_bot::*;
|
use telegram_bot::*;
|
||||||
|
|
||||||
@ -10,6 +10,11 @@ pub struct Conf {
|
|||||||
title: String,
|
title: String,
|
||||||
date: i32,
|
date: i32,
|
||||||
}
|
}
|
||||||
|
#[derive(Debug, Clone)]
|
||||||
|
pub struct TopWord {
|
||||||
|
pub word: String,
|
||||||
|
pub count: i32,
|
||||||
|
}
|
||||||
|
|
||||||
pub(crate) fn open() -> Result<Connection> {
|
pub(crate) fn open() -> Result<Connection> {
|
||||||
let path = "./memory.sqlite3";
|
let path = "./memory.sqlite3";
|
||||||
@ -250,11 +255,10 @@ pub(crate) async fn add_file(
|
|||||||
pub(crate) async fn get_file(file_id: String) -> Result<i64, errors::Error> {
|
pub(crate) async fn get_file(file_id: String) -> Result<i64, errors::Error> {
|
||||||
let conn = open()?;
|
let conn = open()?;
|
||||||
let file_rowid = match { conn.prepare("SELECT rowid FROM file WHERE file_id = :file_id")? }
|
let file_rowid = match { conn.prepare("SELECT rowid FROM file WHERE file_id = :file_id")? }
|
||||||
.query_row(params![file_id], |row| row.get(0)) {
|
.query_row(params![file_id], |row| row.get(0))
|
||||||
|
{
|
||||||
Ok(id) => Ok(id),
|
Ok(id) => Ok(id),
|
||||||
Err(_) => {
|
Err(_) => Err(errors::Error::FileNotFound),
|
||||||
Err(errors::Error::FileNotFound)
|
|
||||||
}
|
|
||||||
};
|
};
|
||||||
|
|
||||||
file_rowid
|
file_rowid
|
||||||
@ -330,8 +334,8 @@ pub(crate) async fn add_sentence(message: &telegram_bot::Message) -> Result<(),
|
|||||||
Ok(id) => {
|
Ok(id) => {
|
||||||
debug!("Added {}: rowid: {}", &word, id);
|
debug!("Added {}: rowid: {}", &word, id);
|
||||||
match add_relation(id, msg_rowid, message).await {
|
match add_relation(id, msg_rowid, message).await {
|
||||||
Ok(_) => {},
|
Ok(_) => {}
|
||||||
Err(e) => panic!("SQLITE3 Error: Relations failed: {:?}", e)
|
Err(e) => panic!("SQLITE3 Error: Relations failed: {:?}", e),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Err(_) => debug!("Word {} is in stop list.", &word),
|
Err(_) => debug!("Word {} is in stop list.", &word),
|
||||||
@ -341,6 +345,39 @@ pub(crate) async fn add_sentence(message: &telegram_bot::Message) -> Result<(),
|
|||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub(crate) async fn get_top(
|
||||||
|
message: &telegram_bot::Message,
|
||||||
|
) -> Result<Vec<TopWord>, errors::Error> {
|
||||||
|
let user_id = i64::from(message.from.id);
|
||||||
|
let conf_id = i64::from(message.chat.id());
|
||||||
|
|
||||||
|
let conn = open()?;
|
||||||
|
let mut stmt = conn.prepare("
|
||||||
|
SELECT w.word, COUNT(*) as count FROM relations r
|
||||||
|
LEFT JOIN word w ON w.id = r.word_id
|
||||||
|
LEFT JOIN `user` u ON u.id = r.user_id
|
||||||
|
WHERE u.id = :user_id AND
|
||||||
|
r.conf_id = :conf_id AND
|
||||||
|
r.id > (
|
||||||
|
SELECT IFNULL(MAX(relation_id), 0) FROM reset WHERE user_id = :user_id AND conf_id = :conf_id
|
||||||
|
)
|
||||||
|
GROUP BY w.word
|
||||||
|
ORDER BY count DESC
|
||||||
|
LIMIT 10
|
||||||
|
")?;
|
||||||
|
|
||||||
|
let mut rows = stmt.query_named(named_params! {":user_id": user_id, ":conf_id": conf_id})?;
|
||||||
|
let mut top = Vec::new();
|
||||||
|
|
||||||
|
while let Some(row) = rows.next()? {
|
||||||
|
top.push(TopWord {
|
||||||
|
word: row.get(0)?,
|
||||||
|
count: row.get(1)?,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
Ok(top)
|
||||||
|
}
|
||||||
|
|
||||||
// SCHEME
|
// SCHEME
|
||||||
static SCHEME: &str = "
|
static SCHEME: &str = "
|
||||||
--
|
--
|
||||||
|
10
src/main.rs
10
src/main.rs
@ -26,13 +26,11 @@ async fn handler(api: Api, message: Message, token: String) -> Result<(), errors
|
|||||||
db::add_sentence(&message).await?;
|
db::add_sentence(&message).await?;
|
||||||
match data.as_str() {
|
match data.as_str() {
|
||||||
"/here" => commands::here(api, message).await?,
|
"/here" => commands::here(api, message).await?,
|
||||||
|
"/top" => commands::top(api, message).await?,
|
||||||
_ => (),
|
_ => (),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
MessageKind::Photo {
|
MessageKind::Photo { ref caption, .. } => {
|
||||||
ref caption,
|
|
||||||
..
|
|
||||||
} => {
|
|
||||||
let title = utils::get_title(&message);
|
let title = utils::get_title(&message);
|
||||||
info!(
|
info!(
|
||||||
"<{}({})>[{}({})]: *PHOTO* {}",
|
"<{}({})>[{}({})]: *PHOTO* {}",
|
||||||
@ -114,8 +112,8 @@ async fn handler(api: Api, message: Message, token: String) -> Result<(), errors
|
|||||||
async fn main() -> Result<(), errors::Error> {
|
async fn main() -> Result<(), errors::Error> {
|
||||||
env_logger::from_env(Env::default().default_filter_or("info")).init();
|
env_logger::from_env(Env::default().default_filter_or("info")).init();
|
||||||
match db::update_scheme() {
|
match db::update_scheme() {
|
||||||
Ok(_) => {},
|
Ok(_) => {}
|
||||||
Err(e) => panic!("Database error: {:?}", e)
|
Err(e) => panic!("Database error: {:?}", e),
|
||||||
}
|
}
|
||||||
let token = match env::var("TELEGRAM_BOT_TOKEN") {
|
let token = match env::var("TELEGRAM_BOT_TOKEN") {
|
||||||
Ok(token) => token,
|
Ok(token) => token,
|
||||||
|
@ -9,7 +9,7 @@ use crate::db;
|
|||||||
use crate::errors;
|
use crate::errors;
|
||||||
extern crate reqwest;
|
extern crate reqwest;
|
||||||
use serde_json::Value;
|
use serde_json::Value;
|
||||||
use subprocess::{Exec, };
|
use subprocess::Exec;
|
||||||
|
|
||||||
pub(crate) fn get_title(message: &Message) -> String {
|
pub(crate) fn get_title(message: &Message) -> String {
|
||||||
match &message.chat {
|
match &message.chat {
|
||||||
@ -81,13 +81,12 @@ pub(crate) async fn get_files(
|
|||||||
hasher.update(&content);
|
hasher.update(&content);
|
||||||
let file_hash = hasher.digest().to_string();
|
let file_hash = hasher.digest().to_string();
|
||||||
match db::get_file(file_hash.clone()).await {
|
match db::get_file(file_hash.clone()).await {
|
||||||
Ok(_) => {
|
Ok(_) => {}
|
||||||
}
|
|
||||||
Err(_) => {
|
Err(_) => {
|
||||||
let mut dest = File::create(path.clone())?;
|
let mut dest = File::create(path.clone())?;
|
||||||
match dest.write(&content) {
|
match dest.write(&content) {
|
||||||
Ok(_) => {},
|
Ok(_) => {}
|
||||||
Err(e) => panic!("IO Error: Couldn't save file: {:?}", e)
|
Err(e) => panic!("IO Error: Couldn't save file: {:?}", e),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
Reference in New Issue
Block a user