Skip to content

Commit 85a6fb0

Browse files
committed
feat: fixes
1 parent de4fd4f commit 85a6fb0

7 files changed

+637
-515
lines changed

src/callback_handler.rs

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
use teloxide::{types::CallbackQuery, Bot};
2+
3+
use crate::{
4+
command::go_function, get_duplet_by_id, get_user_by_chat_id, update_duplet, HandlerResult, UserReact, DupletStatus,
5+
};
6+
7+
pub async fn callback_handler(
8+
bot: Bot,
9+
q: CallbackQuery,
10+
pool: sqlx::Pool<sqlx::Postgres>,
11+
) -> HandlerResult {
12+
if let Some(data) = q.data {
13+
if let Some(data) = data.split_once("_") {
14+
let mut duplet = get_duplet_by_id(&pool, data.0).await?;
15+
match data.1 {
16+
"like" => {
17+
if duplet.first_user_react == UserReact::None {
18+
duplet.first_user_react = UserReact::Like;
19+
} else {
20+
duplet.second_user_react = UserReact::Like;
21+
duplet.status = DupletStatus::Match;
22+
}
23+
}
24+
"dislike" => {
25+
if duplet.first_user_react == UserReact::None {
26+
duplet.first_user_react = UserReact::Dislike;
27+
} else {
28+
duplet.second_user_react = UserReact::Dislike;
29+
duplet.status = DupletStatus::Mismatch;
30+
}
31+
}
32+
_ => return Ok(()),
33+
}
34+
update_duplet(&pool, &duplet).await?;
35+
if let Some(message) = q.message {
36+
if let Some(user) = get_user_by_chat_id(&pool, message.chat.id.0).await? {
37+
go_function(user, &pool, &bot, message.chat.id).await?;
38+
}
39+
}
40+
}
41+
}
42+
Ok(())
43+
}

src/command.rs

+97
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
use teloxide::{
2+
requests::Requester,
3+
types::{ChatId, InlineKeyboardButton, InlineKeyboardMarkup, Message},
4+
utils::command::BotCommands,
5+
Bot,
6+
};
7+
8+
use crate::{
9+
get_needed_user, get_user_by_chat_id, get_user_matches_string, HandlerResult, MyDialogue,
10+
State, User,
11+
};
12+
use teloxide::payloads::SendMessageSetters;
13+
14+
use anyhow::Result;
15+
16+
#[derive(Clone, BotCommands)]
17+
#[command(rename_rule = "lowercase")]
18+
pub enum Command {
19+
Start,
20+
Settings,
21+
Go,
22+
Matches,
23+
}
24+
25+
pub async fn command_handler(
26+
bot: Bot,
27+
dialogue: MyDialogue,
28+
msg: Message,
29+
cmd: Command,
30+
pool: sqlx::Pool<sqlx::Postgres>,
31+
) -> HandlerResult {
32+
let chat_id = msg.chat.id.0;
33+
let user = get_user_by_chat_id(&pool, chat_id).await?;
34+
match cmd {
35+
Command::Start => {
36+
dialogue.update(State::GetAge(User::default())).await?;
37+
bot.send_message(msg.chat.id, "First enter your age")
38+
.await?;
39+
}
40+
Command::Settings => {
41+
if let Some(_) = user {
42+
dialogue.update(State::GetAge(User::default())).await?;
43+
bot.send_message(msg.chat.id, "Reset registration.").await?;
44+
bot.send_message(msg.chat.id, "First enter your age")
45+
.await?;
46+
} else {
47+
bot.send_message(msg.chat.id, "Register first").await?;
48+
}
49+
}
50+
Command::Go => {
51+
if let Some(user) = user {
52+
go_function(user, &pool, &bot, msg.chat.id).await?;
53+
} else {
54+
bot.send_message(msg.chat.id, "Register first").await?;
55+
}
56+
}
57+
Command::Matches => {
58+
if let Some(user) = user {
59+
let message = get_user_matches_string(&pool, user.chat_id, msg.chat.id.0).await?;
60+
bot.send_message(msg.chat.id, message).await?;
61+
} else {
62+
bot.send_message(msg.chat.id, "Register first").await?;
63+
}
64+
}
65+
}
66+
Ok(())
67+
}
68+
69+
pub async fn go_function(
70+
user: User,
71+
pool: &sqlx::Pool<sqlx::Postgres>,
72+
bot: &Bot,
73+
chat_id: ChatId,
74+
) -> Result<()> {
75+
if let Some(u) = get_needed_user(&pool, user).await? {
76+
let keyboard = vec![vec![
77+
InlineKeyboardButton::callback("like", format!("{}_like", u.duplet_id)),
78+
InlineKeyboardButton::callback("dislike", format!("{}_dislike", u.duplet_id)),
79+
]];
80+
bot.send_message(
81+
chat_id,
82+
format!(
83+
"name - {},\nage - {},\ncity - {},\ngender - {},\nabout - {}",
84+
u.name, u.age, u.city, u.gender, u.about
85+
),
86+
)
87+
.reply_markup(InlineKeyboardMarkup::new(keyboard))
88+
.await?;
89+
} else {
90+
bot.send_message(
91+
chat_id,
92+
"There's no one suitable at the moment, try later with /go",
93+
)
94+
.await?;
95+
}
96+
Ok(())
97+
}

src/domain.rs

+99
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
use serde::{Deserialize, Serialize};
2+
#[derive(Debug, Serialize, Deserialize, Default, Clone)]
3+
pub struct User {
4+
pub chat_id: i64,
5+
pub age: i32,
6+
pub gender: String,
7+
pub city: String,
8+
pub name: String,
9+
pub telegram_name: String,
10+
pub about: String,
11+
pub interested_min_age: i32,
12+
pub interested_max_age: i32,
13+
pub interested_gender: String,
14+
}
15+
16+
#[derive(Debug, sqlx::FromRow)]
17+
pub struct Duplet {
18+
pub id: String,
19+
pub first_user_id: i64,
20+
pub first_user_react: UserReact,
21+
pub second_user_id: i64,
22+
pub second_user_react: UserReact,
23+
pub status: DupletStatus,
24+
}
25+
26+
#[derive(Debug, Serialize, Deserialize, Default, Clone)]
27+
pub struct PublicDuplet {
28+
pub partner_name: String,
29+
pub partner_telegram_name: String,
30+
}
31+
32+
pub struct PublicUserAndDuplet {
33+
pub name: String,
34+
pub age: i32,
35+
pub city: String,
36+
pub gender: String,
37+
pub about: String,
38+
pub duplet_id: String,
39+
}
40+
41+
#[derive(Clone, Serialize, Deserialize)]
42+
pub enum State {
43+
GetAge(User),
44+
GetGender(User),
45+
GetCity(User),
46+
GetName(User),
47+
GetAbout(User),
48+
GetInterestedMinAge(User),
49+
GetInterestedMaxAge(User),
50+
GetInterestedGender(User),
51+
Ready,
52+
}
53+
54+
impl Default for State {
55+
fn default() -> Self {
56+
State::GetAge(User::default())
57+
}
58+
}
59+
60+
#[derive(Debug, PartialEq, Eq, sqlx::Type, Clone, Copy)]
61+
pub enum UserReact{
62+
Like,
63+
Dislike,
64+
None,
65+
}
66+
67+
impl From<String> for UserReact {
68+
fn from(value: String) -> Self {
69+
match value.as_str() {
70+
"Like" => UserReact::Like,
71+
"Dislike" => UserReact::Dislike,
72+
"None" => UserReact::None,
73+
_ => UserReact::None,
74+
}
75+
}
76+
}
77+
78+
79+
80+
#[derive(Debug, PartialEq, Eq, sqlx::Type, Clone, Copy)]
81+
pub enum DupletStatus {
82+
InProcess,
83+
Match,
84+
Mismatch,
85+
Prepared,
86+
}
87+
88+
impl From<String> for DupletStatus {
89+
fn from(value: String) -> Self {
90+
match value.as_str() {
91+
"InProcess" => DupletStatus::InProcess,
92+
"Match" => DupletStatus::Match,
93+
"Mismatch" => DupletStatus::Mismatch,
94+
"Prepared" => DupletStatus::Prepared,
95+
_ => DupletStatus::InProcess,
96+
}
97+
}
98+
}
99+

0 commit comments

Comments
 (0)