2021-11-27 23:24:09 +02:00
|
|
|
use matrix_sdk::{
|
2023-11-16 19:26:22 +02:00
|
|
|
config::SyncSettings,
|
2021-11-27 23:24:09 +02:00
|
|
|
room::Room,
|
2023-11-16 19:26:22 +02:00
|
|
|
ruma::{
|
|
|
|
events::room::message::{
|
|
|
|
MessageType, OriginalSyncRoomMessageEvent, RoomMessageEventContent,
|
|
|
|
TextMessageEventContent,
|
|
|
|
},
|
|
|
|
UserId,
|
|
|
|
},
|
|
|
|
Client,
|
2021-11-27 23:24:09 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
fn open(param: String) {
|
|
|
|
use std::io::{self, Write};
|
2023-11-16 19:28:34 +02:00
|
|
|
use std::process::Command;
|
|
|
|
let mut cmd = Command::new("/usr/bin/labadoor-wrapper");
|
2021-11-27 23:24:09 +02:00
|
|
|
cmd.arg("matrix").arg(param);
|
|
|
|
let out = cmd.output().expect("Could not run command");
|
|
|
|
io::stdout().write_all(&out.stdout).unwrap();
|
|
|
|
}
|
|
|
|
|
2023-11-16 19:26:22 +02:00
|
|
|
async fn on_room_message(event: OriginalSyncRoomMessageEvent, room: Room) {
|
2021-11-27 23:24:09 +02:00
|
|
|
if let Room::Joined(room) = room {
|
|
|
|
let msg_body = match event.content.msgtype {
|
|
|
|
MessageType::Text(TextMessageEventContent { body, .. }) => body,
|
|
|
|
_ => return,
|
|
|
|
};
|
|
|
|
|
|
|
|
if msg_body == "1" {
|
|
|
|
open(event.sender.to_string());
|
2023-11-16 19:26:22 +02:00
|
|
|
let content = RoomMessageEventContent::text_plain("Open sesame!");
|
2021-11-27 23:24:09 +02:00
|
|
|
room.send(content, None).await.unwrap();
|
|
|
|
}
|
2023-11-15 20:52:19 +02:00
|
|
|
if msg_body == "ping" {
|
2023-11-16 19:26:22 +02:00
|
|
|
let content = RoomMessageEventContent::text_plain("Pong!");
|
2023-11-15 20:52:19 +02:00
|
|
|
room.send(content, None).await.unwrap();
|
|
|
|
}
|
2021-11-27 23:24:09 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2023-11-18 19:59:35 +02:00
|
|
|
async fn client_login(username: String, password: String, device_id: Option<String>) -> Client {
|
2023-11-16 19:26:22 +02:00
|
|
|
let user = <&UserId>::try_from(username.as_str()).unwrap();
|
|
|
|
let client = Client::builder()
|
|
|
|
.server_name(user.server_name())
|
2023-11-18 19:59:35 +02:00
|
|
|
.sled_store("./sled_store", None)
|
|
|
|
.unwrap()
|
2023-11-16 19:26:22 +02:00
|
|
|
.build()
|
|
|
|
.await
|
|
|
|
.unwrap();
|
2021-11-27 23:24:09 +02:00
|
|
|
|
2023-11-18 19:59:35 +02:00
|
|
|
let mut login_builder = client.login_username(user, &password);
|
|
|
|
let d_id = &device_id.as_ref();
|
|
|
|
if device_id.is_some() {
|
|
|
|
login_builder = login_builder.device_id(d_id.unwrap());
|
|
|
|
}
|
|
|
|
login_builder.send().await.unwrap();
|
|
|
|
if device_id.is_none() {
|
|
|
|
println!("Logged in with a new device id: \"{}\"; you can save it in your configuration so we can use it next time.", client.device_id().unwrap());
|
|
|
|
}
|
|
|
|
|
|
|
|
client
|
|
|
|
}
|
|
|
|
|
|
|
|
#[tokio::main]
|
|
|
|
pub async fn matrix(username: String, password: String, device_id: Option<String>) {
|
|
|
|
let client = client_login(username, password, device_id).await;
|
2021-11-27 23:24:09 +02:00
|
|
|
client.sync_once(SyncSettings::default()).await.unwrap();
|
2023-11-16 19:26:22 +02:00
|
|
|
client.add_event_handler(on_room_message);
|
2021-11-27 23:24:09 +02:00
|
|
|
let settings = SyncSettings::default().token(client.sync_token().await.unwrap());
|
2023-11-16 19:28:34 +02:00
|
|
|
client.sync(settings).await.unwrap();
|
2021-11-27 23:24:09 +02:00
|
|
|
}
|