diff --git a/RaceTimer/racetimer_endpoints/src/main/java/DataMapper/DBCPDataSource.java b/RaceTimer/racetimer_endpoints/src/main/java/DataMapper/DBCPDataSource.java
index 5201de33..32450674 100644
--- a/RaceTimer/racetimer_endpoints/src/main/java/DataMapper/DBCPDataSource.java
+++ b/RaceTimer/racetimer_endpoints/src/main/java/DataMapper/DBCPDataSource.java
@@ -24,7 +24,7 @@ public class DBCPDataSource {
ds.setDriver(new com.mysql.cj.jdbc.Driver());
ds.setUrl("jdbc:mysql://151.80.230.149:3306/unloze_racetimer_css?useLegacyDatetimeCode=false&serverTimezone=UTC");
ds.setUsername("unloze_racetimer_css");
- ds.setPassword("ahsdbahb/#¤FHdasd");
+ ds.setPassword("dfhasFEb234dfsnFEEJSfFEJdfap");
ds.setMaxTotal(-1);
ds.setMinIdle(5);
ds.setMaxIdle(-1);
diff --git a/RaceTimer/racetimer_endpoints/src/main/java/facade/CallableJsonObject.java b/RaceTimer/racetimer_endpoints/src/main/java/facade/CallableJsonObject.java
new file mode 100644
index 00000000..95cf75ca
--- /dev/null
+++ b/RaceTimer/racetimer_endpoints/src/main/java/facade/CallableJsonObject.java
@@ -0,0 +1,45 @@
+/*
+ * To change this license header, choose License Headers in Project Properties.
+ * To change this template file, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package facade;
+
+import java.util.AbstractMap;
+import java.util.Map;
+import java.util.concurrent.Callable;
+import org.json.JSONObject;
+
+/**
+ *
+ * @author install1
+ */
+public class CallableJsonObject implements Callable> {
+
+ private JSONObject jsonObject;
+ private String avatar;
+ private String steamID;
+
+ public CallableJsonObject(JSONObject jsonObject) {
+ String steamID64 = jsonObject.getString("steamid");
+ this.avatar = jsonObject.getString("avatarfull");
+ this.steamID = convertCommunityIdToSteamId(Long.valueOf(steamID64));
+ }
+
+ public CallableJsonObject() {
+ }
+
+ @Override
+ public Map.Entry call() throws Exception {
+ Map.Entry entry = new AbstractMap.SimpleEntry(steamID, avatar);
+ return entry;
+ }
+
+ private String convertCommunityIdToSteamId(long communityId) {
+ long steamId1 = communityId % 2;
+ long steamId2 = communityId - 76561197960265728L;
+ steamId2 = (steamId2 - steamId1) / 2;
+ return "STEAM_0:" + steamId1 + ":" + steamId2;
+ }
+
+}
diff --git a/RaceTimer/racetimer_endpoints/src/main/java/facade/Facade.java b/RaceTimer/racetimer_endpoints/src/main/java/facade/Facade.java
index 2da269b3..56c9dc3a 100644
--- a/RaceTimer/racetimer_endpoints/src/main/java/facade/Facade.java
+++ b/RaceTimer/racetimer_endpoints/src/main/java/facade/Facade.java
@@ -24,9 +24,14 @@ import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
+import java.util.concurrent.Callable;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ForkJoinPool;
+import java.util.concurrent.Future;
import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Matcher;
@@ -47,6 +52,13 @@ public class Facade {
private final long EXPIRE_TIME_IN_SECONDS = TimeUnit.SECONDS.convert(30, TimeUnit.MINUTES);
private Instant elapsedTime;
private int initSetup = 0;
+ private static final ForkJoinPool executor = instantiateExecutor();
+
+ private static ForkJoinPool instantiateExecutor() {
+ return new ForkJoinPool(Runtime.getRuntime().availableProcessors(),
+ ForkJoinPool.defaultForkJoinWorkerThreadFactory,
+ null, false);
+ }
public Facade() {
elapsedTime = Instant.now();
@@ -311,31 +323,27 @@ public class Facade {
}
}
- private String convertCommunityIdToSteamId(long communityId) {
- long steamId1 = communityId % 2;
- long steamId2 = communityId - 76561197960265728L;
- steamId2 = (steamId2 - steamId1) / 2;
- return "STEAM_0:" + steamId1 + ":" + steamId2;
- }
-
private void retrieveAvatarFull(String avatarurl) {
try {
+ Callable> worker;
+ final ConcurrentMap>> futures = new MapMaker().concurrencyLevel(6).makeMap();
URL url = new URL(avatarurl);
JSONTokener tokener = new JSONTokener(url.openStream());
JSONObject root = new JSONObject(tokener);
JSONObject jsonObject = root.getJSONObject("response");
JSONArray jsonArray = jsonObject.getJSONArray("players");
for (int incrementer = 0; incrementer < jsonArray.length(); incrementer++) {
- try {
- String steamID64 = jsonArray.getJSONObject(incrementer).getString("steamid");
- String avatar = jsonArray.getJSONObject(incrementer).getString("avatarfull");
- String steamID = convertCommunityIdToSteamId(Long.valueOf(steamID64));
- playerCache.get(steamID).setAvatar(avatar);
- //System.out.println("avatar: " + avatar + "\nname: " + playerCache.get(steamID).getName() + "\n");
- } catch (NumberFormatException | JSONException ex) {
- System.out.println("ex: " + ex.getLocalizedMessage() + "\n Nosteamer");
- }
+ worker = new CallableJsonObject(jsonArray.getJSONObject(incrementer));
+ futures.put(incrementer, executor.submit(worker));
}
+ futures.values().parallelStream().forEach(future -> {
+ try {
+ Entry getEntry = future.get(3, TimeUnit.SECONDS);
+ playerCache.get(getEntry.getKey()).setAvatar(getEntry.getValue());
+ } catch (InterruptedException | ExecutionException | TimeoutException ex) {
+ Logger.getLogger(Facade.class.getName()).log(Level.SEVERE, null, ex);
+ }
+ });
} catch (MalformedURLException ex) {
Logger.getLogger(Facade.class.getName()).log(Level.SEVERE, null, ex);
} catch (IOException ex) {
@@ -349,7 +357,8 @@ public class Facade {
avatarURL.append("http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=262F3F0C6B83E0F263C272C3762002F1&steamids=");
int incrementer = 0;
int overallCounter = 0;
- int fetchCapacity = 450;
+ int fetchCapacity = players.size() > 5 ? players.size() / 5 : 6;
+ CountDownLatch cdl = new CountDownLatch(1);
for (Player player : players) {
if (incrementer > 0) {
avatarURL.append(",");
@@ -358,13 +367,25 @@ public class Facade {
avatarURL.append(Long.toString(convertSteamIdToCommunityId(player.getSteamID())));
if (incrementer >= fetchCapacity || incrementer + overallCounter >= players.size()) {
final String fullUrl = avatarURL.toString();
- retrieveAvatarFull(fullUrl);
+ final int overall = incrementer + overallCounter;
+ new Thread(() -> {
+ retrieveAvatarFull(fullUrl);
+ if (overall >= players.size()) {
+ cdl.countDown();
+ }
+ }).start();
overallCounter += incrementer;
incrementer = 0;
avatarURL = new StringBuilder();
avatarURL.append("http://api.steampowered.com/ISteamUser/GetPlayerSummaries/v0002/?key=262F3F0C6B83E0F263C272C3762002F1&steamids=");
+
}
}
+ try {
+ cdl.await();
+ } catch (InterruptedException ex) {
+ System.out.println("cdl await interrupted: " + ex.getLocalizedMessage() + "\n");
+ }
setNonExistingAvatarOnPlayers(players);
}
diff --git a/RaceTimer/racetimer_react/src/Leaderboard/Leaderboard.js b/RaceTimer/racetimer_react/src/Leaderboard/Leaderboard.js
index 66fec8be..63f81ffe 100644
--- a/RaceTimer/racetimer_react/src/Leaderboard/Leaderboard.js
+++ b/RaceTimer/racetimer_react/src/Leaderboard/Leaderboard.js
@@ -127,6 +127,9 @@ class Leaderboard extends React.Component {
+ {!this.state.breakload ?
+ Loading Maps
+
: ""}
{this.state.searchBool ? ("") : ()}
@@ -157,9 +160,6 @@ class Leaderboard extends React.Component {
))}
- {!this.state.breakload ?
- Loading Players
-
: ""}
);
}
diff --git a/RaceTimer/racetimer_react/src/MapBoard/MapBoard.js b/RaceTimer/racetimer_react/src/MapBoard/MapBoard.js
index 71de0ba7..6db3cd65 100644
--- a/RaceTimer/racetimer_react/src/MapBoard/MapBoard.js
+++ b/RaceTimer/racetimer_react/src/MapBoard/MapBoard.js
@@ -96,6 +96,9 @@ class MapBoards extends React.Component {
+ {!this.state.breakload ?
+ Loading Maps
+
: ""}
{this.state.searchBool ? ("") : ()}
@@ -103,22 +106,19 @@ class MapBoards extends React.Component {
-
-
- Map: {e.mapname}
- Stage: {e.mapstage}
-
-
-
-
+
+
+ Map: {e.mapname}
+ Stage: {e.mapstage}
+
+
+
+
))}
- {!this.state.breakload ?
- Loading Maps
-
: ""}
);
diff --git a/RaceTimer/racetimer_react/src/Maps/Maps.js b/RaceTimer/racetimer_react/src/Maps/Maps.js
index c4e44988..dc591877 100644
--- a/RaceTimer/racetimer_react/src/Maps/Maps.js
+++ b/RaceTimer/racetimer_react/src/Maps/Maps.js
@@ -80,29 +80,34 @@ class Maps extends React.Component {
render() {
return (
-
-
-
-
- leaderboard
-
+
+
+
+
Map: {this.state.mapName}
+
+ Stage: {this.props.match.params.stage}
+
-
+
+
+
+
+
- MapBoard
+ MapBoard
-
+
+
+
+ leaderboard
+
+
-
-
{this.state.mapName}
-
-
+
{this.state.mapTimes.map(e => (
-
+
SteamID: {e.steamID}
@@ -116,16 +121,14 @@ class Maps extends React.Component {
+
))}
-
-
-
+
))}
{!this.state.breakload ?
Loading Players
: ""}
-
diff --git a/RaceTimer/racetimer_react/src/Player/Player.js b/RaceTimer/racetimer_react/src/Player/Player.js
index ac0a5f6c..5b41af92 100644
--- a/RaceTimer/racetimer_react/src/Player/Player.js
+++ b/RaceTimer/racetimer_react/src/Player/Player.js
@@ -49,13 +49,13 @@ class Player extends React.Component {
window.removeEventListener("scroll", this.scrollListener);
}
- findSecondLast(array) {
- return array[array.length - 2];
+ findLateIndex(array) {
+ return array[array.length - 5];
}
handleScroll = () => {
if (this.state.breakload && this.state.player.Times > this.state.mapTimes.length) {
- const map = this.findSecondLast(this.state.mapTimes);
+ const map = this.findLateIndex(this.state.mapTimes);
var lastLi = document.getElementById("playermaps/" + map.mapname + "/" + map.mapstage);
var lastLiOffset = lastLi.offsetTop + lastLi.clientHeight;
var pageOffset = window.pageYOffset + window.innerHeight;
@@ -84,38 +84,43 @@ class Player extends React.Component {
));
return (
-
-
-
-
- leaderboard
-
-
-
-
- MapBoard
-
+
+
+
+
Player Profile: {this.state.player.name}
+
+
+
+
+
+ MapBoard
+
+
+
+
+ leaderboard
+
+
+
-
-
-
+ {!this.state.breakload ?
+ Loading Stats
+
: ""}
);
}
}
-
-
export default Player;
\ No newline at end of file
diff --git a/RaceTimer/racetimer_react/src/css/style.css b/RaceTimer/racetimer_react/src/css/style.css
index 3d1bfe8b..e9454c3f 100644
--- a/RaceTimer/racetimer_react/src/css/style.css
+++ b/RaceTimer/racetimer_react/src/css/style.css
@@ -2621,6 +2621,7 @@ video {
animation: pop-in 9s .2s cubic-bezier(0, .8, 0, 4) forwards;
background-color: #FFF;
content: "";
+ /* https://images.unsplash.com/photo-1459749411175-04bf5292ceea?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1000&q=80*/
opacity: 0;
position: absolute;
top: 0;
@@ -2628,7 +2629,7 @@ video {
bottom: 0;
left: 0;
z-index: -1;
- background-image: url('https://images.unsplash.com/photo-1459749411175-04bf5292ceea?ixlib=rb-1.2.1&ixid=eyJhcHBfaWQiOjEyMDd9&auto=format&fit=crop&w=1000&q=80');
+ background-image: url('https://vignette.wikia.nocookie.net/zombieescape/images/9/98/Ze_predator_ultimate_v3_css.png/revision/latest?cb=20120105193018');
}
.hero_single .wrapper h3 {
diff --git a/RaceTimer/racetimer_react/src/playerSearch/playersSearch.js b/RaceTimer/racetimer_react/src/playerSearch/playersSearch.js
index 0944ced6..f6039a5a 100644
--- a/RaceTimer/racetimer_react/src/playerSearch/playersSearch.js
+++ b/RaceTimer/racetimer_react/src/playerSearch/playersSearch.js
@@ -4,7 +4,6 @@ import { NavLink } from 'react-router-dom';
class playersSearch extends Component {
state = {
players: [],
- searchBool: true,
};
componentDidMount = async () => {