]> gitweb.factorcode.org Git - factor.git/blob - extra/irc/ui/ui.factor
Updating code for make and fry changes
[factor.git] / extra / irc / ui / ui.factor
1 ! Copyright (C) 2008 William Schlieper\r
2 ! See http://factorcode.org/license.txt for BSD license.\r
3 \r
4 USING: accessors kernel threads combinators concurrency.mailboxes\r
5        sequences strings hashtables splitting fry assocs hashtables colors\r
6        sorting qualified unicode.collation math.order\r
7        ui ui.gadgets ui.gadgets.panes ui.gadgets.editors\r
8        ui.gadgets.scrollers ui.commands ui.gadgets.frames ui.gestures\r
9        ui.gadgets.tabs ui.gadgets.grids ui.gadgets.packs ui.gadgets.labels\r
10        io io.styles namespaces calendar calendar.format models continuations\r
11        irc.client irc.client.private irc.messages\r
12        irc.ui.commandparser irc.ui.load ;\r
13 \r
14 RENAME: join sequences => sjoin\r
15 \r
16 IN: irc.ui\r
17 \r
18 SYMBOL: listener\r
19 \r
20 SYMBOL: client\r
21 \r
22 TUPLE: ui-window < tabbed client ;\r
23 \r
24 M: ui-window ungraft*\r
25     client>> terminate-irc ;\r
26 \r
27 TUPLE: irc-tab < frame listener client window ;\r
28 \r
29 : write-color ( str color -- )\r
30     foreground associate format ;\r
31 : dark-red T{ rgba f 0.5 0.0 0.0 1 } ;\r
32 : dark-green T{ rgba f 0.0 0.5 0.0 1 } ;\r
33 \r
34 : dot-or-parens ( string -- string )\r
35     [ "." ]\r
36     [ "(" prepend ")" append ] if-empty ;\r
37 \r
38 GENERIC: write-irc ( irc-message -- )\r
39 \r
40 M: ping write-irc\r
41     drop "* Ping" blue write-color ;\r
42 \r
43 M: privmsg write-irc\r
44     "<" blue write-color\r
45     [ irc-message-sender write ] keep\r
46     "> " blue write-color\r
47     trailing>> write ;\r
48 \r
49 M: notice write-irc\r
50     [ type>> blue write-color ] keep\r
51     ": " blue write-color\r
52     trailing>> write ;\r
53 \r
54 TUPLE: own-message message nick timestamp ;\r
55 \r
56 : <own-message> ( message nick -- own-message )\r
57     now own-message boa ;\r
58 \r
59 M: own-message write-irc\r
60     "<" blue write-color\r
61     [ nick>> bold font-style associate format ] keep\r
62     "> " blue write-color\r
63     message>> write ;\r
64 \r
65 M: join write-irc\r
66     "* " dark-green write-color\r
67     irc-message-sender write\r
68     " has entered the channel." dark-green write-color ;\r
69 \r
70 M: part write-irc\r
71     "* " dark-red write-color\r
72     [ irc-message-sender write ] keep\r
73     " has left the channel" dark-red write-color\r
74     trailing>> dot-or-parens dark-red write-color ;\r
75 \r
76 M: quit write-irc\r
77     "* " dark-red write-color\r
78     [ irc-message-sender write ] keep\r
79     " has left IRC" dark-red write-color\r
80     trailing>> dot-or-parens dark-red write-color ;\r
81 \r
82 M: kick write-irc\r
83     "* " dark-red write-color\r
84     [ irc-message-sender write ] keep\r
85     " has kicked " dark-red write-color\r
86     [ who>> write ] keep\r
87     " from the channel" dark-red write-color\r
88     trailing>> dot-or-parens dark-red write-color ;\r
89 \r
90 : full-mode ( message -- mode )\r
91     parameters>> rest " " sjoin ;\r
92 \r
93 M: mode write-irc\r
94     "* " blue write-color\r
95     [ irc-message-sender write ] keep\r
96     " has applied mode " blue write-color\r
97     [ full-mode write ] keep\r
98     " to " blue write-color\r
99     channel>> write ;\r
100 \r
101 M: nick write-irc\r
102     "* " blue write-color\r
103     [ irc-message-sender write ] keep\r
104     " is now known as " blue write-color\r
105     trailing>> write ;\r
106 \r
107 M: unhandled write-irc\r
108     "UNHANDLED: " write\r
109     line>> blue write-color ;\r
110 \r
111 M: irc-end write-irc\r
112     drop "* You have left IRC" dark-red write-color ;\r
113 \r
114 M: irc-disconnected write-irc\r
115     drop "* Disconnected" dark-red write-color ;\r
116 \r
117 M: irc-connected write-irc\r
118     drop "* Connected" dark-green write-color ;\r
119 \r
120 M: irc-listener-end write-irc\r
121     drop ;\r
122 \r
123 M: irc-message write-irc\r
124     drop ; ! catch all unimplemented writes, THIS WILL CHANGE    \r
125 \r
126 GENERIC: time-happened ( message -- timestamp )\r
127 \r
128 M: irc-message time-happened timestamp>> ;\r
129 \r
130 M: object time-happened drop now ;\r
131 \r
132 : print-irc ( irc-message -- )\r
133     [ time-happened timestamp>hms write " " write ]\r
134     [ write-irc nl ] bi ;\r
135 \r
136 : send-message ( message -- )\r
137     [ print-irc ]\r
138     [ listener get write-message ] bi ;\r
139 \r
140 GENERIC: handle-inbox ( tab message -- )\r
141 \r
142 : value-labels ( assoc val -- seq )\r
143     '[ nip _ = ] assoc-filter keys sort-strings [ <label> ] map ;\r
144 \r
145 : add-gadget-color ( pack seq color -- pack )\r
146     '[ _ >>color add-gadget ] each ;\r
147 \r
148 M: object handle-inbox\r
149     nip print-irc ;\r
150 \r
151 : display ( stream tab -- )\r
152     '[ _ [ [ t ]\r
153            [ _ dup listener>> read-message handle-inbox ]\r
154            [  ] while ] with-output-stream ] "ircv" spawn drop ;\r
155 \r
156 : <irc-pane> ( tab -- tab pane )\r
157     <scrolling-pane>\r
158     [ <pane-stream> swap display ] 2keep ;\r
159 \r
160 TUPLE: irc-editor < editor outstream tab ;\r
161 \r
162 : <irc-editor> ( tab pane -- tab editor )\r
163     irc-editor new-editor\r
164     swap <pane-stream> >>outstream ;\r
165 \r
166 : editor-send ( irc-editor -- )\r
167     { [ outstream>> ]\r
168       [ [ irc-tab? ] find-parent ]\r
169       [ editor-string ]\r
170       [ "" swap set-editor-string ] } cleave\r
171      '[ _ irc-tab set _ parse-message ] with-output-stream ;\r
172 \r
173 irc-editor "general" f {\r
174     { T{ key-down f f "RET" } editor-send }\r
175     { T{ key-down f f "ENTER" } editor-send }\r
176 } define-command-map\r
177 \r
178 : new-irc-tab ( listener ui-window class -- irc-tab )\r
179     new-frame\r
180     swap >>window\r
181     swap >>listener\r
182     <irc-pane> [ <scroller> @center grid-add ] keep\r
183     <irc-editor> <scroller> @bottom grid-add ;\r
184 \r
185 M: irc-tab graft*\r
186     [ listener>> ] [ window>> client>> ] bi add-listener ;\r
187 \r
188 M: irc-tab ungraft*\r
189     [ listener>> ] [ window>> client>> ] bi remove-listener ;\r
190 \r
191 TUPLE: irc-channel-tab < irc-tab userlist ;\r
192 \r
193 : <irc-channel-tab> ( listener ui-window -- irc-tab )\r
194     irc-channel-tab new-irc-tab\r
195     <pile> [ <scroller> @right grid-add ] keep >>userlist ;\r
196 \r
197 : update-participants ( tab -- )\r
198     [ userlist>> [ clear-gadget ] keep ]\r
199     [ listener>> participants>> ] bi\r
200     [ +operator+ value-labels dark-green add-gadget-color ]\r
201     [ +voice+ value-labels blue add-gadget-color ]\r
202     [ +normal+ value-labels black add-gadget-color ] tri drop ;\r
203 \r
204 M: participant-changed handle-inbox\r
205     drop update-participants ;\r
206 \r
207 TUPLE: irc-server-tab < irc-tab ;\r
208 \r
209 : <irc-server-tab> ( listener -- irc-tab )\r
210     f irc-server-tab new-irc-tab ;\r
211 \r
212 : <irc-nick-tab> ( listener ui-window -- irc-tab )\r
213     irc-tab new-irc-tab ;\r
214 \r
215 M: irc-tab pref-dim*\r
216     drop { 480 480 } ;\r
217 \r
218 : join-channel ( name ui-window -- )\r
219     [ dup <irc-channel-listener> ] dip\r
220     [ <irc-channel-tab> swap ] keep\r
221     add-page ;\r
222 \r
223 : query-nick ( nick ui-window -- )\r
224     [ dup <irc-nick-listener> ] dip\r
225     [ <irc-nick-tab> swap ] keep\r
226     add-page ;\r
227 \r
228 : irc-window ( ui-window -- )\r
229     [ ]\r
230     [ client>> profile>> server>> ] bi\r
231     open-window ;\r
232 \r
233 : ui-connect ( profile -- ui-window )\r
234     <irc-client>\r
235     { [ [ <irc-server-listener> ] dip add-listener ]\r
236       [ listeners>> +server-listener+ swap at <irc-server-tab> dup\r
237         "Server" associate ui-window new-tabbed [ swap (>>window) ] keep ]\r
238       [ >>client ]\r
239       [ connect-irc ] } cleave ;\r
240 \r
241 : server-open ( server port nick password channels -- )\r
242     [ <irc-profile> ui-connect [ irc-window ] keep ] dip\r
243     [ over join-channel ] each drop ;\r
244 \r
245 : main-run ( -- ) run-ircui ;\r
246 \r
247 MAIN: main-run\r