hello world over matrix #2
2845
Cargo.lock
generated
2845
Cargo.lock
generated
File diff suppressed because it is too large
Load Diff
@ -6,3 +6,9 @@ edition = "2021"
|
|||||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
|
clap = { version = "4.4.6", features = ["derive"] }
|
||||||
|
matrix-sdk = "0.6.2"
|
||||||
|
serde = { version = "1.0.189", features = ["derive"] }
|
||||||
|
serde_yaml = "0.9.25"
|
||||||
|
thiserror = "1.0.50"
|
||||||
|
tokio = { version = "1.33.0", features = ["full"] }
|
||||||
|
31
src/config.rs
Normal file
31
src/config.rs
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
use serde::Deserialize;
|
||||||
|
use std::fs::File;
|
||||||
|
use std::path::Path;
|
||||||
|
use thiserror::Error;
|
||||||
|
|
||||||
|
#[derive(Error, Debug)]
|
||||||
|
pub enum Error {
|
||||||
|
#[error("failed to read/write config file")]
|
||||||
|
Filesystem(#[from] std::io::Error),
|
||||||
|
|
||||||
|
#[error("failed to parse yaml")]
|
||||||
|
Parse(#[from] serde_yaml::Error),
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize)]
|
||||||
|
pub struct Matrix {
|
||||||
|
pub user_id: String,
|
||||||
|
pub password: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Deserialize)]
|
||||||
|
pub struct Config {
|
||||||
|
pub matrix: Matrix,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Config {
|
||||||
|
pub fn load(p: &Path) -> Result<Config, Error> {
|
||||||
|
let f = File::open(p)?;
|
||||||
|
Ok(serde_yaml::from_reader(f)?)
|
||||||
|
}
|
||||||
|
}
|
77
src/main.rs
77
src/main.rs
@ -1,3 +1,76 @@
|
|||||||
fn main() {
|
mod config;
|
||||||
println!("Hello, world!");
|
|
||||||
|
use clap::Parser;
|
||||||
|
use config::Config;
|
||||||
|
use matrix_sdk::ruma::api::client::room::{
|
||||||
|
create_room::v3::Request as CreateRoomRequest, Visibility,
|
||||||
|
};
|
||||||
|
use matrix_sdk::{
|
||||||
|
config::SyncSettings,
|
||||||
|
ruma::{events::room::message::SyncRoomMessageEvent, user_id},
|
||||||
|
Client,
|
||||||
|
};
|
||||||
|
use matrix_sdk::ruma::events::room::message::RoomMessageEventContent;
|
||||||
|
use matrix_sdk::ruma::events::room::message::MessageType;
|
||||||
|
use matrix_sdk::ruma::events::room::message::TextMessageEventContent;
|
||||||
|
use matrix_sdk::HttpError;
|
||||||
|
use std::path::PathBuf;
|
||||||
|
use thiserror::Error;
|
||||||
|
|
||||||
|
#[derive(Error, Debug)]
|
||||||
|
pub enum Error {
|
||||||
|
#[error("configuration error")]
|
||||||
|
Configuration(#[from] config::Error),
|
||||||
|
|
||||||
|
#[error("failed to setup client")]
|
||||||
|
Client(#[from] matrix_sdk::ClientBuildError),
|
||||||
|
|
||||||
|
#[error("matrix")]
|
||||||
|
Matrix(#[from] matrix_sdk::Error),
|
||||||
|
|
||||||
|
#[error("matrix (http)")]
|
||||||
|
Http(#[from] HttpError),
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Parser, Debug)]
|
||||||
|
#[command(author, version, about, long_about = None)]
|
||||||
|
struct Args {
|
||||||
|
// Configuration file path
|
||||||
|
#[arg(short, long)]
|
||||||
|
config: PathBuf,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[tokio::main]
|
||||||
|
async fn main() -> Result<(), Error> {
|
||||||
|
let args = Args::parse();
|
||||||
|
let cfg = Config::load(&args.config)?;
|
||||||
|
|
||||||
|
let jorah = user_id!("@jorah.cx:hillion.co.uk");
|
||||||
|
let jake = user_id!("@jake:hillion.co.uk");
|
||||||
|
|
||||||
|
let client = Client::builder()
|
||||||
|
.homeserver_url("https://matrix.hillion.co.uk")
|
||||||
|
.build()
|
||||||
|
.await?;
|
||||||
|
client
|
||||||
|
.login_username(jorah, &cfg.matrix.password)
|
||||||
|
.send()
|
||||||
|
.await?;
|
||||||
|
|
||||||
|
let mut room_req = CreateRoomRequest::new();
|
||||||
|
let invitees = vec![jake.clone().into()];
|
||||||
|
room_req.invite = invitees.as_slice();
|
||||||
|
room_req.is_direct = true;
|
||||||
|
room_req.name = Some("Testing 123");
|
||||||
|
room_req.topic = Some("Some serious testing going on here.");
|
||||||
|
room_req.visibility = Visibility::Private;
|
||||||
|
let room_id = client.create_room(room_req).await?.room_id;
|
||||||
|
|
||||||
|
let room = client.get_joined_room(&room_id).unwrap();
|
||||||
|
|
||||||
|
let msg = MessageType::Text(TextMessageEventContent::plain("Hello world!"));
|
||||||
|
let content = RoomMessageEventContent::new(msg);
|
||||||
|
room.send(content, None).await?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user