From 5c708a22d2d625e0a380d84a221279ef7535fa73 Mon Sep 17 00:00:00 2001 From: Kodi Craft Date: Sun, 7 Jul 2024 22:46:18 +0200 Subject: [PATCH] Implement being aware of the handshake --- lib/servers/generic.ex | 5 ++++- lib/servers/stage1.ex | 12 +++++++++--- 2 files changed, 13 insertions(+), 4 deletions(-) diff --git a/lib/servers/generic.ex b/lib/servers/generic.ex index 532a29c..bad4dd9 100644 --- a/lib/servers/generic.ex +++ b/lib/servers/generic.ex @@ -23,7 +23,10 @@ defmodule Amethyst.Server.Generic do alias Amethyst.Minecraft.Read def get_packet(client) do - + {[length], ""} = get_varint(client, "") + {:ok, full_packet} = :gen_tcp.recv(client, length) + {[id], data} = Read.start(full_packet) |> Read.varint() |> Read.stop() + {id, data} end defp get_varint(client, acc) do diff --git a/lib/servers/stage1.ex b/lib/servers/stage1.ex index 8ffccd8..ca9e12b 100644 --- a/lib/servers/stage1.ex +++ b/lib/servers/stage1.ex @@ -18,10 +18,16 @@ defmodule Amethyst.Server.Stage1 do @moduledoc """ This module contains the stage 1 (Handshaking) server logic. """ + require Logger alias Amethyst.Minecraft.Read + @spec serve(:gen_tcp.socket()) :: no_return() def serve(client) do - + {id, data} = Amethyst.Server.Generic.get_packet(client) + case deserialize(id, data) do + {:handshake, ver, addr, port, next} -> Logger.info("Got handshake on ver #{ver}, #{addr}:#{port} moving to #{next}") + end + serve(client) end ## DESERIALIZATION @@ -34,9 +40,9 @@ defmodule Amethyst.Server.Stage1 do 3 -> :transfer _ -> raise RuntimeError, "Client requested moving to an unknown state!" end - %{type: :handshake, version: ver, address: addr, port: port, next: next} + {:handshake, ver, addr, port, next} end - def deserialize(<>) do + def deserialize(type, _) do raise RuntimeError, "Got unknown packet type #{type}!" end end