@@ -134,7 +134,7 @@ async fn handle_chat_message(
134134 ptero_server_id,
135135 Some ( sender) ,
136136 false ,
137- message,
137+ message. to_owned ( ) ,
138138 )
139139 . await ?;
140140
@@ -165,7 +165,7 @@ async fn handle_log_message(
165165 ptero_server_id,
166166 Some ( & sanitized_username) ,
167167 true ,
168- & message,
168+ message,
169169 )
170170 . await ?;
171171 }
@@ -241,7 +241,7 @@ async fn broadcast_message(
241241 ptero_server_id : & str ,
242242 username : Option < & str > ,
243243 system_message : bool ,
244- message : & str ,
244+ message : String ,
245245) -> Result < ( ) , crate :: Error > {
246246 let config = config:: get ( ) ;
247247 let Some ( from_server) = config
@@ -255,14 +255,16 @@ async fn broadcast_message(
255255 let Some ( chat_bridge) = config. chat_bridge_by_ptero_server_name ( & from_server. name ) else {
256256 return Ok ( ( ) ) ;
257257 } ;
258+
259+ // send to other pterodactyl servers
258260 let mut pterodactyl_message = format ! ( "[{}] " , from_server. display_name) ;
259261 if system_message {
260262 pterodactyl_message += "[System] " ;
261263 }
262264 if let Some ( username) = username {
263265 pterodactyl_message += & format ! ( "[{username}] " ) ;
264266 }
265- pterodactyl_message += message;
267+ pterodactyl_message += & message;
266268 try_join_all (
267269 chat_bridge
268270 . ptero_servers
@@ -283,6 +285,8 @@ async fn broadcast_message(
283285 } ) ,
284286 )
285287 . await ?;
288+
289+ // send to discord
286290 let mut discord_sender = format ! ( "[{}]" , from_server. display_name) ;
287291 if system_message {
288292 discord_sender += " [System]" ;
@@ -298,14 +302,28 @@ async fn broadcast_message(
298302 discord_sender. truncate ( new_len) ;
299303 discord_sender += "..." ;
300304 }
305+ // escape special chars in discord message for system messages
306+ let discord_message = if system_message {
307+ message
308+ . chars ( )
309+ . fold ( String :: with_capacity ( message. len ( ) ) , |mut s, c| {
310+ if !c. is_alphanumeric ( ) {
311+ s. push ( '\\' ) ;
312+ }
313+ s. push ( c) ;
314+ s
315+ } )
316+ } else {
317+ message
318+ } ;
301319 try_join_all ( chat_bridge. discord_channels . iter ( ) . map ( |channel| {
302320 broadcast_to_discord (
303321 discord_handle,
304322 webhook_cache,
305323 & channel. webhook ,
306324 & discord_sender,
307325 username,
308- message ,
326+ & discord_message ,
309327 )
310328 } ) )
311329 . await ?;
@@ -446,7 +464,7 @@ impl<H: PteroWebSocketHandle> PteroWebSocketListener<H> for WebsocketListener<'_
446464 & ptero_server_id,
447465 None ,
448466 true ,
449- message,
467+ message. to_owned ( ) ,
450468 )
451469 . await
452470 {
0 commit comments