]> gitweb.factorcode.org Git - factor.git/commitdiff
add managed-server to extra/
authorDoug Coleman <erg@jobim.local>
Fri, 29 May 2009 16:20:40 +0000 (11:20 -0500)
committerDoug Coleman <erg@jobim.local>
Fri, 29 May 2009 16:20:40 +0000 (11:20 -0500)
extra/managed-server/authors.txt [new file with mode: 0644]
extra/managed-server/chat/authors.txt [new file with mode: 0644]
extra/managed-server/chat/chat.factor [new file with mode: 0644]
extra/managed-server/managed-server.factor [new file with mode: 0644]

diff --git a/extra/managed-server/authors.txt b/extra/managed-server/authors.txt
new file mode 100644 (file)
index 0000000..b4bd0e7
--- /dev/null
@@ -0,0 +1 @@
+Doug Coleman
\ No newline at end of file
diff --git a/extra/managed-server/chat/authors.txt b/extra/managed-server/chat/authors.txt
new file mode 100644 (file)
index 0000000..b4bd0e7
--- /dev/null
@@ -0,0 +1 @@
+Doug Coleman
\ No newline at end of file
diff --git a/extra/managed-server/chat/chat.factor b/extra/managed-server/chat/chat.factor
new file mode 100644 (file)
index 0000000..7cd4db5
--- /dev/null
@@ -0,0 +1,23 @@
+! Copyright (C) 2009 Doug Coleman.
+! See http://factorcode.org/license.txt for BSD license.
+USING: accessors assocs fry io kernel managed-server
+namespaces sequences ;
+IN: managed-server.chat
+
+TUPLE: chat-server < managed-server ;
+
+: <chat-server> ( port -- managed-server )
+    "chat-server" chat-server new-managed-server ;
+
+M: chat-server handle-managed-client*
+    clients>>
+    readln dup empty? [
+        2drop
+    ] [
+        '[
+            nip output-stream>>
+            [
+                client get username>> ": " _ 3append print flush
+            ] with-output-stream*
+        ] assoc-each
+    ] if ;
diff --git a/extra/managed-server/managed-server.factor b/extra/managed-server/managed-server.factor
new file mode 100644 (file)
index 0000000..2a9df2a
--- /dev/null
@@ -0,0 +1,63 @@
+! Copyright (C) 2009 Doug Coleman.
+! See http://factorcode.org/license.txt for BSD license.
+USING: accessors assocs calendar continuations io
+io.encodings.binary io.servers.connection io.sockets
+io.streams.duplex kernel locals math math.ranges multiline
+namespaces prettyprint random sequences sets splitting threads
+tools.continuations ;
+IN: managed-server
+
+SYMBOL: client
+
+TUPLE: managed-server < threaded-server clients ;
+
+TUPLE: managed-client input-stream output-stream local-address
+remote-address username ;
+
+GENERIC: login ( managed-server -- username )
+GENERIC: handle-managed-client* ( threaded-server -- )
+
+ERROR: already-logged-in username ;
+ERROR: bad-login username ;
+
+<PRIVATE
+
+: <managed-client> ( username -- managed-client )
+    managed-client new
+        swap >>username
+        input-stream get >>input-stream
+        output-stream get >>output-stream
+        local-address get >>local-address
+        remote-address get >>remote-address ;
+
+: check-logged-in ( username -- username )
+    dup threaded-server get clients>> key? [ already-logged-in ] when ;
+
+: add-managed-client ( managed-client -- )
+    dup username>>
+    threaded-server get clients>> set-at ;
+
+: delete-managed-client ( -- )
+    client get username>>
+    threaded-server get clients>> delete-at ;
+
+: handle-managed-client ( -- )
+    [ [ threaded-server get handle-managed-client* t ] loop ]
+    [ delete-managed-client ]
+    [ ] cleanup ;
+
+PRIVATE>
+
+M: managed-server login drop readln ;
+
+M: managed-server handle-client*
+    login <managed-client>
+    [ client set ] [ add-managed-client ] bi
+    handle-managed-client ;
+
+: new-managed-server ( port name class -- server )
+    new-threaded-server
+        swap >>name
+        swap >>insecure
+        f >>timeout
+        H{ } clone >>clients ; inline