irc.client: More robust reconnection

db4
Bruno Deferrari 2009-04-16 21:35:26 -03:00
parent 2c46304c75
commit 34ec9af2ad
2 changed files with 31 additions and 23 deletions

View File

@ -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 ;

View File

@ -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 ;