66ebfc3
Branches > refactor/use-spec-1 > 66ebfc3 > files / src / net / bowmap
Horrible working code I'll fix it later
Commit: 66ebfc395741b77f1002ab6aada82fc2a433bc7d
Parent: 338a44c
1 changed file:
src/net/bowmap/core.clj view file
@@ -4,8 +4,9 @@ [manifold.deferred :as d] [manifold.stream :as s] [net.bowmap.client.state :as state]+ [net.bowmap.packet :as pk] [net.bowmap.packet-handling :as handle]- [net.bowmap.packet.client :refer [encode-packet]]+ [net.bowmap.packet.client :as cp :refer [encode-packet]] [net.bowmap.packet.read :as read] [net.bowmap.packet.server :as sp]) (:import@@ -14,8 +15,8 @@ [io.netty.channel ChannelOption])) (defn packet-framer-xf- "Frames bytes from incoming byte arrays and calls 'xf' on ByteBufs of- complete Minecraft protocol packet bytes."+ "Transducer that frames bytes from incoming byte arrays and outputs ByteBufs of+ framed serialized serverbound packets." [rf] (let [buf (Unpooled/buffer)] (fn@@ -26,27 +27,67 @@ (loop [res res] (if (read/can-read-packet? buf) (let [len (read/read-varint! buf)- ;; This copy is probably inefficient but fine for now. res' (rf res (ByteBuf/.copy (ByteBuf/.readRetainedSlice buf len)))] (ByteBuf/.discardReadBytes buf) (recur res')) res)))))) (defn handle-packet- "Handles one framed Minecraft protocol packet bytes."+ "Handles one ByteBuf of a framed serialized serverbound packet, and returns a+ map of :client and :packets." [client packet-buf]- (let [{:keys [client response]} (handle/response client (sp/decode-packet packet-buf (::state/state client)))]- (doseq [pk response]- (s/put! (::stream client) (encode-packet pk (::state/state client))))- client))+ (let [pk (sp/decode-packet packet-buf (::state/state client))]+ (when (= (::pk/id pk) ::sp/finish-config)+ (s/connect (s/periodically 20000 0 (fn []+ {::pk/id ::cp/keep-alive+ :timestamp (long (* (rand) Long/MAX_VALUE))}))+ (::packet-stream client)))+ (handle/response client pk)))++(defn handle-message+ "Handles either a serverbound or clientbound packet, returning the new client+ state, and sending either the clientbound packets it was given, or the+ packets that handling the serverbound packet it was given returned.+ Should only be used synchronously as serialization depends on client state!"+ [client msg]+ (case (:type msg)+ :server+ (let [{:keys [client response]} (handle-packet client (:bytes msg))]+ (reduce (fn [client pk]+ (handle-message client {:type :client :pk pk}))+ client response))++ :client+ (let [pk (encode-packet (:pk msg) (::state/state client))]+ @(s/put! (::stream client) pk)+ client))) (defn client-handler [stream _]- (let [client {::state/state ::state/handshaking- ::stream stream}]- (d/catch (s/reduce #'handle-packet client (s/transform packet-framer-xf stream))+ (let [client-packet-stream (s/stream)+ client {::state/state ::state/handshaking+ ::stream stream+ ::packet-stream client-packet-stream}+ message-stream (s/stream)]++ (-> (s/transform+ (comp+ packet-framer-xf+ (map (fn [buf] {:type :server+ :bytes buf})))+ stream)+ (s/connect message-stream {:upstream? false}))++ (-> (s/transform+ (map (fn [pk] {:type :client+ :pk pk}))+ client-packet-stream)+ (s/connect message-stream {:upstream? false}))++ (d/catch (s/reduce #'handle-message client message-stream) (fn [e] (println "Exception in client packets:" e))))) +;; TODO move this into net.bowmap.server :p (defn start-server! [] (tcp/start-server #'client-handler {:port 25565