From: Daniel Moore Date: 2009-11-01T08:41:49+09:00 Subject: [QUIZ][SUMMARY] IRC Teams (#221) --000feaebab340b67d7047743b01a Content-Type: text/plain; charset=ISO-8859-1 This week's quiz was solved by Martin DeMello. Martin uses the [rif gem][1] to handle the nitty gritty details of IRC, like establishing a connection and sending and receiving messages. The `TeamBot#on_message` method receives the messages from the users and dispatches them to an instance of the Teams class. This is accomplished by simply splitting the the message that was sent and using the first part as the method to invoke. The first argument is always the player, which is taken from the message event's `nick` field. The rest of the message, if any, is passed as the remaining arguments. Let's look at a full pass through of the following sample message from user Bob: create ruby This will land in the bot's `on_message` method. The `event` will have "Bob" as the nick and "create ruby" as the message. That is parsed into the method to call and the arguments like so: msg, *args = event.message.split(" ") The `teams` object is then sent the parsed message arguments with the specified method as follows: *ret = teams.send(msg, player, *args) This takes us into the create method and the team is created (if all goes according to plan): def create(player, team) raise TeambotError("team #{team} already created") if teams[team] teams[team] = true "created team #{team}" end The other actions that users may wish to perform are taken care of in the same way. This simple and flexible solution allows for easy modification and extension. Thank you Martin for your solution (and also for the quiz suggestion)! [IRC Teams (#221) - Solutions][2] [1]: http://gitorious.org/ruby-irc [2]: http://rubyquiz.strd6.com/quizzes/221.tar.gz -- - Daniel http://rubyquiz.strd6.com/ --000feaebab340b67d7047743b01a Content-Type: application/x-gzip; name="221.tar.gz" Content-Disposition: attachment; filename="221.tar.gz" Content-Transfer-Encoding: base64 X-Attachment-Id: f_g1h0lra50 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 --000feaebab340b67d7047743b01a--