factor/unmaintained/irc-ui/ui.factor

251 lines
6.8 KiB
Factor
Raw Normal View History

! Copyright (C) 2008 William Schlieper
! See http://factorcode.org/license.txt for BSD license.
USING: accessors kernel threads combinators concurrency.mailboxes
2008-08-02 15:54:02 -04:00
sequences strings hashtables splitting fry assocs hashtables colors
sorting unicode.collation math.order
2008-07-14 20:53:08 -04:00
ui ui.gadgets ui.gadgets.panes ui.gadgets.editors
ui.gadgets.scrollers ui.commands ui.gadgets.frames ui.gestures
ui.gadgets.tabs ui.gadgets.grids ui.gadgets.packs ui.gadgets.labels
2008-07-28 21:02:05 -04:00
io io.styles namespaces calendar calendar.format models continuations
irc.client irc.client.private irc.messages
2008-12-07 04:06:52 -05:00
irc.ui.commandparser irc.ui.load vocabs.loader classes prettyprint ;
2008-07-28 21:02:05 -04:00
RENAME: join sequences => sjoin
IN: irc.ui
SYMBOL: chat
2008-07-14 20:53:08 -04:00
SYMBOL: client
2008-08-11 01:22:26 -04:00
TUPLE: ui-window < tabbed client ;
2008-08-14 00:52:29 -04:00
M: ui-window ungraft*
client>> terminate-irc ;
TUPLE: irc-tab < frame chat client window ;
2008-07-16 19:33:33 -04:00
: write-color ( str color -- )
foreground associate format ;
CONSTANT: dark-red T{ rgba f 0.5 0.0 0.0 1 }
CONSTANT: dark-green T{ rgba f 0.0 0.5 0.0 1 }
CONSTANT: dark-blue T{ rgba f 0.0 0.0 0.5 1 }
2008-07-14 20:53:08 -04:00
: dot-or-parens ( string -- string )
2008-09-06 18:15:25 -04:00
[ "." ]
[ "(" prepend ")" append ] if-empty ;
GENERIC: write-irc ( irc-message -- )
M: ping write-irc
drop "* Ping" blue write-color ;
M: privmsg write-irc
2008-12-07 04:06:52 -05:00
"<" dark-blue write-color
[ irc-message-sender write ] keep
2008-12-07 04:06:52 -05:00
"> " dark-blue write-color
trailing>> write ;
M: notice write-irc
2008-12-07 04:06:52 -05:00
[ type>> dark-blue write-color ] keep
": " dark-blue write-color
trailing>> write ;
2008-07-11 17:11:03 -04:00
TUPLE: own-message message nick timestamp ;
: <own-message> ( message nick -- own-message )
now own-message boa ;
M: own-message write-irc
2008-12-07 04:06:52 -05:00
"<" dark-blue write-color
2008-07-11 17:11:03 -04:00
[ nick>> bold font-style associate format ] keep
2008-12-07 04:06:52 -05:00
"> " dark-blue write-color
2008-07-11 17:11:03 -04:00
message>> write ;
M: join write-irc
2008-08-02 15:54:02 -04:00
"* " dark-green write-color
irc-message-sender write
2008-08-02 15:54:02 -04:00
" has entered the channel." dark-green write-color ;
M: part write-irc
2008-08-02 15:54:02 -04:00
"* " dark-red write-color
[ irc-message-sender write ] keep
2008-08-02 15:54:02 -04:00
" has left the channel" dark-red write-color
trailing>> dot-or-parens dark-red write-color ;
M: quit write-irc
2008-08-02 15:54:02 -04:00
"* " dark-red write-color
[ irc-message-sender write ] keep
2008-08-02 15:54:02 -04:00
" has left IRC" dark-red write-color
trailing>> dot-or-parens dark-red write-color ;
2008-08-04 15:44:40 -04:00
M: kick write-irc
"* " dark-red write-color
[ irc-message-sender write ] keep
2008-08-04 15:44:40 -04:00
" has kicked " dark-red write-color
[ who>> write ] keep
" from the channel" dark-red write-color
trailing>> dot-or-parens dark-red write-color ;
2008-07-16 19:33:33 -04:00
M: mode write-irc
2008-12-07 04:06:52 -05:00
"* " dark-blue write-color
[ name>> write ] keep
" has applied mode " dark-blue write-color
[ mode>> write ] keep
" to " dark-blue write-color
parameter>> write ;
2008-07-16 19:33:33 -04:00
2008-08-03 13:21:32 -04:00
M: nick write-irc
2008-12-07 04:06:52 -05:00
"* " dark-blue write-color
[ irc-message-sender write ] keep
2008-08-03 13:21:32 -04:00
" is now known as " blue write-color
trailing>> write ;
2008-07-28 21:02:05 -04:00
M: unhandled write-irc
"UNHANDLED: " write
2008-12-07 04:06:52 -05:00
line>> dark-blue write-color ;
2008-07-28 21:02:05 -04:00
M: irc-end write-irc
2008-08-02 15:54:02 -04:00
drop "* You have left IRC" dark-red write-color ;
M: irc-disconnected write-irc
2008-08-02 15:54:02 -04:00
drop "* Disconnected" dark-red write-color ;
M: irc-connected write-irc
2008-08-02 15:54:02 -04:00
drop "* Connected" dark-green write-color ;
M: irc-chat-end write-irc
2008-07-28 21:02:05 -04:00
drop ;
M: irc-message write-irc
2008-12-07 04:06:52 -05:00
"UNIMPLEMENTED" write
[ class pprint ] keep
": " write
line>> dark-blue write-color ;
2008-08-14 01:24:56 -04:00
GENERIC: time-happened ( message -- timestamp )
M: irc-message time-happened timestamp>> ;
M: object time-happened drop now ;
2008-07-28 21:02:05 -04:00
: print-irc ( irc-message -- )
2008-07-28 21:02:05 -04:00
[ time-happened timestamp>hms write " " write ]
2008-07-11 17:11:03 -04:00
[ write-irc nl ] bi ;
2008-07-14 20:53:08 -04:00
: send-message ( message -- )
[ print-irc ]
[ chat get speak ] bi ;
2008-07-16 19:33:33 -04:00
GENERIC: handle-inbox ( tab message -- )
2008-08-03 13:21:32 -04:00
: value-labels ( assoc val -- seq )
2008-09-10 23:11:40 -04:00
'[ nip _ = ] assoc-filter keys sort-strings [ <label> ] map ;
2008-08-03 13:21:32 -04:00
: add-gadget-color ( pack seq color -- pack )
2008-09-10 23:11:40 -04:00
'[ _ >>color add-gadget ] each ;
2008-07-16 19:33:33 -04:00
M: object handle-inbox
nip print-irc ;
: display ( stream tab -- )
2008-09-10 23:11:40 -04:00
'[ _ [ [ t ]
[ _ dup chat>> hear handle-inbox ]
while ] with-output-stream ] "ircv" spawn drop ;
2008-07-16 19:33:33 -04:00
: <irc-pane> ( tab -- tab pane )
<scrolling-pane>
2008-07-16 19:33:33 -04:00
[ <pane-stream> swap display ] 2keep ;
2008-08-11 01:22:26 -04:00
TUPLE: irc-editor < editor outstream tab ;
2008-07-16 19:33:33 -04:00
: <irc-editor> ( tab pane -- tab editor )
2008-08-11 01:22:26 -04:00
irc-editor new-editor
swap <pane-stream> >>outstream ;
: editor-send ( irc-editor -- )
{ [ outstream>> ]
2008-08-11 01:22:26 -04:00
[ [ irc-tab? ] find-parent ]
2008-07-14 20:53:08 -04:00
[ editor-string ]
[ "" swap set-editor-string ] } cleave
2008-09-10 23:11:40 -04:00
'[ _ irc-tab set _ parse-message ] with-output-stream ;
irc-editor "general" f {
{ T{ key-down f f "RET" } editor-send }
{ T{ key-down f f "ENTER" } editor-send }
} define-command-map
: new-irc-tab ( chat ui-window class -- irc-tab )
2008-08-11 01:22:26 -04:00
new-frame
swap >>window
swap >>chat
2008-07-25 13:34:41 -04:00
<irc-pane> [ <scroller> @center grid-add ] keep
<irc-editor> <scroller> @bottom grid-add ;
2008-07-16 19:33:33 -04:00
2008-08-11 01:22:26 -04:00
M: irc-tab graft*
[ chat>> ] [ window>> client>> ] bi attach-chat ;
2008-08-11 01:22:26 -04:00
M: irc-tab ungraft*
2008-10-06 16:56:54 -04:00
chat>> detach-chat ;
2008-08-11 01:22:26 -04:00
TUPLE: irc-channel-tab < irc-tab userlist ;
: <irc-channel-tab> ( chat ui-window -- irc-tab )
2008-08-14 01:24:56 -04:00
irc-channel-tab new-irc-tab
<pile> [ <scroller> @right grid-add ] keep >>userlist ;
2008-07-14 20:53:08 -04:00
2008-08-14 00:52:29 -04:00
: update-participants ( tab -- )
[ userlist>> [ clear-gadget ] keep ]
[ chat>> participants>> ] bi
2008-08-14 00:52:29 -04:00
[ +operator+ value-labels dark-green add-gadget-color ]
[ +voice+ value-labels blue add-gadget-color ]
[ +normal+ value-labels black add-gadget-color ] tri drop ;
M: participant-changed handle-inbox
drop update-participants ;
2008-08-11 01:22:26 -04:00
TUPLE: irc-server-tab < irc-tab ;
2008-07-14 20:53:08 -04:00
: <irc-server-tab> ( chat -- irc-tab )
2008-08-11 01:22:26 -04:00
f irc-server-tab new-irc-tab ;
2008-07-14 20:53:08 -04:00
: <irc-nick-tab> ( chat ui-window -- irc-tab )
2008-08-11 01:22:26 -04:00
irc-tab new-irc-tab ;
M: irc-tab pref-dim*
drop { 480 480 } ;
: join-channel ( name ui-window -- )
[ dup <irc-channel-chat> ] dip
2008-07-16 19:33:33 -04:00
[ <irc-channel-tab> swap ] keep
2008-08-11 01:22:26 -04:00
add-page ;
: query-nick ( nick ui-window -- )
[ dup <irc-nick-chat> ] dip
2008-08-11 01:22:26 -04:00
[ <irc-nick-tab> swap ] keep
add-page ;
: irc-window ( ui-window -- )
2008-08-11 01:22:26 -04:00
[ ]
[ client>> profile>> server>> ] bi
open-window ;
: ui-connect ( profile -- ui-window )
2008-08-11 01:22:26 -04:00
<irc-client>
{ [ [ <irc-server-chat> ] dip attach-chat ]
[ chats>> +server-chat+ swap at <irc-server-tab> dup
2008-08-11 01:22:26 -04:00
"Server" associate ui-window new-tabbed [ swap (>>window) ] keep ]
[ >>client ]
[ connect-irc ] } cleave ;
: server-open ( server port nick password channels -- )
[ <irc-profile> ui-connect [ irc-window ] keep ] dip
[ over join-channel ] each drop ;
: main-run ( -- ) run-ircui ;
MAIN: main-run
2008-11-24 01:57:31 -05:00
"irc.ui.commands" require