package addon.steam;
import bashoid.Addon;
import bashoid.Message;
import java.util.*;
import utils.WebPage;
public class Steam extends Addon {
private static final String ENCODING = "UTF-8";
private static boolean containsOnlyDigits(String str) {
if (str == null || str.length() == 0)
return false;
for (int i = 0; i < str.length(); i++)
if (!Character.isDigit(str.charAt(i)))
return false;
return true;
}
private String extractParameterValue(String str, String parameterName) {
int paraIdx = str.indexOf("\""+parameterName+"\"");
if (paraIdx < 0)
return "";
int startIdx = str.indexOf(":", paraIdx)+1;
if (startIdx <= -1)
return "";
String value;
int endIdx = str.indexOf("\"", startIdx+1);
if (endIdx <= -1)
value = str.substring(startIdx);
else
value = str.substring(startIdx, endIdx);
value = value.replaceAll("\"", "");
return value;
}
public String loadGames(String profileId, String parameters) throws Exception {
String url = "http://steamcommunity.com/";
if (containsOnlyDigits(profileId))
url += "profiles/";
else
url += "id/";
url += profileId + "/" + parameters;
WebPage page = WebPage.loadWebPage(url, ENCODING);
String pageContent = page.getContent();
int lineIdx = pageContent.indexOf("var rgGames");
if (lineIdx <= -1) {
reaction.add("Invalid profile!");
return null;
}
int startIdx = pageContent.indexOf("[", lineIdx)+1;
int endIdx = pageContent.indexOf("];", startIdx);
String gamesString = pageContent.substring(startIdx, endIdx);
// chop first and last char
gamesString = gamesString.substring(1, gamesString.length()-1);
return gamesString;
}
public String[] getGamesData(String gamesString) {
return gamesString.split("\\},\\{");
}
public List<String> parseGamesData(String gamesString, String parameter) {
List<String> games = new ArrayList<>();
String[] data = getGamesData(gamesString);
for (String str : data)
games.add(extractParameterValue(str, parameter));
return games;
}
public String SelectRandomGame(String profileId) throws Exception {
String gamesString = loadGames(profileId, "games?tab=all");
List<String> games = parseGamesData(gamesString, "name");
int gamePosition = new Random().nextInt(games.size());
return games.get(gamePosition);
}
public String SelectMostPlayedWeek(String profileId) throws Exception {
String gamesString = loadGames(profileId, "games?tab=recent");
List<String> games = parseGamesData(gamesString, "name");
List<String> hours = parseGamesData(gamesString, "hours");
List<String> hours_ever = parseGamesData(gamesString, "hours_forever");
return "Game: " + games.get(0) + ", Played in last two weeks: " + hours.get(0) + "h, Total played: " + hours_ever.get(0) + "h";
}
public String SelectMostPlayedEver(String profileId) throws Exception {
String gamesString = loadGames(profileId, "games?tab=all");
List<String> games = parseGamesData(gamesString, "name");
List<String> hours_ever = parseGamesData(gamesString, "hours_forever");
return "Game: " + games.get(0) + " Total played: " + hours_ever.get(0) + "h";
}
public String GetGamesCount(String profileId) throws Exception {
String gamesString = loadGames(profileId, "games?tab=all");
List<String> games = parseGamesData(gamesString, "name");
return Integer.toString(games.size());
}
public String GetPlayedWeek(String profileId) throws Exception {
String gamesString = loadGames(profileId, "games?tab=recent");
List<String> games = parseGamesData(gamesString, "hours");
float total = 0;
for (String str : games) {
try {
total += Float.parseFloat(str);
}
catch(Exception e) {
System.out.println(str);
}
}
return Float.toString(total)+"h";
}
public String GetPlayedEver(String profileId) throws Exception {
String gamesString = loadGames(profileId, "games?tab=all");
List<String> games = parseGamesData(gamesString, "hours_forever");
float total = 0;
for (String str : games) {
try {
total += Float.parseFloat(str);
}
catch(Exception e) {
System.out.println(str);
}
}
return Float.toString(total)+"h";
}
@Override
public boolean shouldReact(Message message) {
return message.text.startsWith("steam ") && message.text.split(" ").length == 3;
}
@Override
protected void setReaction(Message message) {
try {
String[] messageParts = message.text.split(" ");
String profileId = messageParts[1];
String result;
switch (messageParts[2]) {
case "random": result = SelectRandomGame(profileId); break;
case "most_week": result = SelectMostPlayedWeek(profileId); break;
case "most_ever": result = SelectMostPlayedEver(profileId); break;
case "count": result = GetGamesCount(profileId); break;
case "played_ever": result = GetPlayedEver(profileId); break;
case "played_week": result = GetPlayedWeek(profileId); break;
default: result = "Co?"; break;
}
reaction.add( result );
} catch (Exception e) {
System.out.println(e);
setError("Cannot load given URL.", e);
}
}
}