9cd217fc5d
While it's generally useful to watch what the sdk is sending out during development using mitmproxy, users of the sdk might wonder why the example doesn't connect. Remove the proxy usage until we add a cli parser which can enable proxy support with a command line switch.
126 lines
3.2 KiB
Rust
126 lines
3.2 KiB
Rust
use std::{
|
|
env,
|
|
fs::File,
|
|
io::{Seek, SeekFrom},
|
|
path::PathBuf,
|
|
process::exit,
|
|
sync::Arc,
|
|
};
|
|
use tokio::sync::Mutex;
|
|
|
|
use matrix_sdk::{
|
|
self, async_trait,
|
|
events::{
|
|
room::message::{MessageEventContent, TextMessageEventContent},
|
|
SyncMessageEvent,
|
|
},
|
|
Client, EventEmitter, RoomState, SyncSettings,
|
|
};
|
|
use url::Url;
|
|
|
|
struct ImageBot {
|
|
client: Client,
|
|
image: Arc<Mutex<File>>,
|
|
}
|
|
|
|
impl ImageBot {
|
|
pub fn new(client: Client, image: File) -> Self {
|
|
let image = Arc::new(Mutex::new(image));
|
|
Self { client, image }
|
|
}
|
|
}
|
|
|
|
#[async_trait]
|
|
impl EventEmitter for ImageBot {
|
|
async fn on_room_message(
|
|
&self,
|
|
room: RoomState,
|
|
event: &SyncMessageEvent<MessageEventContent>,
|
|
) {
|
|
if let RoomState::Joined(room) = room {
|
|
let msg_body = if let SyncMessageEvent {
|
|
content: MessageEventContent::Text(TextMessageEventContent { body: msg_body, .. }),
|
|
..
|
|
} = event
|
|
{
|
|
msg_body
|
|
} else {
|
|
return;
|
|
};
|
|
|
|
if msg_body.contains("!image") {
|
|
println!("sending image");
|
|
let mut image = self.image.lock().await;
|
|
|
|
self.client
|
|
.room_send_attachment(
|
|
room.room_id(),
|
|
"cat",
|
|
&mime::IMAGE_JPEG,
|
|
&mut *image,
|
|
None,
|
|
)
|
|
.await
|
|
.unwrap();
|
|
|
|
image.seek(SeekFrom::Start(0)).unwrap();
|
|
|
|
println!("message sent");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
async fn login_and_sync(
|
|
homeserver_url: String,
|
|
username: String,
|
|
password: String,
|
|
image: File,
|
|
) -> Result<(), matrix_sdk::Error> {
|
|
let homeserver_url = Url::parse(&homeserver_url).expect("Couldn't parse the homeserver URL");
|
|
let client = Client::new(homeserver_url).unwrap();
|
|
|
|
client
|
|
.login(&username, &password, None, Some("command bot"))
|
|
.await?;
|
|
|
|
client.sync_once(SyncSettings::default()).await.unwrap();
|
|
client
|
|
.add_event_emitter(Box::new(ImageBot::new(client.clone(), image)))
|
|
.await;
|
|
|
|
let settings = SyncSettings::default().token(client.sync_token().await.unwrap());
|
|
client.sync(settings).await;
|
|
|
|
Ok(())
|
|
}
|
|
|
|
#[tokio::main]
|
|
async fn main() -> Result<(), matrix_sdk::Error> {
|
|
tracing_subscriber::fmt::init();
|
|
let (homeserver_url, username, password, image_path) = match (
|
|
env::args().nth(1),
|
|
env::args().nth(2),
|
|
env::args().nth(3),
|
|
env::args().nth(4),
|
|
) {
|
|
(Some(a), Some(b), Some(c), Some(d)) => (a, b, c, d),
|
|
_ => {
|
|
eprintln!(
|
|
"Usage: {} <homeserver_url> <username> <password> <image>",
|
|
env::args().next().unwrap()
|
|
);
|
|
exit(1)
|
|
}
|
|
};
|
|
|
|
println!(
|
|
"helloooo {} {} {} {:#?}",
|
|
homeserver_url, username, password, image_path
|
|
);
|
|
let path = PathBuf::from(image_path);
|
|
let image = File::open(path).expect("Can't open image file.");
|
|
|
|
login_and_sync(homeserver_url, username, password, image).await?;
|
|
Ok(())
|
|
}
|