client.clj
Branches > main > 4a76ca7 > files / src / net / bowmap / network / client.clj
(ns net.bowmap.network.client
(:require
[net.bowmap.network.packets.clientbound :refer [encode-packet!]]
[net.bowmap.network.packets.serverbound :refer [decode-packet!]]
[net.bowmap.network.state :as state]
[net.bowmap.network.streams :as streams]
[net.bowmap.server.entity :as entity]
[net.bowmap.server.server :as server])
(:import
[java.net Socket]))
(defn client [socket]
(ref {::state/connection-state ::state/handshaking
::socket socket}))
(defn read-packet! [client-ref]
(let [{:keys! [::socket ::state/connection-state]} @client-ref
frame (streams/read-frame!! (Socket/.getInputStream socket))]
(decode-packet! frame connection-state)))
; TODO handle errors here as well to disconnect client?
(defn send-packet! [client-ref packet]
(let [{:keys! [::socket ::state/connection-state]} @client-ref]
#_(println "sending packet out: " packet)
(streams/write-frame!! (encode-packet! packet connection-state) (Socket/.getOutputStream socket))
client))
(defn leave! [client-ref]
(let [{:keys! [::socket] :keys [::playing? ::entity/uuid]} @client-ref]
(try
(dosync
(when playing?
; What should really happen if this fails?
; Probably should come up with a better solution
(commute server/players dissoc uuid)))
(finally
(Socket/.close socket)))))