package net.jrtechs.www.SteamAPI;
|
|
|
|
import net.jrtechs.www.server.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.Map;
|
|
|
|
/**
|
|
* Class which is used to pull information from the Steam 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 = "http://api.steampowered.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/";
|
|
|
|
/** 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");
|
|
}
|
|
|
|
|
|
/**
|
|
* 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<>();
|
|
|
|
try
|
|
{
|
|
String apiData = "";
|
|
try
|
|
{
|
|
apiData = WebScraper
|
|
.getWebsite(this.baseURL + this.friendListURL +
|
|
this.apiKey + "&steamid=" + steamid);
|
|
}
|
|
catch (SteamConnectionException e)
|
|
{
|
|
switch (e.getError())
|
|
{
|
|
case RESTRICTED:
|
|
{
|
|
//This is fine
|
|
System.out.println("Private profile: " + steamid);
|
|
return friendsId;
|
|
}
|
|
case CONNECTION:
|
|
{
|
|
//spooky 500 error :(
|
|
new APIThrottler().wait(120);
|
|
|
|
try
|
|
{
|
|
apiData = WebScraper
|
|
.getWebsite(this.baseURL + this.friendListURL +
|
|
this.apiKey + "&steamid=" + steamid);
|
|
}
|
|
catch (SteamConnectionException exception2)
|
|
{
|
|
throw new Exception("Everything is dead");
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
new JSONObject(apiData)
|
|
.getJSONObject("friendslist")
|
|
.getJSONArray("friends").toList()
|
|
.forEach(f->
|
|
friendsId.add(((HashMap<String, String>)(f)).get("steamid"))
|
|
);
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
ex.printStackTrace();
|
|
System.exit(-1);
|
|
}
|
|
|
|
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 Map<String, String> getNames(List<String> ids)
|
|
{
|
|
System.out.println(ids);
|
|
Map<String, String> map = new HashMap<>();
|
|
|
|
while(!ids.isEmpty())
|
|
{
|
|
String queryUrl = baseURL + playerInfoURL + apiKey + "&steamids=";
|
|
|
|
int remove = (ids.size() > 100) ? 100 : ids.size();
|
|
|
|
for(int i = 0; i < remove; i++)
|
|
{
|
|
queryUrl = queryUrl + "," + ids.remove(0);
|
|
}
|
|
|
|
System.out.println(queryUrl);
|
|
JSONArray names;
|
|
try
|
|
{
|
|
names = new JSONObject(WebScraper.getWebsite(queryUrl))
|
|
.getJSONObject("response").getJSONArray("players");
|
|
}
|
|
catch (SteamConnectionException ex)
|
|
{
|
|
//meh
|
|
return map;
|
|
}
|
|
|
|
for(int i = 0; i < names.length(); i++)
|
|
{
|
|
JSONObject player = names.getJSONObject(i);
|
|
|
|
if(player.has("steamid") && player.has("personaname"))
|
|
{
|
|
map.put(player.getString("steamid"),
|
|
player.getString("personaname"));
|
|
}
|
|
}
|
|
}
|
|
return map;
|
|
}
|
|
|
|
|
|
/**
|
|
* Wrapper for getNames which returns a list of players instead
|
|
* of a map from id's to names
|
|
*
|
|
* @param ids
|
|
* @return
|
|
*/
|
|
public List<Player> getFullPlayers(List<String> ids)
|
|
{
|
|
Map<String, String> map = this.getNames(ids);
|
|
|
|
List<Player> players = new ArrayList<>();
|
|
|
|
for(String id: map.keySet())
|
|
{
|
|
players.add(new Player(map.get(id),id));
|
|
}
|
|
|
|
return players;
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* Returns the name of the player with a specific steam id
|
|
*
|
|
* @param steamid the steam id of player
|
|
* @return
|
|
*/
|
|
public String getPlayerName(String steamid)
|
|
{
|
|
JSONObject response;
|
|
try
|
|
{
|
|
response = new JSONObject(WebScraper
|
|
.getWebsite(this.baseURL + this.playerInfoURL +
|
|
this.apiKey + "&steamids=" + steamid));
|
|
}
|
|
catch (SteamConnectionException ex)
|
|
{
|
|
return "";
|
|
}
|
|
|
|
|
|
if(response.has("response"))
|
|
{
|
|
response = response.getJSONObject("response");
|
|
if(response.has("players"))
|
|
{
|
|
JSONArray arr = response.getJSONArray("players");
|
|
if(arr.length() > 0)
|
|
{
|
|
return arr.getJSONObject(0).getString("personaname");
|
|
}
|
|
}
|
|
}
|
|
return null;
|
|
}
|
|
|
|
|
|
public static void main(String[] args)
|
|
{
|
|
APIConnection con = new APIConnection();
|
|
|
|
con.getFriends("76561198188400721").forEach(System.out::println);
|
|
|
|
System.out.println(con.getPlayerName("76561198188400721"));
|
|
}
|
|
}
|