tgbot-mastodon-sync 0.2.2

A Telegram bot synchronizes Telegram messages to Mastodon
Documentation
use std::borrow::Cow;

use teloxide::{prelude::*, requests::Requester};

use crate::{
    handler::{Request, Response, UserId},
    util::ProgMsg,
};

pub async fn handle<'a>(
    req: &Request,
    prog_msg: &mut ProgMsg<'a>,
    arg: impl Into<String>,
) -> Result<Response<'a>, Response<'a>> {
    let content = arg.into();
    if content.is_empty() {
        return Err(Response::reply_to("Content cannot be empty."));
    }

    let records = sqlx::query!(
        r#"
SELECT tg_user_id
FROM mastodon_login_user
        "#,
    )
    .fetch_all(req.state().db.pool())
    .await
    .map_err(|err| Response::reply_to(err.to_string()))?;

    for record in records {
        let user_id = UserId(record.tg_user_id as u64);

        let status: Cow<'a, str> = match req
            .bot()
            .send_message(user_id, &content)
            .disable_web_page_preview(true)
            .await
        {
            Ok(_) => "succeeded".into(),
            Err(err) => format!("failed ({err})").into(),
        };

        prog_msg
            .update(format!("Boardcast to user '{user_id}' {status}."), true)
            .await;
    }

    prog_msg.set_delete_on_drop(false);

    Ok(Response::nothing())
}