Migrate group id on all messages sent

This commit is contained in:
Manuel Vögele
2024-10-27 17:56:02 +01:00
parent b4dc2ce561
commit b04f5b8993
3 changed files with 53 additions and 35 deletions

View File

@@ -10,7 +10,6 @@ use diesel::ExpressionMethods;
use diesel::QueryDsl;
use diesel::RunQueryDsl;
use itertools::Itertools;
use log::info;
use strum::Display;
use strum::EnumIter;
use strum::IntoEnumIterator;
@@ -29,11 +28,12 @@ use teloxide::types::MessageId;
use teloxide::types::{ChatId, ReplyParameters};
use teloxide::types::{Message, Update};
use teloxide::utils::command::BotCommands;
use teloxide::{Bot, RequestError};
use teloxide::Bot;
use crate::appointment::fetch_next_appointment;
use crate::db::{ChatInfo, Reminder};
use crate::db::{DbChat, ParseReminderError};
use crate::migrating_send::migrating_send;
use crate::{schema, Database};
#[derive(BotCommands, Clone, EnumIter, Display)]
@@ -333,9 +333,10 @@ pub async fn fetch_and_announce_appointment(
.to_string(),
};
let send_announcement = |chat_id| {
bot.send_message(
ChatId(chat_id),
let announcement = migrating_send(
bot,
db,
ChatId(chat_info.id),
t!(
"messages.next_appointment",
locale = &chat_info.locale,
@@ -344,25 +345,7 @@ pub async fn fetch_and_announce_appointment(
uk_time = &uk_time_str.to_string()
),
)
};
let mut announcement = send_announcement(chat_info.id).await;
if let Err(e) = &announcement {
if let RequestError::MigrateToChatId(new_id) = e {
db.lock().await.exclusive_transaction(|db| {
use schema::chats::dsl::*;
info!("Migrating chat {} to {}", chat_info.id, new_id.0);
diesel::update(chats)
.filter(telegram_id.eq(chat_info.id))
.set(telegram_id.eq(new_id.0))
.execute(db)
})?;
announcement = send_announcement(new_id.0).await;
}
}
let announcement = announcement?;
.await?;
if let Some(pinned_message_id) = entry.pinned_message_id {
let mut unpin_message = bot.unpin_chat_message(ChatId(chat_info.id));

View File

@@ -2,6 +2,7 @@ mod appointment;
mod bot;
mod db;
mod error;
mod migrating_send;
mod schema;
use std::env::args;
@@ -21,10 +22,10 @@ use diesel::{ExpressionMethods, QueryDsl};
use diesel_migrations::{embed_migrations, EmbeddedMigrations, MigrationHarness};
use error::ConfigLoadError;
use log::*;
use migrating_send::migrating_send;
use serde::Deserialize;
use teloxide::adaptors::Throttle;
use teloxide::prelude::RequesterExt;
use teloxide::requests::Requester;
use teloxide::types::ChatId;
use teloxide::{adaptors::throttle::Limits, Bot};
use tokio::time::sleep;
@@ -238,8 +239,7 @@ async fn check_task(bot: &Throttle<Bot>, db: &Database) -> Result<()> {
continue;
}
bot.send_message(ChatId(chat_info.id), reminder.text)
.await?;
migrating_send(bot, db, ChatId(chat_info.id), reminder.text).await?;
db.lock().await.transaction(|db| {
use schema::chats::dsl::*;

35
src/migrating_send.rs Normal file
View File

@@ -0,0 +1,35 @@
use anyhow::Result;
use diesel::{ExpressionMethods, RunQueryDsl};
use log::info;
use teloxide::{
adaptors::Throttle,
prelude::Requester,
types::{ChatId, Message},
Bot, RequestError,
};
use crate::{schema, Database};
pub async fn migrating_send<T: Into<String>>(
bot: &Throttle<Bot>,
db: &Database,
chat_id: ChatId,
text: T,
) -> Result<Message> {
let text = text.into();
let mut result = bot.send_message(chat_id, &text).await;
if let Err(e) = &result {
if let RequestError::MigrateToChatId(new_id) = e {
db.lock().await.exclusive_transaction(|db| {
use schema::chats::dsl::*;
info!("Migrating chat {} to {}", chat_id.0, new_id.0);
diesel::update(chats)
.filter(telegram_id.eq(chat_id.0))
.set(telegram_id.eq(new_id.0))
.execute(db)
})?;
result = bot.send_message(*new_id, text).await;
}
}
Ok(result?)
}