1 ! Copyright (C) 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors assocs db.tuples db.types furnace.cache
4 furnace.redirection furnace.scopes furnace.sessions
5 furnace.utilities http http.server kernel math.parser namespaces
7 IN: furnace.conversations
9 TUPLE: conversation < scope session ;
11 : <conversation> ( id -- conversation )
12 conversation new-server-state ;
14 conversation "CONVERSATIONS" {
15 { "session" "SESSION" BIG-INTEGER +not-null+ }
18 CONSTANT: conversation-id-key "__c"
20 TUPLE: conversations < server-state-manager ;
22 : <conversations> ( responder -- responder' )
23 conversations new-server-state-manager ;
27 SYMBOL: conversation-id
29 : cget ( key -- value )
30 conversation get scope-get ;
32 : cset ( value key -- )
33 conversation get scope-set ;
35 : cchange ( key quot -- )
36 conversation get scope-change ; inline
38 : get-conversation ( id -- conversation )
39 dup [ conversation get-state ] when check-session ;
41 : request-conversation-id ( request -- id )
42 conversation-id-key swap request-params at string>number ;
44 : request-conversation ( request -- conversation )
45 request-conversation-id get-conversation ;
47 : save-conversation-after ( conversation -- )
48 conversations get save-scope-after ;
50 : set-conversation ( conversation -- )
53 [ id>> conversation-id set ]
54 [ save-conversation-after ]
58 : init-conversations ( conversations -- )
60 request get request-conversation
63 M: conversations call-responder*
64 [ init-conversations ]
69 : empty-conversastion ( -- conversation )
70 conversation empty-scope
71 session get id>> >>session ;
73 : touch-conversation ( conversation -- )
74 conversations get touch-state ;
76 : add-conversation ( conversation -- )
77 [ touch-conversation ] [ insert-tuple ] bi ;
79 : begin-conversation ( -- )
83 [ set-conversation ] bi
86 : end-conversation ( -- )
90 : <continue-conversation> ( url -- response )
96 : restore-conversation ( seq -- )
99 [ '[ _ key? ] filter ]
100 [ '[ [ _ at ] keep set ] each ]
104 M: conversations modify-form