|
@@ -1,8 +1,8 @@
|
|
|
use crate::protocol::connection::{AudioChannel, ControlChannel};
|
|
|
use crate::protocol::parser::{
|
|
|
AudioData, AudioPacket, Authenticate, ChannelState, CodecVersion, ControlMessage, CryptSetup,
|
|
|
- Ping, ServerConfig, ServerSync, SessionId, UdpTunnel, UserRemove, UserState, Version,
|
|
|
- MUMBLE_PROTOCOL_VERSION,
|
|
|
+ Ping, ServerConfig, ServerSync, SessionId, TextMessage, UdpTunnel, UserRemove, UserState,
|
|
|
+ Version, MUMBLE_PROTOCOL_VERSION,
|
|
|
};
|
|
|
use crate::server::client::client::{ClientEvent, ServerEvent};
|
|
|
use crate::storage::{Guest, SessionData, Storage};
|
|
@@ -157,6 +157,7 @@ impl<C: ControlChannel, A: AudioChannel> Handler<C, A> {
|
|
|
ServerEvent::StateChanged(state) => self.user_state_changed(state).await?,
|
|
|
ServerEvent::Talking(audio_data) => self.user_talking(audio_data).await?,
|
|
|
ServerEvent::Disconnected(session_id) => self.user_disconnected(session_id).await?,
|
|
|
+ ServerEvent::TextMessage(message) => self.user_text_message(message).await?,
|
|
|
}
|
|
|
|
|
|
Ok(())
|
|
@@ -165,6 +166,7 @@ impl<C: ControlChannel, A: AudioChannel> Handler<C, A> {
|
|
|
pub async fn handle_message(&self, packet: ControlMessage) -> Result<(), Error> {
|
|
|
match packet {
|
|
|
ControlMessage::Ping(ping) => self.control_ping(ping).await?,
|
|
|
+ ControlMessage::TextMessage(message) => self.text_message(message).await?,
|
|
|
ControlMessage::UserState(state) => self.user_state(state).await?,
|
|
|
ControlMessage::UdpTunnel(tunnel) => self.tunnel(tunnel).await?,
|
|
|
_ => error!("unimplemented!"),
|
|
@@ -214,6 +216,20 @@ impl<C: ControlChannel, A: AudioChannel> Handler<C, A> {
|
|
|
Ok(())
|
|
|
}
|
|
|
|
|
|
+ async fn text_message(&self, mut message: TextMessage) -> Result<(), Error> {
|
|
|
+ if self.config.max_message_length < message.message.len() as u32 {
|
|
|
+ // TODO send a permission denied message
|
|
|
+ return Ok(());
|
|
|
+ }
|
|
|
+ if message.sender.is_none() {
|
|
|
+ message.sender = Some(SessionId::from(self.session_id));
|
|
|
+ }
|
|
|
+ self.event_sender
|
|
|
+ .send(ClientEvent::TextMessage(message))
|
|
|
+ .await;
|
|
|
+ Ok(())
|
|
|
+ }
|
|
|
+
|
|
|
async fn user_state(&self, mut state: UserState) -> Result<(), Error> {
|
|
|
if state.session_id.is_none() {
|
|
|
state.session_id = Some(SessionId::from(self.session_id));
|
|
@@ -312,6 +328,11 @@ impl<C: ControlChannel, A: AudioChannel> Handler<C, A> {
|
|
|
Ok(self.control_channel.send(user_remove).await?)
|
|
|
}
|
|
|
|
|
|
+ async fn user_text_message(&self, message: TextMessage) -> Result<(), Error> {
|
|
|
+ self.control_channel.send(message).await?;
|
|
|
+ Ok(())
|
|
|
+ }
|
|
|
+
|
|
|
// Utils
|
|
|
async fn authenticate(&self, auth: Authenticate) -> Result<(), Error> {
|
|
|
let username = match auth.username {
|