packet_handling.clj

Branches > refactor/use-spec-1 > 9348299 > files / src / net / bowmap / packet_handling.clj

(ns net.bowmap.packet-handling
  (:require
   [net.bowmap.client.state :as state]
   [net.bowmap.packet :as pk]
   [net.bowmap.packet.client :as cp]
   [net.bowmap.packet.registry :as registry]
   [net.bowmap.packet.server :as sp]))

(defmulti handle-packet
  (fn [pk client]
    (::pk/id pk)))

(defn response
  "Returns a map of a client, and any other keys a packet handler may use.
   Client may be unchanged, or adorned with any information, such as a new state."
  [client pk]
  (let [response (handle-packet pk client)]
    (if (:client response)
      response
      (assoc response :client client))))

(defmethod handle-packet :default [pk client]
  (prn "Unhandled packet:" pk))

(defmethod handle-packet ::sp/handshaking [pk client]
  {:client (assoc client ::state/state (:intent pk))})

(defmethod handle-packet ::sp/status-request [pk client]
  {:response [{::pk/id ::cp/status-response
               :response {:version {:name "1.21.11"
                                    :protocol 774}
                          :players {:max 1000
                                    :online 0}
                          :description {:text "Bowmap!"}
                          :enforcesSecureChat false}}]})

(defmethod handle-packet ::sp/ping-request [pk client]
  {:response [{::pk/id ::cp/pong-response
               :timestamp (:timestamp pk)}]})

(defmethod handle-packet ::sp/login-start [pk client]
  {:response [{::pk/id ::cp/login-success
               :uuid (:uuid pk)
               :username (:username pk)
               :properties []}]})

(defmethod handle-packet ::sp/login-acknowledged [pk client]
  {:client (assoc client ::state/state ::state/config)
   :response [{::pk/id ::cp/known-packs
               :known-packs [{:namespace "minecraft" :id "core" :version "1.12.11"}]}]})

(defmethod handle-packet ::sp/known-packs [pk client]
  {:response (conj (vec registry/registry-packets)
                   {::pk/id ::cp/finish-config})})

(defmethod handle-packet ::sp/finish-config [pk client]
  {:client (assoc client ::state/state ::state/play)})