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
 | 
					{ "someuser" } [ "someuser!n=user@some.where" parse-name ] unit-test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
irc-message new
 | 
					{ T{ irc-message
 | 
				
			||||||
    ":someuser!n=user@some.where PRIVMSG #factortest :hi" >>line
 | 
					     { line ":someuser!n=user@some.where PRIVMSG #factortest :hi" }
 | 
				
			||||||
    "someuser!n=user@some.where" >>prefix
 | 
					     { prefix "someuser!n=user@some.where" }
 | 
				
			||||||
                       "PRIVMSG" >>command
 | 
					     { command  "PRIVMSG" }
 | 
				
			||||||
               { "#factortest" } >>parameters
 | 
					     { parameters { "#factortest" } }
 | 
				
			||||||
                            "hi" >>trailing
 | 
					     { trailing "hi" } } }
 | 
				
			||||||
1array
 | 
					 | 
				
			||||||
[ ":someuser!n=user@some.where PRIVMSG #factortest :hi"
 | 
					[ ":someuser!n=user@some.where PRIVMSG #factortest :hi"
 | 
				
			||||||
  string>irc-message f >>timestamp ] unit-test
 | 
					  string>irc-message f >>timestamp ] unit-test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
privmsg new
 | 
					{ T{ privmsg
 | 
				
			||||||
    ":someuser!n=user@some.where PRIVMSG #factortest :hi" >>line
 | 
					     { line ":someuser!n=user@some.where PRIVMSG #factortest :hi" }
 | 
				
			||||||
    "someuser!n=user@some.where" >>prefix
 | 
					     { prefix  "someuser!n=user@some.where" }
 | 
				
			||||||
                       "PRIVMSG" >>command
 | 
					     { command "PRIVMSG" }
 | 
				
			||||||
               { "#factortest" } >>parameters
 | 
					     { parameters { "#factortest" } }
 | 
				
			||||||
                            "hi" >>trailing
 | 
					     { trailing "hi" }
 | 
				
			||||||
                   "#factortest" >>name
 | 
					     { name "#factortest" } } }
 | 
				
			||||||
1array
 | 
					 | 
				
			||||||
[ ":someuser!n=user@some.where PRIVMSG #factortest :hi"
 | 
					[ ":someuser!n=user@some.where PRIVMSG #factortest :hi"
 | 
				
			||||||
  parse-irc-line f >>timestamp ] unit-test
 | 
					  parse-irc-line f >>timestamp ] unit-test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
join new
 | 
					{ T{ join
 | 
				
			||||||
    ":someuser!n=user@some.where JOIN :#factortest" >>line
 | 
					     { line ":someuser!n=user@some.where JOIN :#factortest" }
 | 
				
			||||||
    "someuser!n=user@some.where" >>prefix
 | 
					     { prefix "someuser!n=user@some.where" }
 | 
				
			||||||
                          "JOIN" >>command
 | 
					     { command "JOIN" }
 | 
				
			||||||
                             { } >>parameters
 | 
					     { parameters { } }
 | 
				
			||||||
                   "#factortest" >>trailing
 | 
					     { trailing "#factortest" } } }
 | 
				
			||||||
1array
 | 
					 | 
				
			||||||
[ ":someuser!n=user@some.where JOIN :#factortest"
 | 
					[ ":someuser!n=user@some.where JOIN :#factortest"
 | 
				
			||||||
  parse-irc-line f >>timestamp ] unit-test
 | 
					  parse-irc-line f >>timestamp ] unit-test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
mode new
 | 
					{ T{ mode
 | 
				
			||||||
    ":ircserver.net MODE #factortest +ns" >>line
 | 
					     { line ":ircserver.net MODE #factortest +ns" }
 | 
				
			||||||
                          "ircserver.net" >>prefix
 | 
					     { prefix "ircserver.net" }
 | 
				
			||||||
                                   "MODE" >>command
 | 
					     { command "MODE" }
 | 
				
			||||||
                  { "#factortest" "+ns" } >>parameters
 | 
					     { parameters { "#factortest" "+ns" } }
 | 
				
			||||||
                            "#factortest" >>channel
 | 
					     { channel "#factortest" }
 | 
				
			||||||
                                    "+ns" >>mode
 | 
					     { mode "+ns" } } }
 | 
				
			||||||
1array
 | 
					 | 
				
			||||||
[ ":ircserver.net MODE #factortest +ns"
 | 
					[ ":ircserver.net MODE #factortest +ns"
 | 
				
			||||||
  parse-irc-line f >>timestamp ] unit-test
 | 
					  parse-irc-line f >>timestamp ] unit-test
 | 
				
			||||||
 | 
					
 | 
				
			||||||
nick new
 | 
					{ T{ mode
 | 
				
			||||||
    ":someuser!n=user@some.where NICK :someuser2" >>line
 | 
					     { line ":ircserver.net MODE #factortest +o someuser" }
 | 
				
			||||||
                     "someuser!n=user@some.where" >>prefix
 | 
					     { prefix "ircserver.net" }
 | 
				
			||||||
                                           "NICK" >>command
 | 
					     { command "MODE" }
 | 
				
			||||||
                                              { } >>parameters
 | 
					     { parameters { "#factortest" "+o" "someuser" } }
 | 
				
			||||||
                                      "someuser2" >>trailing
 | 
					     { channel "#factortest" }
 | 
				
			||||||
1array
 | 
					     { 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"
 | 
					[ ":someuser!n=user@some.where NICK :someuser2"
 | 
				
			||||||
  parse-irc-line f >>timestamp ] unit-test
 | 
					  parse-irc-line f >>timestamp ] unit-test
 | 
				
			||||||
| 
						 | 
					@ -18,7 +18,7 @@ TUPLE: kick < irc-message channel who ;
 | 
				
			||||||
TUPLE: roomlist < irc-message channel names ;
 | 
					TUPLE: roomlist < irc-message channel names ;
 | 
				
			||||||
TUPLE: nick-in-use < irc-message asterisk name ;
 | 
					TUPLE: nick-in-use < irc-message asterisk name ;
 | 
				
			||||||
TUPLE: notice < irc-message type ;
 | 
					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: names-reply < irc-message who channel ;
 | 
				
			||||||
TUPLE: unhandled < irc-message ;
 | 
					TUPLE: unhandled < irc-message ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -28,6 +28,9 @@ TUPLE: unhandled < irc-message ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<PRIVATE
 | 
					<PRIVATE
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					: channel? ( string -- ? )
 | 
				
			||||||
 | 
					    first "#&" member? ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
GENERIC: command-string>> ( irc-message -- string )
 | 
					GENERIC: command-string>> ( irc-message -- string )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
M: irc-message command-string>> ( irc-message -- string ) command>> ;
 | 
					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: notice  (>>command-parameters) ( params notice -- )  >r first r> (>>type) ;
 | 
				
			||||||
M: kick    (>>command-parameters) ( params kick -- )
 | 
					M: kick    (>>command-parameters) ( params kick -- )
 | 
				
			||||||
    >r first2 r> [ (>>who) ] [ (>>channel) ] bi ;
 | 
					    >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 -- )
 | 
					M: names-reply (>>command-parameters) ( params names-reply -- )
 | 
				
			||||||
    [ >r first r> (>>who) ] [ >r third r> (>>channel) ] 2bi ;
 | 
					    [ >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>
 | 
					PRIVATE>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -110,7 +121,7 @@ M: irc-message irc-message>server-line ( irc-message -- string )
 | 
				
			||||||
: split-trailing ( string -- string string/f )
 | 
					: split-trailing ( string -- string string/f )
 | 
				
			||||||
    ":" split1 ;
 | 
					    ":" split1 ;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
: copy-contents ( origin dest -- )
 | 
					: copy-message-in ( origin dest -- )
 | 
				
			||||||
    { [ >r parameters>> r> [ (>>command-parameters) ] [ (>>parameters) ] 2bi ]
 | 
					    { [ >r parameters>> r> [ (>>command-parameters) ] [ (>>parameters) ] 2bi ]
 | 
				
			||||||
      [ >r line>>       r> (>>line) ]
 | 
					      [ >r line>>       r> (>>line) ]
 | 
				
			||||||
      [ >r prefix>>     r> (>>prefix) ]
 | 
					      [ >r prefix>>     r> (>>prefix) ]
 | 
				
			||||||
| 
						 | 
					@ -134,18 +145,17 @@ M: sender-in-prefix irc-message-sender ( sender-in-prefix -- sender )
 | 
				
			||||||
: parse-irc-line ( string -- message )
 | 
					: parse-irc-line ( string -- message )
 | 
				
			||||||
    string>irc-message
 | 
					    string>irc-message
 | 
				
			||||||
    dup command>> {
 | 
					    dup command>> {
 | 
				
			||||||
        { "PING" [ ping new ] }
 | 
					        { "PING"    [ ping ] }
 | 
				
			||||||
        { "NOTICE" [ notice new ] }
 | 
					        { "NOTICE"  [ notice ] }
 | 
				
			||||||
        { "001" [ logged-in new ] }
 | 
					        { "001"     [ logged-in ] }
 | 
				
			||||||
        { "433" [ nick-in-use new ] }
 | 
					        { "433"     [ nick-in-use ] }
 | 
				
			||||||
        { "353" [ names-reply new ] }
 | 
					        { "353"     [ names-reply ] }
 | 
				
			||||||
        { "JOIN" [ join new ] }
 | 
					        { "JOIN"    [ join ] }
 | 
				
			||||||
        { "PART" [ part new ] }
 | 
					        { "PART"    [ part ] }
 | 
				
			||||||
        { "NICK" [ nick new ] }
 | 
					        { "NICK"    [ nick ] }
 | 
				
			||||||
        { "PRIVMSG" [ privmsg new ] }
 | 
					        { "PRIVMSG" [ privmsg ] }
 | 
				
			||||||
        { "QUIT" [ quit new ] }
 | 
					        { "QUIT"    [ quit ] }
 | 
				
			||||||
        { "MODE" [ mode new ] }
 | 
					        { "MODE"    [ mode ] }
 | 
				
			||||||
        { "KICK" [ kick new ] }
 | 
					        { "KICK"    [ kick ] }
 | 
				
			||||||
        [ drop unhandled new ]
 | 
					        [ drop unhandled ]
 | 
				
			||||||
    } case
 | 
					    } case new [ copy-message-in ] keep ;
 | 
				
			||||||
    [ copy-contents ] keep ;
 | 
					 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue