Skip to content

Commit 9a2d669

Browse files
committed
refactor(http): remove room page endpoint and extract room views logic
- Remove the `/rooms/:roomId` GET endpoint and its associated HTML generation - Extract room iteration logic into `RoomState::into_views()` method - Simplify SSE initialization by using the new method - Clean up unused imports in http module
1 parent 0e08fc5 commit 9a2d669

File tree

2 files changed

+18
-91
lines changed

2 files changed

+18
-91
lines changed

src/http.rs

Lines changed: 3 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,11 @@
11
use crate::models::{RemoveRemoveEvent, RoomUpdateEvent, RoomView};
2-
use crate::packet::RoomId;
32
use crate::state::{AppState, RoomUpdate};
43
use axum::{
5-
extract::{Path, State},
4+
extract::State,
65
http::header,
76
response::{
87
sse::{Event, KeepAlive, Sse},
9-
Html, IntoResponse,
8+
IntoResponse,
109
},
1110
routing::{get, post},
1211
Router,
@@ -23,7 +22,6 @@ pub async fn run(state: Arc<AppState>, port: u16) -> anyhow::Result<()> {
2322
let app = Router::new()
2423
.route("/ping", get(ping))
2524
.route("/rooms", get(rooms_sse))
26-
.route("/:roomId", get(room_page))
2725
.route("/:roomId", post(room_port))
2826
.with_state(state);
2927

@@ -41,15 +39,7 @@ async fn rooms_sse(State(state): State<Arc<AppState>>) -> impl IntoResponse {
4139
let rx = state.room_state.broadcast_sender.subscribe();
4240
let stream = BroadcastStream::new(rx);
4341

44-
let initial_rooms: Vec<RoomUpdateEvent> = state
45-
.room_state
46-
.rooms
47-
.iter()
48-
.map(|entry| RoomUpdateEvent {
49-
room_id: entry.key().0.clone(),
50-
data: RoomView::from(entry.value()),
51-
})
52-
.collect();
42+
let initial_rooms: Vec<RoomUpdateEvent> = state.room_state.into_views();
5343

5444
let init_stream = once(async move {
5545
Event::default()
@@ -91,76 +81,6 @@ async fn rooms_sse(State(state): State<Arc<AppState>>) -> impl IntoResponse {
9181
)
9282
}
9383

94-
async fn room_page(
95-
Path(room_id): Path<String>,
96-
State(state): State<Arc<AppState>>,
97-
) -> impl IntoResponse {
98-
let stats = state
99-
.room_state
100-
.rooms
101-
.get(&RoomId(room_id))
102-
.map(|r| r.stats.clone());
103-
104-
if let Some(stats) = stats {
105-
let html = format!(
106-
r#"<!DOCTYPE html>
107-
<html lang="en">
108-
<head>
109-
<meta charset="UTF-8">
110-
<meta name="viewport" content="width=device-width, initial-scale=1.0">
111-
<title>Room: {}</title>
112-
<meta property="og:title" content="Room: {}" />
113-
<meta property="og:description" content="Map: {}, Gamemode: {}, Players: {}, Version: {}" />
114-
<meta property="og:type" content="website" />
115-
<meta property="og:site_name" content="Mindustry PlayerConnect" />
116-
117-
<!-- Additional OpenGraph Tags for Stats -->
118-
<meta property="og:map_name" content="{}" />
119-
<meta property="og:gamemode" content="{}" />
120-
<meta property="og:player_count" content="{}" />
121-
<meta property="og:locale" content="{}" />
122-
<meta property="og:version" content="{}" />
123-
<meta property="og:created_at" content="{}" />
124-
125-
</head>
126-
<body>
127-
<h1>Room: {}</h1>
128-
<ul>
129-
<li><strong>Map:</strong> {}</li>
130-
<li><strong>Gamemode:</strong> {}</li>
131-
<li><strong>Players:</strong> {}</li>
132-
<li><strong>Locale:</strong> {}</li>
133-
<li><strong>Version:</strong> {}</li>
134-
<li><strong>Created At:</strong> {}</li>
135-
</ul>
136-
</body>
137-
</html>"#,
138-
stats.name,
139-
stats.name,
140-
stats.map_name,
141-
stats.gamemode,
142-
stats.players.len(),
143-
stats.version,
144-
stats.map_name,
145-
stats.gamemode,
146-
stats.players.len(),
147-
stats.locale,
148-
stats.version,
149-
stats.created_at,
150-
stats.name,
151-
stats.map_name,
152-
stats.gamemode,
153-
stats.players.len(),
154-
stats.locale,
155-
stats.version,
156-
stats.created_at
157-
);
158-
Html(html)
159-
} else {
160-
Html("<h1>Room not found</h1>".to_string())
161-
}
162-
}
163-
16484
async fn room_port(State(state): State<Arc<AppState>>) -> impl IntoResponse {
16585
state.config.player_connect_port.to_string()
16686
}

src/state.rs

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::config::Config;
22
use crate::constant::{ConnectionCloseReason, RoomCloseReason};
33
use crate::error::AppError;
4-
use crate::models::{RoomView, Stats};
4+
use crate::models::{RoomUpdateEvent, RoomView, Stats};
55
use crate::packet::{
66
AnyPacket, AppPacket, ConnectionClosedPacket, ConnectionId, ConnectionIdlingPacket,
77
ConnectionJoinPacket, RoomClosedPacket, RoomId, StatsPacket,
@@ -81,6 +81,16 @@ impl RoomState {
8181
.cloned()
8282
}
8383

84+
pub fn into_views(&self) -> Vec<RoomUpdateEvent> {
85+
self.rooms
86+
.iter()
87+
.map(|entry| RoomUpdateEvent {
88+
room_id: entry.key().0.clone(),
89+
data: RoomView::from(entry.value()),
90+
})
91+
.collect()
92+
}
93+
8494
pub fn join(
8595
&self,
8696
connection_id: ConnectionId,
@@ -134,13 +144,10 @@ impl RoomState {
134144
r.updated_at = current_time_millis();
135145
r.ping = current_time_millis() - sent_at;
136146

137-
if let Err(err) = self
138-
.broadcast_sender
139-
.send(RoomUpdate::Update {
140-
id: r.id.clone(),
141-
data: r.clone(),
142-
})
143-
{
147+
if let Err(err) = self.broadcast_sender.send(RoomUpdate::Update {
148+
id: r.id.clone(),
149+
data: r.clone(),
150+
}) {
144151
warn!("Fail to broadcast room update {}", err);
145152
}
146153
} else {

0 commit comments

Comments
 (0)