feat(lua/matrix): add more fields and methods

This commit is contained in:
Ryan 2025-03-15 16:47:04 -04:00
parent 638dc75cb7
commit 0f2a5a0dc5
Signed by: ErrorNoInternet
GPG Key ID: 2486BFB7B1E6A4A3
2 changed files with 86 additions and 12 deletions

View File

@ -1,5 +1,8 @@
use super::room::Room; use super::room::Room;
use matrix_sdk::{Client as MatrixClient, ruma::UserId}; use matrix_sdk::{
Client as MatrixClient,
ruma::{RoomId, UserId},
};
use mlua::{Error, UserData, UserDataFields, UserDataMethods}; use mlua::{Error, UserData, UserDataFields, UserDataMethods};
use std::sync::Arc; use std::sync::Arc;
@ -7,6 +10,30 @@ pub struct Client(pub Arc<MatrixClient>);
impl UserData for Client { impl UserData for Client {
fn add_fields<F: UserDataFields<Self>>(f: &mut F) { fn add_fields<F: UserDataFields<Self>>(f: &mut F) {
f.add_field_method_get("invited_rooms", |_, this| {
Ok(this
.0
.invited_rooms()
.into_iter()
.map(Room)
.collect::<Vec<_>>())
});
f.add_field_method_get("joined_rooms", |_, this| {
Ok(this
.0
.joined_rooms()
.into_iter()
.map(Room)
.collect::<Vec<_>>())
});
f.add_field_method_get("left_rooms", |_, this| {
Ok(this
.0
.left_rooms()
.into_iter()
.map(Room)
.collect::<Vec<_>>())
});
f.add_field_method_get("rooms", |_, this| { f.add_field_method_get("rooms", |_, this| {
Ok(this.0.rooms().into_iter().map(Room).collect::<Vec<_>>()) Ok(this.0.rooms().into_iter().map(Room).collect::<Vec<_>>())
}); });
@ -23,5 +50,12 @@ impl UserData for Client {
.map_err(Error::external) .map_err(Error::external)
.map(Room) .map(Room)
}); });
m.add_async_method("join_room_by_id", async |_, this, room_id: String| {
this.0
.join_room_by_id(&RoomId::parse(room_id).map_err(Error::external)?)
.await
.map_err(Error::external)
.map(Room)
});
} }
} }

View File

@ -1,6 +1,8 @@
use super::member::Member; use super::member::Member;
use matrix_sdk::{ use matrix_sdk::{
RoomMemberships, room::Room as MatrixRoom, ruma::events::room::message::RoomMessageEventContent, RoomMemberships,
room::Room as MatrixRoom,
ruma::{EventId, UserId, events::room::message::RoomMessageEventContent},
}; };
use mlua::{Error, UserData, UserDataFields, UserDataMethods}; use mlua::{Error, UserData, UserDataFields, UserDataMethods};
@ -17,16 +19,18 @@ impl UserData for Room {
} }
fn add_methods<M: UserDataMethods<Self>>(m: &mut M) { fn add_methods<M: UserDataMethods<Self>>(m: &mut M) {
m.add_async_method("send", async |_, this, body: String| { m.add_async_method(
this.0 "ban_user",
.send(RoomMessageEventContent::text_plain(body)) async |_, this, (user_id, reason): (String, Option<String>)| {
.await this.0
.map_err(Error::external) .ban_user(
.map(|response| response.event_id.to_string()) &UserId::parse(user_id).map_err(Error::external)?,
}); reason.as_deref(),
m.add_async_method("leave", async |_, this, (): ()| { )
this.0.leave().await.map_err(Error::external) .await
}); .map_err(Error::external)
},
);
m.add_async_method("get_members", async |_, this, (): ()| { m.add_async_method("get_members", async |_, this, (): ()| {
this.0 this.0
.members(RoomMemberships::all()) .members(RoomMemberships::all())
@ -39,5 +43,41 @@ impl UserData for Room {
.collect::<Vec<_>>() .collect::<Vec<_>>()
}) })
}); });
m.add_async_method(
"kick_user",
async |_, this, (user_id, reason): (String, Option<String>)| {
this.0
.kick_user(
&UserId::parse(user_id).map_err(Error::external)?,
reason.as_deref(),
)
.await
.map_err(Error::external)
},
);
m.add_async_method("leave", async |_, this, (): ()| {
this.0.leave().await.map_err(Error::external)
});
m.add_async_method(
"redact",
async |_, this, (event_id, reason): (String, Option<String>)| {
this.0
.redact(
&EventId::parse(event_id).map_err(Error::external)?,
reason.as_deref(),
None,
)
.await
.map_err(Error::external)
.map(|response| response.event_id.to_string())
},
);
m.add_async_method("send", async |_, this, body: String| {
this.0
.send(RoomMessageEventContent::text_plain(body))
.await
.map_err(Error::external)
.map(|response| response.event_id.to_string())
});
} }
} }