@@ -17,13 +17,21 @@ defmodule Minecraft.TestClient do
1717 end
1818
1919 @ doc """
20- Sends a message to the server.
20+ Sends a packet to the server.
2121 """
22- @ spec send ( pid , struct ) :: { :ok , response :: term } | { :error , term }
22+ @ spec send ( pid , packet :: struct ) :: { :ok , response :: term } | { :error , term }
2323 def send ( pid , packet ) do
2424 GenServer . call ( pid , { :send , packet } )
2525 end
2626
27+ @ doc """
28+ Sends raw data to the server.
29+ """
30+ @ spec send_raw ( pid , data :: binary ) :: { :ok , response :: term } | { :error , term }
31+ def send_raw ( pid , data ) do
32+ GenServer . call ( pid , { :send_raw , data } )
33+ end
34+
2735 @ doc """
2836 Sets the client's connection state.
2937 """
@@ -52,9 +60,29 @@ defmodule Minecraft.TestClient do
5260 def handle_call ( { :send , packet } , _from , { socket , state } ) do
5361 { :ok , request } = Minecraft.Packet . serialize ( packet )
5462 :ok = :gen_tcp . send ( socket , request )
55- { :ok , response } = :gen_tcp . recv ( socket , 0 )
56- { response_packet , _ , "" } = Minecraft.Packet . deserialize ( response , state , :server )
57- { :reply , { :ok , response_packet } , { socket , state } }
63+
64+ case :gen_tcp . recv ( socket , 0 ) do
65+ { :ok , response } ->
66+ { response_packet , _ , "" } = Minecraft.Packet . deserialize ( response , state , :server )
67+ { :reply , { :ok , response_packet } , { socket , state } }
68+
69+ { :error , _ } = err ->
70+ { :stop , :normal , err , { socket , state } }
71+ end
72+ end
73+
74+ @ impl true
75+ def handle_call ( { :send_raw , data } , _from , { socket , state } ) do
76+ :ok = :gen_tcp . send ( socket , data )
77+
78+ case :gen_tcp . recv ( socket , 0 ) do
79+ { :ok , response } ->
80+ { response_packet , _ , "" } = Minecraft.Packet . deserialize ( response , state , :server )
81+ { :reply , { :ok , response_packet } , { socket , state } }
82+
83+ { :error , _ } = err ->
84+ { :stop , :normal , err , { socket , state } }
85+ end
5886 end
5987
6088 def handle_call ( { :set_state , state } , _from , { socket , _old_state } ) do
0 commit comments