{ "someuser" } [ "someuser!n=user@some.where" parse-name ] unit-test
-irc-message new
- ":someuser!n=user@some.where PRIVMSG #factortest :hi" >>line
- "someuser!n=user@some.where" >>prefix
- "PRIVMSG" >>command
- { "#factortest" } >>parameters
- "hi" >>trailing
-1array
+{ T{ irc-message
+ { line ":someuser!n=user@some.where PRIVMSG #factortest :hi" }
+ { prefix "someuser!n=user@some.where" }
+ { command "PRIVMSG" }
+ { parameters { "#factortest" } }
+ { trailing "hi" } } }
[ ":someuser!n=user@some.where PRIVMSG #factortest :hi"
string>irc-message f >>timestamp ] unit-test
-privmsg new
- ":someuser!n=user@some.where PRIVMSG #factortest :hi" >>line
- "someuser!n=user@some.where" >>prefix
- "PRIVMSG" >>command
- { "#factortest" } >>parameters
- "hi" >>trailing
- "#factortest" >>name
-1array
+{ T{ privmsg
+ { line ":someuser!n=user@some.where PRIVMSG #factortest :hi" }
+ { prefix "someuser!n=user@some.where" }
+ { command "PRIVMSG" }
+ { parameters { "#factortest" } }
+ { trailing "hi" }
+ { name "#factortest" } } }
[ ":someuser!n=user@some.where PRIVMSG #factortest :hi"
parse-irc-line f >>timestamp ] unit-test
-join new
- ":someuser!n=user@some.where JOIN :#factortest" >>line
- "someuser!n=user@some.where" >>prefix
- "JOIN" >>command
- { } >>parameters
- "#factortest" >>trailing
-1array
+{ T{ join
+ { line ":someuser!n=user@some.where JOIN :#factortest" }
+ { prefix "someuser!n=user@some.where" }
+ { command "JOIN" }
+ { parameters { } }
+ { trailing "#factortest" } } }
[ ":someuser!n=user@some.where JOIN :#factortest"
parse-irc-line f >>timestamp ] unit-test
-mode new
- ":ircserver.net MODE #factortest +ns" >>line
- "ircserver.net" >>prefix
- "MODE" >>command
- { "#factortest" "+ns" } >>parameters
- "#factortest" >>channel
- "+ns" >>mode
-1array
+{ T{ mode
+ { line ":ircserver.net MODE #factortest +ns" }
+ { prefix "ircserver.net" }
+ { command "MODE" }
+ { parameters { "#factortest" "+ns" } }
+ { channel "#factortest" }
+ { mode "+ns" } } }
[ ":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
+{ T{ mode
+ { line ":ircserver.net MODE #factortest +o someuser" }
+ { prefix "ircserver.net" }
+ { command "MODE" }
+ { parameters { "#factortest" "+o" "someuser" } }
+ { channel "#factortest" }
+ { mode "+o" }
+ { parameter "someuser" } } }
+[ ":ircserver.net MODE #factortest +o someuser"
+ parse-irc-line f >>timestamp ] unit-test
+
+{ T{ mode
+ { line ":ircserver.net MODE someuser +i" }
+ { prefix "ircserver.net" }
+ { command "MODE" }
+ { parameters { "someuser" "+i" } }
+ { nickname "someuser" }
+ { mode "+i" } } }
+[ ":ircserver.net MODE someuser +i"
+ parse-irc-line f >>timestamp ] unit-test
+
+{ T{ nick
+ { line ":someuser!n=user@some.where NICK :someuser2" }
+ { prefix "someuser!n=user@some.where" }
+ { command "NICK" }
+ { parameters { } }
+ { trailing "someuser2" } } }
[ ":someuser!n=user@some.where NICK :someuser2"
parse-irc-line f >>timestamp ] unit-test
\ No newline at end of file
TUPLE: roomlist < irc-message channel names ;
TUPLE: nick-in-use < irc-message asterisk name ;
TUPLE: notice < irc-message type ;
-TUPLE: mode < irc-message channel mode ;
+TUPLE: mode < irc-message channel mode nickname parameter ;
TUPLE: names-reply < irc-message who channel ;
TUPLE: unhandled < irc-message ;
<PRIVATE
+: channel? ( string -- ? )
+ first "#&" member? ;
+
GENERIC: command-string>> ( irc-message -- string )
M: irc-message command-string>> ( irc-message -- string ) command>> ;
M: notice (>>command-parameters) ( params notice -- ) >r first r> (>>type) ;
M: kick (>>command-parameters) ( params kick -- )
>r first2 r> [ (>>who) ] [ (>>channel) ] bi ;
-M: mode (>>command-parameters) ( params mode -- )
- >r first2 r> [ (>>mode) ] [ (>>channel) ] bi ; ! FIXME
M: names-reply (>>command-parameters) ( params names-reply -- )
[ >r first r> (>>who) ] [ >r third r> (>>channel) ] 2bi ;
+M: mode (>>command-parameters) ( params mode -- )
+ over first channel? [
+ over length 3 = [
+ >r first3 r> [ (>>parameter) ] [ (>>mode) ] [ (>>channel) ] tri
+ ] [
+ >r first2 r> [ (>>mode) ] [ (>>channel) ] bi
+ ] if
+ ] [
+ >r first2 r> [ (>>mode) ] [ (>>nickname) ] bi
+ ] if ;
PRIVATE>
: split-trailing ( string -- string string/f )
":" split1 ;
-: copy-contents ( origin dest -- )
+: copy-message-in ( origin dest -- )
{ [ >r parameters>> r> [ (>>command-parameters) ] [ (>>parameters) ] 2bi ]
[ >r line>> r> (>>line) ]
[ >r prefix>> r> (>>prefix) ]
: parse-irc-line ( string -- message )
string>irc-message
dup command>> {
- { "PING" [ ping new ] }
- { "NOTICE" [ notice new ] }
- { "001" [ logged-in new ] }
- { "433" [ nick-in-use new ] }
- { "353" [ names-reply new ] }
- { "JOIN" [ join new ] }
- { "PART" [ part new ] }
- { "NICK" [ nick new ] }
- { "PRIVMSG" [ privmsg new ] }
- { "QUIT" [ quit new ] }
- { "MODE" [ mode new ] }
- { "KICK" [ kick new ] }
- [ drop unhandled new ]
- } case
- [ copy-contents ] keep ;
+ { "PING" [ ping ] }
+ { "NOTICE" [ notice ] }
+ { "001" [ logged-in ] }
+ { "433" [ nick-in-use ] }
+ { "353" [ names-reply ] }
+ { "JOIN" [ join ] }
+ { "PART" [ part ] }
+ { "NICK" [ nick ] }
+ { "PRIVMSG" [ privmsg ] }
+ { "QUIT" [ quit ] }
+ { "MODE" [ mode ] }
+ { "KICK" [ kick ] }
+ [ drop unhandled ]
+ } case new [ copy-message-in ] keep ;