feat: TEXT_MESSAGE_HANDLES

This commit is contained in:
2021-05-17 02:42:24 +08:00
parent 50780dfd3c
commit ae5169e3bd

View File

@@ -118,6 +118,9 @@ lazy_static! {
handles.push(Box::new(HandleTextMessageExit)); handles.push(Box::new(HandleTextMessageExit));
handles.push(Box::new(HandleTextMessageStatics)); handles.push(Box::new(HandleTextMessageStatics));
handles.push(Box::new(HandleTextMessagePass)); handles.push(Box::new(HandleTextMessagePass));
handles.push(Box::new(HandleTextMessageRooms));
handles.push(Box::new(HandleTextMessageRoom));
handles.push(Box::new(HandleTextMessageVersion));
handles handles
}; };
} }
@@ -174,16 +177,17 @@ impl HandleTextMessage for HandleTextMessagePass {
} }
} }
fn handle_text_message(handle_context: &mut HandleContext, tx: &Tx, addr: SocketAddr, msg: String) { struct HandleTextMessageRooms;
// process all registered handles impl HandleTextMessage for HandleTextMessageRooms {
for handle in &*TEXT_MESSAGE_HANDLES { fn is_matches(&self, _handle_context: &mut HandleContext, _tx: &Tx, _addr: SocketAddr, msg: &str) -> bool {
if handle.is_matches(handle_context, tx, addr, &msg) { msg == "/rooms"
return handle.handle(handle_context, tx, addr, &msg);
}
} }
if handle_context.is_admin { fn handle(&self, handle_context: &mut HandleContext, tx: &Tx, _addr: SocketAddr, _msg: &str) {
if msg == "/rooms" { if !handle_context.is_admin {
RoomMessageDown::create_error_reply("Not admin").send(tx);
return;
}
let rooms = handle_context.room_map.lock().unwrap().keys().map( let rooms = handle_context.room_map.lock().unwrap().keys().map(
|k| k.clone() |k| k.clone()
).collect::<Vec<_>>().join("\n"); ).collect::<Vec<_>>().join("\n");
@@ -192,9 +196,20 @@ fn handle_text_message(handle_context: &mut HandleContext, tx: &Tx, addr: Socket
} else { } else {
tx.unbounded_send(Message::Text(format!("rooms:\n{}", rooms))).ok(); tx.unbounded_send(Message::Text(format!("rooms:\n{}", rooms))).ok();
} }
}
}
struct HandleTextMessageRoom;
impl HandleTextMessage for HandleTextMessageRoom {
fn is_matches(&self, _handle_context: &mut HandleContext, _tx: &Tx, _addr: SocketAddr, msg: &str) -> bool {
msg.starts_with("/room ")
}
fn handle(&self, handle_context: &mut HandleContext, tx: &Tx, _addr: SocketAddr, msg: &str) {
if !handle_context.is_admin {
RoomMessageDown::create_error_reply("Not admin").send(tx);
return; return;
} }
if msg.starts_with("/room ") {
let room_id = &msg[6..]; let room_id = &msg[6..];
let room_map = handle_context.room_map.lock().unwrap(); let room_map = handle_context.room_map.lock().unwrap();
let mut client_ids = vec![]; let mut client_ids = vec![];
@@ -206,15 +221,34 @@ fn handle_text_message(handle_context: &mut HandleContext, tx: &Tx, addr: Socket
} else { } else {
tx.unbounded_send(Message::Text(format!("room not found: {}", room_id))).ok(); tx.unbounded_send(Message::Text(format!("room not found: {}", room_id))).ok();
} }
}
}
struct HandleTextMessageVersion;
impl HandleTextMessage for HandleTextMessageVersion {
fn is_matches(&self, _handle_context: &mut HandleContext, _tx: &Tx, _addr: SocketAddr, msg: &str) -> bool {
msg == "/version"
}
fn handle(&self, handle_context: &mut HandleContext, tx: &Tx, _addr: SocketAddr, _msg: &str) {
if !handle_context.is_admin {
RoomMessageDown::create_error_reply("Not admin").send(tx);
return; return;
} }
if msg == "/version" { tx.unbounded_send(Message::Text(format!("{} - v{}", NAME, VERSION))).ok();
tx.unbounded_send(Message::Text( }
format!("{} - v{}", NAME, VERSION) }
)).ok();
return; fn handle_text_message(handle_context: &mut HandleContext, tx: &Tx, addr: SocketAddr, msg: String) {
// process all registered handles
if msg.starts_with('/') {
for handle in &*TEXT_MESSAGE_HANDLES {
if handle.is_matches(handle_context, tx, addr, &msg) {
return handle.handle(handle_context, tx, addr, &msg);
} }
} }
}
let room_message = match serde_json::from_str::<RoomMessage>(&msg) { let room_message = match serde_json::from_str::<RoomMessage>(&msg) {
Ok(room_message) => room_message, Ok(room_message) => room_message,
Err(e) => { Err(e) => {