diff --git a/src/parser.erl b/src/parser.erl new file mode 100644 index 0000000..a46072f --- /dev/null +++ b/src/parser.erl @@ -0,0 +1,142 @@ +%%% @author Niclas Axelsson +%%% @copyright (C) 2010, Niclas Axelsson +%%% @doc +%%% Parser for messages sent from client-side +%%% @end +%%% Created : 22 Oct 2010 by Niclas Axelsson + +-module(parser). + +-include("../include/client_packets.hrl"). +-include("../include/types.hrl"). + +-export([parse_header/1]). + +parse_header(<>) -> + case PacketID of + 1 -> + <> = Rest, + ULength = 8*UsernameLength, + <> = RRest, + #login_request{ + protocol_version = ProtocolVersion, + username = Username, + password = Password + }; + 2 -> + <> = Rest, + #handshake{ + username = erlang:binary_to_list(Username) + }; + 3 -> + <> = Rest, + #chat_message{ + message = Message + }; + 5 -> + <> = Rest, + ParsedPayload = parse_payload(Payload), + #player_inventory{ + type = Type, + count = Count, + payload = ParsedPayload + }; + 10 -> + <> = Rest, + OG = case OnGround of + 0 -> false; + 1 -> true + end, + #player{ + on_ground = OG + }; + 11 -> + <> = Rest, + OG = case OnGround of + 0 -> false; + 1 -> true + end, + #player_position{ + x = X, + y = Y, + stance = Stance, + z = Z, + on_ground = OG + }; + 12 -> + <> = Rest, + OG = case OnGround of + 0 -> false; + 1 -> true + end, + #player_look{ + yaw = Yaw, + pitch = Pitch, + on_ground = OG + }; + 13 -> + <> = Rest, + OG = case OnGround of + 0 -> false; + 1 -> true + end, + #player_position_and_look{ + x = X, + y = Y, + stance = Stance, + z = Z, + yaw = Yaw, + pitch = Pitch, + on_ground = OG + }; + 14 -> + <> = Rest, + #player_digging{ + status = Status, + x = X, + y = Y, + z = Z, + face = Face + }; + 15 -> + <> = Rest, + #player_block_placement{ + item_id = ItemID, + x = X, + y = Y, + z = Z, + direction = Direction + }; + 16 -> + <> = Rest, + #holding_change{ + item_id = ItemID + }; + 255 -> + <> = Rest, + #disconnect{ + reason = Reason + }; + _ -> + error + end. + + + + + + + + +parse_payload(Payload) -> + parse_payload(Payload, []). + +parse_payload(<<>>, Acc) -> + lists:reverse(Acc); +parse_payload(<>, Acc) -> + parse_payload(Payload, [{empty} | Acc]); +parse_payload(<>, Acc) -> + parse_payload(Payload, [{ItemID, Count, Health} | Acc]). + + +