This repository has been archived on 2025-01-27. You can view files and clone it, but cannot push or open issues or pull requests.
puyoskey-firefish/packages/backend-rs/src/service/antenna/process_new_note.rs
HidemaruOwO 41186813ed ♻️ Refer develop version firefish (Cargo.lock, Cargo.toml, locales/ca-ES.yml, package.json, packages/backend-rs/src/cache/redis.rs, packages/backend-rs/src/database/redis.rs, packages/backend-rs/src/federation/activitypub/object/follow.rs, packages/backend-rs/src/federation/activitypub/object/like.rs, packages/backend-rs/src/federation/activitypub/object/relay.rs, packages/backend-rs/src/federation/internal_actor/instance.rs, packages/backend-rs/src/federation/internal_actor/relay.rs, packages/backend-rs/src/federation/nodeinfo/fetch.rs, packages/backend-rs/src/federation/nodeinfo/generate.rs, packages/backend-rs/src/misc/convert_host.rs, packages/backend-rs/src/misc/emoji.rs, packages/backend-rs/src/misc/emoji/reaction.rs, packages/backend-rs/src/misc/get_image_size.rs, packages/backend-rs/src/misc/latest_version.rs, packages/backend-rs/src/misc/password.rs, packages/backend-rs/src/misc/random_icon.rs, packages/backend-rs/src/misc/should_nyaify.rs, packages/backend-rs/src/misc/translate.rs, packages/backend-rs/src/service/antenna/check_hit.rs, packages/backend-rs/src/service/antenna/process_new_note.rs, packages/backend-rs/src/service/push_notification.rs, packages/backend-rs/src/service/stream.rs, packages/backend-rs/src/util/error_chain.rs, packages/backend-rs/src/util/http_client.rs, packages/backend/assets/resource-unknown.svg, packages/backend/package.json, packages/client/package.json, packages/client/src/components/MkInstanceCardMini.vue, packages/client/src/components/MkInstanceTicker.vue, packages/client/src/components/MkUrlPreview.vue, packages/client/src/ui/_common_/statusbar-federation.vue, packages/client/src/widgets/federation.vue, packages/client/src/widgets/instance-cloud.vue, packages/firefish-js/package.json, packages/macro-rs/macros-impl/Cargo.toml, packages/macro-rs/macros-impl/src/lib.rs, packages/macro-rs/macros-impl/src/napi.rs, packages/macro-rs/macros/src/lib.rs, packages/sw/package.json, pnpm-lock.yaml)
2024-08-24 09:40:20 +09:00

76 lines
2.2 KiB
Rust

use crate::{
cache,
database::{redis_conn, redis_key, RedisConnError},
federation::acct::Acct,
misc::note::elaborate,
model::entity::note,
service::{
antenna,
antenna::check_hit::{check_hit_antenna, AntennaCheckError},
stream,
},
util::id::{get_timestamp, InvalidIdError},
};
use redis::{streams::StreamMaxlen, AsyncCommands, RedisError};
use sea_orm::prelude::*;
#[error_doc::errors]
pub enum Error {
#[doc = "Database error"]
#[error(transparent)]
Db(#[from] DbErr),
#[error("Redis cache operation has failed")]
Cache(#[from] cache::redis::Error),
#[error("failed to execute a Redis command")]
Redis(#[from] RedisError),
#[error("bad Redis connection")]
RedisConn(#[from] RedisConnError),
#[doc = "Provided string is not a valid Firefish ID"]
#[error(transparent)]
InvalidId(#[from] InvalidIdError),
#[error("Redis stream operation has failed")]
Stream(#[from] stream::Error),
#[error("failed to check if the note should be added to antenna")]
AntennaCheck(#[from] AntennaCheckError),
}
// for napi export
// https://github.com/napi-rs/napi-rs/issues/2060
type Note = note::Model;
#[macros::export]
pub async fn update_antennas_on_new_note(
note: &Note,
note_author: &Acct,
note_muted_users: &[String],
) -> Result<(), Error> {
let note_all_texts = elaborate!(note, false).await?;
// TODO: do this in parallel
for antenna in antenna::get_antennas().await?.iter() {
if note_muted_users.contains(&antenna.user_id) {
continue;
}
if check_hit_antenna(antenna, note, &note_all_texts, note_author).await? {
add_note_to_antenna(&antenna.id, note).await?;
}
}
Ok(())
}
async fn add_note_to_antenna(antenna_id: &str, note: &Note) -> Result<(), Error> {
// for streaming API
stream::antenna::publish(antenna_id.to_owned(), note).await?;
// for timeline API
Ok(redis_conn()
.await?
.xadd_maxlen(
redis_key(format!("antennaTimeline:{}", antenna_id)),
StreamMaxlen::Approx(200),
format!("{}-*", get_timestamp(&note.id)?),
&[("note", &note.id)],
)
.await?)
}