Skip to content

Commit d1cbe00

Browse files
committed
Merge remote-tracking branch 'burningtnt/master' into feature/android
2 parents e3dbab5 + ab0db9d commit d1cbe00

File tree

13 files changed

+519
-387
lines changed

13 files changed

+519
-387
lines changed

.github/workflows/build.yaml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -133,14 +133,14 @@ jobs:
133133
cargo +nightly zigbuild --release --bin terracotta --target "${{ matrix.target }}.${{ matrix.glibc-version }}"
134134
- name: Build (freebsd x86_64)
135135
if: ${{ contains(fromJSON('["x86_64"]'), matrix.arch) && matrix.os == 'freebsd' }}
136-
uses: cross-platform-actions/action@v0.29.0
136+
uses: cross-platform-actions/action@v0.30.0
137137
with:
138138
operating_system: freebsd
139139
architecture: ${{ matrix.arch }}
140140
version: '13.2'
141141
shell: bash
142142
run: |
143-
sudo pkg install -y llvm-devel curl
143+
sudo pkg install -y llvm-devel curl ca_root_nss
144144
curl --proto 'https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y
145145
export CC=clang
146146
export CXX=clang++

build/macos/terracotta.app/Contents/Info.plist

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,9 +44,7 @@
4444
<key>CFBundleSignature</key>
4545
<string>Terracotta</string>
4646
<key>LSApplicationCategoryType</key>
47-
<string>public.app-category.games</string>
48-
<key>GCSupportsGameMode</key>
49-
<true/>
47+
<string>public.app-category.utilities</string>
5048
<key>CFBundleSupportedPlatforms</key>
5149
<array>
5250
<string>MacOSX</string>

src/controller/api.rs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use std::sync::mpsc;
22
use crate::controller::states::AppState;
3-
use crate::controller::{experimental, ExceptionType, Room};
3+
use crate::controller::{experimental, ConnectionDifficulty, ExceptionType, Room};
44
use crate::scaffolding::profile::Profile;
55
use crate::mc::scanning::MinecraftScanner;
66
use crate::MOTD;
@@ -48,11 +48,23 @@ pub fn get_state() -> Value {
4848
AppState::GuestConnecting { room, .. } => {
4949
json!({"state": "guest-connecting", "index": index, "room": room.code})
5050
}
51-
AppState::GuestStarting { room, .. } => {
52-
json!({"state": "guest-starting", "index": index, "room": room.code})
51+
AppState::GuestStarting { room, difficulty, .. } => {
52+
json!({"state": "guest-starting", "index": index, "room": room.code, "difficulty": match difficulty {
53+
ConnectionDifficulty::Unknown => "UNKNOWN",
54+
ConnectionDifficulty::Easiest => "EASIEST",
55+
ConnectionDifficulty::Simple => "SIMPLE",
56+
ConnectionDifficulty::Medium => "MEDIUM",
57+
ConnectionDifficulty::Tough => "TOUGH",
58+
}})
5359
}
5460
AppState::GuestOk { server, profiles, .. } => {
55-
json!({"state": "guest-ok", "index": index, "url": format!("127.0.0.1:{}", server.port), "profile_index": sharing_index, "profiles": profiles})
61+
let url = if server.port == 25565 {
62+
"127.0.0.1".into()
63+
} else {
64+
format!("127.0.0.1:{}", server.port)
65+
};
66+
67+
json!({"state": "guest-ok", "index": index, "url": url, "profile_index": sharing_index, "profiles": profiles})
5668
}
5769
AppState::Exception { kind, .. } => json!({
5870
"state": "exception",

src/controller/rooms/experimental/room.rs

Lines changed: 47 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
use crate::controller::experimental::{MACHINE_ID, VENDOR};
22
use crate::controller::rooms::legacy;
33
use crate::controller::states::{AppState, AppStateCapture};
4-
use crate::controller::{ExceptionType, Room, RoomKind, SCAFFOLDING_PORT};
4+
use crate::controller::{ConnectionDifficulty, ExceptionType, Room, RoomKind, SCAFFOLDING_PORT};
55
use crate::easytier;
66
use crate::easytier::argument::{Argument, PortForward, Proto};
77
use crate::easytier::publics::{fetch_public_nodes, PublicServers};
@@ -18,6 +18,7 @@ use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddrV4, SocketAddrV6};
1818
use std::str::FromStr;
1919
use std::time::{Duration, SystemTime};
2020
use std::thread;
21+
use crate::easytier::EasyTierMember;
2122

2223
static CHARS: &[u8] = "0123456789ABCDEFGHJKLMNPQRSTUVWXYZ".as_bytes();
2324

@@ -146,7 +147,7 @@ pub fn start_host(room: Room, port: u16, player: Option<String>, capture: AppSta
146147
args.push(Argument::TcpWhitelist(port));
147148
args.push(Argument::UdpWhitelist(port));
148149

149-
let easytier = easytier::FACTORY.create(args);
150+
let easytier = easytier::create(args);
150151
let capture = {
151152
let Some(state) = capture.try_capture() else {
152153
return;
@@ -219,13 +220,13 @@ pub fn start_guest(room: Room, player: Option<String>, capture: AppStateCapture)
219220
args.push(Argument::DHCP);
220221
args.push(Argument::TcpWhitelist(0));
221222
args.push(Argument::UdpWhitelist(0));
222-
let easytier = easytier::FACTORY.create(args);
223+
let easytier = easytier::create(args);
223224
let capture = {
224225
let Some(state) = capture.try_capture() else {
225226
return;
226227
};
227228

228-
state.set(AppState::GuestStarting { room, easytier })
229+
state.set(AppState::GuestStarting { room, easytier, difficulty: ConnectionDifficulty::Unknown })
229230
};
230231

231232
let (scaffolding_port, host_ip) = 'local_port: {
@@ -236,7 +237,7 @@ pub fn start_guest(room: Room, player: Option<String>, capture: AppStateCapture)
236237
return;
237238
};
238239
let mut state = state.into_slow();
239-
let AppState::GuestStarting { easytier, .. } = state.as_mut_ref() else {
240+
let AppState::GuestStarting { easytier, difficulty, .. } = state.as_mut_ref() else {
240241
unreachable!();
241242
};
242243
if !easytier.is_alive() {
@@ -247,25 +248,46 @@ pub fn start_guest(room: Room, player: Option<String>, capture: AppStateCapture)
247248
let Some(players) = easytier.get_players() else {
248249
continue;
249250
};
250-
for (hostname, ip) in players {
251-
if hostname.starts_with("scaffolding-mc-server-") && let Ok(port) = u16::from_str(&hostname["scaffolding-mc-server-".len()..]) {
252-
logging!("RoomExperiment", "Scaffolding Server is at {}:{}", ip, port);
253-
254-
let local_port = PortRequest::Scaffolding.request();
255-
256-
if !easytier.add_port_forward(&[PortForward {
257-
local: SocketAddrV4::new(Ipv4Addr::UNSPECIFIED, local_port).into(),
258-
remote: SocketAddrV4::new(ip, port).into(),
259-
proto: Proto::TCP,
260-
}]) {
261-
logging!("RoomExperiment", "Cannot create a port-forward {} -> {} for Scaffolding Connection.", local_port, port);
262-
state.set(AppState::Exception { kind: ExceptionType::GuestEasytierCrash });
263-
return;
264-
};
265251

266-
break 'local_port (local_port, ip);
252+
let Some(local_nat) = players.iter().find_map(|EasyTierMember { is_local, nat, ..}| {
253+
if *is_local {
254+
Some(nat)
255+
} else {
256+
None
267257
}
268-
}
258+
}) else {
259+
continue;
260+
};
261+
262+
let Some((server_address, server_port, server_nat)) = players.iter().find_map(|
263+
EasyTierMember { hostname, address, is_local, nat, .. }
264+
| {
265+
static PREFIX: &str = "scaffolding-mc-server-";
266+
267+
if let Some(address) = address && !is_local && hostname.starts_with(PREFIX) && let Ok(port) = u16::from_str(&hostname[PREFIX.len()..]) {
268+
Some((address, port, nat))
269+
} else {
270+
None
271+
}
272+
}) else {
273+
continue;
274+
};
275+
276+
logging!("RoomExperiment", "Scaffolding Server is at {}:{}", server_address, server_port);
277+
let local_port = PortRequest::Scaffolding.request();
278+
if !easytier.add_port_forward(&[PortForward {
279+
local: SocketAddrV4::new(Ipv4Addr::UNSPECIFIED, local_port).into(),
280+
remote: SocketAddrV4::new(*server_address, server_port).into(),
281+
proto: Proto::TCP,
282+
}]) {
283+
logging!("RoomExperiment", "Cannot create a port-forward {} -> {} for Scaffolding Connection.", local_port, server_port);
284+
state.set(AppState::Exception { kind: ExceptionType::GuestEasytierCrash });
285+
return;
286+
};
287+
288+
*difficulty = easytier::calc_conn_difficulty(local_nat, server_nat);
289+
logging!("RoomExperiment", "Current NAT status: {:?} -> {:?}, difficulty = {:?}", local_nat, server_nat, difficulty);
290+
break 'local_port (local_port, *server_address);
269291
}
270292

271293
logging!("RoomExperiment", "Cannot find scaffolding server.");
@@ -303,10 +325,10 @@ pub fn start_guest(room: Room, player: Option<String>, capture: AppStateCapture)
303325
}
304326
}
305327

306-
let Some(mut state) = capture.try_capture() else {
328+
let Some(state) = capture.try_capture() else {
307329
return;
308330
};
309-
let AppState::GuestStarting { easytier, .. } = state.as_mut_ref() else {
331+
let AppState::GuestStarting { easytier, .. } = state.as_ref() else {
310332
unreachable!();
311333
};
312334
if !easytier.is_alive() {
@@ -400,7 +422,7 @@ pub fn start_guest(room: Room, player: Option<String>, capture: AppStateCapture)
400422
return;
401423
};
402424
state.replace(|state| {
403-
let AppState::GuestStarting { room, easytier } = state else {
425+
let AppState::GuestStarting { room, easytier, .. } = state else {
404426
unreachable!();
405427
};
406428

src/controller/rooms/legacy.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
use crate::controller::states::{AppState, AppStateCapture};
2-
use crate::controller::{ExceptionType, Room, RoomKind};
2+
use crate::controller::{ConnectionDifficulty, ExceptionType, Room, RoomKind};
33
use crate::easytier;
44
use crate::easytier::argument::{Argument, PortForward, Proto};
55
use crate::mc::fakeserver::FakeServer;
@@ -109,9 +109,9 @@ fn parse_segment(chars: &[char]) -> Option<Room> {
109109
}
110110

111111
fn check_easytier() -> bool {
112-
let mut state = AppState::acquire();
112+
let state = AppState::acquire();
113113
if let AppState::GuestStarting { easytier, .. }
114-
| AppState::GuestOk { easytier, .. } = state.as_mut_ref() && !easytier.is_alive()
114+
| AppState::GuestOk { easytier, .. } = state.as_ref() && !easytier.is_alive()
115115
{
116116
logging!("Legacy Room", "EasyTier has crashed.");
117117
state.set(AppState::Exception {
@@ -212,12 +212,12 @@ pub fn start_guest(room: Room, capture: AppStateCapture) {
212212
}));
213213

214214
let capture = {
215-
let easytier = easytier::FACTORY.create(args);
215+
let easytier = easytier::create(args);
216216

217217
let Some(state) = capture.try_capture() else {
218218
return;
219219
};
220-
state.set(AppState::GuestStarting { room, easytier })
220+
state.set(AppState::GuestStarting { room, easytier, difficulty: ConnectionDifficulty::Unknown })
221221
};
222222

223223
'init_conn: {
@@ -248,7 +248,7 @@ pub fn start_guest(room: Room, capture: AppStateCapture) {
248248
};
249249

250250
state.replace(move |state| match state {
251-
AppState::GuestStarting { room, easytier } => AppState::GuestOk {
251+
AppState::GuestStarting { room, easytier, .. } => AppState::GuestOk {
252252
room,
253253
easytier,
254254
server,

src/controller/rooms/mod.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,11 @@ pub enum RoomKind {
2020
PCL2CE { mc_port: u16 },
2121
}
2222

23+
#[derive(Debug)]
24+
pub enum ConnectionDifficulty {
25+
Unknown, Easiest, Simple, Medium, Tough
26+
}
27+
2328
impl Room {
2429
pub fn create() -> Room {
2530
experimental::create_room()

src/controller/states.rs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
use std::fmt::{Debug, Formatter};
2-
use crate::easytier::Easytier;
2+
use crate::easytier::EasyTier;
33
use crate::mc::fakeserver::FakeServer;
44
use crate::mc::scanning::MinecraftScanner;
55
use std::mem;
66
use std::panic::Location;
77
use std::time::{Duration, SystemTime};
88
use parking_lot::{Mutex, MutexGuard};
9-
use crate::controller::Room;
9+
use crate::controller::{ConnectionDifficulty, Room};
1010
use crate::scaffolding::profile::Profile;
1111

1212
pub enum AppState {
@@ -22,7 +22,7 @@ pub enum AppState {
2222
HostOk {
2323
room: Room,
2424
port: u16,
25-
easytier: Easytier,
25+
easytier: EasyTier,
2626
profiles: Vec<(SystemTime, Profile)>,
2727
},
2828

@@ -31,11 +31,12 @@ pub enum AppState {
3131
},
3232
GuestStarting {
3333
room: Room,
34-
easytier: Easytier,
34+
easytier: EasyTier,
35+
difficulty: ConnectionDifficulty
3536
},
3637
GuestOk {
3738
room: Room,
38-
easytier: Easytier,
39+
easytier: EasyTier,
3940
server: FakeServer,
4041

4142
profiles: Vec<Profile>,
@@ -61,8 +62,8 @@ impl Debug for AppState {
6162
AppState::GuestConnecting { room } => {
6263
write!(f, "AppState::GuestConnecting {{ code: {:?} }}", room.code)
6364
}
64-
AppState::GuestStarting { room, .. } => {
65-
write!(f, "AppState::GuestStarting {{ code: {:?}, easytier: .. }}", room.code)
65+
AppState::GuestStarting { room, difficulty, .. } => {
66+
write!(f, "AppState::GuestStarting {{ code: {:?}, difficulty: {:?}, easytier: .. }}", room.code, difficulty)
6667
}
6768
AppState::GuestOk { room, server, profiles, .. } => {
6869
write!(

src/easytier/argument.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,14 @@ use std::net::{Ipv4Addr, SocketAddr};
33

44
type CowString = Cow<'static, str>;
55

6-
#[derive(Clone)]
6+
#[derive(Clone, Debug)]
77
pub struct PortForward {
88
pub(crate) local: SocketAddr,
99
pub(crate) remote: SocketAddr,
1010
pub(crate) proto: Proto,
1111
}
1212

13-
#[derive(Clone)]
13+
#[derive(Clone, Debug)]
1414
pub enum Proto {
1515
TCP,
1616
UDP,

0 commit comments

Comments
 (0)