2020-11-28 17:31:08 +03:00
use crate ::db ;
2020-12-08 12:31:21 +03:00
use crate ::errors ::Error ;
2020-11-29 16:23:27 +03:00
use html_escape ::encode_text ;
2020-12-08 12:31:21 +03:00
use markov ::Chain ;
2020-12-30 14:30:53 +03:00
use mystem ::Case ::Nominative ;
2020-12-29 17:01:56 +03:00
use mystem ::Gender ::Feminine ;
2020-12-30 09:24:15 +03:00
use mystem ::Tense ::{ Inpresent , Past } ;
2020-12-30 14:30:53 +03:00
use mystem ::VerbPerson ::First ;
use mystem ::{ MyStem , VerbPerson } ;
2020-12-29 17:01:56 +03:00
use rand ::seq ::SliceRandom ;
2020-12-09 18:13:59 +03:00
use rand ::Rng ;
2020-12-29 17:01:56 +03:00
use regex ::Regex ;
2020-11-28 17:31:08 +03:00
use telegram_bot ::prelude ::* ;
2020-12-07 17:41:12 +03:00
use telegram_bot ::{ Api , Message , ParseMode } ;
2020-11-28 17:31:08 +03:00
pub ( crate ) async fn here ( api : Api , message : Message ) -> Result < ( ) , Error > {
2020-11-29 16:23:27 +03:00
let members : Vec < telegram_bot ::User > = db ::get_members ( message . chat . id ( ) ) . unwrap ( ) ;
2020-11-29 00:26:00 +03:00
for u in & members {
2020-12-07 17:41:12 +03:00
debug! ( " Found user {:?} in chat {} " , u , message . chat . id ( ) ) ;
2020-11-29 00:26:00 +03:00
}
let mut msg = " <b>I summon you</b>, " . to_string ( ) ;
2020-11-28 17:31:08 +03:00
for user in members {
let mention = match user . username {
Some ( username ) = > format! ( " @ {} " , username ) ,
2020-11-29 16:23:27 +03:00
_ = > format! (
" <a href= \" tg://user?id={} \" >{}</a> " ,
encode_text ( & user . id . to_string ( ) ) ,
encode_text ( & user . first_name )
) ,
2020-11-28 17:31:08 +03:00
} ;
msg = format! ( " {} {} " , msg , mention ) ;
}
2020-12-07 15:55:25 +03:00
match api
. send ( message . text_reply ( msg ) . parse_mode ( ParseMode ::Html ) )
. await
{
2020-12-07 17:41:12 +03:00
Ok ( _ ) = > debug! ( " /here command sent to {} " , message . chat . id ( ) ) ,
Err ( _ ) = > warn! ( " /here command sent failed to {} " , message . chat . id ( ) ) ,
2020-12-06 23:55:09 +03:00
}
2020-11-28 17:31:08 +03:00
//api.send(message.chat.text("Text to message chat")).await?;
//api.send(message.from.text("Private text")).await?;
Ok ( ( ) )
}
2020-12-07 17:41:12 +03:00
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 ( ) {
2020-12-08 12:31:21 +03:00
msg = format! (
" {} <b>{}</b> {} - {} \n " ,
msg , counter , word . word , word . count
) ;
2020-12-07 17:41:12 +03:00
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?;
2020-12-08 12:31:21 +03:00
Ok ( ( ) )
}
pub ( crate ) async fn markov_all ( api : Api , message : Message ) -> Result < ( ) , Error > {
2020-12-29 17:01:56 +03:00
let messages = db ::get_messages_random_all ( ) . await ? ;
2020-12-08 12:31:21 +03:00
let mut chain = Chain ::new ( ) ;
chain . feed ( messages ) ;
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 ( ) ) ;
}
match api
. send ( message . text_reply ( msg . trim ( ) ) . parse_mode ( ParseMode ::Html ) )
. await
{
2020-12-09 18:13:59 +03:00
Ok ( _ ) = > debug! ( " /markov_all command sent to {} " , message . chat . id ( ) ) ,
Err ( _ ) = > warn! ( " /markov_all command sent failed to {} " , message . chat . id ( ) ) ,
2020-12-08 12:31:21 +03:00
}
//api.send(message.chat.text("Text to message chat")).await?;
//api.send(message.from.text("Private text")).await?;
Ok ( ( ) )
}
2020-12-11 15:53:14 +03:00
pub ( crate ) async fn markov ( api : Api , message : Message ) -> Result < ( ) , Error > {
2020-12-29 17:01:56 +03:00
let messages = db ::get_messages_random_group ( & message ) . await ? ;
2020-12-11 15:53:14 +03:00
let mut chain = Chain ::new ( ) ;
chain . feed ( messages ) ;
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 ( ) ) ;
}
match api
. send ( message . text_reply ( msg . trim ( ) ) . parse_mode ( ParseMode ::Html ) )
. await
{
Ok ( _ ) = > debug! ( " /markov command sent to {} " , message . chat . id ( ) ) ,
Err ( _ ) = > warn! ( " /markov 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 ( ( ) )
}
2020-12-29 17:01:56 +03:00
pub ( crate ) async fn omedeto ( api : Api , message : Message , mystem : & mut MyStem ) -> Result < ( ) , Error > {
let all_msg = db ::get_messages_user_all ( & message ) . await ? ;
2020-12-30 11:50:19 +03:00
let re = Regex ::new ( r "^[яЯ] [а -яА-Я]+(-[а -яА-Я]+(_[а -яА-Я]+)*)*" ) . unwrap ( ) ;
2020-12-29 17:01:56 +03:00
let mut nouns : Vec < String > = all_msg
. clone ( )
. into_iter ( )
. filter ( | m | re . is_match ( m ) )
. map ( | m | m . split ( ' ' ) . map ( | s | s . to_string ( ) ) . collect ::< Vec < String > > ( ) [ 1 ] . clone ( ) )
. filter ( | m | {
let stem = mystem . stemming ( m . clone ( ) ) . unwrap_or_default ( ) ;
2020-12-30 09:24:15 +03:00
if stem . is_empty ( ) {
false
} else if stem [ 0 ] . lex . is_empty ( ) {
false
} else {
match stem [ 0 ] . lex [ 0 ] . grammem . part_of_speech {
2020-12-30 11:56:25 +03:00
mystem ::PartOfSpeech ::Noun = > stem [ 0 ] . lex [ 0 ]
. grammem
. facts
. contains ( & mystem ::Fact ::Case ( Nominative ) ) ,
2020-12-30 09:24:15 +03:00
_ = > false ,
}
2020-12-29 17:01:56 +03:00
}
} )
2020-12-30 11:50:19 +03:00
. map ( | w | w . replace ( | z | z = = '.' | | z = = ',' , " " ) )
2020-12-29 17:01:56 +03:00
. collect ( ) ;
nouns . sort ( ) ;
nouns . dedup ( ) ;
nouns . shuffle ( & mut rand ::thread_rng ( ) ) ;
2020-12-30 14:30:53 +03:00
debug! ( " Found {} nouns. {:#?} " , nouns . len ( ) , nouns ) ;
2020-12-29 17:01:56 +03:00
let mut verbs_p : Vec < String > = all_msg
. clone ( )
. into_iter ( )
. filter ( | m | re . is_match ( m ) )
. map ( | m | m . split ( ' ' ) . map ( | s | s . to_string ( ) ) . collect ::< Vec < String > > ( ) [ 1 ] . clone ( ) )
. filter ( | m | {
let stem = mystem . stemming ( m . clone ( ) ) . unwrap_or_default ( ) ;
2020-12-30 09:24:15 +03:00
if stem . is_empty ( ) {
false
} else if stem [ 0 ] . lex . is_empty ( ) {
false
} else {
match stem [ 0 ] . lex [ 0 ] . grammem . part_of_speech {
mystem ::PartOfSpeech ::Verb = > stem [ 0 ] . lex [ 0 ]
. grammem
. facts
. contains ( & mystem ::Fact ::Tense ( Past ) ) ,
_ = > false ,
}
2020-12-29 17:01:56 +03:00
}
} )
2020-12-30 11:50:19 +03:00
. map ( | w | w . replace ( | z | z = = '.' | | z = = ',' , " " ) )
2020-12-29 17:01:56 +03:00
. collect ( ) ;
verbs_p . sort ( ) ;
verbs_p . dedup ( ) ;
verbs_p . shuffle ( & mut rand ::thread_rng ( ) ) ;
2020-12-30 14:30:53 +03:00
debug! ( " Found {} nouns. {:#?} " , verbs_p . len ( ) , verbs_p ) ;
2020-12-29 17:01:56 +03:00
let mut verbs_i : Vec < String > = all_msg
. clone ( )
. into_iter ( )
. filter ( | m | re . is_match ( m ) )
. map ( | m | m . split ( ' ' ) . map ( | s | s . to_string ( ) ) . collect ::< Vec < String > > ( ) [ 1 ] . clone ( ) )
. filter ( | m | {
let stem = mystem . stemming ( m . clone ( ) ) . unwrap_or_default ( ) ;
2020-12-30 09:24:15 +03:00
if stem . is_empty ( ) {
false
} else if stem [ 0 ] . lex . is_empty ( ) {
false
} else {
match stem [ 0 ] . lex [ 0 ] . grammem . part_of_speech {
2020-12-30 14:30:53 +03:00
mystem ::PartOfSpeech ::Verb = > {
stem [ 0 ] . lex [ 0 ]
. grammem
. facts
. contains ( & mystem ::Fact ::Tense ( Inpresent ) )
& & stem [ 0 ] . lex [ 0 ]
. grammem
. facts
. contains ( & mystem ::Fact ::Person ( First ) )
}
2020-12-30 09:24:15 +03:00
_ = > false ,
}
2020-12-29 17:01:56 +03:00
}
} )
2020-12-30 11:50:19 +03:00
. map ( | w | w . replace ( | z | z = = '.' | | z = = ',' , " " ) )
2020-12-29 17:01:56 +03:00
. collect ( ) ;
verbs_i . sort ( ) ;
verbs_i . dedup ( ) ;
verbs_i . shuffle ( & mut rand ::thread_rng ( ) ) ;
2020-12-30 14:30:53 +03:00
debug! ( " Found {} nouns. {:#?} " , verbs_i . len ( ) , verbs_i ) ;
2020-12-29 17:01:56 +03:00
if nouns . is_empty ( ) {
nouns . push ( message . from . first_name . to_string ( ) ) ;
}
let start : Vec < String > = vec! [
" С новыйм годом." . into ( ) ,
" С НГ тебя" . into ( ) ,
" Поздравляю " . into ( ) ,
" Поздравляю с НГ " . into ( ) ,
] ;
2020-12-30 09:58:17 +03:00
let placeholders : Vec < String > = vec! [
" [ДАННЫЕ УДАЛЕНЫ] " . into ( ) ,
" [С Е К Р Е Т Н О ] " . into ( ) ,
" [Н Е Т ДАННЫХ] " . into ( ) ,
" [ОШИБКА ДОСТУПА] " . into ( ) ,
" [XXXX] " . into ( ) ,
] ;
2020-12-29 17:01:56 +03:00
//debug!("Nouns: {:#?}", nouns);
//debug!("Verbs: {:#?}", verbs);
2020-12-30 09:24:15 +03:00
let fem = {
let z = mystem
2020-12-29 17:01:56 +03:00
. stemming ( message . from . first_name . to_string ( ) )
2020-12-30 09:24:15 +03:00
. unwrap ( ) ;
2020-12-30 14:30:53 +03:00
debug! ( " {:#?} " , z ) ;
2020-12-30 09:24:15 +03:00
if z . is_empty ( ) {
2020-12-29 17:01:56 +03:00
false
2020-12-30 09:24:15 +03:00
} else if z [ 0 ] . lex . is_empty ( ) {
false
} else {
2020-12-30 14:30:53 +03:00
z [ 0 ] . lex [ 0 ]
2020-12-30 09:24:15 +03:00
. grammem
. facts
. contains ( & mystem ::Fact ::Gender ( Feminine ) )
2020-12-29 17:01:56 +03:00
}
} ;
let result = format! (
2020-12-30 09:38:33 +03:00
" {} {} известн{} как {}, {}, а так же конечно {}. В прошедшем году ты часто давал{} нам знать, что ты {}, {} и {}. Нередко ты говорил{} я {}, я {} или даже я {}. =* " ,
2020-12-29 17:01:56 +03:00
start . choose ( & mut rand ::thread_rng ( ) ) . unwrap ( ) ,
message . from . first_name . to_string ( ) ,
{ if fem { " ая " } else { " ый " } } ,
2020-12-30 09:58:17 +03:00
nouns . pop ( ) . unwrap_or ( placeholders . choose ( & mut rand ::thread_rng ( ) ) . unwrap ( ) . to_string ( ) ) ,
nouns . pop ( ) . unwrap_or ( placeholders . choose ( & mut rand ::thread_rng ( ) ) . unwrap ( ) . to_string ( ) ) ,
nouns . pop ( ) . unwrap_or ( placeholders . choose ( & mut rand ::thread_rng ( ) ) . unwrap ( ) . to_string ( ) ) ,
2020-12-29 17:01:56 +03:00
{ if fem { " а " } else { " " } } ,
2020-12-30 09:58:17 +03:00
verbs_p . pop ( ) . unwrap_or ( placeholders . choose ( & mut rand ::thread_rng ( ) ) . unwrap ( ) . to_string ( ) ) ,
verbs_p . pop ( ) . unwrap_or ( placeholders . choose ( & mut rand ::thread_rng ( ) ) . unwrap ( ) . to_string ( ) ) ,
verbs_p . pop ( ) . unwrap_or ( placeholders . choose ( & mut rand ::thread_rng ( ) ) . unwrap ( ) . to_string ( ) ) ,
2020-12-29 17:01:56 +03:00
{ if fem { " а " } else { " " } } ,
2020-12-30 09:58:17 +03:00
verbs_i . pop ( ) . unwrap_or ( placeholders . choose ( & mut rand ::thread_rng ( ) ) . unwrap ( ) . to_string ( ) ) ,
verbs_i . pop ( ) . unwrap_or ( placeholders . choose ( & mut rand ::thread_rng ( ) ) . unwrap ( ) . to_string ( ) ) ,
verbs_i . pop ( ) . unwrap_or ( placeholders . choose ( & mut rand ::thread_rng ( ) ) . unwrap ( ) . to_string ( ) ) ,
2020-12-29 17:01:56 +03:00
) ;
debug! ( " {:?} " , result ) ;
2020-12-29 17:09:49 +03:00
match api
2020-12-30 09:24:15 +03:00
. send (
message
. text_reply ( result . trim ( ) )
. parse_mode ( ParseMode ::Html ) ,
)
2020-12-29 17:09:49 +03:00
. await
{
Ok ( _ ) = > debug! ( " /omedeto command sent to {} " , message . chat . id ( ) ) ,
Err ( _ ) = > warn! ( " /omedeto command sent failed to {} " , message . chat . id ( ) ) ,
}
2020-12-29 17:01:56 +03:00
Ok ( ( ) )
}