Skip to content

Commit

Permalink
Add the virtual user model
Browse files Browse the repository at this point in the history
  • Loading branch information
exul committed Nov 5, 2017
1 parent 3f40573 commit 0618602
Show file tree
Hide file tree
Showing 6 changed files with 23 additions and 28 deletions.
8 changes: 4 additions & 4 deletions src/matrix-rocketchat/handlers/iron/rocketchat.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ use iron::prelude::*;
use api::MatrixApi;
use api::rocketchat::Message;
use config::Config;
use handlers::rocketchat::{Forwarder, VirtualUserHandler};
use handlers::rocketchat::Forwarder;
use log::{self, IronLogger};
use middleware::RocketchatToken;
use models::{ConnectionPool, RocketchatServer};
use models::{ConnectionPool, RocketchatServer, VirtualUser};

/// Rocket.Chat is an endpoint of the application service API which is called by the Rocket.Chat
/// server to push new messages.
Expand Down Expand Up @@ -41,7 +41,7 @@ impl Handler for Rocketchat {
let server =
request.extensions.get::<RocketchatServer>().expect("Middleware ensures the presence of the Rocket.Chat server");

let virtual_user_handler = VirtualUserHandler {
let virtual_user = VirtualUser {
config: &self.config,
logger: &logger,
matrix_api: self.matrix_api.as_ref(),
Expand All @@ -52,7 +52,7 @@ impl Handler for Rocketchat {
connection: &connection,
matrix_api: self.matrix_api.as_ref(),
logger: &logger,
virtual_user_handler: &virtual_user_handler,
virtual_user: &virtual_user,
};

if let Err(err) = forwarder.send(server, message) {
Expand Down
18 changes: 7 additions & 11 deletions src/matrix-rocketchat/handlers/rocketchat/forwarder.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,8 @@ use api::{MatrixApi, RocketchatApi};
use api::rocketchat::Message;
use config::Config;
use errors::*;
use handlers::rocketchat::VirtualUserHandler;
use log;
use models::{Channel, RocketchatServer, Room, UserOnRocketchatServer};
use models::{Channel, RocketchatServer, Room, UserOnRocketchatServer, VirtualUser};

const RESEND_THRESHOLD_IN_SECONDS: i64 = 3;

Expand All @@ -25,7 +24,7 @@ pub struct Forwarder<'a> {
/// Matrix REST API
pub matrix_api: &'a MatrixApi,
/// Manages virtual users that the application service uses
pub virtual_user_handler: &'a VirtualUserHandler<'a>,
pub virtual_user: &'a VirtualUser<'a>,
}

impl<'a> Forwarder<'a> {
Expand All @@ -52,7 +51,7 @@ impl<'a> Forwarder<'a> {
};

let sender_id =
self.virtual_user_handler.find_or_register(server.id.clone(), message.user_id.clone(), message.user_name.clone())?;
self.virtual_user.find_or_register(server.id.clone(), message.user_id.clone(), message.user_name.clone())?;
let current_displayname = self.matrix_api.get_display_name(sender_id.clone())?.unwrap_or_default();
if message.user_name != current_displayname {
debug!(self.logger, "Display name changed from `{}` to `{}`, will update", current_displayname, message.user_name);
Expand Down Expand Up @@ -123,7 +122,7 @@ impl<'a> Forwarder<'a> {
receiver: &UserOnRocketchatServer,
message: &Message,
) -> Result<Option<Room>> {
let sender_id = self.virtual_user_handler.build_user_id(&message.user_id, &server.id)?;
let sender_id = self.virtual_user.build_user_id(&message.user_id, &server.id)?;

// If the user does not exist yet, there is no existing direct message room
if self.matrix_api.get_display_name(sender_id.clone())?.is_none() {
Expand Down Expand Up @@ -163,7 +162,7 @@ impl<'a> Forwarder<'a> {
let inviting_user_id = self.config.matrix_bot_user_id()?;
let user_id = message.user_id.clone();
let user_name = message.user_name.clone();
let sender_id = self.virtual_user_handler.find_or_register(server.id.clone(), user_id, user_name)?;
let sender_id = self.virtual_user.find_or_register(server.id.clone(), user_id, user_name)?;
let room = Room::new(self.config, self.logger, self.matrix_api, room_id);
room.join_user(sender_id, inviting_user_id)?;

Expand All @@ -188,11 +187,8 @@ impl<'a> Forwarder<'a> {
);

if rocketchat_api.direct_messages_list()?.iter().any(|dm| dm.id == message.channel_id) {
let sender_id = self.virtual_user_handler.find_or_register(
server.id.clone(),
message.user_id.clone(),
message.user_name.clone(),
)?;
let sender_id =
self.virtual_user.find_or_register(server.id.clone(), message.user_id.clone(), message.user_name.clone())?;

let room_display_name_suffix = t!(["defaults", "direct_message_room_display_name_suffix"]).l(DEFAULT_LANGUAGE);
let room_display_name = format!("{} {}", message.user_name, room_display_name_suffix);
Expand Down
3 changes: 0 additions & 3 deletions src/matrix-rocketchat/handlers/rocketchat/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,6 @@
pub mod forwarder;
/// Helper methods to login a user on the Rocket.Chat server
pub mod login;
/// Provides helper methods to manage virtual users.
pub mod virtual_user_handler;

pub use self::forwarder::Forwarder;
pub use self::login::{Credentials, Login};
pub use self::virtual_user_handler::VirtualUserHandler;
5 changes: 4 additions & 1 deletion src/matrix-rocketchat/models/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -14,10 +14,13 @@ mod room;
mod schema;
/// `UserOnRocketchatServer` entry
mod user_on_rocketchat_server;
/// A virtual user on the Matrix homeserver that represents a Rocket.Chat user.
mod virtual_user;

pub use self::connection_pool::ConnectionPool;
pub use self::channel::Channel;
pub use self::events::Events;
pub use self::rocketchat_server::{NewRocketchatServer, RocketchatServer};
pub use self::room::Room;
pub use self::user_on_rocketchat_server::{NewUserOnRocketchatServer, UserOnRocketchatServer};
pub use self::connection_pool::ConnectionPool;
pub use self::virtual_user::VirtualUser;
13 changes: 6 additions & 7 deletions src/matrix-rocketchat/models/room.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,20 @@ use slog::Logger;
use api::{MatrixApi, RocketchatApi};
use config::Config;
use errors::*;
use handlers::rocketchat::VirtualUserHandler;
use i18n::*;
use models::{RocketchatServer, UserOnRocketchatServer};
use models::{RocketchatServer, UserOnRocketchatServer, VirtualUser};

/// A room that is managed by the application service. This can be either a bridged room or an
/// admin room.
pub struct Room<'a> {
/// The rooms Matrix ID
pub id: RoomId,
/// The application service config
config: &'a Config,
/// Logger context
logger: &'a Logger,
/// API to call the Matrix homeserver
matrix_api: &'a MatrixApi,
/// The rooms Matrix ID
pub id: RoomId,
}

impl<'a> Room<'a> {
Expand Down Expand Up @@ -190,7 +189,7 @@ impl<'a> Room<'a> {
}
};

let (server_id, virtual_user_id) = VirtualUserHandler::rocketchat_server_and_user_id_from_matrix_id(virtual_user_id);
let (server_id, virtual_user_id) = VirtualUser::rocketchat_server_and_user_id_from_matrix_id(virtual_user_id);
let server = match RocketchatServer::find_by_id(conn, &server_id)? {
Some(server) => server,
None => {
Expand Down Expand Up @@ -262,7 +261,7 @@ impl<'a> Room<'a> {
) -> Result<()> {
debug!(self.logger, "Starting to add virtual users to room {}", self.id);

let virtual_user_handler = VirtualUserHandler {
let virtual_user = VirtualUser {
config: self.config,
logger: self.logger,
matrix_api: self.matrix_api,
Expand All @@ -274,7 +273,7 @@ impl<'a> Room<'a> {
for username in usernames.iter() {
let rocketchat_user = rocketchat_api.users_info(username)?;
let user_id =
virtual_user_handler.find_or_register(rocketchat_server_id.clone(), rocketchat_user.id, username.to_string())?;
virtual_user.find_or_register(rocketchat_server_id.clone(), rocketchat_user.id, username.to_string())?;
self.join_user(user_id, bot_user_id.clone())?;
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ use config::Config;
use errors::*;

/// Provides helper methods to manage virtual users.
pub struct VirtualUserHandler<'a> {
pub struct VirtualUser<'a> {
/// Application service configuration
pub config: &'a Config,
/// Logger context
Expand All @@ -17,7 +17,7 @@ pub struct VirtualUserHandler<'a> {
pub matrix_api: &'a MatrixApi,
}

impl<'a> VirtualUserHandler<'a> {
impl<'a> VirtualUser<'a> {
/// Register a virtual user on the Matrix server and assign it to a Rocket.Chat server.
pub fn find_or_register(
&self,
Expand Down

0 comments on commit 0618602

Please sign in to comment.