] unit-test
! Participants lists tests
-{ H{ { "somedude" f } } } [
+{ H{ { "somedude" +normal+ } } } [
{ ":somedude!n=user@isp.net JOIN :#factortest" } make-client
{ [ "factorbot" set-nick ]
[ listeners>>
} cleave
] unit-test
-{ H{ { "somedude2" f } } } [
+{ H{ { "somedude2" +normal+ } } } [
{ ":somedude!n=user@isp.net PART #factortest" } make-client
{ [ "factorbot" set-nick ]
[ listeners>>
[ "#factortest" [ <irc-channel-listener>
- H{ { "somedude2" f }
- { "somedude" f } } clone >>participants ] keep
+ H{ { "somedude2" +normal+ }
+ { "somedude" +normal+ } } clone >>participants ] keep
] dip set-at ]
[ connect-irc ]
[ drop 0.1 seconds sleep ]
} cleave
] unit-test
-{ H{ { "somedude2" f } } } [
+{ H{ { "somedude2" +normal+ } } } [
{ ":somedude!n=user@isp.net QUIT" } make-client
{ [ "factorbot" set-nick ]
[ listeners>>
[ "#factortest" [ <irc-channel-listener>
- H{ { "somedude2" f }
- { "somedude" f } } clone >>participants ] keep
+ H{ { "somedude2" +normal+ }
+ { "somedude" +normal+ } } clone >>participants ] keep
] dip set-at ]
[ connect-irc ]
[ drop 0.1 seconds sleep ]
} cleave
] unit-test
-{ H{ { "somedude2" f } } } [
+{ H{ { "somedude2" +normal+ } } } [
{ ":somedude2!n=user2@isp.net KICK #factortest somedude" } make-client
{ [ "factorbot" set-nick ]
[ listeners>>
[ "#factortest" [ <irc-channel-listener>
- H{ { "somedude2" f }
- { "somedude" f } } clone >>participants ] keep
+ H{ { "somedude2" +normal+ }
+ { "somedude" +normal+ } } clone >>participants ] keep
] dip set-at ]
[ connect-irc ]
[ drop 0.1 seconds sleep ]
[ terminate-irc ]
} cleave
] unit-test
+
+! Namelist notification
+{ T{ participant-changed f f f } } [
+ { ":ircserver.net 353 factorbot @ #factortest :@factorbot "
+ ":ircserver.net 366 factorbot #factortest :End of /NAMES list." } make-client
+ { [ "factorbot" set-nick ]
+ [ listeners>>
+ [ "#factortest" [ <irc-channel-listener> ] keep ] dip set-at ]
+ [ connect-irc ]
+ [ drop 0.1 seconds sleep ]
+ [ listeners>> [ "#factortest" ] dip at [ read-message drop ] [ read-message ] bi ]
+ [ terminate-irc ]
+ } cleave
+ ] unit-test
\ No newline at end of file
M: join handle-incoming-irc ( join -- )
{ [ maybe-forward-join ]
[ dup trailing>> to-listener ]
- [ [ drop f ] [ prefix>> parse-name ] [ trailing>> ] tri add-participant ]
+ [ [ drop +normal+ ] [ prefix>> parse-name ] [ trailing>> ] tri add-participant ]
[ handle-participant-change ]
} cleave ;
[ >nick/mode 2array ] map >hashtable ;
M: names-reply handle-incoming-irc ( names-reply -- )
- [ names-reply>participants ] [ channel>> listener> ] bi
- [ (>>participants) ] [ drop ] if* ;
+ [ names-reply>participants ] [ channel>> listener> ] bi [
+ [ (>>participants) ]
+ [ [ f f <participant-changed> ] dip name>> to-listener ] bi
+ ] [ drop ] if* ;
M: irc-broadcasted-message handle-incoming-irc ( irc-broadcasted-message -- )
broadcast-message-to-listeners ;
"ircserver.net" >>prefix
"MODE" >>command
{ "#factortest" "+ns" } >>parameters
- "#factortest" >>channel
+ "#factortest" >>channel
"+ns" >>mode
1array
[ ":ircserver.net MODE #factortest +ns"
+ parse-irc-line f >>timestamp ] unit-test
+
+nick new
+ ":someuser!n=user@some.where NICK :someuser2" >>line
+ "someuser!n=user@some.where" >>prefix
+ "NICK" >>command
+ { } >>parameters
+ "someuser2" >>trailing
+1array
+[ ":someuser!n=user@some.where NICK :someuser2"
parse-irc-line f >>timestamp ] unit-test
\ No newline at end of file
TUPLE: join < irc-message ;
TUPLE: part < irc-message channel ;
TUPLE: quit < irc-message ;
+TUPLE: nick < irc-message ;
TUPLE: privmsg < irc-message name ;
TUPLE: kick < irc-message channel who ;
TUPLE: roomlist < irc-message channel names ;
M: join irc-command-string ( join -- string ) drop "JOIN" ;
M: part irc-command-string ( part -- string ) drop "PART" ;
M: quit irc-command-string ( quit -- string ) drop "QUIT" ;
+M: nick irc-command-string ( nick -- string ) drop "NICK" ;
M: privmsg irc-command-string ( privmsg -- string ) drop "PRIVMSG" ;
M: notice irc-command-string ( notice -- string ) drop "NOTICE" ;
M: mode irc-command-string ( mode -- string ) drop "MODE" ;
M: join irc-command-parameters ( join -- seq ) drop { } ;
M: part irc-command-parameters ( part -- seq ) name>> 1array ;
M: quit irc-command-parameters ( quit -- seq ) drop { } ;
+M: nick irc-command-parameters ( nick -- seq ) drop { } ;
M: privmsg irc-command-parameters ( privmsg -- seq ) name>> 1array ;
M: notice irc-command-parameters ( norice -- seq ) type>> 1array ;
M: kick irc-command-parameters ( kick -- seq )
{ "353" [ names-reply ] }
{ "JOIN" [ join ] }
{ "PART" [ part ] }
+ { "NICK" [ nick ] }
{ "PRIVMSG" [ privmsg ] }
{ "QUIT" [ quit ] }
{ "MODE" [ mode ] }