import std.algorithm.searching : canFind; import std.algorithm.comparison : equal; import std.array : array; import std.range : only, takeNone; import virc.ircsplitter : IRCSplitter; { auto namReply = parseNumeric!(Numeric.RPL_NAMREPLY)(IRCSplitter("someone = #channel :User1 User2 @User3 +User4")); assert(namReply.get.chanFlag == NamReplyFlag.public_); assert(namReply.get.channel == "#channel"); auto users = namReply.get.users(['o': '@', 'v': '+']); with(users.front) { assert(modes.equal("")); assert(name == "User1"); } users.popFront(); with(users.front) { assert(modes.equal("")); assert(name == "User2"); } users.popFront(); with(users.front) { assert(modes.equal("o")); assert(name == "User3"); } users.popFront(); with(users.front) { assert(modes.equal("v")); assert(name == "User4"); } } { immutable namReply = parseNumeric!(Numeric.RPL_NAMREPLY)(IRCSplitter("someone = #channel")); assert(namReply.isNull); } { immutable namReply = parseNumeric!(Numeric.RPL_NAMREPLY)(IRCSplitter("someone =")); assert(namReply.isNull); } { immutable namReply = parseNumeric!(Numeric.RPL_NAMREPLY)(IRCSplitter("someone")); assert(namReply.isNull); } { immutable namReply = parseNumeric!(Numeric.RPL_NAMREPLY)(takeNone(only(""))); assert(namReply.isNull); }
Parser for RPL_NAMREPLY
Format is 353 <client> =/*/@ <channel> :<prefix[es]><usermask>[ <prefix[es]><usermask>...]