@@ -5,21 +5,11 @@ defmodule Minecraft.Protocol do
55 """
66 use GenServer
77 require Logger
8+ alias Minecraft.Connection
89 alias Minecraft.Protocol.Handler
9- alias Minecraft.Packet
1010
1111 @ behaviour :ranch_protocol
1212
13- @ typedoc """
14- The possible states a client/server can be in.
15- """
16- @ type state :: :handshaking | :status | :login | :play
17-
18- defmodule State do
19- @ moduledoc false
20- defstruct [ :current , :socket , :transport , :client_ip ]
21- end
22-
2313 @ impl true
2414 def start_link ( ref , socket , transport , protocol_opts ) do
2515 pid = :proc_lib . spawn_link ( __MODULE__ , :init , [ { ref , socket , transport , protocol_opts } ] )
@@ -33,66 +23,57 @@ defmodule Minecraft.Protocol do
3323 @ impl true
3424 def init ( { ref , socket , transport , _protocol_opts } ) do
3525 :ok = :ranch . accept_ack ( ref )
36- { :ok , { client_ip , _port } } = :inet . peername ( socket )
37- client_ip = :inet . ntoa ( client_ip )
38-
39- state = % State {
40- current: :handshaking ,
41- socket: socket ,
42- transport: transport ,
43- client_ip: client_ip
44- }
45-
46- :ok = transport . setopts ( socket , active: :once )
47- Logger . info ( fn -> "Client #{ client_ip } connected." end )
48- :gen_server . enter_loop ( __MODULE__ , [ ] , state )
26+ conn = Connection . init ( socket , transport )
27+ :gen_server . enter_loop ( __MODULE__ , [ ] , conn )
4928 end
5029
5130 @ impl true
52- def handle_info ( { :tcp , socket , packet } , state ) do
53- case Packet . deserialize ( packet , state . current ) do
54- { packet , current , rest } when is_binary ( rest ) ->
55- Logger . debug ( fn -> "REQUEST: #{ inspect ( packet ) } " end )
56-
57- if byte_size ( rest ) > 0 do
58- send ( self ( ) , { :tcp , socket , rest } )
59- end
60-
61- handle_packet ( packet , socket , current , state )
62-
63- { :error , :invalid_packet } ->
64- Logger . error ( fn -> "Received an invalid packet from client, closing connection." end )
65- { :stop , :normal , state }
66- end
31+ def handle_info ( { :tcp , socket , data } , conn ) do
32+ conn
33+ |> Connection . put_socket ( socket )
34+ |> Connection . put_data ( data )
35+ |> handle_conn ( )
6736 end
6837
69- def handle_info ( { :tcp_closed , socket } , state ) do
70- Logger . info ( fn -> "Client #{ state . client_ip } disconnected." end )
71- :ok = state . transport . close ( socket )
72- { :stop , :normal , state }
38+ def handle_info ( { :tcp_closed , socket } , conn ) do
39+ Logger . info ( fn -> "Client #{ conn . client_ip } disconnected." end )
40+ :ok = conn . transport . close ( socket )
41+ { :stop , :normal , conn }
7342 end
7443
7544 #
7645 # Helpers
7746 #
47+ defp handle_conn ( % Connection { data: "" } = conn ) do
48+ conn = Connection . continue ( conn )
49+ { :noreply , conn }
50+ end
51+
52+ defp handle_conn ( % Connection { } = conn ) do
53+ case Connection . read_packet ( conn ) do
54+ { :ok , packet , conn } ->
55+ handle_packet ( packet , conn )
56+
57+ { :error , conn } ->
58+ conn = Connection . close ( conn )
59+ { :stop , :normal , conn }
60+ end
61+ end
7862
79- defp handle_packet ( packet , socket , current , state ) do
80- case Handler . handle ( packet ) do
81- { :ok , :noreply } ->
82- :ok = state . transport . setopts ( socket , active: :once )
83- { :noreply , % State { state | current: current } }
63+ defp handle_packet ( packet , conn ) do
64+ case Handler . handle ( packet , conn ) do
65+ { :ok , :noreply , conn } ->
66+ handle_conn ( conn )
8467
85- { :ok , response_packet } ->
86- Logger . debug ( fn -> "RESPONSE: #{ inspect ( response_packet ) } " end )
87- { :ok , response } = Packet . serialize ( response_packet )
88- :ok = state . transport . setopts ( socket , active: :once )
89- :ok = state . transport . send ( socket , response )
90- { :noreply , % State { state | current: current } }
68+ { :ok , response , conn } ->
69+ conn
70+ |> Connection . send_response ( response )
71+ |> handle_conn ( )
9172
92- err ->
73+ { :error , _ , conn } = err ->
9374 Logger . error ( fn -> "#{ __MODULE__ } error: #{ inspect ( err ) } " end )
94- :ok = state . transport . close ( socket )
95- { :stop , :normal , state }
75+ conn = Connection . close ( conn )
76+ { :stop , :normal , conn }
9677 end
9778 end
9879end
0 commit comments