From 5c589a82f6b9eea4d05308ded7a86bd62315b17f Mon Sep 17 00:00:00 2001 From: jenzur Date: Mon, 15 Jul 2019 20:21:35 +0200 Subject: [PATCH] now i just need the new machine to install everything for deloyment --- .../main/java/DataMapper/DBCPDataSource.java | 2 +- .../main/java/facade/CallableJsonObject.java | 45 ++++++++++ .../src/main/java/facade/Facade.java | 57 +++++++++---- .../src/Leaderboard/Leaderboard.js | 6 +- .../racetimer_react/src/MapBoard/MapBoard.js | 22 ++--- RaceTimer/racetimer_react/src/Maps/Maps.js | 43 +++++----- .../racetimer_react/src/Player/Player.js | 83 ++++++++++--------- RaceTimer/racetimer_react/src/css/style.css | 3 +- .../src/playerSearch/playersSearch.js | 1 - 9 files changed, 167 insertions(+), 95 deletions(-) create mode 100644 RaceTimer/racetimer_endpoints/src/main/java/facade/CallableJsonObject.java 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 () => {