package net.jrtechs.www.SteamAPI;
|
|
|
|
import net.jrtechs.www.model.Game;
|
|
import net.jrtechs.www.model.Player;
|
|
import net.jrtechs.www.utils.ConfigLoader;
|
|
|
|
import net.jrtechs.www.utils.WebScraper;
|
|
import net.jrtechs.www.webCrawler.APIThrottler;
|
|
import org.json.JSONArray;
|
|
import org.json.JSONObject;
|
|
|
|
import java.util.ArrayList;
|
|
import java.util.HashMap;
|
|
import java.util.List;
|
|
import java.util.stream.IntStream;
|
|
|
|
/**
|
|
* Class which is used to pull information from the Steam api
|
|
*
|
|
* Documentation at https://developer.valvesoftware.com/wiki/Steam_Web_API
|
|
*
|
|
* @author Jeffery Russell 5-26-18
|
|
*/
|
|
public class APIConnection
|
|
{
|
|
/** Base url to use for all queries to steam's api **/
|
|
private final String baseURL = "https://community.steam-api.com";
|
|
|
|
/** Path to use when getting info on a player from api **/
|
|
private final String playerInfoURL = "/ISteamUser/GetPlayerSummaries/v0002/";
|
|
|
|
private final String friendListURL = "/ISteamUser/GetFriendList/v0001/";
|
|
|
|
private final String gamesListURL = "/IPlayerService/GetOwnedGames/v0001/";
|
|
|
|
/** Path to conf file(from within the conf folder) **/
|
|
private final String confPath = "SteamAPIKey.json";
|
|
|
|
/** API key for steam's api - loaded from json conf file **/
|
|
private String apiKey;
|
|
|
|
|
|
/**
|
|
* Constructor for APIConnection which loads a config file
|
|
* and sets the api key to your Steam api key.
|
|
*/
|
|
public APIConnection()
|
|
{
|
|
ConfigLoader conf = new ConfigLoader(confPath);
|
|
|
|
apiKey = "?key=" + conf.getValue("api");
|
|
}
|
|
|
|
|
|
/**
|
|
* Makes a call to the steam api using the requested url and does
|
|
* some error handling where it will re-request data from the steam
|
|
* api if it simply throws an internal error.
|
|
*
|
|
* @param url address to download data with
|
|
* @return string of the data returned
|
|
*/
|
|
public String querySteamAPI(String url)
|
|
{
|
|
System.out.println(url);
|
|
boolean downloaded = false;
|
|
String apiData = "";
|
|
while(!downloaded)
|
|
{
|
|
try
|
|
{
|
|
apiData = WebScraper.getWebsite(url);
|
|
downloaded = true;
|
|
}
|
|
catch (SteamConnectionException e)
|
|
{
|
|
switch (e.getError())
|
|
{
|
|
case RESTRICTED:
|
|
{
|
|
//This is fine
|
|
System.out.println("Private profile: ");
|
|
System.out.println(url);
|
|
return "";
|
|
}
|
|
case CONNECTION:
|
|
{
|
|
//spooky 500 error :(
|
|
//I don't know why but, steam throws 1-3 of these per day
|
|
System.out.println("Spooky steam API error");
|
|
new APIThrottler().wait(30);
|
|
break;
|
|
}
|
|
case RATE_LIMITED:
|
|
{
|
|
//hasn't happened yet
|
|
System.out.println("Oof, we are being throttled");
|
|
new APIThrottler().wait(300);
|
|
break;
|
|
}
|
|
case FORBIDDEN:
|
|
{
|
|
System.out.println("Check your API key.");
|
|
System.exit(-1);
|
|
}
|
|
case BAD_REQUEST:
|
|
{
|
|
System.out.println("BAD REQUEST:");
|
|
System.out.println(url);
|
|
System.out.println("Please modify your query.");
|
|
return "";
|
|
}
|
|
}
|
|
}
|
|
}
|
|
return apiData;
|
|
}
|
|
|
|
|
|
public List<Game> getGames(String steamID)
|
|
{
|
|
List<Game> games = new ArrayList<>();
|
|
String apiData = this.querySteamAPI(this.baseURL + this.gamesListURL +
|
|
this.apiKey + "&steamid=" + steamID +
|
|
"&include_appinfo=true&include_played_free_games=true");
|
|
|
|
if(apiData.isEmpty())
|
|
return games;
|
|
|
|
JSONObject object = new JSONObject(apiData);
|
|
System.out.println(object);
|
|
|
|
if(object.has("response"))
|
|
{
|
|
JSONArray gamesJ = object.getJSONObject("response").getJSONArray("games");
|
|
IntStream.range(0, gamesJ.length()).forEach(i ->
|
|
games.add(new Game(gamesJ.getJSONObject(i))));
|
|
}
|
|
return games;
|
|
}
|
|
|
|
|
|
/**
|
|
* Returns a list of the UIDs of all the players friends
|
|
*
|
|
* @param steamid
|
|
* @return
|
|
*/
|
|
public List<String> getFriends(String steamid)
|
|
{
|
|
List<String> friendsId = new ArrayList<>();
|
|
|
|
String apiData = this.querySteamAPI(this.baseURL + this.friendListURL +
|
|
this.apiKey + "&steamid=" + steamid);
|
|
|
|
if(apiData.equals(""))
|
|
return friendsId; //private url
|
|
|
|
JSONObject object = new JSONObject(apiData);
|
|
System.out.println(object);
|
|
|
|
if(object.has("friendslist"))
|
|
{
|
|
object.getJSONObject("friendslist")
|
|
.getJSONArray("friends").toList()
|
|
.forEach(f->
|
|
friendsId.add(((HashMap<String, String>)(f)).get("steamid"))
|
|
);
|
|
}
|
|
else
|
|
{
|
|
return friendsId;
|
|
}
|
|
|
|
return friendsId;
|
|
}
|
|
|
|
|
|
/**
|
|
* returns a map from the steam id to the players name
|
|
*
|
|
* * tricky because we can only request up to 100 ids
|
|
* in one request
|
|
*
|
|
* @param ids
|
|
* @return
|
|
*/
|
|
public List<Player> getPlayers(List<String> ids)
|
|
{
|
|
System.out.println(ids);
|
|
List<Player> players = new ArrayList<>();
|
|
while(!ids.isEmpty())
|
|
{
|
|
StringBuilder queryUrl = new StringBuilder(baseURL + playerInfoURL + apiKey + "&steamids=");
|
|
|
|
int remove = Math.min(ids.size(), 100);
|
|
|
|
for(int i = 0; i < remove; i++)
|
|
{
|
|
queryUrl.append(",").append(ids.remove(0));
|
|
}
|
|
|
|
System.out.println(queryUrl);
|
|
JSONArray names;
|
|
|
|
String apiResult = this.querySteamAPI(queryUrl.toString());
|
|
|
|
if(apiResult.equals(""))
|
|
return players;
|
|
|
|
JSONObject object = new JSONObject(apiResult);
|
|
|
|
if(object.has("response"))
|
|
{
|
|
names = object.getJSONObject("response").getJSONArray("players");
|
|
}
|
|
else
|
|
{
|
|
//eh
|
|
return players;
|
|
}
|
|
|
|
for(int i = 0; i < names.length(); i++)
|
|
{
|
|
JSONObject player = names.getJSONObject(i);
|
|
|
|
if(player.has(Player.KEY_STEAM_ID) && player.has(Player.KEY_USERNAME))
|
|
{
|
|
players.add(transformToPlayer(player));
|
|
}
|
|
}
|
|
}
|
|
return players;
|
|
}
|
|
|
|
|
|
private Player transformToPlayer(JSONObject player)
|
|
{
|
|
String avatar = player.has(Player.KEY_AVATAR) ?
|
|
player.getString(Player.KEY_AVATAR) :
|
|
"";
|
|
String realName = player.has(Player.KEY_REAL_NAME) ?
|
|
player.getString(Player.KEY_REAL_NAME) :
|
|
"";
|
|
String id = player.getString(Player.KEY_STEAM_ID);
|
|
Integer timeCreated = player.has(Player.KEY_TIME_CREATED) ?
|
|
player.getInt(Player.KEY_TIME_CREATED) :
|
|
0;
|
|
String username = player.getString(Player.KEY_USERNAME);
|
|
return new Player(username, id, realName, timeCreated, avatar);
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* Returns the name of the player with a specific steam id
|
|
*
|
|
* @param steamid the steam id of player
|
|
* @return
|
|
*/
|
|
public Player getSingle(String steamid) throws SteamConnectionException
|
|
{
|
|
JSONObject response = new JSONObject(WebScraper
|
|
.getWebsite(this.baseURL + this.playerInfoURL +
|
|
this.apiKey + "&steamids=" + steamid));
|
|
|
|
if(response.has("response"))
|
|
{
|
|
response = response.getJSONObject("response");
|
|
if(response.has("players"))
|
|
{
|
|
JSONArray arr = response.getJSONArray("players");
|
|
|
|
if(arr.length() > 0)
|
|
{
|
|
return transformToPlayer(arr.getJSONObject(0));
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
|
|
public static void main(String[] args) throws SteamConnectionException
|
|
{
|
|
APIConnection con = new APIConnection();
|
|
|
|
//steam id of jrtechs
|
|
con.getFriends("76561198188400721").forEach(System.out::println);
|
|
|
|
//System.out.println(con.getSingle("76561198188400721"));
|
|
System.out.println(con.getGames("76561198188400721"));
|
|
}
|
|
}
|