irc.client: correctly handle multiple name-replys
							parent
							
								
									3eee17f7a4
								
							
						
					
					
						commit
						ee22964c49
					
				|  | @ -169,6 +169,20 @@ M: mb-writer dispose drop ; | |||
|   ] unit-test | ||||
| ] with-irc | ||||
| 
 | ||||
| [ { H{ { "factorbot" +operator+ } { "ircuser" +normal+ } } } [ | ||||
|       "#factortest" <irc-channel-chat> | ||||
|           H{ { "ircuser" +normal+ } } clone >>participants | ||||
|       [ %add-named-chat ] keep | ||||
|       ":ircserver.net 353 factorbot @ #factortest :@factorbot " %push-line | ||||
|       ":ircserver.net 353 factorbot @ #factortest :ircuser2 " %push-line | ||||
|       ":ircserver.net 366 factorbot #factortest :End of /NAMES list." %push-line | ||||
|       ":ircserver.net 353 factorbot @ #factortest :@factorbot " %push-line | ||||
|       ":ircserver.net 353 factorbot @ #factortest :ircuser " %push-line | ||||
|       ":ircserver.net 366 factorbot #factortest :End of /NAMES list." %push-line | ||||
|       participants>> | ||||
|   ] unit-test | ||||
| ] with-irc | ||||
| 
 | ||||
| ! Namelist change notification | ||||
| [ { T{ participant-changed f f f f } } [ | ||||
|       "#factortest" <irc-channel-chat> [ %add-named-chat ] keep | ||||
|  |  | |||
|  | @ -32,7 +32,7 @@ TUPLE: irc-client profile stream in-messages out-messages | |||
| 
 | ||||
| TUPLE: irc-chat in-messages client ; | ||||
| TUPLE: irc-server-chat < irc-chat ; | ||||
| TUPLE: irc-channel-chat < irc-chat name password timeout participants ; | ||||
| TUPLE: irc-channel-chat < irc-chat name password timeout participants clean-participants ; | ||||
| TUPLE: irc-nick-chat < irc-chat name ; | ||||
| SYMBOL: +server-chat+ | ||||
| 
 | ||||
|  | @ -55,7 +55,7 @@ SYMBOL: +nick+ | |||
|      <mailbox> f irc-server-chat boa ; | ||||
| 
 | ||||
| : <irc-channel-chat> ( name -- irc-channel-chat ) | ||||
|      [ <mailbox> f ] dip f 60 seconds H{ } clone | ||||
|      [ <mailbox> f ] dip f 60 seconds H{ } clone t | ||||
|      irc-channel-chat boa ; | ||||
| 
 | ||||
| : <irc-nick-chat> ( name -- irc-nick-chat ) | ||||
|  | @ -246,12 +246,24 @@ M: mode process-message ( mode -- ) | |||
|     trailing>> [ blank? ] trim " " split | ||||
|     [ >nick/mode 2array ] map >hashtable ; | ||||
| 
 | ||||
| : maybe-clean-participants ( channel-chat -- ) | ||||
|     dup clean-participants>> [ | ||||
|         H{ } clone >>participants f >>clean-participants | ||||
|     ] when drop ; | ||||
| 
 | ||||
| M: names-reply process-message | ||||
|     [ names-reply>participants ] [ channel>> chat> ] bi [ | ||||
|         [ (>>participants) ] | ||||
|         [ [ f f f <participant-changed> ] dip name>> to-chat ] bi | ||||
|         [ maybe-clean-participants ]  | ||||
|         [ participants>> 2array assoc-combine ] | ||||
|         [ (>>participants) ] tri | ||||
|     ] [ drop ] if* ; | ||||
| 
 | ||||
| M: end-of-names process-message | ||||
|     channel>> chat> [ | ||||
|         t >>clean-participants | ||||
|         [ f f f <participant-changed> ] dip name>> to-chat | ||||
|     ] when* ; | ||||
| 
 | ||||
| ! ====================================== | ||||
| ! Client message handling | ||||
| ! ====================================== | ||||
|  |  | |||
|  | @ -20,6 +20,7 @@ TUPLE: nick-in-use < irc-message name ; | |||
| TUPLE: notice < irc-message type ; | ||||
| TUPLE: mode < irc-message name mode parameter ; | ||||
| TUPLE: names-reply < irc-message who channel ; | ||||
| TUPLE: end-of-names < irc-message who channel ; | ||||
| TUPLE: unhandled < irc-message ; | ||||
| 
 | ||||
| : <irc-client-message> ( command parameters trailing -- irc-message ) | ||||
|  | @ -85,6 +86,9 @@ M: nick-in-use >>command-parameters ( nick-in-use params -- nick-in-use ) | |||
| M: names-reply >>command-parameters ( names-reply params -- names-reply ) | ||||
|     first3 nip [ >>who ] [ >>channel ] bi* ; | ||||
| 
 | ||||
| M: end-of-names >>command-parameters ( names-reply params -- names-reply ) | ||||
|     first2 [ >>who ] [ >>channel ] bi* ; | ||||
| 
 | ||||
| M: mode >>command-parameters ( mode params -- mode ) | ||||
|     dup length 3 = [ | ||||
|         first3 [ >>name ] [ >>mode ] [ >>parameter ] tri* | ||||
|  | @ -159,6 +163,7 @@ M: sender-in-prefix irc-message-sender ( sender-in-prefix -- sender ) | |||
|             { "001"     [ logged-in ] } | ||||
|             { "433"     [ nick-in-use ] } | ||||
|             { "353"     [ names-reply ] } | ||||
|             { "366"     [ end-of-names ] } | ||||
|             { "JOIN"    [ join ] } | ||||
|             { "PART"    [ part ] } | ||||
|             { "NICK"    [ nick ] } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue