66ebfc3

Branches > refactor/use-spec-1 > 66ebfc3 > files / src / net / bowmap

Horrible working code I'll fix it later

Grahp, 2026-03-08

Commit: 66ebfc395741b77f1002ab6aada82fc2a433bc7d
Parent: 338a44c

1 changed file:

src/net/bowmap/core.clj modified (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