From 3c2fcf9c734cd9ac03289f06371399f91c3f2846 Mon Sep 17 00:00:00 2001 From: Yuu NAKAJIMA Date: Wed, 6 Jul 2022 09:36:38 +0900 Subject: [PATCH 01/26] =?UTF-8?q?=E6=8E=88=E6=A5=AD=E6=99=82=E3=81=AElog?= =?UTF-8?q?=E5=87=BA=E5=8A=9B=E3=82=92=E5=A4=89=E6=9B=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/assembly/jar-with-dependencies.xml | 17 ------ .../org/nkjmlab/go/javalin/GoApplication.java | 12 ++-- .../go/javalin/jsonrpc/GoJsonRpcService.java | 13 ++--- .../model/problem/ProblemJsonReader.java | 2 +- .../model/relation/MatchingRequestsTable.java | 4 +- .../src/main/resources/go-webui.sh | 2 +- .../src/main/resources/log4j2-production.xml | 56 +++++++++++++++++++ 7 files changed, 69 insertions(+), 37 deletions(-) delete mode 100644 nkjmlab-go-webapp/src/assembly/jar-with-dependencies.xml create mode 100644 nkjmlab-go-webapp/src/main/resources/log4j2-production.xml diff --git a/nkjmlab-go-webapp/src/assembly/jar-with-dependencies.xml b/nkjmlab-go-webapp/src/assembly/jar-with-dependencies.xml deleted file mode 100644 index 684315c..0000000 --- a/nkjmlab-go-webapp/src/assembly/jar-with-dependencies.xml +++ /dev/null @@ -1,17 +0,0 @@ - - jar-with-dependencies - - dir - - false - - - / - true - true - runtime - - - diff --git a/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/GoApplication.java b/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/GoApplication.java index 4d67d91..13223a5 100644 --- a/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/GoApplication.java +++ b/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/GoApplication.java @@ -100,11 +100,6 @@ public class GoApplication { private final LoginsTable loginsTable; private final WebsocketSessionsManager wsManager; - - - static { - } - public static void main(String[] args) { if (args.length != 0) { THYMELEAF_EXPIRE_TIME_MILLI_SECOND = Long.valueOf(args[0]); @@ -124,6 +119,9 @@ private void start(int port) { } public GoApplication() { + + log.info("log4j2.configurationFile={}, Logger level={}", + System.getProperty("log4j2.configurationFile"), log.getLevel()); FileDatabaseConfigJson fileDbConf = getFileDbConfig(); H2LocalDataSourceFactory factory = @@ -253,9 +251,7 @@ public static String getJdbcUrlOfInMemoryDb(String dbName) { private void prepareWebSocket() { app.ws("/websocket/play/checkcon", ws -> { - ws.onConnect(ctx -> { - log.debug("{}", ctx.session.getUpgradeRequest().getRequestURI()); - }); + ws.onConnect(ctx -> log.trace("{}", ctx.session.getUpgradeRequest().getRequestURI())); }); app.ws("/websocket/play", ws -> { ws.onConnect(ctx -> wsManager.onConnect(ctx.session, ctx.queryParam("userId"), diff --git a/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/jsonrpc/GoJsonRpcService.java b/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/jsonrpc/GoJsonRpcService.java index c1687ca..a50fc07 100644 --- a/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/jsonrpc/GoJsonRpcService.java +++ b/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/jsonrpc/GoJsonRpcService.java @@ -145,7 +145,7 @@ private void saveProblemJsonToFile(ProblemJson p) { File problemGroupDir = getProblemDir(p.groupId()); File o = new File(problemGroupDir, p.name() + ".json"); mapper.toJsonAndWrite(p, o, true); - log.info("Problep {} - {} is saved to {}", p.groupId(), p.name(), o); + log.info("Problem {} - {} is saved to {}", p.groupId(), p.name(), o); } @@ -268,7 +268,6 @@ public void enterWaitingRoom(String userId) { @Override public void exitWaitingRoom(String userId) { - // logger.debug("{} exited from waiting room.", userId); matchingRequestsTable.deleteByPrimaryKey(userId); wsManager.sendUpdateWaitingRequestStatus(Set.of(userId)); } @@ -284,7 +283,7 @@ public File uploadImage(String userId, String base64EncodedImage) { File outputFile = new File(CURRENT_ICON_DIR, userId + ".png"); outputFile.mkdirs(); ImageIoUtils.write(Base64Utils.decodeToImage(base64EncodedImage, "png"), "png", outputFile); - log.info("Icon is uploaded={}", outputFile); + log.debug("Icon is uploaded={}", outputFile); return outputFile; } catch (Exception e) { log.error(e, e); @@ -334,7 +333,6 @@ public void handUp(String gameId, boolean handUp, String message) { @Override public int registerRecord(String userId, String opponentUserId, String jadge, String memo) { - // logger.debug("{},{},{},{}", userId, opponentUserId, jadge, memo); int rank = gameRecordsTable.registerRecordAndGetRank(usersTable, userId, opponentUserId, jadge, memo); @@ -358,7 +356,6 @@ public int registerRecord(String userId, String opponentUserId, String jadge, St @Override public String getKomi(String gameId) { - String msg = ""; try { GameStateJson gs = gameStatesTables.readLatestGameStateJson(gameId); User bp = usersTable.selectByPrimaryKey(gs.blackPlayerId()); @@ -370,15 +367,15 @@ public String getKomi(String gameId) { String s1 = start.get(roCol).get(Math.min(diff, 5)); String s2 = midFlow.get(roCol).get(Math.min(diff, 5)); - msg = ParameterizedStringUtils.newString( + String msg = ParameterizedStringUtils.newString( "{} ({},{}級) vs {} ({},{}級): {}級差,{}路
はじめから {}, 棋譜並べから {}
", bp.userId(), bp.userName(), bp.rank(), wp.userId(), wp.userName(), wp.rank(), diff, ro, s1, s2); + return msg; } catch (Exception e) { - msg = ""; log.error(e); + return ""; } - return msg; } } diff --git a/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/model/problem/ProblemJsonReader.java b/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/model/problem/ProblemJsonReader.java index bf8d685..bdc243c 100644 --- a/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/model/problem/ProblemJsonReader.java +++ b/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/model/problem/ProblemJsonReader.java @@ -29,7 +29,7 @@ private static List readProblemJsonFiles(Path pathToProblemJsonDir) { public static List readProblemJsons(Path pathToProblemJsonDir) { List files = readProblemJsonFiles(pathToProblemJsonDir); - log.info("detect [{}] problem files in [{}]", files.size(), pathToProblemJsonDir); + log.debug("detect [{}] problem files in [{}]", files.size(), pathToProblemJsonDir); return files.stream().map(file -> { try { ProblemJson problem = diff --git a/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/model/relation/MatchingRequestsTable.java b/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/model/relation/MatchingRequestsTable.java index 3b36304..74edfe0 100644 --- a/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/model/relation/MatchingRequestsTable.java +++ b/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/model/relation/MatchingRequestsTable.java @@ -68,7 +68,7 @@ public Set createPairOfUsers(GameStatesTables gameStatesTables) { } Set pastOpponents = gameStatesTables.readPastOpponents(target.userId()); - log.debug("[{}] has been matched with {} on today", target.userId(), pastOpponents); + log.trace("[{}] has been matched with {} on today", target.userId(), pastOpponents); MatchingRequest nextOpponent = selectNextOponent(target, pastOpponents); if (nextOpponent == null) { @@ -79,7 +79,7 @@ public Set createPairOfUsers(GameStatesTables gameStatesTables) { String white = target.rank() >= nextOpponent.rank() ? nextOpponent.userId() : target.userId(); String gameId = black + GameStatesTables.VS_SEPARATOR + white; - log.debug("[{}] is created", gameId); + log.trace("[{}] is created", gameId); updateByPrimaryKey(RowMap.of("game_id", gameId), target.userId); updateByPrimaryKey(RowMap.of("game_id", gameId), nextOpponent.userId); diff --git a/nkjmlab-go-webapp/src/main/resources/go-webui.sh b/nkjmlab-go-webapp/src/main/resources/go-webui.sh index c97b5b6..52e7640 100644 --- a/nkjmlab-go-webapp/src/main/resources/go-webui.sh +++ b/nkjmlab-go-webapp/src/main/resources/go-webui.sh @@ -1,4 +1,4 @@ cd `dirname $0` cd ../ -java -cp classes:lib/* -Dfile.encoding=UTF-8 org.nkjmlab.go.javalin.GoApplication $@ +java -cp classes:lib/* -Dfile.encoding=UTF-8 -Dlog4j2.configurationFile=./classes/log4j2-production.xml org.nkjmlab.go.javalin.GoApplication $@ diff --git a/nkjmlab-go-webapp/src/main/resources/log4j2-production.xml b/nkjmlab-go-webapp/src/main/resources/log4j2-production.xml new file mode 100644 index 0000000..d652597 --- /dev/null +++ b/nkjmlab-go-webapp/src/main/resources/log4j2-production.xml @@ -0,0 +1,56 @@ + + + + + nkjmlab-go + logs + INFO + INFO + ${log_pattern_loc} + + %d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%t] %c.%M(%F:%L) %m%n + + + %d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%t] %c{3.} %m%n + + + %m%n + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From c12770648dde239797a525361fc4159b2e15ee54 Mon Sep 17 00:00:00 2001 From: Yuu NAKAJIMA Date: Wed, 6 Jul 2022 10:45:37 +0900 Subject: [PATCH 02/26] =?UTF-8?q?OrangeSignalCsv=E3=82=92=E5=89=8A?= =?UTF-8?q?=E9=99=A4=E3=81=97=EF=BC=8CH2=E3=81=AEcsvRead=E3=82=92=E4=BD=BF?= =?UTF-8?q?=E3=81=86=E3=82=88=E3=81=86=E3=81=AB=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nkjmlab-go-webapp/pom.xml | 6 ----- .../model/relation/GameRecordsTable.java | 8 +++---- .../model/relation/PasswordsTable.java | 15 ++---------- .../go/javalin/model/relation/UsersTable.java | 24 +++++++++---------- .../main/resources/conf/passwords.csv.default | 2 +- .../src/main/resources/conf/users.csv.default | 2 +- 6 files changed, 18 insertions(+), 39 deletions(-) diff --git a/nkjmlab-go-webapp/pom.xml b/nkjmlab-go-webapp/pom.xml index e12bcfa..dc79ff2 100644 --- a/nkjmlab-go-webapp/pom.xml +++ b/nkjmlab-go-webapp/pom.xml @@ -107,12 +107,6 @@ commons-lang3 3.12.0 - - - com.orangesignal - orangesignal-csv - 2.2.1 - diff --git a/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/model/relation/GameRecordsTable.java b/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/model/relation/GameRecordsTable.java index 7b417db..1b209ec 100644 --- a/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/model/relation/GameRecordsTable.java +++ b/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/model/relation/GameRecordsTable.java @@ -1,6 +1,5 @@ package org.nkjmlab.go.javalin.model.relation; -import static org.nkjmlab.go.javalin.model.relation.GameRecordsTable.GameRecord.*; import java.time.LocalDateTime; import java.util.List; import java.util.Optional; @@ -15,6 +14,9 @@ import org.nkjmlab.sorm4j.util.table_def.annotation.PrimaryKey; public class GameRecordsTable extends BasicH2Table { + private static final String CREATED_AT = "created_at"; + private static final String USER_ID = "user_id"; + private static final String RANK = "rank"; public GameRecordsTable(DataSource dataSource) { super(Sorm.create(dataSource), GameRecord.class); @@ -92,10 +94,6 @@ public List readByUserId(String userId) { public static record GameRecord(@PrimaryKey @AutoIncrement int id, LocalDateTime createdAt, String userId, String opponentUserId, String jadge, String memo, int rank, int point, String message) { - private static final String CREATED_AT = "created_at"; - private static final String USER_ID = "user_id"; - private static final String RANK = "rank"; - } diff --git a/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/model/relation/PasswordsTable.java b/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/model/relation/PasswordsTable.java index 0070b81..768ef5a 100644 --- a/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/model/relation/PasswordsTable.java +++ b/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/model/relation/PasswordsTable.java @@ -3,16 +3,12 @@ import java.io.File; import java.util.List; import java.util.Optional; -import java.util.stream.Collectors; import javax.sql.DataSource; import org.nkjmlab.go.javalin.model.relation.PasswordsTable.Password; import org.nkjmlab.sorm4j.Sorm; import org.nkjmlab.sorm4j.annotation.OrmRecord; import org.nkjmlab.sorm4j.util.h2.BasicH2Table; import org.nkjmlab.sorm4j.util.table_def.annotation.PrimaryKey; -import org.nkjmlab.util.orangesignal_csv.OrangeSignalCsvUtils; -import org.nkjmlab.util.orangesignal_csv.OrangeSignalCsvUtils.Row; -import com.orangesignal.csv.CsvConfig; /*** * @@ -31,15 +27,8 @@ public boolean isValid(String userId, String password) { } public void readFromFileAndMerge(File usersCsvFile) { - CsvConfig conf = OrangeSignalCsvUtils.createDefaultCsvConfig(); - conf.setSkipLines(1); - List users = OrangeSignalCsvUtils.readAllRows(usersCsvFile, conf); - transformToPassword(users).forEach(user -> merge(user)); - } - - private static List transformToPassword(List rows) { - return rows.stream().map(row -> new Password(row.get(0), row.get(1))) - .collect(Collectors.toList()); + List password = readCsvWithHeader(usersCsvFile); + merge(password); } @OrmRecord diff --git a/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/model/relation/UsersTable.java b/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/model/relation/UsersTable.java index 7d1ad3b..8c2219b 100644 --- a/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/model/relation/UsersTable.java +++ b/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/model/relation/UsersTable.java @@ -26,9 +26,6 @@ import org.nkjmlab.sorm4j.util.table_def.annotation.Index; import org.nkjmlab.sorm4j.util.table_def.annotation.PrimaryKey; import org.nkjmlab.sorm4j.util.table_def.annotation.Unique; -import org.nkjmlab.util.orangesignal_csv.OrangeSignalCsvUtils; -import org.nkjmlab.util.orangesignal_csv.OrangeSignalCsvUtils.Row; -import com.orangesignal.csv.CsvConfig; /*** * Userという名前で統一したかったけど,H2のデフォルトのテーブルと衝突してしまうので,Playerに改名した. @@ -82,23 +79,24 @@ public User readByEmail(String email) { public void readFromFileAndMerge(File usersCsvFile) { - CsvConfig conf = OrangeSignalCsvUtils.createDefaultCsvConfig(); - conf.setSkipLines(1); - List users = OrangeSignalCsvUtils.readAllRows(usersCsvFile, conf); - transformToUser(users).forEach(user -> { + BasicH2Table table = new BasicH2Table<>(getOrm(), UserCsv.class); + + transformToUser(table.readCsvWithHeader(usersCsvFile)).forEach(user -> { createIcon(user.userId()); insert(user); }); } + @OrmRecord + public static record UserCsv(String userId, String email, String username, String role) { + + } + - private static List transformToUser(List rows) { - return rows.stream().map(row -> { - User user = - new User(row.get(0), row.get(1), row.get(2), row.get(3), "-1", 30, LocalDateTime.now()); - return user; - }).collect(Collectors.toList()); + private List transformToUser(List users) { + return users.stream().map(row -> new User(row.userId(), row.email(), row.username(), row.role(), + "-1", 30, LocalDateTime.now())).collect(Collectors.toList()); } public List readListByUids(Collection uids) { diff --git a/nkjmlab-go-webapp/src/main/resources/conf/passwords.csv.default b/nkjmlab-go-webapp/src/main/resources/conf/passwords.csv.default index a82e2bd..844a02b 100644 --- a/nkjmlab-go-webapp/src/main/resources/conf/passwords.csv.default +++ b/nkjmlab-go-webapp/src/main/resources/conf/passwords.csv.default @@ -1,4 +1,4 @@ -userId,password +user_id,password 5500900,example0@example.com 5500911,example1@example.com 5500920,example2@example.com diff --git a/nkjmlab-go-webapp/src/main/resources/conf/users.csv.default b/nkjmlab-go-webapp/src/main/resources/conf/users.csv.default index 3aa0e6d..78dd825 100644 --- a/nkjmlab-go-webapp/src/main/resources/conf/users.csv.default +++ b/nkjmlab-go-webapp/src/main/resources/conf/users.csv.default @@ -1,4 +1,4 @@ -userId,email,username,role +user_id,email,username,role 5500900,example0@example.com,管理者1,ADMIN 5500911,example1@example.com,TA1,TA 5500920,example2@example.com,学生0,STUDENT From c2b87012856c4d5b2130a488170f7f1d0ae6a875 Mon Sep 17 00:00:00 2001 From: Yuu NAKAJIMA Date: Wed, 6 Jul 2022 11:17:07 +0900 Subject: [PATCH 03/26] =?UTF-8?q?WebsoketSessionsTable=20=E3=81=A7=20remov?= =?UTF-8?q?e=20=E3=81=99=E3=82=8B=E7=AE=87=E6=89=80=E3=81=AB=E3=83=90?= =?UTF-8?q?=E3=82=B0=E3=81=8C=E3=81=82=E3=81=A3=E3=81=9F=E3=81=AE=E3=82=92?= =?UTF-8?q?=E4=BF=AE=E6=AD=A3=E3=81=97=E3=81=9F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../org/nkjmlab/go/javalin/GoApplication.java | 34 ++-- .../go/javalin/jsonrpc/GoJsonRpcService.java | 37 ++-- .../websocket/WebsocketSessionsManager.java | 162 +++++++++++++++++- .../websocket/WebsoketSessionsTable.java | 158 ----------------- 4 files changed, 189 insertions(+), 202 deletions(-) delete mode 100644 nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/websocket/WebsoketSessionsTable.java diff --git a/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/GoApplication.java b/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/GoApplication.java index 13223a5..441dd54 100644 --- a/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/GoApplication.java +++ b/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/GoApplication.java @@ -34,7 +34,6 @@ import org.nkjmlab.go.javalin.model.relation.UsersTable.User; import org.nkjmlab.go.javalin.model.relation.VotesTable; import org.nkjmlab.go.javalin.websocket.WebsocketSessionsManager; -import org.nkjmlab.go.javalin.websocket.WebsoketSessionsTable; import org.nkjmlab.sorm4j.common.Tuple.Tuple2; import org.nkjmlab.sorm4j.internal.util.ParameterizedStringUtils; import org.nkjmlab.sorm4j.internal.util.Try; @@ -95,10 +94,9 @@ public class GoApplication { private final MatchingRequestsTable matchingRequestsTable; private final GameStatesTables gameStatesTables; private final VotesTable votesTable; - private final WebsoketSessionsTable websoketSessionsTable; private final GameRecordsTable gameRecordsTable; private final LoginsTable loginsTable; - private final WebsocketSessionsManager wsManager; + private final WebsocketSessionsManager webSocketManager; public static void main(String[] args) { if (args.length != 0) { @@ -215,12 +213,8 @@ public GoApplication() { this.votesTable = new VotesTable(memDbDataSource); votesTable.createTableIfNotExists().createIndexesIfNotExists(); } - { - this.websoketSessionsTable = new WebsoketSessionsTable(memDbDataSource); - this.websoketSessionsTable.createTableIfNotExists().createIndexesIfNotExists(); - } - this.wsManager = new WebsocketSessionsManager(gameStatesTables, problemsTable, - websoketSessionsTable, usersTable, handsUpTable, matchingRequestsTable); + this.webSocketManager = new WebsocketSessionsManager(gameStatesTables, problemsTable, + usersTable, handsUpTable, matchingRequestsTable, memDbDataSource); @@ -254,11 +248,11 @@ private void prepareWebSocket() { ws.onConnect(ctx -> log.trace("{}", ctx.session.getUpgradeRequest().getRequestURI())); }); app.ws("/websocket/play", ws -> { - ws.onConnect(ctx -> wsManager.onConnect(ctx.session, ctx.queryParam("userId"), + ws.onConnect(ctx -> webSocketManager.onConnect(ctx.session, ctx.queryParam("userId"), ctx.queryParam("gameId"))); - ws.onClose(ctx -> wsManager.onClose(ctx.session, ctx.status(), ctx.reason())); - ws.onError(ctx -> wsManager.onError(ctx.session, ctx.error())); - ws.onMessage(ctx -> wsManager.onMessage(ctx.queryParam("gameId"), ctx)); + ws.onClose(ctx -> webSocketManager.onClose(ctx.session, ctx.status(), ctx.reason())); + ws.onError(ctx -> webSocketManager.onError(ctx.session, ctx.error())); + ws.onMessage(ctx -> webSocketManager.onMessage(ctx.queryParam("gameId"), ctx)); }); @@ -271,7 +265,7 @@ private void prepareWebSocket() { }); srv.scheduleWithFixedDelay(Try.createRunnable(() -> { Set uids = matchingRequestsTable.createPairOfUsers(gameStatesTables); - wsManager.sendUpdateWaitingRequestStatus(uids); + webSocketManager.sendUpdateWaitingRequestStatus(uids); }, e -> log.error(e)), INTERVAL_IN_WAITING_ROOM, INTERVAL_IN_WAITING_ROOM, TimeUnit.SECONDS); } @@ -279,9 +273,9 @@ private void prepareJsonRpc() { prepareFirebase(); - final GoJsonRpcService goJsonRpcService = new GoJsonRpcService(wsManager, gameStatesTables, - problemsTable, usersTable, loginsTable, matchingRequestsTable, votesTable, handsUpTable, - websoketSessionsTable, gameRecordsTable); + final GoJsonRpcService goJsonRpcService = + new GoJsonRpcService(webSocketManager, gameStatesTables, problemsTable, usersTable, + loginsTable, matchingRequestsTable, votesTable, handsUpTable, gameRecordsTable); JacksonMapper mapper = GoApplication.getDefaultJacksonMapper(); @@ -363,20 +357,20 @@ private void prepareGetHandler() { String gameId = gsj.gameId(); GameStateViewJson json = new GameStateViewJson(gsj, handsUpTable.selectByPrimaryKey(gameId), - websoketSessionsTable.getWatchingUniqueStudentsNum(usersTable, gameId)); + webSocketManager.getWatchingUniqueStudentsNum(gameId)); return json; }).collect(Collectors.toList()); model.put("games", tmp); pageName = "games.html"; } case "games.html" -> { - List gids = websoketSessionsTable.readActiveGameIdsOrderByGameId(usersTable); + List gids = webSocketManager.readActiveGameIdsOrderByGameId(); List tmp = gids.stream().map(gid -> gameStatesTables.readLatestGameStateJson(gid)).map(gsj -> { String gameId = gsj.gameId(); GameStateViewJson json = new GameStateViewJson(gsj, handsUpTable.selectByPrimaryKey(gameId), - websoketSessionsTable.getWatchingUniqueStudentsNum(usersTable, gameId)); + webSocketManager.getWatchingUniqueStudentsNum(gameId)); return json; }).collect(Collectors.toList()); model.put("games", diff --git a/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/jsonrpc/GoJsonRpcService.java b/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/jsonrpc/GoJsonRpcService.java index a50fc07..9b2abc1 100644 --- a/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/jsonrpc/GoJsonRpcService.java +++ b/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/jsonrpc/GoJsonRpcService.java @@ -28,7 +28,6 @@ import org.nkjmlab.go.javalin.model.relation.VotesTable.Vote; import org.nkjmlab.go.javalin.model.relation.VotesTable.VoteResult; import org.nkjmlab.go.javalin.websocket.WebsocketSessionsManager; -import org.nkjmlab.go.javalin.websocket.WebsoketSessionsTable; import org.nkjmlab.sorm4j.result.RowMap; import org.nkjmlab.util.java.Base64Utils; import org.nkjmlab.util.java.json.JsonMapper; @@ -45,8 +44,7 @@ public class GoJsonRpcService implements GoJsonRpcServiceInterface { private final LoginsTable loginsTable; private final MatchingRequestsTable matchingRequestsTable; private final VotesTable votesTable; - private final WebsocketSessionsManager wsManager; - private final WebsoketSessionsTable websoketSessionsTable; + private final WebsocketSessionsManager websocketManager; private final HandUpsTable handsUpTable; private final GameRecordsTable gameRecordsTable; @@ -56,46 +54,45 @@ public class GoJsonRpcService implements GoJsonRpcServiceInterface { public GoJsonRpcService(WebsocketSessionsManager wsManager, GameStatesTables gameStatesTables, ProblemsTable problemsTable, UsersTable usersTable, LoginsTable loginsTable, MatchingRequestsTable matchingRequestsTable, VotesTable votesTable, HandUpsTable handsUpTable, - WebsoketSessionsTable websoketSessionsTable, GameRecordsTable gameRecordsTable) { + GameRecordsTable gameRecordsTable) { this.gameStatesTables = gameStatesTables; this.problemsTable = problemsTable; this.usersTable = usersTable; this.loginsTable = loginsTable; this.matchingRequestsTable = matchingRequestsTable; - this.wsManager = wsManager; + this.websocketManager = wsManager; this.votesTable = votesTable; this.handsUpTable = handsUpTable; - this.websoketSessionsTable = websoketSessionsTable; this.gameRecordsTable = gameRecordsTable; } @Override public void sendGameState(String gameId, GameStateJson json) { - wsManager.sendGameState(gameId, json); + websocketManager.sendGameState(gameId, json); } @Override public void sendGlobalMessage(String userId, String message) { - wsManager.sendGlobalMessage(message); + websocketManager.sendGlobalMessage(message); } @Override public void syncGameState(int sessionId, String gameId, String userId) { - wsManager.updateSession(sessionId, gameId, userId); - wsManager.sendLatestGameStateToSessions(gameId); + websocketManager.updateSession(sessionId, gameId, userId); + websocketManager.sendLatestGameStateToSessions(gameId); } @Override public void newGame(String gameId, GameStateJson json) { - wsManager.newGame(gameId, json); + websocketManager.newGame(gameId, json); } @Override public ProblemJson loadProblem(String gameId, long problemId) { - return wsManager.loadProblem(gameId, problemId); + return websocketManager.loadProblem(gameId, problemId); } @Override @@ -106,7 +103,7 @@ public ProblemJson getProblem(long problemId) { @Override public void goBack(String gameId, GameStateJson json) { - wsManager.goBack(gameId); + websocketManager.goBack(gameId); } @Override @@ -218,7 +215,7 @@ public UserJson getUser(String userId) { @Override public String getNextGame(String currentGameId) { - List ids = websoketSessionsTable.readActiveGameIdsOrderByGameId(usersTable); + List ids = websocketManager.readActiveGameIdsOrderByGameId(); return getNextId(ids, currentGameId); } @@ -235,7 +232,7 @@ private String getNextId(List ids, String currentGameId) { @Override public String getPrevGame(String currentGameId) { - List ids = websoketSessionsTable.readActiveGameIdsOrderByGameId(usersTable); + List ids = websocketManager.readActiveGameIdsOrderByGameId(); Collections.reverse(ids); return getNextId(ids, currentGameId); } @@ -258,7 +255,7 @@ public void enterWaitingRoom(String userId) { MatchingRequest m = matchingRequestsTable.selectByPrimaryKey(userId); matchingRequestsTable.update(m); } - wsManager.sendUpdateWaitingRequestStatus(Set.of(userId)); + websocketManager.sendUpdateWaitingRequestStatus(Set.of(userId)); } catch (Exception e) { log.error("maching request for {} failed", userId); log.error(e, e); @@ -269,7 +266,7 @@ public void enterWaitingRoom(String userId) { @Override public void exitWaitingRoom(String userId) { matchingRequestsTable.deleteByPrimaryKey(userId); - wsManager.sendUpdateWaitingRequestStatus(Set.of(userId)); + websocketManager.sendUpdateWaitingRequestStatus(Set.of(userId)); } @Override @@ -320,12 +317,12 @@ public void handUp(String gameId, boolean handUp, String message) { .update(new HandUp(h.gameId(), h.createdAt(), h.message() + "
" + message)); } } - wsManager.sendHandUp(gameId, handUp, handsUpTable.readOrder(gameId)); + websocketManager.sendHandUp(gameId, handUp, handsUpTable.readOrder(gameId)); } else { handsUpTable.deleteByPrimaryKey(gameId); - wsManager.sendHandDown(gameId); + websocketManager.sendHandDown(gameId); - handsUpTable.readAllGameIds().stream().forEach(handupGameId -> wsManager + handsUpTable.readAllGameIds().stream().forEach(handupGameId -> websocketManager .sendHandUpOrder(handupGameId, handsUpTable.readOrder(handupGameId))); } diff --git a/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/websocket/WebsocketSessionsManager.java b/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/websocket/WebsocketSessionsManager.java index d6b2209..328ca89 100644 --- a/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/websocket/WebsocketSessionsManager.java +++ b/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/websocket/WebsocketSessionsManager.java @@ -5,16 +5,20 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.Queue; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.stream.Collectors; +import javax.sql.DataSource; import org.eclipse.jetty.websocket.api.RemoteEndpoint; import org.eclipse.jetty.websocket.api.Session; import org.eclipse.jetty.websocket.api.WriteCallback; @@ -32,6 +36,15 @@ import org.nkjmlab.go.javalin.model.relation.UsersTable; import org.nkjmlab.go.javalin.model.relation.UsersTable.User; import org.nkjmlab.go.javalin.model.relation.UsersTable.UserJson; +import org.nkjmlab.go.javalin.websocket.WebsocketSessionsManager.WebsoketSessionsTable.WebSocketSession; +import org.nkjmlab.sorm4j.Sorm; +import org.nkjmlab.sorm4j.annotation.OrmRecord; +import org.nkjmlab.sorm4j.sql.OrderedParameterSqlParser; +import org.nkjmlab.sorm4j.sql.ParameterizedSql; +import org.nkjmlab.sorm4j.sql.ParameterizedSqlParser; +import org.nkjmlab.sorm4j.util.h2.BasicH2Table; +import org.nkjmlab.sorm4j.util.table_def.annotation.Index; +import org.nkjmlab.sorm4j.util.table_def.annotation.PrimaryKey; import org.nkjmlab.util.jackson.JacksonMapper; import org.nkjmlab.util.java.concurrent.ForkJoinPoolUtils; import org.nkjmlab.util.java.json.JsonMapper; @@ -47,10 +60,10 @@ public class WebsocketSessionsManager { private final ProblemsTable problemsTable; private final GameStatesTables gameStatesTables; - private final WebsoketSessionsTable websoketSessionsTable; private final UsersTable usersTable; private final HandUpsTable handsUpTable; private final MatchingRequestsTable matchingRequestsTable; + private final WebsoketSessionsTable websoketSessionsTable; private final Queue globalMessages = new ConcurrentLinkedQueue<>(); @@ -58,14 +71,16 @@ public class WebsocketSessionsManager { public WebsocketSessionsManager(GameStatesTables gameStatesTables, ProblemsTable problemsTable, - WebsoketSessionsTable websoketSessionsTable, UsersTable usersTable, HandUpsTable handsUpTable, - MatchingRequestsTable matchingRequestsTable) { + UsersTable usersTable, HandUpsTable handsUpTable, MatchingRequestsTable matchingRequestsTable, + DataSource memDbDataSource) { this.gameStatesTables = gameStatesTables; this.problemsTable = problemsTable; - this.websoketSessionsTable = websoketSessionsTable; this.usersTable = usersTable; this.handsUpTable = handsUpTable; this.matchingRequestsTable = matchingRequestsTable; + this.websoketSessionsTable = new WebsoketSessionsTable(memDbDataSource); + this.websoketSessionsTable.createTableIfNotExists().createIndexesIfNotExists(); + } @@ -327,4 +342,143 @@ public String toString() { } } + public static class WebsoketSessionsTable extends BasicH2Table { + + private static final String USER_ID = "user_id"; + private static final String GAME_ID = "game_id"; + + private static Map sessions = new ConcurrentHashMap<>(); + + public WebsoketSessionsTable(DataSource dataSource) { + super(Sorm.create(dataSource), WebSocketSession.class); + } + + + + List readSessionsByGameId(String gameId) { + return readList(SELECT_STAR + FROM + getTableName() + WHERE + GAME_ID + "=?", gameId); + } + + List readSessionsByUserId(String userId) { + return readList("select * " + FROM + getTableName() + WHERE + USER_ID + "=?", userId); + } + + List getSessionsByGameId(String gameId) { + List result = + readSessionsByGameId(gameId).stream().map(session -> sessions.get(session.sessionId())) + .filter(Objects::nonNull).collect(Collectors.toList()); + return result; + } + + List getSessionsByUserId(String userId) { + List result = + readSessionsByUserId(userId).stream().map(session -> sessions.get(session.sessionId())) + .filter(s -> Objects.nonNull(s)).collect(Collectors.toList()); + return result; + } + + public List getSessionsByUserIds(List userIds) { + if (userIds.size() == 0) { + return Collections.emptyList(); + } + ParameterizedSql psql = ParameterizedSqlParser + .parse("select * from " + getTableName() + " where " + USER_ID + " IN() ", userIds); + return readList(psql.getSql(), psql.getParameters()).stream() + .map(session -> sessions.get(session.sessionId())).filter(s -> Objects.nonNull(s)) + .collect(Collectors.toList()); + } + + + + List getAllSessions() { + List result = selectAll().stream().map(session -> sessions.get(session.sessionId())) + .filter(s -> Objects.nonNull(s)).collect(Collectors.toList()); + return result; + } + + + void registerSession(String gameId, String userId, Session session) { + int sessionId = session.hashCode(); + WebSocketSession ws = new WebSocketSession(sessionId, userId, gameId, LocalDateTime.now()); + if (exists(ws)) { + log.warn("{} already exists.", ws); + return; + } + insert(ws); + sessions.put(sessionId, session); + log.info("WebSocket is registered={}", ws); + } + + void updateSession(int sessionId, String gameId, String userId) { + update(new WebSocketSession(sessionId, userId, gameId, LocalDateTime.now())); + + } + + Optional removeSession(Session session) { + if (sessions.entrySet().removeIf(e -> e.getKey() == session.hashCode())) { + WebSocketSession gs = selectByPrimaryKey(session.hashCode()); + delete(gs); + return Optional.of(gs.gameId()); + } + return Optional.empty(); + + } + + public List readUsers(UsersTable usersTable, String gameId) { + Set uids = + readSessionsByGameId(gameId).stream().map(u -> u == null ? null : u.userId()) + .filter(Objects::nonNull).collect(Collectors.toSet()); + return usersTable.readListByUids(uids); + + } + + public List readStudents(UsersTable usersTable, String gameId) { + return readUsers(usersTable, gameId).stream().filter(u -> u.isStudent()) + .collect(Collectors.toList()); + } + + public List readActiveGameIdsOrderByGameId(UsersTable usersTable) { + ParameterizedSql psql = ParameterizedSqlParser.parse( + SELECT + DISTINCT + GAME_ID + FROM + getTableName() + WHERE + GAME_ID + LIKE + "?", + "%-vs-%"); + return getOrm().readList(String.class, psql).stream() + .filter(gid -> readUsers(usersTable, gid).size() > 0).sorted() + .collect(Collectors.toList()); + } + + public int getWatchingUniqueStudentsNum(UsersTable usersTable, String gameId) { + return (int) readStudents(usersTable, gameId).stream().map(uj -> uj.userId()) + .collect(Collectors.toSet()).stream().count(); + } + + public List getAdminSessions(UsersTable usersTable) { + List ids = usersTable.getAdminUserIds(); + if (ids.size() == 0) { + return Collections.emptyList(); + } + ParameterizedSql st = OrderedParameterSqlParser + .parse("select * from " + getTableName() + " where " + USER_ID + " IN ()", ids); + return readList(st.getSql(), st.getParameters()).stream() + .map(ws -> sessions.get(ws.sessionId())).filter(Objects::nonNull) + .collect(Collectors.toList()); + } + + + @OrmRecord + public static record WebSocketSession(@PrimaryKey int sessionId, String userId, + @Index String gameId, LocalDateTime createdAt) { + + } + + } + + public int getWatchingUniqueStudentsNum(String gameId) { + return websoketSessionsTable.getWatchingUniqueStudentsNum(usersTable, gameId); + } + + + public List readActiveGameIdsOrderByGameId() { + return websoketSessionsTable.readActiveGameIdsOrderByGameId(usersTable); + } + } diff --git a/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/websocket/WebsoketSessionsTable.java b/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/websocket/WebsoketSessionsTable.java deleted file mode 100644 index 32f1dc5..0000000 --- a/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/websocket/WebsoketSessionsTable.java +++ /dev/null @@ -1,158 +0,0 @@ -package org.nkjmlab.go.javalin.websocket; - -import java.time.LocalDateTime; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Map.Entry; -import java.util.Objects; -import java.util.Optional; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; -import java.util.stream.Collectors; -import javax.sql.DataSource; -import org.eclipse.jetty.websocket.api.Session; -import org.nkjmlab.go.javalin.model.relation.UsersTable; -import org.nkjmlab.go.javalin.model.relation.UsersTable.User; -import org.nkjmlab.go.javalin.websocket.WebsoketSessionsTable.WebSocketSession; -import org.nkjmlab.sorm4j.Sorm; -import org.nkjmlab.sorm4j.annotation.OrmRecord; -import org.nkjmlab.sorm4j.sql.OrderedParameterSqlParser; -import org.nkjmlab.sorm4j.sql.ParameterizedSql; -import org.nkjmlab.sorm4j.sql.ParameterizedSqlParser; -import org.nkjmlab.sorm4j.util.h2.BasicH2Table; -import org.nkjmlab.sorm4j.util.table_def.annotation.Index; -import org.nkjmlab.sorm4j.util.table_def.annotation.PrimaryKey; - -public class WebsoketSessionsTable extends BasicH2Table { - private static final org.apache.logging.log4j.Logger log = - org.apache.logging.log4j.LogManager.getLogger(); - - - private static final String USER_ID = "user_id"; - private static final String GAME_ID = "game_id"; - - private static Map sessions = new ConcurrentHashMap<>(); - - public WebsoketSessionsTable(DataSource dataSource) { - super(Sorm.create(dataSource), WebSocketSession.class); - } - - - - List readSessionsByGameId(String gameId) { - return readList(SELECT_STAR + FROM + getTableName() + WHERE + GAME_ID + "=?", gameId); - } - - List readSessionsByUserId(String userId) { - return readList("select * " + FROM + getTableName() + WHERE + USER_ID + "=?", userId); - } - - List getSessionsByGameId(String gameId) { - List result = - readSessionsByGameId(gameId).stream().map(session -> sessions.get(session.sessionId())) - .filter(Objects::nonNull).collect(Collectors.toList()); - return result; - } - - List getSessionsByUserId(String userId) { - List result = - readSessionsByUserId(userId).stream().map(session -> sessions.get(session.sessionId())) - .filter(s -> Objects.nonNull(s)).collect(Collectors.toList()); - return result; - } - - public List getSessionsByUserIds(List userIds) { - if (userIds.size() == 0) { - return Collections.emptyList(); - } - ParameterizedSql psql = ParameterizedSqlParser - .parse("select * from " + getTableName() + " where " + USER_ID + " IN() ", userIds); - return readList(psql.getSql(), psql.getParameters()).stream() - .map(session -> sessions.get(session.sessionId())).filter(s -> Objects.nonNull(s)) - .collect(Collectors.toList()); - } - - - - List getAllSessions() { - List result = selectAll().stream().map(session -> sessions.get(session.sessionId())) - .filter(s -> Objects.nonNull(s)).collect(Collectors.toList()); - return result; - } - - - void registerSession(String gameId, String userId, Session session) { - int sessionId = session.hashCode(); - WebSocketSession ws = new WebSocketSession(sessionId, userId, gameId, LocalDateTime.now()); - if (exists(ws)) { - log.warn("{} already exists.", ws); - return; - } - insert(ws); - sessions.put(sessionId, session); - log.info("WebSocket is registered={}", ws); - } - - void updateSession(int sessionId, String gameId, String userId) { - update(new WebSocketSession(sessionId, userId, gameId, LocalDateTime.now())); - - } - - Optional removeSession(Session session) { - for (Entry e : sessions.entrySet()) { - if (e.getValue().equals(session)) { - sessions.remove(e.getKey()); - WebSocketSession gs = selectByPrimaryKey(e.getKey()); - delete(gs); - return Optional.of(gs.gameId()); - } - } - return Optional.empty(); - } - - public List readUsers(UsersTable usersTable, String gameId) { - Set uids = readSessionsByGameId(gameId).stream().map(u -> u == null ? null : u.userId()) - .filter(Objects::nonNull).collect(Collectors.toSet()); - return usersTable.readListByUids(uids); - - } - - public List readStudents(UsersTable usersTable, String gameId) { - return readUsers(usersTable, gameId).stream().filter(u -> u.isStudent()) - .collect(Collectors.toList()); - } - - public List readActiveGameIdsOrderByGameId(UsersTable usersTable) { - ParameterizedSql psql = ParameterizedSqlParser.parse( - SELECT + DISTINCT + GAME_ID + FROM + getTableName() + WHERE + GAME_ID + LIKE + "?", - "%-vs-%"); - return getOrm().readList(String.class, psql).stream() - .filter(gid -> readUsers(usersTable, gid).size() > 0).sorted().collect(Collectors.toList()); - } - - public int getWatchingUniqueStudentsNum(UsersTable usersTable, String gameId) { - return (int) readStudents(usersTable, gameId).stream().map(uj -> uj.userId()) - .collect(Collectors.toSet()).stream().count(); - } - - public List getAdminSessions(UsersTable usersTable) { - List ids = usersTable.getAdminUserIds(); - if (ids.size() == 0) { - return Collections.emptyList(); - } - ParameterizedSql st = OrderedParameterSqlParser - .parse("select * from " + getTableName() + " where " + USER_ID + " IN ()", ids); - return readList(st.getSql(), st.getParameters()).stream() - .map(ws -> sessions.get(ws.sessionId())).filter(Objects::nonNull) - .collect(Collectors.toList()); - } - - - @OrmRecord - public static record WebSocketSession(@PrimaryKey int sessionId, String userId, - @Index String gameId, LocalDateTime createdAt) { - - } - -} From d80125d053a63b8b3d15767b79bb3bd3d61a3525 Mon Sep 17 00:00:00 2001 From: Yuu NAKAJIMA Date: Wed, 13 Jul 2022 14:28:15 +0900 Subject: [PATCH 04/26] =?UTF-8?q?GameStateJson=E3=81=AE=E5=89=8A=E9=99=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nkjmlab-go-webapp/pom.xml | 4 +- .../org/nkjmlab/go/javalin/GoApplication.java | 6 +-- .../javalin/fbauth/FirebaseUserSession.java | 4 +- .../go/javalin/jsonrpc/GoJsonRpcService.java | 16 +++--- .../jsonrpc/GoJsonRpcServiceInterface.java | 8 +-- .../go/javalin/model/common/Agehama.java | 3 ++ .../nkjmlab/go/javalin/model/common/Hand.java | 2 + .../model/relation/GameStatesTable.java | 49 +++++-------------- .../model/relation/GameStatesTables.java | 43 ++++++++-------- .../websocket/WebsocketSessionsManager.java | 30 ++++++------ 10 files changed, 72 insertions(+), 93 deletions(-) diff --git a/nkjmlab-go-webapp/pom.xml b/nkjmlab-go-webapp/pom.xml index dc79ff2..61dc142 100644 --- a/nkjmlab-go-webapp/pom.xml +++ b/nkjmlab-go-webapp/pom.xml @@ -26,9 +26,9 @@ - 0.8.2 + 0.8.3 3.0.15.RELEASE - 1.4.8 + 1.4.9 UTF-8 true true diff --git a/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/GoApplication.java b/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/GoApplication.java index 441dd54..da1dfaf 100644 --- a/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/GoApplication.java +++ b/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/GoApplication.java @@ -20,7 +20,6 @@ import org.nkjmlab.go.javalin.model.relation.GameRecordsTable.GameRecord; import org.nkjmlab.go.javalin.model.relation.GameStatesTable; import org.nkjmlab.go.javalin.model.relation.GameStatesTable.GameState; -import org.nkjmlab.go.javalin.model.relation.GameStatesTable.GameStateJson; import org.nkjmlab.go.javalin.model.relation.GameStatesTables; import org.nkjmlab.go.javalin.model.relation.HandUpsTable; import org.nkjmlab.go.javalin.model.relation.HandUpsTable.HandUp; @@ -198,6 +197,7 @@ public GoApplication() { { GameStatesTable gameStatesTable = new GameStatesTable(fileDbDataSource); + gameStatesTable.dropTableIfExists(); gameStatesTable.createTableIfNotExists().createIndexesIfNotExists(); gameStatesTable.trimAndBackupToFile(factory.getDatabaseDirectory(), @@ -366,7 +366,7 @@ private void prepareGetHandler() { case "games.html" -> { List gids = webSocketManager.readActiveGameIdsOrderByGameId(); List tmp = - gids.stream().map(gid -> gameStatesTables.readLatestGameStateJson(gid)).map(gsj -> { + gids.stream().map(gid -> gameStatesTables.readLatestGameState(gid)).map(gsj -> { String gameId = gsj.gameId(); GameStateViewJson json = new GameStateViewJson(gsj, handsUpTable.selectByPrimaryKey(gameId), @@ -485,7 +485,7 @@ public static JacksonMapper getDefaultJacksonMapper() { return JacksonMapper.getIgnoreUnknownPropertiesMapper(); } - public static record GameStateViewJson(GameStateJson gameState, HandUp handUp, + public static record GameStateViewJson(GameState gameState, HandUp handUp, int watchingStudentsNum) { } diff --git a/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/fbauth/FirebaseUserSession.java b/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/fbauth/FirebaseUserSession.java index e22bf81..1bc92f0 100644 --- a/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/fbauth/FirebaseUserSession.java +++ b/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/fbauth/FirebaseUserSession.java @@ -5,8 +5,8 @@ public class FirebaseUserSession extends UserSession { - private static final String EMAIL = "email"; - private static final String ID_TOKEN = "idToken"; + private static final String EMAIL = "EMAIL"; + private static final String ID_TOKEN = "ID_TOKEN"; public static FirebaseUserSession wrap(HttpSession session) { return new FirebaseUserSession(session); diff --git a/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/jsonrpc/GoJsonRpcService.java b/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/jsonrpc/GoJsonRpcService.java index 9b2abc1..63029b2 100644 --- a/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/jsonrpc/GoJsonRpcService.java +++ b/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/jsonrpc/GoJsonRpcService.java @@ -4,7 +4,6 @@ import java.io.File; import java.time.LocalDateTime; import java.util.Collections; -import java.util.Date; import java.util.List; import java.util.Map; import java.util.Set; @@ -12,7 +11,7 @@ import org.nkjmlab.go.javalin.model.common.ProblemJson; import org.nkjmlab.go.javalin.model.problem.ProblemTextToJsonConverter; import org.nkjmlab.go.javalin.model.relation.GameRecordsTable; -import org.nkjmlab.go.javalin.model.relation.GameStatesTable.GameStateJson; +import org.nkjmlab.go.javalin.model.relation.GameStatesTable.GameState; import org.nkjmlab.go.javalin.model.relation.GameStatesTables; import org.nkjmlab.go.javalin.model.relation.HandUpsTable; import org.nkjmlab.go.javalin.model.relation.HandUpsTable.HandUp; @@ -33,6 +32,7 @@ import org.nkjmlab.util.java.json.JsonMapper; import org.nkjmlab.util.java.lang.ParameterizedStringUtils; import org.nkjmlab.util.javax.imageio.ImageIoUtils; +import org.threeten.bp.Instant; public class GoJsonRpcService implements GoJsonRpcServiceInterface { private static final org.apache.logging.log4j.Logger log = @@ -68,7 +68,7 @@ public GoJsonRpcService(WebsocketSessionsManager wsManager, GameStatesTables gam } @Override - public void sendGameState(String gameId, GameStateJson json) { + public void sendGameState(String gameId, GameState json) { websocketManager.sendGameState(gameId, json); } @@ -86,7 +86,7 @@ public void syncGameState(int sessionId, String gameId, String userId) { } @Override - public void newGame(String gameId, GameStateJson json) { + public void newGame(String gameId, GameState json) { websocketManager.newGame(gameId, json); } @@ -102,7 +102,7 @@ public ProblemJson getProblem(long problemId) { } @Override - public void goBack(String gameId, GameStateJson json) { + public void goBack(String gameId, GameState json) { websocketManager.goBack(gameId); } @@ -120,7 +120,7 @@ public ProblemJson saveProblem(String gameId, long problemId, String groupId, St private Problem createNewProblem(String gameId, long problemId, String groupId, String name, String message) { Problem prevP = problemsTable.selectByPrimaryKey(problemId); - GameStateJson currentState = gameStatesTables.readLatestGameStateJson(gameId); + GameState currentState = gameStatesTables.readLatestGameState(gameId); if (prevP != null) { autoBackupProblemJsonToFile(ProblemJson.createFrom(prevP)); } @@ -134,7 +134,7 @@ private Problem createNewProblem(String gameId, long problemId, String groupId, private void autoBackupProblemJsonToFile(ProblemJson p) { File bkupDir = getProblemAutoBackupDir(p.groupId()); - File o = new File(bkupDir, new Date().getTime() + "-copy-" + p.name() + ".json"); + File o = new File(bkupDir, Instant.now().toEpochMilli() + "-copy-" + p.name() + ".json"); mapper.toJsonAndWrite(p, o, true); } @@ -354,7 +354,7 @@ public int registerRecord(String userId, String opponentUserId, String jadge, St @Override public String getKomi(String gameId) { try { - GameStateJson gs = gameStatesTables.readLatestGameStateJson(gameId); + GameState gs = gameStatesTables.readLatestGameState(gameId); User bp = usersTable.selectByPrimaryKey(gs.blackPlayerId()); User wp = usersTable.selectByPrimaryKey(gs.whitePlayerId()); int diff = Math.abs(wp.rank() - bp.rank()); diff --git a/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/jsonrpc/GoJsonRpcServiceInterface.java b/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/jsonrpc/GoJsonRpcServiceInterface.java index d494d05..00c4f11 100644 --- a/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/jsonrpc/GoJsonRpcServiceInterface.java +++ b/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/jsonrpc/GoJsonRpcServiceInterface.java @@ -3,7 +3,7 @@ import java.io.File; import java.util.List; import org.nkjmlab.go.javalin.model.common.ProblemJson; -import org.nkjmlab.go.javalin.model.relation.GameStatesTable.GameStateJson; +import org.nkjmlab.go.javalin.model.relation.GameStatesTable.GameState; import org.nkjmlab.go.javalin.model.relation.UsersTable.UserJson; import org.nkjmlab.go.javalin.model.relation.VotesTable.VoteResult; @@ -30,15 +30,15 @@ public interface GoJsonRpcServiceInterface { boolean sendLog(String logLevel, String location, String msg, String options); - void newGame(String gameId, GameStateJson json); + void newGame(String gameId, GameState json); ProblemJson loadProblem(String gameId, long problemId); ProblemJson getProblem(long problemId); - void goBack(String gameId, GameStateJson json); + void goBack(String gameId, GameState json); - void sendGameState(String gameId, GameStateJson json); + void sendGameState(String gameId, GameState json); ProblemJson saveProblem(String gameId, long problemId, String groupId, String name, String message); diff --git a/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/model/common/Agehama.java b/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/model/common/Agehama.java index eb09b68..bb9c8d6 100644 --- a/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/model/common/Agehama.java +++ b/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/model/common/Agehama.java @@ -1,5 +1,8 @@ package org.nkjmlab.go.javalin.model.common; +import org.nkjmlab.sorm4j.util.datatype.OrmJsonColumnContainer; + +@OrmJsonColumnContainer public record Agehama(int black, int white) { public Agehama increment(Stone stone) { diff --git a/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/model/common/Hand.java b/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/model/common/Hand.java index 68bb491..80c46c0 100644 --- a/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/model/common/Hand.java +++ b/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/model/common/Hand.java @@ -1,6 +1,7 @@ package org.nkjmlab.go.javalin.model.common; import java.util.stream.Stream; +import org.nkjmlab.sorm4j.util.datatype.OrmJsonColumnContainer; /** * stone
@@ -8,6 +9,7 @@ * 2桁目 0:ブランク, 1:□, 2:△, 3:x * */ +@OrmJsonColumnContainer public record Hand(String type, int number, int x, int y, int stone, String options) { public static Hand createDummyHand() { diff --git a/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/model/relation/GameStatesTable.java b/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/model/relation/GameStatesTable.java index 56e7d55..b0fda60 100644 --- a/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/model/relation/GameStatesTable.java +++ b/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/model/relation/GameStatesTable.java @@ -18,13 +18,12 @@ import org.nkjmlab.sorm4j.Sorm; import org.nkjmlab.sorm4j.annotation.OrmRecord; import org.nkjmlab.sorm4j.util.h2.BasicH2Table; +import org.nkjmlab.sorm4j.util.jackson.JacksonSormContext; import org.nkjmlab.sorm4j.util.table_def.annotation.AutoIncrement; import org.nkjmlab.sorm4j.util.table_def.annotation.Index; import org.nkjmlab.sorm4j.util.table_def.annotation.IndexColumns; import org.nkjmlab.sorm4j.util.table_def.annotation.NotNull; import org.nkjmlab.sorm4j.util.table_def.annotation.PrimaryKey; -import org.nkjmlab.util.jackson.JacksonMapper; -import com.fasterxml.jackson.core.type.TypeReference; public class GameStatesTable extends BasicH2Table { private static final org.apache.logging.log4j.Logger log = @@ -45,7 +44,10 @@ public class GameStatesTable extends BasicH2Table { public GameStatesTable(DataSource dataSource) { - super(Sorm.create(dataSource), GameState.class); + super( + Sorm.create(dataSource, JacksonSormContext + .builder(GoApplication.getDefaultJacksonMapper().getObjectMapper()).build()), + GameState.class); } @@ -107,46 +109,19 @@ public List readTodayGameIds() { @IndexColumns({BLACK_PLAYER_ID, WHITE_PLAYER_ID}) public record GameState(@PrimaryKey @AutoIncrement long id, LocalDateTime createdAt, @Index @NotNull String gameId, @NotNull String blackPlayerId, @NotNull String whitePlayerId, - @NotNull String lastHand, @NotNull String agehama, @NotNull String cells, - @NotNull String symbols, @NotNull String handHistory, @NotNull long problemId, - @NotNull String options) { - } - - public record GameStateJson(long id, String gameId, String blackPlayerId, String whitePlayerId, - int[][] cells, Map symbols, Agehama agehama, Hand lastHand, - Hand[] handHistory, long problemId, Map options, LocalDateTime createdAt) { + @NotNull Hand lastHand, @NotNull Agehama agehama, @NotNull Integer[][] cells, + @NotNull Map symbols, @NotNull Hand[] handHistory, @NotNull long problemId, + @NotNull Map options) { public static final String DEFAULT_PLAYER_ID = "-1"; public static final int DEFAULT_RO = 9; - private static final JacksonMapper mapper = GoApplication.getDefaultJacksonMapper(); - - public GameStateJson updateHandHistory(List modifiedHistory) { - return new GameStateJson(id, gameId, blackPlayerId, whitePlayerId, cells, symbols, agehama, - lastHand, modifiedHistory.toArray(Hand[]::new), problemId, options, createdAt); - } - - - public GameStateJson(GameState gameState) { - this(gameState.id(), gameState.gameId(), gameState.blackPlayerId(), gameState.whitePlayerId(), - mapper.toObject(gameState.cells(), int[][].class), - mapper.toObject(gameState.symbols(), new TypeReference>() {}), - mapper.toObject(gameState.agehama(), Agehama.class), - mapper.toObject(gameState.lastHand(), Hand.class), - mapper.toObject(gameState.handHistory(), Hand[].class), gameState.problemId(), - mapper.toObject(gameState.options(), new TypeReference>() {}), - gameState.createdAt()); + public GameState updateHandHistory(List modifiedHistory) { + return new GameState(id, createdAt, gameId, blackPlayerId, whitePlayerId, lastHand, agehama, + cells, symbols, modifiedHistory.toArray(Hand[]::new), problemId, options); } - - public GameState toGameState() { - return new GameState(id(), LocalDateTime.now(), gameId, blackPlayerId, whitePlayerId, - mapper.toJson(lastHand), mapper.toJson(agehama), mapper.toJson(cells), - mapper.toJson(symbols), mapper.toJson(handHistory), problemId, mapper.toJson(options)); - } - - - } + } diff --git a/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/model/relation/GameStatesTables.java b/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/model/relation/GameStatesTables.java index ba42851..7806955 100644 --- a/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/model/relation/GameStatesTables.java +++ b/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/model/relation/GameStatesTables.java @@ -13,7 +13,6 @@ import org.nkjmlab.go.javalin.model.common.Agehama; import org.nkjmlab.go.javalin.model.common.Hand; import org.nkjmlab.go.javalin.model.relation.GameStatesTable.GameState; -import org.nkjmlab.go.javalin.model.relation.GameStatesTable.GameStateJson; import org.nkjmlab.sorm4j.internal.util.Try; public class GameStatesTables { @@ -31,29 +30,28 @@ public GameStatesTables(GameStatesTable fileDb, GameStatesTable memDb) { this.gameStatesTableInFile = fileDb; } - private static final Map statesCache = new ConcurrentHashMap<>(); + private static final Map statesCache = new ConcurrentHashMap<>(); - public void saveGameState(GameStateJson json) { + public void saveGameState(GameState json) { statesCache.put(json.gameId(), json); - GameState gs = json.toGameState(); - gameStatesTableInMem.insert(gs); - fileDbService.execute( - Try.createRunnable(() -> gameStatesTableInFile.insert(gs), e -> log.error(e.getMessage()))); + gameStatesTableInMem.insert(json); + fileDbService.execute(Try.createRunnable(() -> gameStatesTableInFile.insert(json), + e -> log.error(e.getMessage()))); } - public GameStateJson readLatestGameStateJson(String gameId) { + public GameState readLatestGameState(String gameId) { return statesCache.computeIfAbsent(gameId, - key -> gameStatesTableInMem.getLatestGameStateFromDb(gameId).map(s -> new GameStateJson(s)) - .orElseGet(() -> createNewGameState(gameId, GameStateJson.DEFAULT_PLAYER_ID, - GameStateJson.DEFAULT_PLAYER_ID, GameStateJson.DEFAULT_RO))); + key -> gameStatesTableInMem.getLatestGameStateFromDb(gameId) + .orElseGet(() -> createNewGameState(gameId, GameState.DEFAULT_PLAYER_ID, + GameState.DEFAULT_PLAYER_ID, GameState.DEFAULT_RO))); } - public List readLatestBoardsJson(List gids) { - return gids.stream().map(gid -> readLatestGameStateJson(gid)).collect(Collectors.toList()); + public List readLatestBoardsJson(List gids) { + return gids.stream().map(gid -> readLatestGameState(gid)).collect(Collectors.toList()); } - public List readTodayGameJsons() { + public List readTodayGameJsons() { return readLatestBoardsJson(gameStatesTableInMem.readTodayGameIds()); } @@ -61,26 +59,27 @@ public List readTodayGameJsons() { public void deleteLatestGameState(String gameId) { gameStatesTableInMem.delete(gameId); statesCache.put(gameId, - gameStatesTableInMem.getLatestGameStateFromDb(gameId).map(s -> new GameStateJson(s)) - .orElseGet(() -> createNewGameState(gameId, GameStateJson.DEFAULT_PLAYER_ID, - GameStateJson.DEFAULT_PLAYER_ID, GameStateJson.DEFAULT_RO))); + gameStatesTableInMem.getLatestGameStateFromDb(gameId) + .orElseGet(() -> createNewGameState(gameId, GameState.DEFAULT_PLAYER_ID, + GameState.DEFAULT_PLAYER_ID, GameState.DEFAULT_RO))); } - public GameStateJson createNewGameState(String gameId, String blackPlayerId, String whitePlayerId, + public GameState createNewGameState(String gameId, String blackPlayerId, String whitePlayerId, int ro) { String[] players = {blackPlayerId, whitePlayerId}; if (gameId.split(VS_SEPARATOR).length == 2) { players = gameId.split(VS_SEPARATOR); } - int[][] cells = new int[ro][ro]; + Integer[][] cells = new Integer[ro][ro]; for (int i = 0; i < cells.length; i++) { Arrays.fill(cells[i], 0); } - return new GameStateJson(-1, gameId, players[0], players[1], cells, new HashMap<>(), - new Agehama(0, 0), Hand.createDummyHand(), new Hand[0], -1, new HashMap<>(), - LocalDateTime.now()); + + return new GameState(-1, LocalDateTime.now(), gameId, players[0], players[1], + Hand.createDummyHand(), new Agehama(0, 0), cells, new HashMap<>(), new Hand[0], -1, + new HashMap<>()); } diff --git a/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/websocket/WebsocketSessionsManager.java b/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/websocket/WebsocketSessionsManager.java index 328ca89..f6fd8bf 100644 --- a/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/websocket/WebsocketSessionsManager.java +++ b/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/websocket/WebsocketSessionsManager.java @@ -27,7 +27,7 @@ import org.nkjmlab.go.javalin.model.common.Hand; import org.nkjmlab.go.javalin.model.common.Hand.HandType; import org.nkjmlab.go.javalin.model.common.ProblemJson; -import org.nkjmlab.go.javalin.model.relation.GameStatesTable.GameStateJson; +import org.nkjmlab.go.javalin.model.relation.GameStatesTable.GameState; import org.nkjmlab.go.javalin.model.relation.GameStatesTables; import org.nkjmlab.go.javalin.model.relation.HandUpsTable; import org.nkjmlab.go.javalin.model.relation.MatchingRequestsTable; @@ -85,7 +85,7 @@ public WebsocketSessionsManager(GameStatesTables gameStatesTables, ProblemsTable public void onMessage(String gameId, WsMessageContext ctx) { - GameStateJson gs = ctx.messageAsClass(GameStateJson.class); + GameState gs = ctx.messageAsClass(GameState.class); sendGameState(gameId, gs); } @@ -140,19 +140,19 @@ public ProblemJson loadProblem(String gameId, long problemId) { Hand[] handHistory = mapper.toObject(p.handHistory(), Hand[].class); Hand lastHand = handHistory.length != 0 ? handHistory[handHistory.length - 1] : Hand.createDummyHand(); - GameStateJson json = - new GameStateJson(-1, gameId, "", "", mapper.toObject(p.cells(), int[][].class), - mapper.toObject(p.symbols(), new TypeReference>() {}), - mapper.toObject(p.agehama(), Agehama.class), lastHand, handHistory, p.id(), - new HashMap<>(), LocalDateTime.now()); + + GameState json = new GameState(-1, LocalDateTime.now(), gameId, "", "", lastHand, + mapper.toObject(p.agehama(), Agehama.class), mapper.toObject(p.cells(), Integer[][].class), + mapper.toObject(p.symbols(), new TypeReference>() {}), handHistory, + p.id(), new HashMap<>()); sendGameState(gameId, json); return ProblemJson.createFrom(problemsTable.selectByPrimaryKey(problemId)); } - public void newGame(String gameId, GameStateJson json) { - GameStateJson newGameJson = gameStatesTables.createNewGameState(gameId, json.blackPlayerId(), + public void newGame(String gameId, GameState json) { + GameState newGameJson = gameStatesTables.createNewGameState(gameId, json.blackPlayerId(), json.whitePlayerId(), json.cells().length); sendGameState(gameId, newGameJson); } @@ -165,14 +165,14 @@ private void sendEntriesToSessions(String gameId) { } - public void sendGameState(String gameId, GameStateJson json) { - GameStateJson newJson = removeHagashi(json); + public void sendGameState(String gameId, GameState json) { + GameState newJson = removeHagashi(json); gameStatesTables.saveGameState(newJson); sendGameStateToSessions(gameId, newJson); } - private GameStateJson removeHagashi(GameStateJson json) { + private GameState removeHagashi(GameState json) { List history = Arrays.asList(json.handHistory()); if (history.size() <= 2) { return json; @@ -192,7 +192,7 @@ private GameStateJson removeHagashi(GameStateJson json) { } - private void sendGameStateToSessions(String gameId, GameStateJson json) { + private void sendGameStateToSessions(String gameId, GameState json) { jsonSenderService.submitGameState(websoketSessionsTable.getSessionsByGameId(gameId), json); } @@ -221,7 +221,7 @@ private void sendHandUpToSessions(String gameId, boolean handUp, int order) { } public void sendLatestGameStateToSessions(String gameId) { - sendGameStateToSessions(gameId, gameStatesTables.readLatestGameStateJson(gameId)); + sendGameStateToSessions(gameId, gameStatesTables.readLatestGameState(gameId)); } @@ -253,7 +253,7 @@ private enum MethodName { public WebSocketJsonSenderService() {} - public void submitGameState(List sessions, GameStateJson json) { + public void submitGameState(List sessions, GameState json) { submit(sessions, MethodName.GAME_STATE, json); } From 21094120ffdfc349c26e659e3be583f361206e58 Mon Sep 17 00:00:00 2001 From: Yuu NAKAJIMA Date: Thu, 14 Jul 2022 10:32:00 +0900 Subject: [PATCH 05/26] =?UTF-8?q?Bootstrap5=E3=81=B8=E3=82=A2=E3=83=83?= =?UTF-8?q?=E3=83=97=E3=83=87=E3=83=BC=E3=83=88=E3=81=97=E3=81=9F=EF=BC=8E?= =?UTF-8?q?WebJars=E3=82=92=E7=94=A8=E3=81=84=E3=82=8B=E3=82=88=E3=81=86?= =?UTF-8?q?=E3=81=AB=E3=81=97=E3=81=9F=EF=BC=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- nkjmlab-go-webapp/pom.xml | 176 +++++++++++++++++- .../org/nkjmlab/go/javalin/GoApplication.java | 9 +- .../javalin/fbauth/FirebaseUserSession.java | 13 +- .../resources/templates/fragment/creator.html | 16 +- .../resources/templates/fragment/head.html | 71 ++++--- .../templates/fragment/header-admin.html | 2 +- .../templates/fragment/header-play.html | 84 +++++---- .../templates/fragment/modal-creator.html | 8 +- .../templates/fragment/modal-icon.html | 4 +- .../templates/fragment/modal-misc.html | 12 +- .../templates/fragment/modal-record.html | 4 +- .../templates/fragment/modal-records.html | 2 +- .../templates/fragment/modal-signup.html | 8 +- .../fragment/question-table-small.html | 4 +- .../templates/fragment/question-table.html | 4 +- .../fragment/waiting-request-table-small.html | 6 +- .../fragment/waiting-request-table.html | 4 +- .../src/main/resources/templates/games.html | 10 +- .../src/main/resources/templates/index.html | 24 +-- .../src/main/resources/templates/play.html | 82 ++++---- .../src/main/resources/templates/players.html | 6 +- .../main/resources/templates/questions.html | 4 +- .../resources/templates/waiting-room.html | 8 +- .../resources/webroot/js/check-environment.js | 12 +- .../src/main/resources/webroot/js/play.js | 10 +- 25 files changed, 376 insertions(+), 207 deletions(-) diff --git a/nkjmlab-go-webapp/pom.xml b/nkjmlab-go-webapp/pom.xml index 61dc142..a2a9306 100644 --- a/nkjmlab-go-webapp/pom.xml +++ b/nkjmlab-go-webapp/pom.xml @@ -59,7 +59,7 @@ io.javalin javalin - 4.6.3 + 4.6.4 @@ -125,19 +125,187 @@ org.apache.logging.log4j log4j-slf4j-impl - 2.17.2 + 2.18.0 org.apache.logging.log4j log4j-core - 2.17.2 + 2.18.0 + + + + + org.webjars.npm + jquery + 3.6.0 + + + * + * + + + + + org.webjars.npm + bootstrap + 5.2.0-beta1 + + + * + * + + + + + + org.webjars.bower + bootstrap-treeview + 1.2.0 + + + * + * + + + + + + org.webjars.npm + sweetalert2 + 11.4.18 + + + * + * + + + + + org.webjars.npm + chart.js + 3.8.0 + + + * + * + + + + + org.webjars.npm + fortawesome__fontawesome-free + 6.1.1 + + + * + * + + + + + + + org.webjars.npm + stacktrace-js + 2.0.2 + + + * + * + + + + + + org.webjars.npm + clipboard + 2.0.11 + + + * + * + + + + + + org.webjars.npm + jszip + 3.10.0 + + + * + * + + + + + + org.webjars.bowergithub.datatables + datatables + 1.10.21 + + + * + * + + + + + org.webjars.bower + datatables-tabletools + 2.2.4 + + + * + * + + + + + + + org.webjars.bowergithub.datatables + dist-datatables-buttons-datatables + 2.2.2 + + + * + * + + + + + + + org.webjars.npm + firebase + 9.9.0 + + + * + * + + + + + + org.webjars.npm + firebaseui + 6.0.1 + + + * + * + + org.junit.jupiter junit-jupiter-engine - 5.9.0-M1 + 5.9.0-RC1 test diff --git a/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/GoApplication.java b/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/GoApplication.java index da1dfaf..5ea978a 100644 --- a/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/GoApplication.java +++ b/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/GoApplication.java @@ -142,6 +142,7 @@ public GoApplication() { config.autogenerateEtags = true; // config.precompressStaticFiles = true; config.enableCorsForAllOrigins(); + config.enableWebjars(); }); { @@ -287,6 +288,9 @@ private void prepareJsonRpc() { ? new AuthService(usersTable, loginsTable, passwordsTable, ctx.req) : goJsonRpcService; JsonRpcResponse jres = jsonRpcService.callHttpJsonRpc(srv, jreq, ctx.res); + if (jres.getError() != null) { + log.warn(jres); + } String ret = mapper.toJson(jres); ctx.result(ret).contentType("application/json"); }); @@ -462,13 +466,14 @@ private void isAdminOrThrow(UsersTable usersTable, HttpServletRequest req) { FirebaseUserSession session = FirebaseUserSession.wrap(req.getSession()); User u = null; if (session.isSigninFirebase()) { - String email = session.getEmail(); + String email = session.getEmail().orElseThrow(() -> new RuntimeException( + ParameterizedStringUtils.newString("Email is not set in the session"))); u = usersTable.readByEmail(email); } else if (session.isLogined()) { u = session.getUserId().map(userId -> usersTable.selectByPrimaryKey(userId)).orElse(null); } if (u == null) { - throw new RuntimeException(ParameterizedStringUtils.newString("User not found")); + throw new RuntimeException(ParameterizedStringUtils.newString("User is not found")); } if (!u.isAdmin()) { throw new RuntimeException(ParameterizedStringUtils.newString("User is not admin")); diff --git a/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/fbauth/FirebaseUserSession.java b/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/fbauth/FirebaseUserSession.java index 1bc92f0..803962c 100644 --- a/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/fbauth/FirebaseUserSession.java +++ b/nkjmlab-go-webapp/src/main/java/org/nkjmlab/go/javalin/fbauth/FirebaseUserSession.java @@ -1,5 +1,6 @@ package org.nkjmlab.go.javalin.fbauth; +import java.util.Optional; import javax.servlet.http.HttpSession; import org.nkjmlab.util.javax.servlet.UserSession; @@ -17,21 +18,21 @@ protected FirebaseUserSession(HttpSession session) { } - public String getEmail() { - return getAttribute(EMAIL) == null ? null : getAttribute(EMAIL).toString(); + public Optional getEmail() { + return getAttribute(EMAIL).map(o -> o.toString()); } - public String getIdToken() { - return getAttribute(ID_TOKEN) == null ? null : getAttribute(ID_TOKEN).toString(); + public Optional getIdToken() { + return getAttribute(ID_TOKEN).map(o -> o.toString()); } public boolean isSetUserId() { - return getUserId() != null; + return getUserId().isPresent(); } public boolean isSigninFirebase() { - return getIdToken() != null; + return getIdToken().isPresent(); } private void setEmail(String email) { diff --git a/nkjmlab-go-webapp/src/main/resources/templates/fragment/creator.html b/nkjmlab-go-webapp/src/main/resources/templates/fragment/creator.html index a5f02ec..0e44722 100644 --- a/nkjmlab-go-webapp/src/main/resources/templates/fragment/creator.html +++ b/nkjmlab-go-webapp/src/main/resources/templates/fragment/creator.html @@ -4,26 +4,26 @@
-
+ -
+
ユーザ (学生) ユーザ (全ユーザ) 対局 (進行中) 対局 (本日)
-
+
-
-
- -
-
-
-
+
+ class="badge bg-info" th:if='${isAttendance and !currentUser.isAdmin()}'>出
-
+
@@ -43,7 +43,7 @@ diff --git a/nkjmlab-go-webapp/src/main/resources/templates/fragment/modal-icon.html b/nkjmlab-go-webapp/src/main/resources/templates/fragment/modal-icon.html index ec2b418..b054715 100644 --- a/nkjmlab-go-webapp/src/main/resources/templates/fragment/modal-icon.html +++ b/nkjmlab-go-webapp/src/main/resources/templates/fragment/modal-icon.html @@ -8,7 +8,7 @@ -
@@ -29,7 +29,7 @@
@@ -50,7 +50,7 @@
diff --git a/nkjmlab-go-webapp/src/main/resources/templates/fragment/modal-record.html b/nkjmlab-go-webapp/src/main/resources/templates/fragment/modal-record.html index e3bd148..5dd9c7d 100644 --- a/nkjmlab-go-webapp/src/main/resources/templates/fragment/modal-record.html +++ b/nkjmlab-go-webapp/src/main/resources/templates/fragment/modal-record.html @@ -8,7 +8,7 @@ -
@@ -47,7 +47,7 @@
diff --git a/nkjmlab-go-webapp/src/main/resources/templates/fragment/modal-records.html b/nkjmlab-go-webapp/src/main/resources/templates/fragment/modal-records.html index 86e33c9..48e5f19 100644 --- a/nkjmlab-go-webapp/src/main/resources/templates/fragment/modal-records.html +++ b/nkjmlab-go-webapp/src/main/resources/templates/fragment/modal-records.html @@ -8,7 +8,7 @@ - diff --git a/nkjmlab-go-webapp/src/main/resources/templates/fragment/modal-signup.html b/nkjmlab-go-webapp/src/main/resources/templates/fragment/modal-signup.html index 58c4374..b0ceed5 100644 --- a/nkjmlab-go-webapp/src/main/resources/templates/fragment/modal-signup.html +++ b/nkjmlab-go-webapp/src/main/resources/templates/fragment/modal-signup.html @@ -8,7 +8,7 @@ - @@ -41,12 +41,12 @@