feat(rooms): private room membership, operators and refusals
Private rooms were unreachable: the client could ask to join one but had no way to invite, promote, resign or be told what happened, and a room name already owned by someone else came back as silence rather than a refusal (code 1003). Adds the rosters the server pushes after login (133/148), the changes it narrates to them (134/135, 143/144), our own standing (139/140, 145/146), and the messages that drive them, with the rosters kept current in client state. The daemon protocol and the TUI room transcript carry the new events rather than dropping them.
This commit is contained in:
@@ -26,6 +26,10 @@ use crate::message::server::UserJoinedRoomHandler;
|
||||
use crate::message::server::UserLeftRoomHandler;
|
||||
use crate::message::server::WatchUserHandler;
|
||||
use crate::message::server::WishListIntervalHandler;
|
||||
use crate::message::server::{
|
||||
CantCreateRoomHandler, OwnRoomStandingHandler, RoomMembersHandler,
|
||||
RoomOperatorsHandler, RoomRosterChangeHandler,
|
||||
};
|
||||
use crate::message::server::{
|
||||
GetUserStatsHandler, GetUserStatusHandler, RoomListHandler,
|
||||
};
|
||||
@@ -229,6 +233,36 @@ pub enum ServerMessage {
|
||||
},
|
||||
/// Phrases the server refuses to search for (code 160).
|
||||
ExcludedSearchPhrases(Vec<String>),
|
||||
/// Who may enter a private room (code 133).
|
||||
PrivateRoomMembers {
|
||||
room: String,
|
||||
users: Vec<String>,
|
||||
},
|
||||
/// Who runs a private room (code 148).
|
||||
PrivateRoomOperators {
|
||||
room: String,
|
||||
users: Vec<String>,
|
||||
},
|
||||
/// One user joined or left a private room's member or operator roster
|
||||
/// (codes 134/135 and 143/144).
|
||||
PrivateRoomRosterChanged {
|
||||
room: String,
|
||||
username: String,
|
||||
/// True for the member roster, false for the operator roster.
|
||||
members: bool,
|
||||
added: bool,
|
||||
},
|
||||
/// Our own membership (139/140) or operatorship (145/146) of a private
|
||||
/// room was granted or revoked.
|
||||
OwnRoomStandingChanged {
|
||||
room: String,
|
||||
members: bool,
|
||||
granted: bool,
|
||||
},
|
||||
/// The room we asked to join could not be created (code 1003).
|
||||
CantCreateRoom {
|
||||
room: String,
|
||||
},
|
||||
}
|
||||
|
||||
pub struct ServerActor {
|
||||
@@ -386,6 +420,19 @@ impl ServerActor {
|
||||
handlers.register_handler(GetPeerAddressHandler);
|
||||
handlers.register_handler(ConnectToPeerHandler);
|
||||
handlers.register_handler(CantConnectToPeerHandler);
|
||||
handlers.register_handler(RoomMembersHandler);
|
||||
handlers.register_handler(RoomOperatorsHandler);
|
||||
handlers.register_handler(RoomRosterChangeHandler::member_added());
|
||||
handlers.register_handler(RoomRosterChangeHandler::member_removed());
|
||||
handlers.register_handler(RoomRosterChangeHandler::operator_added());
|
||||
handlers.register_handler(RoomRosterChangeHandler::operator_removed());
|
||||
handlers.register_handler(OwnRoomStandingHandler::membership_granted());
|
||||
handlers.register_handler(OwnRoomStandingHandler::membership_revoked());
|
||||
handlers
|
||||
.register_handler(OwnRoomStandingHandler::operatorship_granted());
|
||||
handlers
|
||||
.register_handler(OwnRoomStandingHandler::operatorship_revoked());
|
||||
handlers.register_handler(CantCreateRoomHandler);
|
||||
handlers.register_handler(RoomTickersHandler);
|
||||
handlers.register_handler(RoomTickerAddedHandler);
|
||||
handlers.register_handler(RoomTickerRemovedHandler);
|
||||
@@ -694,6 +741,45 @@ impl ServerActor {
|
||||
token,
|
||||
});
|
||||
}
|
||||
ServerMessage::PrivateRoomMembers { room, users } => {
|
||||
self.forward_room_event(RoomEvent::PrivateMembers {
|
||||
room,
|
||||
users,
|
||||
});
|
||||
}
|
||||
ServerMessage::PrivateRoomOperators { room, users } => {
|
||||
self.forward_room_event(RoomEvent::PrivateOperators {
|
||||
room,
|
||||
users,
|
||||
});
|
||||
}
|
||||
ServerMessage::PrivateRoomRosterChanged {
|
||||
room,
|
||||
username,
|
||||
members,
|
||||
added,
|
||||
} => {
|
||||
self.forward_room_event(RoomEvent::PrivateRosterChanged {
|
||||
room,
|
||||
username,
|
||||
members,
|
||||
added,
|
||||
});
|
||||
}
|
||||
ServerMessage::OwnRoomStandingChanged {
|
||||
room,
|
||||
members,
|
||||
granted,
|
||||
} => {
|
||||
self.forward_room_event(RoomEvent::OwnStandingChanged {
|
||||
room,
|
||||
members,
|
||||
granted,
|
||||
});
|
||||
}
|
||||
ServerMessage::CantCreateRoom { room } => {
|
||||
self.forward_room_event(RoomEvent::CantCreate { room });
|
||||
}
|
||||
ServerMessage::ExcludedSearchPhrases(phrases) => {
|
||||
self.forward_to_client(ClientOperation::ExcludedSearchPhrases(
|
||||
phrases,
|
||||
|
||||
Reference in New Issue
Block a user