defmodule Blol do @riot_api_key Application.get_env(:blol, :riot_api_key) @doc """ Get Summoner by name. ## Examples iex> Blol.get_summoner_by_name("caitlyn", "br1") %{ "accountId" => "EPXpLpLBYnmqfJR-RZkoK_FK6NaV7SgRM5H7iigrV-mdABAKoB3ZcNva", "id" => "Su0Vun3PT1aqBjAAA-Fycpgh4vueW0f7Zm-NuRBfQ8oH8unX4STe8-xZtQ", "name" => "Caitlyn", "profileIconId" => 3542, "puuid" => "TPdUJh2qog5cavQueDks0CyFq9AqNM0unj5lZuwoM8YutmmPMbs7D0r7ZcerPrrz8rs_NRuijKOB9Q", "revisionDate" => 1628245913000, "summonerLevel" => 30 } """ def get_summoner_by_name(name, region) do HTTPoison.get!("https://#{region}.api.riotgames.com/lol/summoner/v4/summoners/by-name/#{name}?api_key=#{@riot_api_key}") |> Map.get(:body) |> Poison.decode! end @doc """ Get Summoner matches. ## Examples iex> Blol.get_summoner_matches("caitlyn", "br1", 5) ["BR1_2298956627", "BR1_2298915613", "BR1_2298934053", "BR1_2298932595", "BR1_2298931318"] """ def get_summoner_matches(name, region, limit) do puuid = get_summoner_by_name(name, region) |> Map.get("puuid") HTTPoison.get!("https://americas.api.riotgames.com/lol/match/v5/matches/by-puuid/#{puuid}/ids?start=0&count=#{limit}&api_key=#{@riot_api_key}") |> Map.get(:body) |> Poison.decode! end @doc """ Gets participants from summoner's previous matches and returns a list of maps with name and puuids. ## Examples iex> Blol.get_summoner_participants("caitlyn", "br1", 1) [ %{ matches_played: [], name: "Antielialil", puuid: "9bkwL40M-4ZE3_HHAdUwftBuTsac3s8tW9zFFRIy_ZEcTs9CAxupfp5QuKCC895HzgEXl1yuyPzy1w" }, %{ matches_played: [], name: "Sanctum Slayer", puuid: "qXjYyajWGV33iX3lNnnAPfupBZAYMDVUkiWWxKIveGuX-q2SO2gTeTaHZ1VoZF74Qk5HZ1jebj7cnA" }, %{ matches_played: [], name: "Rerdy", puuid: "9ytv_KhGgTewyMf4ImFjXe9bBNHPGjodf1fOTNHO9llTzXgBZv_tegd4iAD4VsLOfsZ5f6U8duBwVw" }, %{ matches_played: [], name: "Ehadhodl", puuid: "OFXE2uAnsHOo2oQHSYFdf3bsG9fzowWiu8ykSJCrh_VDyOeEqSjaz1OXpHCfn4DhtdvekXeTJ0TDLQ" }, %{ matches_played: [], name: "Pernaeliu", puuid: "TPdUJh2qog5cavQueDks0CyFq9AqNM0unj5lZuwoM8YutmmPMbs7D0r7ZcerPrrz8rs_NRuijKOB9Q" }, %{matches_played: [], name: "Ezreal", puuid: "BOT"}, %{matches_played: [], name: "Nasus", puuid: "BOT"}, %{matches_played: [], name: "Ryze", puuid: "BOT"}, %{matches_played: [], name: "Alistar", puuid: "BOT"}, %{matches_played: [], name: "Galio", puuid: "BOT"} ] """ def get_summoner_participants(name, region, limit) do get_summoner_matches(name, region, limit) |> Enum.map(fn match -> HTTPoison.get!("https://americas.api.riotgames.com/lol/match/v5/matches/#{match}?api_key=#{@riot_api_key}") |> Map.get(:body) |> Poison.decode! |> Enum.find_value(fn participants -> elem(participants, 1) |> Map.get("participants") |> Enum.map(fn participant -> name = Map.get(participant, "summonerName") puuid = Map.get(participant, "puuid") %{ puuid: puuid, name: name, matches_played: [] } end) end) end) |> List.flatten |> Enum.uniq end @doc """ Lists summoners participants and monitors them for new matches every minute for 1 hour. ## Examples iex> Blol.monitor_summoner_matches("caitlyn", "br1", 5) ["Antielialil", "Sanctum Slayer", "Rerdy", "Ehadhodl", "Pernaeliu", "Gaurrars", "Uballodenth", "Jertarun", "Einglent", "Cathesmaurie", "Valak1z", "Inalisha", "the GazettE", "Osarabrit", "Inthermar", "Jezekoand", "Dikoxo", "Yneanereth", "Inanneevi", "uxsna", "Sievadenysal"] """ def monitor_summoner_matches(name, region, limit) do summoners = get_summoner_participants(name, region, limit) |> Enum.filter(&Map.get(&1, :puuid) !== "BOT") start_time = System.system_time(:second) {:ok, pid} = GenServer.start_link(Blol.Monitor, {start_time, summoners}) :timer.kill_after(3_600_000, pid) # kill after 1 hour (3_600_000) summoners |> Enum.map(&Map.get(&1, :name)) end @doc false def check_summoner_matches(state) do limit = 1 start_time = elem(state, 0) summoners = state |> elem(1) summoners |> Enum.map(fn summoner -> puuid = Map.get(summoner, :puuid) name = Map.get(summoner, :name) HTTPoison.get!("https://americas.api.riotgames.com/lol/match/v5/matches/by-puuid/#{puuid}/ids?startTime=#{start_time}&start=0&count=#{limit}&api_key=#{@riot_api_key}") |> Map.get(:body) |> Poison.decode! |> case do [] -> update_matches_played(summoners, name, '') match_id -> matches_played = update_matches_played(summoners, name, "Summoner #{name} completed match #{match_id}") Map.get(matches_played, :matches_played) |> List.first |> IO.inspect() matches_played end end) end defp update_matches_played(summoners, name, msg) do Enum.find_value(summoners, fn summoner -> if summoner[:name] == name do Map.update!(summoner, :matches_played, fn matches_played -> [msg | matches_played] |> List.flatten |> Enum.uniq end) end end) end end