Browse Source

Inserted the game into the graph database

game_data
jrtechs 4 years ago
parent
commit
7c6b767102
3 changed files with 152 additions and 10 deletions
  1. +106
    -10
      src/main/java/net/jrtechs/www/graphDB/SteamGraph.java
  2. +38
    -0
      src/main/java/net/jrtechs/www/server/Game.java
  3. +8
    -0
      src/main/java/net/jrtechs/www/server/Player.java

+ 106
- 10
src/main/java/net/jrtechs/www/graphDB/SteamGraph.java View File

@ -1,13 +1,12 @@
package net.jrtechs.www.graphDB;
import net.jrtechs.www.SteamAPI.SteamConnectionException;
import net.jrtechs.www.server.Game;
import net.jrtechs.www.server.Player;
import net.jrtechs.www.SteamAPI.APIConnection;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
/**
@ -21,6 +20,7 @@ public class SteamGraph
public static String KEY_PLAYER = "player";
public static String KEY_CRAWLED_STATUS = "crawled";
public static String KEY_CRAWLED_GAME_STATUS = "crawled_game";
/** Connection to the graph server */
private GraphConnection con;
@ -73,6 +73,7 @@ public class SteamGraph
.addV(SteamGraph.KEY_PLAYER)
.property(Player.KEY_USERNAME, p.getName())
.property(SteamGraph.KEY_CRAWLED_STATUS, 0)
.property(SteamGraph.KEY_CRAWLED_GAME_STATUS, 0)
.property(Player.KEY_STEAM_ID, p.getId())
.property(Player.KEY_AVATAR, p.getAvatar())
.property(Player.KEY_REAL_NAME, p.getRealName())
@ -86,6 +87,44 @@ public class SteamGraph
}
}
private boolean gameAlreadyInGraph(Integer id)
{
return !con.getTraversal()
.V().hasLabel(Game.KEY_DB)
.has(Game.KEY_STEAM_GAME_ID, id)
.toList().isEmpty();
}
private void insertGameForPlayerToGraph(String id, Game g)
{
if(!gameAlreadyInGraph(g.getAppID()))// check if game is already in graph
{
//insert game into graph
this.con.getTraversal()
.addV(Game.KEY_DB)
.property(Game.KEY_STEAM_GAME_ID, g.getAppID())
.property(Game.KEY_GAME_NAME, g.getName())
.property(Game.KEY_GAME_ICON, g.getIcon())
.property(Game.KEY_GAME_LOGO, g.getLogo())
.id().next();
}
// insert connection from player to game
this.con.getTraversal()
.V()
.hasLabel(SteamGraph.KEY_PLAYER)
.has(Player.KEY_STEAM_ID, id)
.as("p")
.V().hasLabel(Game.KEY_DB)
.has(Game.KEY_STEAM_GAME_ID, g.getAppID())
.as("g")
.addE(Game.KEY_RELATIONSHIP)
.from("p").to("g")
.property(Game.KEY_PLAY_TIME, g.getTimePlayed())
.id().next();
}
/**
* Checks if a friend-friend edge is already in the
@ -122,7 +161,6 @@ public class SteamGraph
*/
private void insertEdgeIntoGraph(String p1, String p2)
{
try
{
if(!this.edgeAlreadyInGraph(p1, p2))
@ -154,14 +192,31 @@ public class SteamGraph
* @param id
* @return
*/
private boolean playerAlreadyIndexed(String id)
private boolean playerFriendsAlreadyIndexed(String id)
{
return playerPropertyIndexed(id, SteamGraph.KEY_CRAWLED_STATUS);
}
private boolean playerGamesAlreadyIndexed(String id)
{
return playerPropertyIndexed(id, SteamGraph.KEY_CRAWLED_GAME_STATUS);
}
/**
* determines if a player has been indexed yet
*
* @param id
* @return
*/
private boolean playerPropertyIndexed(String id, String key)
{
try
{
return this.con.getTraversal()
.V().hasLabel(SteamGraph.KEY_PLAYER)
.has(Player.KEY_STEAM_ID, id)
.has(SteamGraph.KEY_CRAWLED_STATUS, 0)
.has(key, 0)
.toList().isEmpty();
}
catch(Exception e)
@ -172,14 +227,26 @@ public class SteamGraph
}
private void updateCrawledStatus(String id)
private void updateCrawledStatusFriends(String id)
{
updateCrawledStatus(id, SteamGraph.KEY_CRAWLED_STATUS);
}
private void updateCrawledStatusGames(String id)
{
updateCrawledStatus(id, SteamGraph.KEY_CRAWLED_GAME_STATUS);
}
private void updateCrawledStatus(String id, String key)
{
try
{
this.con.getTraversal().V()
.hasLabel(SteamGraph.KEY_PLAYER)
.has(Player.KEY_STEAM_ID, id)
.property(SteamGraph.KEY_CRAWLED_STATUS, 1).id().next();
.property(key, 1).id().next();
}
catch (Exception e)
{
@ -223,6 +290,23 @@ public class SteamGraph
}};
}
private List<Game> getPlayerGamesFromGraph(String id)
{
System.out.println("fetching games from graph");
return new ArrayList<Game>()
{{
con.getTraversal().V()
.hasLabel(SteamGraph.KEY_PLAYER)
.has(Player.KEY_STEAM_ID, id)
.outE()
.inV()
.hasLabel(Game.KEY_DB)
.valueMap()
.toStream().forEach(r ->
add(new Game(r)));
}};
}
/**
* tells api to get this dude's friends list
@ -248,11 +332,21 @@ public class SteamGraph
friendsIds.forEach(s->
this.insertEdgeIntoGraph(id, s));
this.updateCrawledStatus(id);
this.updateCrawledStatusFriends(id);
this.con.commit();
}
private void indexPersonsGames(String id)
{
System.out.println("indexing games for " + id);
List<Game> games = this.api.getGames(id);
games.forEach(g -> insertGameForPlayerToGraph(id, g));
this.updateCrawledStatusGames(id);
this.con.commit();
}
/**
* Fetches a player from the graph with all of its friends
*
@ -265,7 +359,7 @@ public class SteamGraph
if(this.alreadyInGraph(id)) // yay
{
p = this.getPlayerFromGraph(id);
if(!this.playerAlreadyIndexed(id)) //must index the person
if(!this.playerFriendsAlreadyIndexed(id)) //must index the person
{
this.indexPersonFriends(id);
}
@ -309,8 +403,10 @@ public class SteamGraph
public static void main(String[] args)
{
SteamGraph graph = new SteamGraph();
graph.getPlayer("76561198068098265").getFriends().stream().forEach(System.out::println);
//graph.getPlayer("76561198068098265").getFriends().stream().forEach(System.out::println);
// graph.indexPersonFriends("76561198188400721");
//graph.indexPersonsGames("76561198068098265");
System.out.println(graph.getPlayerGamesFromGraph("76561198068098265"));
graph.close();
//
// Player base = graph.getPlayer(args[0]);

+ 38
- 0
src/main/java/net/jrtechs/www/server/Game.java View File

@ -4,6 +4,8 @@ package net.jrtechs.www.server;
import org.json.JSONObject;
import javax.json.JsonObject;
import java.util.List;
import java.util.Map;
/**
* Example URL: http://api.steampowered.com/IPlayerService/GetOwnedGames/v0001/?key=XXXXXXXXXXXXXXXXX&steamid=76561197960434622&format=json
@ -16,6 +18,8 @@ public class Game
public static String KEY_GAME_ICON = "img_icon_url";
public static String KEY_GAME_LOGO = "img_logo_url";
public static String KEY_RELATIONSHIP = "owns";
//other
public static String KEY_PLAY_TIME = "playtime_forever";
@ -35,6 +39,40 @@ public class Game
this.timePlayed = g.getInt(KEY_PLAY_TIME);
}
public Game(Map<String, Object> graph)
{
System.out.println(graph);
this.appID= (Integer)((List<Object>) graph.get(KEY_STEAM_GAME_ID)).get(0);
this.name = (String)((List<Object>) graph.get(KEY_GAME_NAME)).get(0);
this.icon = (String)((List<Object>) graph.get(KEY_GAME_ICON)).get(0);
this.logo = (String)((List<Object>) graph.get(KEY_GAME_LOGO)).get(0);
this.timePlayed = 0;
}
public Integer getAppID()
{
return appID;
}
public String getIcon()
{
return icon;
}
public String getLogo()
{
return logo;
}
public String getName()
{
return name;
}
public Integer getTimePlayed()
{
return timePlayed;
}
@Override
public String toString()

+ 8
- 0
src/main/java/net/jrtechs/www/server/Player.java View File

@ -36,6 +36,7 @@ public class Player
private Integer timeCreated;
private List<Game> playerGames;
/**
* Sets the name and id of the player
@ -53,6 +54,7 @@ public class Player
this.timeCreated = timeCreated;
this.avatar = avatar;
this.friends = new ArrayList<>();
this.playerGames = new ArrayList<>();
}
@ -64,6 +66,7 @@ public class Player
this.avatar = ((List<Object>) apiInfo.getOrDefault(Player.KEY_AVATAR, "")).get(0).toString();
this.timeCreated = (Integer)((List<Object>)apiInfo.get(KEY_TIME_CREATED)).get(0);
this.friends = new ArrayList<>();
this.playerGames = new ArrayList<>();
}
public List<Player> getFriends()
@ -71,6 +74,11 @@ public class Player
return friends;
}
public List<Game> getGames()
{
return this.playerGames;
}
/**
* Getter for display name of player

Loading…
Cancel
Save