fix review issues

master
Devin R 2020-03-31 06:57:29 -04:00
parent 4391fb695e
commit 62159cc6dc
6 changed files with 27 additions and 60 deletions

View File

@ -541,7 +541,7 @@ impl AsyncClient {
} }
} }
// TODO do we need `IncomingEphemeral` events? // TODO `IncomingEphemeral` events for typing events
// After the room has been created and state/timeline events accounted for we use the room_id of the newly created // After the room has been created and state/timeline events accounted for we use the room_id of the newly created
// room to add any presence events that relate to a user in the current room. This is not super // room to add any presence events that relate to a user in the current room. This is not super

View File

@ -205,11 +205,16 @@ impl Client {
)))) ))))
} }
pub(crate) fn get_room(&mut self, room_id: &str) -> Option<&mut Arc<RwLock<Room>>> {
#[allow(clippy::or_fun_call)]
self.joined_rooms.get_mut(room_id)
}
/// Handle a m.ignored_user_list event, updating the room state if necessary. /// Handle a m.ignored_user_list event, updating the room state if necessary.
/// ///
/// Returns true if the room name changed, false otherwise. /// Returns true if the room name changed, false otherwise.
pub(crate) fn handle_ignored_users(&mut self, event: &IgnoredUserListEvent) -> bool { pub(crate) fn handle_ignored_users(&mut self, event: &IgnoredUserListEvent) -> bool {
// TODO use actual UserId instead of string? // FIXME when UserId becomes more like a &str wrapper in ruma-identifiers
if self.ignored_users if self.ignored_users
== event == event
.content .content
@ -306,7 +311,7 @@ impl Client {
room.receive_state_event(event) room.receive_state_event(event)
} }
/// Receive a presence event from an `IncomingResponse` and updates the client state. /// Receive a presence event from a sync response and updates the client state.
/// ///
/// Returns true if the membership list of the room changed, false /// Returns true if the membership list of the room changed, false
/// otherwise. /// otherwise.
@ -325,12 +330,16 @@ impl Client {
if self.current_room_id.comes_after(user_id, event) { if self.current_room_id.comes_after(user_id, event) {
self.current_room_id.update(room_id, event); self.current_room_id.update(room_id, event);
} }
// this should be guaranteed to find the room that was just created in the `Client::sync` loop. // this should be the room that was just created in the `Client::sync` loop.
let mut room = self.get_or_create_room(room_id).write().unwrap(); if let Some(room) = self.get_room(room_id) {
let mut room = room.write().unwrap();
room.receive_presence_event(event) room.receive_presence_event(event)
} else {
false
}
} }
/// Receive a presence event from an `IncomingResponse` and updates the client state. /// Receive a presence event from a sync response and updates the client state.
/// ///
/// This will only update the user if found in the current room looped through by `AsyncClient::sync`. /// This will only update the user if found in the current room looped through by `AsyncClient::sync`.
/// Returns true if the specific users presence has changed, false otherwise. /// Returns true if the specific users presence has changed, false otherwise.

View File

@ -1,45 +0,0 @@
// Copyright 2020 Damir Jelić
// Copyright 2020 The Matrix.org Foundation C.I.C.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
use crate::events::collections::all::RoomEvent;
use crate::models::Room;
// JUST AN IDEA
//
/// This is just a thought I had. Making users impl a trait instead of writing callbacks for events
/// could give the chance for really good documentation for each event?
/// It would look something like this
///
/// ```rust,ignore
/// use matrix-sdk::{AsyncClient, EventEmitter};
///
/// struct MyAppClient;
///
/// impl EventEmitter for MyAppClient {
/// fn on_room_member(&mut self, room: &Room, event: &RoomEvent) { ... }
/// }
/// async fn main() {
/// let cl = AsyncClient::with_emitter(MyAppClient);
/// }
/// ```
///
/// And in `AsyncClient::sync` there could be a switch case that calls the corresponding method on
/// the `Box<dyn EventEmitter>
pub trait EventEmitter {
fn on_room_name(&mut self, _: &Room, _: &RoomEvent) {}
/// Any event that alters the state of the room's members
fn on_room_member(&mut self, _: &Room, _: &RoomEvent) {}
}

View File

@ -35,7 +35,6 @@ pub use ruma_identifiers as identifiers;
mod async_client; mod async_client;
mod base_client; mod base_client;
mod error; mod error;
mod event_emitter;
mod models; mod models;
mod session; mod session;

View File

@ -69,6 +69,7 @@ pub struct Room {
pub members: HashMap<UserId, RoomMember>, pub members: HashMap<UserId, RoomMember>,
/// A list of users that are currently typing. /// A list of users that are currently typing.
pub typing_users: Vec<UserId>, pub typing_users: Vec<UserId>,
// TODO when encryption events are handled we store algorithm used and rotation time.
/// A flag indicating if the room is encrypted. /// A flag indicating if the room is encrypted.
pub encrypted: bool, pub encrypted: bool,
/// Number of unread notifications with highlight flag set. /// Number of unread notifications with highlight flag set.
@ -94,7 +95,7 @@ impl RoomName {
} }
pub fn calculate_name(&self, room_id: &str, members: &HashMap<UserId, RoomMember>) -> String { pub fn calculate_name(&self, room_id: &str, members: &HashMap<UserId, RoomMember>) -> String {
// https://github.com/matrix-org/matrix-js-sdk/blob/33941eb37bffe41958ba9887fc8070dfb1a0ee76/src/models/room.js#L1823 // https://matrix.org/docs/spec/client_server/latest#calculating-the-display-name-for-a-room.
// the order in which we check for a name ^^ // the order in which we check for a name ^^
if let Some(name) = &self.name { if let Some(name) = &self.name {
name.clone() name.clone()
@ -103,7 +104,6 @@ impl RoomName {
} else if !self.aliases.is_empty() { } else if !self.aliases.is_empty() {
self.aliases[0].alias().to_string() self.aliases[0].alias().to_string()
} else { } else {
// TODO
let mut names = members let mut names = members
.values() .values()
.flat_map(|m| m.user.display_name.clone()) .flat_map(|m| m.user.display_name.clone())
@ -111,7 +111,7 @@ impl RoomName {
.collect::<Vec<_>>(); .collect::<Vec<_>>();
if names.is_empty() { if names.is_empty() {
// TODO implement the rest of matrix-js-sdk handling of room names // TODO implement the rest of display name for room spec
format!("Room {}", room_id) format!("Room {}", room_id)
} else { } else {
// stabilize order // stabilize order
@ -180,7 +180,7 @@ impl Room {
match event.membership_change() { match event.membership_change() {
MembershipChange::Invited | MembershipChange::Joined => self.add_member(event), MembershipChange::Invited | MembershipChange::Joined => self.add_member(event),
_ => { _ => {
if let Some(member) = self.members.get_mut(&event.sender.to_string()) { if let Some(member) = self.members.get_mut(&event.state_key) {
member.update_member(event) member.update_member(event)
} else { } else {
false false

View File

@ -13,6 +13,8 @@
// See the License for the specific language governing permissions and // See the License for the specific language governing permissions and
// limitations under the License. // limitations under the License.
use std::convert::TryFrom;
use super::User; use super::User;
use crate::api::r0 as api; use crate::api::r0 as api;
use crate::events::collections::all::{Event, RoomEvent, StateEvent}; use crate::events::collections::all::{Event, RoomEvent, StateEvent};
@ -36,8 +38,11 @@ use crate::crypto::{OlmMachine, OneTimeKeys};
#[cfg(feature = "encryption")] #[cfg(feature = "encryption")]
use ruma_client_api::r0::keys::{upload_keys::Response as KeysUploadResponse, DeviceKeys}; use ruma_client_api::r0::keys::{upload_keys::Response as KeysUploadResponse, DeviceKeys};
// Notes: if Alice invites Bob into a room we will get an event with the sender as Alice and the state key as Bob.
#[derive(Debug)] #[derive(Debug)]
/// A Matrix room member. /// A Matrix room member.
///
pub struct RoomMember { pub struct RoomMember {
/// The unique mxid of the user. /// The unique mxid of the user.
pub user_id: UserId, pub user_id: UserId,
@ -64,13 +69,12 @@ impl RoomMember {
let user = User::new(event); let user = User::new(event);
Self { Self {
room_id: event.room_id.as_ref().map(|id| id.to_string()), room_id: event.room_id.as_ref().map(|id| id.to_string()),
user_id: event.sender.clone(), user_id: UserId::try_from(event.state_key.as_str()).unwrap(),
typing: None, typing: None,
user, user,
power_level: None, power_level: None,
power_level_norm: None, power_level_norm: None,
membership: event.content.membership, membership: event.content.membership,
// TODO should this be `sender` ??
name: event.state_key.clone(), name: event.state_key.clone(),
events: vec![Event::RoomMember(event.clone())], events: vec![Event::RoomMember(event.clone())],
} }
@ -92,7 +96,7 @@ impl RoomMember {
} }
NotImplemented => false, NotImplemented => false,
None => false, None => false,
// TODO should this be handled somehow ?? // we ignore the error here as only a buggy or malicious server would send this
Error => false, Error => false,
_ => false, _ => false,
} }