irc.messages: Handle mode messages better, tests
parent
3de7739403
commit
50e5ffa594
|
@ -6,54 +6,70 @@ IN: irc.messages.tests
|
|||
|
||||
{ "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
|
|
@ -18,7 +18,7 @@ TUPLE: kick < irc-message channel who ;
|
|||
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 ;
|
||||
|
||||
|
@ -28,6 +28,9 @@ TUPLE: unhandled < irc-message ;
|
|||
|
||||
<PRIVATE
|
||||
|
||||
: channel? ( string -- ? )
|
||||
first "#&" member? ;
|
||||
|
||||
GENERIC: command-string>> ( irc-message -- string )
|
||||
|
||||
M: irc-message command-string>> ( irc-message -- string ) command>> ;
|
||||
|
@ -65,10 +68,18 @@ M: privmsg (>>command-parameters) ( params privmsg -- ) >r first r> (>>name) ;
|
|||
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>
|
||||
|
||||
|
@ -110,7 +121,7 @@ M: irc-message irc-message>server-line ( irc-message -- string )
|
|||
: 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) ]
|
||||
|
@ -134,18 +145,17 @@ M: sender-in-prefix irc-message-sender ( sender-in-prefix -- sender )
|
|||
: 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 ;
|
||||
|
|
Loading…
Reference in New Issue