accord/
reverse.rs

1use crate::raccord::{DirectMessage, ServerMessage};
2use async_channel::Sender;
3use std::{error::Error, fmt::Debug};
4use tide::Server;
5use tide::{Request, Response, StatusCode};
6use tide_tracing::TraceMiddleware;
7use twilight_gateway::Event;
8use twilight_model::{channel::Message, gateway::payload::MessageCreate};
9
10pub async fn server(
11	bind: String,
12	ghosts: Sender<(u64, Event)>,
13) -> Result<(), Box<dyn Error + Send + Sync>> {
14	#[derive(Clone, Debug)]
15	struct State {
16		pub ghosts: Sender<(u64, Event)>,
17	}
18
19	let mut app = Server::with_state(State { ghosts });
20	app.with(TraceMiddleware::new());
21
22	app.at("/ghost/server/:server/channel/:channel/message")
23		.post(|mut req: Request<State>| async move {
24			// TODO: handle text/plain body
25			let message: ServerMessage = req.body_json().await?;
26			// TODO: log(warn) if :channel != message.channel etc
27			let message: Message = (&message).into();
28			let event = Event::MessageCreate(Box::new(MessageCreate(message)));
29			req.state().ghosts.send((0, event)).await?;
30			Ok(Response::new(StatusCode::NoContent))
31		});
32
33	app.at("/ghost/direct/channel/:channel/message")
34		.post(|mut req: Request<State>| async move {
35			// TODO: handle text/plain body
36			let message: DirectMessage = req.body_json().await?;
37			// TODO: log(warn) if :channel != message.channel
38			let message: Message = (&message).into();
39			let event = Event::MessageCreate(Box::new(MessageCreate(message)));
40			req.state().ghosts.send((0, event)).await?;
41			Ok(Response::new(StatusCode::NoContent))
42		});
43
44	app.listen(bind).await?;
45	Ok(())
46}