1 ! Copyright (C) 2009 Doug Coleman.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors assocs combinators combinators.smart
4 destructors fry io io.encodings.utf8 kernel managed-server
5 namespaces parser sequences sorting splitting strings.parser
6 unicode.case unicode.categories calendar calendar.format
7 locals multiline io.encodings.binary io.encodings.string
9 IN: managed-server.chat
11 TUPLE: chat-server < managed-server ;
14 commands [ H{ } clone ] initialize
17 chat-docs [ H{ } clone ] initialize
19 CONSTANT: line-beginning "-!- "
21 : handle-me ( string -- )
23 [ "* " username " " ] dip
24 ] "" append-outputs-as send-everyone ;
26 : handle-quit ( string -- )
27 client [ (>>object) ] [ t >>quit? drop ] bi ;
29 : handle-help ( string -- )
32 commands get keys natural-sort ", " join append print flush
36 [ "Unknown command: " prepend print flush ] if
40 chat-docs get at print flush ;
42 : username-taken-string ( username -- string )
43 "The username ``" "'' is already in use; try again." surround ;
45 : warn-name-changed ( old new -- )
47 [ line-beginning "``" ] 2dip
48 [ "'' is now known as ``" ] dip "''"
49 ] "" append-outputs-as send-everyone ;
51 : handle-nick ( string -- )
56 username-taken-string print flush
58 [ username swap warn-name-changed ]
59 [ username clients rename-at ]
60 [ client (>>username) ] tri
64 :: add-command ( quot docs key -- )
65 quot key commands get set-at
66 docs key chat-docs get set-at ;
69 <" Syntax: /help [command]
70 Displays the documentation for a command.">
73 [ drop clients keys [ "``" "''" surround ] map ", " join print flush ]
75 Shows the list of connected users.">
78 [ drop gmt timestamp>rfc822 print flush ]
80 Returns the current GMT time."> "time" add-command
83 <" Syntax: /nick nickname
84 Changes your nickname.">
88 <" Syntax: /me action">
92 <" Syntax: /quit [message]
93 Disconnects a user from the chat server."> "quit" add-command
95 : handle-command ( string -- )
96 dup " " split1 swap >lower commands get at* [
97 call( string -- ) drop
99 2drop "Unknown command: " prepend print flush
102 : <chat-server> ( port -- managed-server )
103 "chat-server" utf8 chat-server new-managed-server ;
105 : handle-chat ( string -- )
107 [ username ": " ] dip
108 ] "" append-outputs-as send-everyone ;
110 M: chat-server handle-login
111 "Username: " write flush
114 M: chat-server handle-client-join
116 line-beginning username " has joined"
117 ] "" append-outputs-as send-everyone ;
119 M: chat-server handle-client-disconnect
121 line-beginning username " has quit "
122 client object>> dup [ "\"" dup surround ] when
123 ] "" append-outputs-as send-everyone ;
125 M: chat-server handle-already-logged-in
126 username username-taken-string print flush ;
128 M: chat-server handle-managed-client*
129 readln dup f = [ t client (>>quit?) ] when
131 "/" ?head [ handle-command ] [ handle-chat ] if