use crate::{database::admin::AdminCommand, database::DatabaseGuard, ConduitResult, Error, Ruma}; use ruma::{ api::client::{error::ErrorKind, r0::room::report_content}, events::room::message, Int, }; #[cfg(feature = "conduit_bin")] use rocket::{http::RawStr, post}; /// # `POST /_matrix/client/r0/rooms/{roomId}/report/{eventId}` /// /// Reports an inappropriate event to homeserver admins /// #[cfg_attr( feature = "conduit_bin", post("/_matrix/client/r0/rooms/<_>/report/<_>", data = "") )] #[tracing::instrument(skip(db, body))] pub async fn report_event_route( db: DatabaseGuard, body: Ruma>, ) -> ConduitResult { let sender_user = body.sender_user.as_ref().expect("user is authenticated"); let pdu = match db.rooms.get_pdu(&body.event_id)? { Some(pdu) => pdu, _ => { return Err(Error::BadRequest( ErrorKind::InvalidParam, "Invalid Event ID", )) } }; if body.score > Int::from(0) || body.score < Int::from(-100) { return Err(Error::BadRequest( ErrorKind::InvalidParam, "Invalid score, must be within 0 to -100", )); }; if body.reason.chars().count() > 250 { return Err(Error::BadRequest( ErrorKind::InvalidParam, "Reason too long, should be 250 characters or fewer", )); }; db.admin.send(AdminCommand::SendMessage( message::RoomMessageEventContent::text_html( format!( "Report received from: {}\n\n\ Event ID: {}\n\ Room ID: {}\n\ Sent By: {}\n\n\ Report Score: {}\n\ Report Reason: {}", sender_user, pdu.event_id, pdu.room_id, pdu.sender, body.score, body.reason ), format!( "
Report received from: {0}\
  • Event Info
  • \ Report Info
    • Report Score: {4}
    • Report Reason: {5}
  • \
", sender_user, pdu.event_id, pdu.room_id, pdu.sender, body.score, RawStr::new(&body.reason).html_escape() ), ), )); db.flush()?; Ok(report_content::Response {}.into()) }