Compare commits

..

3 Commits

Author SHA1 Message Date
Slavi Pantaleev
c8abf0e316 Release 1.4.0 2024-11-19 21:05:56 +02:00
Slavi Pantaleev
39a184e5d0 Adapt to mxlink 1.4.0 (matrix-sdk 0.8.0) 2024-11-19 20:57:35 +02:00
Slavi Pantaleev
9d166e35ba Add missing typing notices sending functionality while generating images 2024-11-19 20:46:23 +02:00
9 changed files with 297 additions and 324 deletions

View File

@@ -1,3 +1,10 @@
# (2024-11-19) Version 1.4.0
- (**Improvement**) Dependency updates. This version is based on [mxlink](https://crates.io/crates/mxlink)@1.4.0 (which is based on the newly released [matrix-sdk](https://crates.io/crates/matrix-sdk)@[0.8.0](https://github.com/matrix-org/matrix-rust-sdk/releases/tag/matrix-sdk-0.8.0)). Once you run this version at least once and your matrix-sdk datastore gets upgraded to the new schema, **you will not be able to downgrade to older baibot versions** (based on the older matrix-sdk), unless you start with an empty datastore.
- (**Bugfix**) Add missing typing notices sending functionality while generating images ([9d166e35ba](https://github.com/etkecc/baibot/commit/9d166e35ba6fc0daaf69318870e92436f3302056))
# (2024-11-12) Version 1.3.2
Dependency updates.

553
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@@ -7,7 +7,7 @@ license = "AGPL-3.0-or-later"
readme = "README.md"
keywords = ["matrix", "chat", "bot", "AI", "LLM"]
include = ["/etc/assets/baibot-torso-768.png", "/src", "/README.md", "/CHANGELOG.md", "/LICENSE"]
version = "1.3.2"
version = "1.4.0"
edition = "2021"
[lib]
@@ -21,9 +21,9 @@ async-openai = "0.26.*"
base64 = "0.22.*"
chrono = { version = "0.4.*", default-features = false, features = ["std", "now"] }
# We'd rather not depend on this, but we cannot use the ruma-events EventContent macro without it.
matrix-sdk = { version = "0.7.1", default-features = false }
matrix-sdk = { version = "0.8.0", default-features = false }
mxidwc = "1.0.*"
mxlink = ">=1.3.0"
mxlink = ">=1.4.0"
etke_openai_api_rust = "0.1.*"
quick_cache = "0.6.*"
regex = "1.11.*"

View File

@@ -1,7 +1,7 @@
use std::sync::Arc;
use std::{future::Future, pin::Pin};
use mxlink::matrix_sdk::media::{MediaFormat, MediaRequest};
use mxlink::matrix_sdk::media::{MediaFormat, MediaRequestParameters};
use mxlink::matrix_sdk::ruma::{
events::room::MediaSource, MilliSecondsSinceUnixEpoch, OwnedUserId,
};
@@ -287,7 +287,7 @@ impl Bot {
let desired_display_name = self.inner.config.user.name.clone();
let profile = account
.get_profile()
.fetch_user_profile()
.await
.map_err(|e| anyhow::anyhow!("Failed fetching profile: {:?}", e))?;
@@ -310,7 +310,7 @@ impl Bot {
let should_update_avatar = match &profile.avatar_url {
Some(avatar_url) => {
let request = MediaRequest {
let request = MediaRequestParameters {
source: MediaSource::Plain(avatar_url.to_owned()),
format: MediaFormat::File,
};

View File

@@ -1,8 +1,8 @@
use mxlink::matrix_sdk::{
ruma::{
events::{
room::message::Relation, AnyMessageLikeEvent, AnySyncTimelineEvent, AnyTimelineEvent,
MessageLikeEvent,
room::message::Relation, AnySyncMessageLikeEvent, AnySyncTimelineEvent,
SyncMessageLikeEvent,
},
OwnedEventId, OwnedUserId,
},
@@ -139,7 +139,7 @@ impl Reacting {
}
};
let reacted_to_event_any_timeline_event = match reacted_to_event.event.deserialize() {
let reacted_to_event_any_timeline_event = match reacted_to_event.raw().deserialize() {
Ok(value) => value,
Err(err) => {
tracing::error!(
@@ -154,7 +154,7 @@ impl Reacting {
let reacted_to_event_sender_id: OwnedUserId =
reacted_to_event_any_timeline_event.sender().to_owned();
let AnyTimelineEvent::MessageLike(reacted_to_event_message_like) =
let AnySyncTimelineEvent::MessageLike(reacted_to_event_message_like) =
reacted_to_event_any_timeline_event
else {
tracing::debug!(
@@ -164,7 +164,7 @@ impl Reacting {
return Ok(());
};
let AnyMessageLikeEvent::RoomMessage(reacted_to_event_room_message) =
let AnySyncMessageLikeEvent::RoomMessage(reacted_to_event_room_message) =
reacted_to_event_message_like
else {
tracing::debug!(
@@ -174,7 +174,7 @@ impl Reacting {
return Ok(());
};
let MessageLikeEvent::Original(reacted_to_event_room_message_original) =
let SyncMessageLikeEvent::Original(reacted_to_event_room_message_original) =
reacted_to_event_room_message
else {
tracing::debug!(?reacted_to_event_id, "Ignoring redacted reacted-to event",);

View File

@@ -575,7 +575,7 @@ async fn handle_stage_speech_to_text_actual_transcribing(
) -> anyhow::Result<OwnedEventId> {
let src = &audio_content.source;
let media_request = mxlink::matrix_sdk::media::MediaRequest {
let media_request = mxlink::matrix_sdk::media::MediaRequestParameters {
source: src.to_owned(),
format: mxlink::matrix_sdk::media::MediaFormat::File,
};

View File

@@ -34,6 +34,8 @@ pub async fn handle_image(
return Ok(());
};
let _typing_notice_guard = bot.start_typing_notice(message_context.room()).await;
let params = MatrixMessageProcessingParams::new(
bot.user_id().to_owned(),
Some(message_context.combined_admin_and_user_regexes()),

View File

@@ -22,7 +22,7 @@ impl RoomEventFetcher {
room: &Room,
) -> mxlink::matrix_sdk::Result<TimelineEvent> {
let Some(lru_cache) = &self.lru_cache else {
return room.event(event_id).await;
return room.event(event_id, None).await;
};
let guard = lru_cache.get_value_or_guard_async(event_id).await;
@@ -33,7 +33,7 @@ impl RoomEventFetcher {
return Ok(config);
}
Err(guard) => {
let event = room.event(event_id).await?;
let event = room.event(event_id, None).await?;
let _ = guard.insert(event.clone());

View File

@@ -12,7 +12,8 @@ use mxlink::matrix_sdk::{
sanitize::remove_plain_reply_fallback, MessageType, OriginalSyncRoomMessageEvent,
Relation, RoomMessageEventContent,
},
AnyMessageLikeEvent, AnyMessageLikeEventContent, AnyTimelineEvent, MessageLikeEvent,
AnyMessageLikeEventContent, AnySyncMessageLikeEvent, AnySyncTimelineEvent,
SyncMessageLikeEvent,
},
Room,
};
@@ -76,10 +77,10 @@ async fn get_matrix_messages_in_reply_chain_native(
event_fetcher: &Arc<RoomEventFetcher>,
room: &Room,
event_id: OwnedEventId,
) -> Result<Vec<AnyMessageLikeEvent>, mxlink::matrix_sdk::Error> {
) -> Result<Vec<AnySyncMessageLikeEvent>, mxlink::matrix_sdk::Error> {
let mut next_event_id = Some(event_id.clone());
let mut messages: Vec<AnyMessageLikeEvent> = Vec::new();
let mut messages: Vec<AnySyncMessageLikeEvent> = Vec::new();
let mut handled_event_ids: Vec<OwnedEventId> = Vec::new();
while let Some(next_event_id_in_loop) = next_event_id {
@@ -98,9 +99,9 @@ async fn get_matrix_messages_in_reply_chain_native(
handled_event_ids.push(next_event_id_in_loop.clone());
let event_deserialized = event.event.deserialize()?;
let event_deserialized = event.raw().deserialize()?;
let AnyTimelineEvent::MessageLike(message_like_event) = event_deserialized else {
let AnySyncTimelineEvent::MessageLike(message_like_event) = event_deserialized else {
tracing::warn!(
"Not proceeding past non-MessageLike event: {:?}",
event_deserialized
@@ -109,9 +110,9 @@ async fn get_matrix_messages_in_reply_chain_native(
};
next_event_id = match message_like_event.clone() {
AnyMessageLikeEvent::RoomEncrypted(_) => None,
AnyMessageLikeEvent::RoomMessage(room_message) => {
if let MessageLikeEvent::Original(room_message_original) = room_message {
AnySyncMessageLikeEvent::RoomEncrypted(_) => None,
AnySyncMessageLikeEvent::RoomMessage(room_message) => {
if let SyncMessageLikeEvent::Original(room_message_original) = room_message {
match room_message_original.content.relates_to {
Some(Relation::Reply { in_reply_to }) => Some(in_reply_to.event_id.clone()),
_ => None,
@@ -207,7 +208,7 @@ fn is_message_from_allowed_sender(
}
pub fn convert_matrix_native_event_to_matrix_message(
matrix_native_event: &AnyMessageLikeEvent,
matrix_native_event: &AnySyncMessageLikeEvent,
) -> Option<MatrixMessage> {
let Some(content) = matrix_native_event.original_content() else {
// Redacted message
@@ -471,7 +472,7 @@ fn timeline_event_to_detailed_message_payload(
bot_user_id: &OwnedUserId,
bot_display_name: &Option<String>,
) -> anyhow::Result<Option<DetailedMessagePayload>> {
let timeline_event_deserialized = match timeline_event.event.deserialize() {
let timeline_event_deserialized = match timeline_event.raw().deserialize() {
Ok(value) => value,
Err(err) => {
return Err(anyhow::format_err!(
@@ -482,7 +483,7 @@ fn timeline_event_to_detailed_message_payload(
}
};
let AnyTimelineEvent::MessageLike(thread_start_message_like_event) =
let AnySyncTimelineEvent::MessageLike(thread_start_message_like_event) =
timeline_event_deserialized
else {
tracing::trace!(
@@ -493,7 +494,7 @@ fn timeline_event_to_detailed_message_payload(
};
let (is_mentioning_bot, message_payload) = match thread_start_message_like_event {
AnyMessageLikeEvent::RoomEncrypted(room_message) => {
AnySyncMessageLikeEvent::RoomEncrypted(room_message) => {
tracing::warn!(
"Could not inspect event {} because it failed to decrypt: {:?}",
timeline_event_id.clone(),
@@ -508,8 +509,8 @@ fn timeline_event_to_detailed_message_payload(
MessagePayload::Encrypted(thread_info.clone()),
)
}
AnyMessageLikeEvent::RoomMessage(room_message) => {
if let MessageLikeEvent::Original(room_message_original) = room_message {
AnySyncMessageLikeEvent::RoomMessage(room_message) => {
if let SyncMessageLikeEvent::Original(room_message_original) = room_message {
let room_message_payload: Result<MessagePayload, String> =
room_message_original.content.msgtype.clone().try_into();