class Challenge
Constants
- EXPIRE_SEC
- SUPPORTED_GAMES
Public Class Methods
Source
# File plugins/challenge.rb, line 38 def self.game_command(game:, bet:) case game when "blackjack" bet ? "blackjack new #{bet}" : "blackjack new 50" when "bingo" "bingo new" else game end end
Source
# File plugins/challenge.rb, line 26 def self.parse_challenge(text) parts = text.to_s.strip.split(/\s+/) return { error: usage_message } if parts.length < 2 nick = parts[0] game = parts[1].downcase return { error: usage_message } unless SUPPORTED_GAMES.include?(game) bet = parts[2]&.to_i { nick: nick, game: game, bet: bet } end
Source
# File plugins/challenge.rb, line 22 def self.usage_message "Usage: !challenge <nick> <game> [bet] | !accept | !decline" end
Public Instance Methods
Source
# File plugins/challenge.rb, line 85 def accept(m) handle_response(m, accepted: true) end
Source
# File plugins/challenge.rb, line 89 def decline(m) handle_response(m, accepted: false) end
Source
# File plugins/challenge.rb, line 49 def execute(m, args) unless m.channel m.reply "Challenges must be issued in a channel" return end parsed = self.class.parse_challenge(args) if parsed[:error] m.reply parsed[:error] return end target = m.channel.user_list.find { |user| user.nick.casecmp?(parsed[:nick]) } unless target m.reply "#{parsed[:nick]} is not in this channel" return end challenge = { "id" => SecureRandom.hex(4), "challenger" => m.user.nick, "target" => target.nick, "game" => parsed[:game], "bet" => parsed[:bet], "at" => RabbotDb.iso_time(Time.now) } ChallengeStore.save(network: bot.config.server, channel: m.channel.name, challenge: challenge) m.reply "#{target.nick}: #{m.user.nick} challenges you to #{parsed[:game]} — !accept or !decline (#{EXPIRE_SEC}s)" AsyncJob.run(label: "challenge_expire") do sleep EXPIRE_SEC current = ChallengeStore.get(network: bot.config.server, channel: m.channel.name) ChallengeStore.clear(network: bot.config.server, channel: m.channel.name) if current && current["id"] == challenge["id"] end end
Source
# File plugins/challenge.rb, line 93 def handle_response(m, accepted:) unless m.channel m.reply "Use !accept or !decline in a channel" return end challenge = ChallengeStore.get(network: bot.config.server, channel: m.channel.name) unless challenge m.reply "No pending challenge" return end unless challenge["target"].to_s.casecmp?(m.user.nick) m.reply "That challenge is not for you" return end ChallengeStore.clear(network: bot.config.server, channel: m.channel.name) if accepted command = self.class.game_command(game: challenge["game"], bet: challenge["bet"]) m.channel.send("!#{command}") m.reply "Challenge accepted — #{command}" else m.reply "Challenge declined" end end