fix clippy errs
This commit is contained in:
@@ -115,7 +115,11 @@ pub async fn get_supporter_messages(
|
||||
"Session not found. Chat history may have been cleared.",
|
||||
));
|
||||
};
|
||||
let html: String = session.messages.iter().map(render_supporter_message).collect();
|
||||
let html: String = session
|
||||
.messages
|
||||
.iter()
|
||||
.map(render_supporter_message)
|
||||
.collect();
|
||||
Html(html)
|
||||
}
|
||||
|
||||
@@ -171,7 +175,10 @@ pub async fn supporter_send_message(
|
||||
State(state): State<Arc<AppState>>,
|
||||
Form(form): Form<SendMessageForm>,
|
||||
) -> Html<String> {
|
||||
if state.is_rate_limited(limit_key("supporter-message", addr), MESSAGE_LIMIT_PER_WINDOW) {
|
||||
if state.is_rate_limited(
|
||||
limit_key("supporter-message", addr),
|
||||
MESSAGE_LIMIT_PER_WINDOW,
|
||||
) {
|
||||
return Html(render_system_notice(
|
||||
"Too many messages from this network. Please wait until the 3-minute window resets.",
|
||||
));
|
||||
|
||||
+1
-1
@@ -1,3 +1,3 @@
|
||||
pub mod pages;
|
||||
pub mod chat;
|
||||
pub mod pages;
|
||||
pub mod ws;
|
||||
|
||||
+8
-11
@@ -1,7 +1,7 @@
|
||||
use axum::{
|
||||
extract::{
|
||||
ws::{Message, WebSocket, WebSocketUpgrade},
|
||||
Path, State,
|
||||
ws::{Message, WebSocket, WebSocketUpgrade},
|
||||
},
|
||||
response::IntoResponse,
|
||||
};
|
||||
@@ -14,7 +14,6 @@ const USER_TYPING_STOP_PREFIX: &str = "typing:user:stop:";
|
||||
const SUPPORTER_TYPING_START_PREFIX: &str = "typing:supporter:start:";
|
||||
const SUPPORTER_TYPING_STOP_PREFIX: &str = "typing:supporter:stop:";
|
||||
|
||||
/// WebSocket for user — pushes notifications when supporter replies
|
||||
pub async fn user_ws(
|
||||
ws: WebSocketUpgrade,
|
||||
Path(session_id): Path<String>,
|
||||
@@ -36,15 +35,13 @@ async fn handle_user_socket(mut socket: WebSocket, session_id: String, state: Ar
|
||||
|
||||
loop {
|
||||
tokio::select! {
|
||||
// Forward broadcast events to the user browser.
|
||||
Ok(event) = rx.recv() => {
|
||||
if event == session_id || event == RESET_EVENT || is_typing_event_for_session(&event, &session_id) {
|
||||
if socket.send(Message::Text(event)).await.is_err() {
|
||||
if (event == session_id || event == RESET_EVENT || is_typing_event_for_session(&event, &session_id))
|
||||
&& socket.send(Message::Text(event)).await.is_err()
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
// Handle ping/close and typing events from client.
|
||||
msg = socket.recv() => {
|
||||
match msg {
|
||||
Some(Ok(Message::Text(text))) => {
|
||||
@@ -63,7 +60,6 @@ async fn handle_user_socket(mut socket: WebSocket, session_id: String, state: Ar
|
||||
}
|
||||
}
|
||||
|
||||
/// WebSocket for supporter dashboard — pushes notifications when any session updates
|
||||
pub async fn supporter_ws(
|
||||
ws: WebSocketUpgrade,
|
||||
Path(_supporter_id): Path<String>,
|
||||
@@ -90,13 +86,14 @@ async fn handle_supporter_socket(mut socket: WebSocket, state: Arc<AppState>) {
|
||||
msg = socket.recv() => {
|
||||
match msg {
|
||||
Some(Ok(Message::Text(text))) => {
|
||||
if let Some(session_id) = supporter_typing_session_id(&text) {
|
||||
if !session_id.is_empty() && state.sessions.contains_key(session_id) {
|
||||
if let Some(session_id) = supporter_typing_session_id(&text)
|
||||
&& !session_id.is_empty()
|
||||
&& state.sessions.contains_key(session_id)
|
||||
{
|
||||
let tx = state.get_or_create_notifier(session_id);
|
||||
let _ = tx.send(text);
|
||||
}
|
||||
}
|
||||
}
|
||||
Some(Ok(Message::Close(_))) | None => break,
|
||||
_ => {}
|
||||
}
|
||||
|
||||
+11
-3
@@ -28,7 +28,9 @@ async fn main() {
|
||||
loop {
|
||||
tokio::time::sleep(CHAT_RESET_INTERVAL).await;
|
||||
reset_state.clear_everything();
|
||||
tracing::info!("Cleared all in-memory chat sessions, messages, notifiers, and rate limits");
|
||||
tracing::info!(
|
||||
"Cleared all in-memory chat sessions, messages, notifiers, and rate limits"
|
||||
);
|
||||
}
|
||||
});
|
||||
|
||||
@@ -38,9 +40,15 @@ async fn main() {
|
||||
.route("/supporter", get(handlers::pages::supporter_page))
|
||||
.route("/reset-countdown", get(handlers::pages::reset_countdown))
|
||||
.route("/ws/user/:session_id", get(handlers::ws::user_ws))
|
||||
.route("/ws/supporter/:supporter_id", get(handlers::ws::supporter_ws))
|
||||
.route(
|
||||
"/ws/supporter/:supporter_id",
|
||||
get(handlers::ws::supporter_ws),
|
||||
)
|
||||
.route("/messages/:session_id", get(handlers::chat::get_messages))
|
||||
.route("/supporter/messages/:session_id", get(handlers::chat::get_supporter_messages))
|
||||
.route(
|
||||
"/supporter/messages/:session_id",
|
||||
get(handlers::chat::get_supporter_messages),
|
||||
)
|
||||
.route("/send/:session_id", post(handlers::chat::send_message))
|
||||
.route(
|
||||
"/supporter/send/:session_id",
|
||||
|
||||
+4
-1
@@ -1,6 +1,9 @@
|
||||
use crate::models::ChatSession;
|
||||
use dashmap::DashMap;
|
||||
use std::{sync::Mutex, time::{Duration, Instant}};
|
||||
use std::{
|
||||
sync::Mutex,
|
||||
time::{Duration, Instant},
|
||||
};
|
||||
use tokio::sync::broadcast;
|
||||
|
||||
pub const RESET_EVENT: &str = "__reset__";
|
||||
|
||||
Reference in New Issue
Block a user