Skip to content

Commit

Permalink
Create the direct message room as the virtual user from Rocket.Chat
Browse files Browse the repository at this point in the history
  • Loading branch information
exul committed May 28, 2017
1 parent 3083b4d commit 8f61dfc
Show file tree
Hide file tree
Showing 5 changed files with 25 additions and 10 deletions.
2 changes: 1 addition & 1 deletion src/matrix-rocketchat/api/matrix/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ pub mod r0;
/// Matrix REST API
pub trait MatrixApi: Send + Sync + MatrixApiClone {
/// Create a room.
fn create_room(&self, room_name: Option<String>, room_alias_name: Option<String>) -> Result<RoomId>;
fn create_room(&self, room_name: Option<String>, room_alias_name: Option<String>, creator_id: &UserId) -> Result<RoomId>;
/// Forget a room.
fn forget_room(&self, matrix_room_id: RoomId) -> Result<()>;
/// Get the `user_id` of the user that created the room.
Expand Down
10 changes: 8 additions & 2 deletions src/matrix-rocketchat/api/matrix/r0.rs
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,11 @@ impl MatrixApi {
}

impl super::MatrixApi for MatrixApi {
fn create_room(&self, room_name: Option<String>, room_alias_name: Option<String>) -> Result<RoomId> {
fn create_room(&self,
room_name: Option<String>,
room_alias_name: Option<String>,
room_creator_id: &UserId)
-> Result<RoomId> {
let endpoint = self.base_url.clone() + &CreateRoomEndpoint::request_path(());
let body_params = create_room::BodyParams {
creation_content: None,
Expand All @@ -69,7 +73,9 @@ impl super::MatrixApi for MatrixApi {
};
let payload = serde_json::to_string(&body_params)
.chain_err(|| ErrorKind::InvalidJSON("Could not serialize create_room body params".to_string()))?;
let params = self.params_hash();
let user_id = room_creator_id.to_string();
let mut params = self.params_hash();
params.insert("user_id", &user_id);

let (body, status_code) = RestApi::call_matrix(CreateRoomEndpoint::method(), &endpoint, &payload, &params)?;
if !status_code.is_success() {
Expand Down
5 changes: 3 additions & 2 deletions src/matrix-rocketchat/handlers/events/command_handler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -231,6 +231,7 @@ impl<'a> CommandHandler<'a> {
}

fn bridge(&self, event: &MessageEvent, rocketchat_server: &RocketchatServer, message: &str) -> Result<()> {
let bot_matrix_user_id = self.config.matrix_bot_user_id()?;
let user_on_rocketchat_server =
UserOnRocketchatServer::find(self.connection, &event.user_id, rocketchat_server.id.clone())?;
let rocketchat_api = RocketchatApi::new(rocketchat_server.rocketchat_url.clone(), self.logger.clone())?
Expand Down Expand Up @@ -271,12 +272,12 @@ impl<'a> CommandHandler<'a> {
}
None => {
let room_handler = RoomHandler::new(self.config, self.connection, self.logger, self.matrix_api);
room_handler.bridge_new_room(rocketchat_api, rocketchat_server, channel, event.user_id.clone())?
room_handler
.bridge_new_room(rocketchat_api, rocketchat_server, channel, &bot_matrix_user_id, event.user_id.clone())?
}
};

let user = user_on_rocketchat_server.user(self.connection)?;
let bot_matrix_user_id = self.config.matrix_bot_user_id()?;
let message = t!(["admin_room", "room_successfully_bridged"])
.with_vars(vec![("channel_name", channel.name.clone().unwrap_or_else(|| channel.id.clone()))]);
self.matrix_api.send_text_message_event(event.room_id.clone(), bot_matrix_user_id, message.l(&user.language))?;
Expand Down
16 changes: 11 additions & 5 deletions src/matrix-rocketchat/handlers/events/room_handler.rs
Original file line number Diff line number Diff line change
Expand Up @@ -95,9 +95,10 @@ impl<'a> RoomHandler<'a> {
rocketchat_api: Box<RocketchatApi>,
rocketchat_server: &RocketchatServer,
channel: &Channel,
user_id: UserId)
room_creator_id: &UserId,
invited_user_id: UserId)
-> Result<Room> {
let room = self.create_room(channel, rocketchat_server.id.clone(), user_id)?;
let room = self.create_room(channel, rocketchat_server.id.clone(), room_creator_id, invited_user_id)?;
self.add_virtual_users_to_room(rocketchat_api, channel, rocketchat_server.id.clone(), room.matrix_room_id.clone())?;
Ok(room)
}
Expand Down Expand Up @@ -310,12 +311,17 @@ impl<'a> RoomHandler<'a> {
self.leave_and_forget_room(room)
}

fn create_room(&self, channel: &Channel, rocketchat_server_id: String, user_id: UserId) -> Result<Room> {
fn create_room(&self,
channel: &Channel,
rocketchat_server_id: String,
room_creator_id: &UserId,
invited_user_id: UserId)
-> Result<Room> {
let bot_matrix_user_id = self.config.matrix_bot_user_id()?;
let room_alias_name = format!("{}_{}_{}", self.config.sender_localpart, rocketchat_server_id, channel.id);
let matrix_room_id = self.matrix_api.create_room(channel.name.clone(), Some(room_alias_name))?;
let matrix_room_id = self.matrix_api.create_room(channel.name.clone(), Some(room_alias_name), room_creator_id)?;
self.matrix_api.set_default_powerlevels(matrix_room_id.clone(), bot_matrix_user_id.clone())?;
self.matrix_api.invite(matrix_room_id.clone(), user_id.clone())?;
self.matrix_api.invite(matrix_room_id.clone(), invited_user_id.clone())?;
let new_room = NewRoom {
matrix_room_id: matrix_room_id.clone(),
display_name: channel.name.clone().unwrap_or_else(|| channel.id.clone()),
Expand Down
2 changes: 2 additions & 0 deletions src/matrix-rocketchat/handlers/rocketchat/forwarder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -139,11 +139,13 @@ impl<'a> Forwarder<'a> {

if let Some(direct_message_channel) =
rocketchat_api.direct_messages_list()?.iter().find(|dm| dm.id == message.channel_id) {
let matrix_bot_user_id = self.config.matrix_bot_user_id()?;
let room_handler = RoomHandler::new(self.config, self.connection, self.logger, self.matrix_api);
let room = room_handler
.bridge_new_room(rocketchat_api,
rocketchat_server,
direct_message_channel,
&matrix_bot_user_id,
user_on_rocketchat_server.matrix_user_id.clone())?;

Ok(Some(room.matrix_room_id.clone()))
Expand Down

0 comments on commit 8f61dfc

Please sign in to comment.