module AsyncDuel
Public Instance Methods
Source
# File lib/async_duel.rb, line 47 def accept(game:, user:) return { error: "No pending challenge." } unless game && game["stage"] == "lobby" return { error: "That challenge is not for you." } unless GameStore.same_nick?(user, game["target"]) game = game.dup game["stage"] = "active" { game: game } end
Source
# File lib/async_duel.rb, line 30 def challenge(game:, challenger:, target:, channel_users:) normalized_target = GameStore.norm_nick(target) unless channel_users.any? { |nick| GameStore.same_nick?(nick, normalized_target) } return { error: "#{target} is not in this channel." } end return { error: "You cannot challenge yourself." } if GameStore.same_nick?(challenger, target) { game: { "stage" => "lobby", "challenger" => GameStore.norm_nick(challenger), "target" => normalized_target, "turn" => GameStore.norm_nick(challenger) } } end
Source
# File lib/async_duel.rb, line 56 def decline(game:, user:) return { error: "No pending challenge." } unless game && game["stage"] == "lobby" return { error: "That challenge is not for you." } unless GameStore.same_nick?(user, game["target"]) { cleared: true } end
Source
# File lib/async_duel.rb, line 67 def opponent(game, user) if GameStore.same_nick?(user, game["challenger"]) game["target"] else game["challenger"] end end
Source
# File lib/async_duel.rb, line 8 def parse_base(text, usage:) parts = text.to_s.strip.split(/\s+/) return { action: :help } if parts.empty? case parts[0].downcase when "help" { action: :help } when "challenge" return { error: usage } if parts.length < 2 { action: :challenge, target: parts[1] } when "accept" { action: :accept } when "decline" { action: :decline } when "status" { action: :status } else { action: :unknown, tail: parts } end end
Source
# File lib/async_duel.rb, line 63 def player?(game, user) GameStore.same_nick?(user, game["challenger"]) || GameStore.same_nick?(user, game["target"]) end