From 1ce9b7c454c15a42313d2bba58caf185520a8bf5 Mon Sep 17 00:00:00 2001 From: Kodi Craft Date: Mon, 8 Jul 2024 14:57:37 +0200 Subject: [PATCH] Move shared boilerplate in servers to Amethyst.Server --- lib/servers/generic.ex | 27 +++++++++++++++++++++++++++ lib/servers/stage1.ex | 16 +++++++--------- lib/servers/status.ex | 18 ++---------------- 3 files changed, 36 insertions(+), 25 deletions(-) diff --git a/lib/servers/generic.ex b/lib/servers/generic.ex index bad4dd9..5731a0a 100644 --- a/lib/servers/generic.ex +++ b/lib/servers/generic.ex @@ -37,3 +37,30 @@ defmodule Amethyst.Server.Generic do end end end + +defmodule Amethyst.Server do + @moduledoc """ + This module includes shared boilerplate code for all stages of the server. + """ + + defmacro __using__(_opts) do + quote do + @spec serve(:gen_tcp.socket()) :: no_return() + def serve(client) do + {id, data} = Amethyst.Server.Generic.get_packet(client) + packet = deserialize(id, data) + Logger.debug("Got packet #{inspect(packet)}") + handle(packet, client) + serve(client) + end + + + def transmit(packet, client) do + Logger.debug("Transmitting #{inspect(packet)}") + data = serialize(packet) + length = byte_size(data) |> Amethyst.Minecraft.Write.varint() + :gen_tcp.send(client, length <> data) + end + end + end +end diff --git a/lib/servers/stage1.ex b/lib/servers/stage1.ex index 50c60d4..9e60f0f 100644 --- a/lib/servers/stage1.ex +++ b/lib/servers/stage1.ex @@ -19,16 +19,9 @@ defmodule Amethyst.Server.Stage1 do This module contains the stage 1 (Handshaking) server logic. """ require Logger - alias Amethyst.Minecraft.Read + use Amethyst.Server - @spec serve(:gen_tcp.socket()) :: no_return() - def serve(client) do - {id, data} = Amethyst.Server.Generic.get_packet(client) - packet = deserialize(id, data) - Logger.debug("Got packet #{inspect(packet)}") - handle(packet, client) - serve(client) - end + alias Amethyst.Minecraft.Read ## DESERIALIZATION # Handshake https://wiki.vg/Protocol#Handshake @@ -48,6 +41,11 @@ defmodule Amethyst.Server.Stage1 do raise RuntimeError, "Got unknown packet type #{type}!" end + ## SERIALIZATION + def serialize(_) do + raise RuntimeError, "No packets can be transmitted while still in the handshake stage!" + end + ## HANDLING # Handshake https://wiki.vg/Protocol#Handshake @spec handle(any(), any()) :: no_return() diff --git a/lib/servers/status.ex b/lib/servers/status.ex index e0e8bb9..5fc2d29 100644 --- a/lib/servers/status.ex +++ b/lib/servers/status.ex @@ -20,25 +20,11 @@ defmodule Amethyst.Server.Status do is only asking a bit of information. """ require Logger + use Amethyst.Server + alias Amethyst.Minecraft.Read alias Amethyst.Minecraft.Write - @spec serve(:gen_tcp.socket()) :: no_return() - def serve(client) do - {id, data} = Amethyst.Server.Generic.get_packet(client) - packet = deserialize(id, data) - Logger.debug("Got packet #{inspect(packet)}") - handle(packet, client) - serve(client) - end - - def transmit(packet, client) do - Logger.debug("Transmitting #{inspect(packet)}") - data = serialize(packet) - length = byte_size(data) |> Write.varint() - :gen_tcp.send(client, length <> data) - end - ## DESERIALIZATION # Status Request https://wiki.vg/Protocol#Status_Request def deserialize(0x00, _) do