irc.client: More robust reconnection
parent
2c46304c75
commit
34ec9af2ad
|
@ -33,7 +33,8 @@ TUPLE: irc-profile server port nickname password ;
|
||||||
C: <irc-profile> irc-profile
|
C: <irc-profile> irc-profile
|
||||||
|
|
||||||
TUPLE: irc-client profile stream in-messages out-messages
|
TUPLE: irc-client profile stream in-messages out-messages
|
||||||
chats is-running nick connect reconnect-time is-ready
|
chats is-running nick connect is-ready
|
||||||
|
reconnect-time reconnect-attempts
|
||||||
exceptions ;
|
exceptions ;
|
||||||
|
|
||||||
: <irc-client> ( profile -- irc-client )
|
: <irc-client> ( profile -- irc-client )
|
||||||
|
@ -43,8 +44,9 @@ TUPLE: irc-client profile stream in-messages out-messages
|
||||||
<mailbox> >>in-messages
|
<mailbox> >>in-messages
|
||||||
<mailbox> >>out-messages
|
<mailbox> >>out-messages
|
||||||
H{ } clone >>chats
|
H{ } clone >>chats
|
||||||
15 seconds >>reconnect-time
|
30 seconds >>reconnect-time
|
||||||
|
10 >>reconnect-attempts
|
||||||
V{ } clone >>exceptions
|
V{ } clone >>exceptions
|
||||||
[ <inet> latin1 <client> ] >>connect ;
|
[ <inet> latin1 <client> drop ] >>connect ;
|
||||||
|
|
||||||
SINGLETONS: irc-chat-end irc-end irc-disconnected irc-connected ;
|
SINGLETONS: irc-chat-end irc-end irc-disconnected irc-connected ;
|
||||||
|
|
|
@ -3,10 +3,17 @@
|
||||||
USING: accessors assocs arrays concurrency.mailboxes continuations destructors
|
USING: accessors assocs arrays concurrency.mailboxes continuations destructors
|
||||||
hashtables io irc.client.base irc.client.chats irc.messages kernel namespaces
|
hashtables io irc.client.base irc.client.chats irc.messages kernel namespaces
|
||||||
strings words.symbol irc.messages.base irc.client.participants fry threads
|
strings words.symbol irc.messages.base irc.client.participants fry threads
|
||||||
combinators irc.messages.parser ;
|
combinators irc.messages.parser math ;
|
||||||
EXCLUDE: sequences => join ;
|
EXCLUDE: sequences => join ;
|
||||||
IN: irc.client.internals
|
IN: irc.client.internals
|
||||||
|
|
||||||
|
: do-connect ( server port quot: ( host port -- stream ) attempts -- stream/f )
|
||||||
|
dup 0 > [
|
||||||
|
[ drop call( host port -- stream ) ]
|
||||||
|
[ drop 15 sleep 1- do-connect ]
|
||||||
|
recover
|
||||||
|
] [ 2drop 2drop f ] if ;
|
||||||
|
|
||||||
: /NICK ( nick -- ) "NICK " prepend irc-print ;
|
: /NICK ( nick -- ) "NICK " prepend irc-print ;
|
||||||
: /PONG ( text -- ) "PONG " prepend irc-print ;
|
: /PONG ( text -- ) "PONG " prepend irc-print ;
|
||||||
|
|
||||||
|
@ -15,18 +22,27 @@ IN: irc.client.internals
|
||||||
"USER " prepend " hostname servername :irc.factor" append irc-print ;
|
"USER " prepend " hostname servername :irc.factor" append irc-print ;
|
||||||
|
|
||||||
: /CONNECT ( server port -- stream )
|
: /CONNECT ( server port -- stream )
|
||||||
irc> connect>> call( host port -- stream local ) drop ;
|
irc> [ connect>> ] [ reconnect-attempts>> ] bi do-connect ;
|
||||||
|
|
||||||
: /JOIN ( channel password -- )
|
: /JOIN ( channel password -- )
|
||||||
[ " :" swap 3append ] when* "JOIN " prepend irc-print ;
|
[ " :" swap 3append ] when* "JOIN " prepend irc-print ;
|
||||||
|
|
||||||
|
: try-connect ( -- stream/f )
|
||||||
|
irc> profile>> [ server>> ] [ port>> ] bi /CONNECT ;
|
||||||
|
|
||||||
|
: (terminate-irc) ( -- )
|
||||||
|
irc> dup is-running>> [
|
||||||
|
f >>is-running
|
||||||
|
[ stream>> dispose ] keep
|
||||||
|
[ in-messages>> ] [ out-messages>> ] bi 2array
|
||||||
|
[ irc-end swap mailbox-put ] each
|
||||||
|
] [ drop ] if ;
|
||||||
|
|
||||||
: (connect-irc) ( -- )
|
: (connect-irc) ( -- )
|
||||||
irc> {
|
try-connect [
|
||||||
[ profile>> [ server>> ] [ port>> ] bi /CONNECT ]
|
[ irc> ] dip >>stream t >>is-running
|
||||||
[ (>>stream) ]
|
in-messages>> [ irc-connected ] dip mailbox-put
|
||||||
[ t swap (>>is-running) ]
|
] [ (terminate-irc) ] if* ;
|
||||||
[ in-messages>> [ irc-connected ] dip mailbox-put ]
|
|
||||||
} cleave ;
|
|
||||||
|
|
||||||
: (do-login) ( -- ) irc> nick>> /LOGIN ;
|
: (do-login) ( -- ) irc> nick>> /LOGIN ;
|
||||||
|
|
||||||
|
@ -92,9 +108,7 @@ M: irc-message handle-outgoing-irc irc-message>string irc-print t ;
|
||||||
|
|
||||||
: (handle-disconnect) ( -- )
|
: (handle-disconnect) ( -- )
|
||||||
irc-disconnected irc> in-messages>> mailbox-put
|
irc-disconnected irc> in-messages>> mailbox-put
|
||||||
irc> reconnect-time>> sleep
|
(connect-irc) (do-login) ;
|
||||||
(connect-irc)
|
|
||||||
(do-login) ;
|
|
||||||
|
|
||||||
: handle-disconnect ( error -- ? )
|
: handle-disconnect ( error -- ? )
|
||||||
[ irc> exceptions>> push ] when*
|
[ irc> exceptions>> push ] when*
|
||||||
|
@ -155,12 +169,4 @@ M: irc-channel-chat remove-chat
|
||||||
[ part new annotate-message irc-send ]
|
[ part new annotate-message irc-send ]
|
||||||
[ name>> unregister-chat ] bi ;
|
[ name>> unregister-chat ] bi ;
|
||||||
|
|
||||||
: (terminate-irc) ( -- )
|
|
||||||
irc> dup is-running>> [
|
|
||||||
f >>is-running
|
|
||||||
[ stream>> dispose ] keep
|
|
||||||
[ in-messages>> ] [ out-messages>> ] bi 2array
|
|
||||||
[ irc-end swap mailbox-put ] each
|
|
||||||
] [ drop ] if ;
|
|
||||||
|
|
||||||
: (speak) ( message irc-chat -- ) swap annotate-message irc-send ;
|
: (speak) ( message irc-chat -- ) swap annotate-message irc-send ;
|
Loading…
Reference in New Issue