cschell
8/16/2016 - 3:49 PM

This script queries the RIOT-API for the last game of a summoner

This script queries the RIOT-API for the last game of a summoner

# Usage: ruby last_game.rb <summoner_name> <na/euw/...>

require "net/http"
require "json"
require "date"

# TODO: Insert your own key here!
API_KEY = "<YOUR-RIOT-API-KEY-HERE>"

@summoner_name = ARGV[0]
@region = ARGV[1] || "euw"

class Summoner < Struct.new(:name, :region)
  def summoner_id
    standardized_summoner_name = name.downcase.gsub(" ", "")
    @summoner_id ||= get_from_api("/api/lol/#{region}/v1.4/summoner/by-name/#{standardized_summoner_name}")
      .fetch(standardized_summoner_name)
      .fetch("id")
  end

  def recent_game
    @recent_game ||= get_from_api("/api/lol/#{region}/v1.3/game/by-summoner/#{summoner_id}/recent")["games"].first
  end

  def print_recent_game_info
    infos = {
      date: Time.at(recent_game["createDate"] / 1000)
                .strftime("%Y-%m-%d (%H:%M)"),
      summoner: name,
      outcome: recent_game["stats"]["win"] ? "won" : "lost",
      game_type: recent_game["subType"],
      game_mode: recent_game["gameMode"]
    }

    p "On %{date} %{summoner} %{outcome} his last game, " \
          "which was a %{game_type} (%{game_mode})" % infos
  end

  private

  def get_from_api(path)
    uri = URI(URI.join("https://#{region}.api.pvp.net", path) + "?api_key=#{API_KEY}")

    http = Net::HTTP.new(uri.hostname, uri.port)
    http.use_ssl = true

    response = http.request(Net::HTTP::Get.new(uri, _header = {'Content-Type' =>'application/json'}))

    case response
    when Net::HTTPSuccess
      return JSON.parse(response.body)
    when Net::HTTPNotFound
      raise "Couldn't find the record, maybe you misspelled something?"
    else
      raise "An error occurred while processing #{path}
           Response #{response.code} #{response.message}:
          #{response.body}"
    end
  end
end

summoner = Summoner.new(@summoner_name, @region)
summoner.print_recent_game_info