feat: add some botched old address support
This commit is contained in:
parent
1d9d205d8c
commit
2eb9adc61a
3 changed files with 21 additions and 5 deletions
|
|
@ -84,7 +84,7 @@ pub struct McApi {
|
|||
|
||||
impl MinecraftAPI<Server> for McApi {
|
||||
#[tracing::instrument(name = "MinecraftAPI::query_server", level = "info", skip(self))]
|
||||
async fn query_server(&self, addr: String) -> Result<Server, OpaqueError> {
|
||||
async fn query_server(&self, addr: &str) -> Result<Server, OpaqueError> {
|
||||
let dep_name = match self.cache.query_dep_addr(&addr).await {
|
||||
Some(x) => x,
|
||||
None => {
|
||||
|
|
@ -137,7 +137,7 @@ impl MinecraftAPI<Server> for McApi {
|
|||
async move {
|
||||
tracing::info!("starting watch");
|
||||
tokio::time::sleep(frequency).await;
|
||||
let server = self.query_server(addr.clone()).await.unwrap();
|
||||
let server = self.query_server(&addr).await.unwrap();
|
||||
let status_json = match server.query_description().await {
|
||||
Ok(x) => x,
|
||||
Err(e) => {
|
||||
|
|
|
|||
20
src/main.rs
20
src/main.rs
|
|
@ -129,7 +129,7 @@ async fn handle_status<T: MinecraftServerHandle>(
|
|||
status_struct.version.protocol = handshake.protocol_version.get_int();
|
||||
let bye_message = format!(" - §dTami§r with §d<3§r §8(rev: {commit_hash})§r");
|
||||
|
||||
let server = match api.query_server(handshake.get_server_address()).await {
|
||||
let server = match api.query_server(&handshake.get_server_address()).await {
|
||||
Ok(x) => x,
|
||||
Err(e) => {
|
||||
tracing::warn!(err = e.context);
|
||||
|
|
@ -186,7 +186,23 @@ async fn handle_login<T: MinecraftServerHandle>(
|
|||
handshake: &Handshake,
|
||||
api: impl MinecraftAPI<T>,
|
||||
) -> Result<(), OpaqueError> {
|
||||
let server = api.query_server(handshake.get_server_address()).await?;
|
||||
let addr = handshake.get_server_address();
|
||||
// Thanks to a buggy minecraft, when the client sends a join
|
||||
// from a SRV DNS record, it will not use the address typed
|
||||
// in the game, but use the address redicted *to* by the
|
||||
// DNS record as the address for joining, plus a trailing "."
|
||||
//
|
||||
// For example:
|
||||
// server.example.com (_minecraft._tcp.server.example.com)
|
||||
// (the typed address) I (the DNS SRV record which gets read)
|
||||
// V
|
||||
// 5 25565 server.example.com
|
||||
// I (the response for the DNS SRV query)
|
||||
// V
|
||||
// server.example.com.
|
||||
// (the address used in the protocol)
|
||||
let server = api.query_server(addr.trim_end_matches(".")).await?;
|
||||
|
||||
let status = server.query_status().await?;
|
||||
tracing::debug!(msg = "server status", status = ?status);
|
||||
match status {
|
||||
|
|
|
|||
|
|
@ -124,7 +124,7 @@ pub trait MinecraftServerHandle: Clone {
|
|||
}
|
||||
|
||||
pub trait MinecraftAPI<T> {
|
||||
async fn query_server(&self, addr: String) -> Result<T, OpaqueError>;
|
||||
async fn query_server(&self, addr: &str) -> Result<T, OpaqueError>;
|
||||
async fn start_watch(
|
||||
self,
|
||||
server: impl MinecraftServerHandle,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue