diff --git a/src/main/java/com/ntlab/irisserver/entities/DrawingController.java b/src/main/java/com/ntlab/irisserver/entities/DrawingController.java index 0ef55d2..13a7222 100644 --- a/src/main/java/com/ntlab/irisserver/entities/DrawingController.java +++ b/src/main/java/com/ntlab/irisserver/entities/DrawingController.java @@ -17,6 +17,16 @@ //ニックネームからメンバーを特定するマップ private Map membersMap= new HashMap<>(); + private long startTime; //ステージの開始時刻 + private long nowTime; //現在の時刻 + private int drawingTime; //お絵描きのタイムリミット + private int countdown; //あと何秒でタイムリミットになるか + private boolean isDrawingTimer; //タイマーを使うかどうか + + //描いている最中にタイムリミット(countdown==0)がくれば、描いている途中のものをputさせる。既に描き終わっている人は何もしない + //時間が0になったときに、描き終わっていない人は「描いている最中の絵をput」する。(クライアントサイド) デバッグがしにくい assingmentのgetで見れるようにする + //getdnoの番号が変わっていたら、「新しい絵を描く」 + public DrawingController(IStateListener stateListener, List members, Game game) { @@ -33,6 +43,13 @@ membersMap.put(nick,mem); } + //お絵描きのタイムリミットを記録 + Settings setting = game.getSettings(); + startTime = System.currentTimeMillis(); + this.drawingTime = setting.getDrawingTimerTimes(); + this.isDrawingTimer = setting.isDrawingTimer(); + + } //絵がアップロードされたときに、ステージを進めるか確認する @@ -55,20 +72,54 @@ if(canUpdate) { stage += 1; - //ゲームに必要な枚数がそろうと、roomのstateを「お絵描き中」から「ゲーム中」に変更 + //タイマーをリセット + startTime = System.currentTimeMillis(); + countdown = drawingTime; + + //ゲームに必要な枚数がそろうと、roomのstateを「お絵描き中2」から「ゲーム中3」に変更 if(stage == maxstage){ stateListener.changeState(); } } } + //お絵描き中のタイマーを更新 + private void updateTimer(){ + //経過した時間を計算(秒) + nowTime = System.currentTimeMillis(); + int count = ((int)nowTime - (int)startTime)/1000; + + if(drawingTime - count > 0){ + countdown = drawingTime - count; + }else{ + countdown = 0; + } + + + } + + //pathパラメーターを引数にするので、memberではなくてString //nicknameから書いてほしいdnoを返す - public int getDno(String nickname) { + public Integer getDno(String nickname) { Member mem = membersMap.get(nickname); + if(mem == null){ + return null; + } List dnoList = assignments.get(mem); int dno = dnoList.get(stage); return dno; } + //これはどこのRESTで使う? assignmentでもいいけど、名前と機能が一致しない assignmentの下にtimerを作ってもいい + public Integer getCountdown(){ + if(isDrawingTimer){ + updateTimer(); + return countdown; + }else{ + return null; + } + + } + } diff --git a/src/main/java/com/ntlab/irisserver/entities/Settings.java b/src/main/java/com/ntlab/irisserver/entities/Settings.java index 4eb2764..81b29da 100644 --- a/src/main/java/com/ntlab/irisserver/entities/Settings.java +++ b/src/main/java/com/ntlab/irisserver/entities/Settings.java @@ -23,7 +23,7 @@ //コンストラクタで初期値設定 public Settings(){ drawingTimer = false; - drawingTimerTimes = 0; + drawingTimerTimes = 50; gameTimer = true; gameTimerTimes = 30; gameTimerFirstThinkingTimes = 10; diff --git a/src/main/java/com/ntlab/irisserver/resources/AssignmentRest.java b/src/main/java/com/ntlab/irisserver/resources/AssignmentRest.java index 8a7c38f..080c417 100644 --- a/src/main/java/com/ntlab/irisserver/resources/AssignmentRest.java +++ b/src/main/java/com/ntlab/irisserver/resources/AssignmentRest.java @@ -6,11 +6,9 @@ import com.ntlab.irisserver.models.RoomManager; import org.springframework.stereotype.Component; -import javax.ws.rs.GET; -import javax.ws.rs.Path; -import javax.ws.rs.PathParam; -import javax.ws.rs.Produces; +import javax.ws.rs.*; import javax.ws.rs.core.MediaType; +import javax.ws.rs.core.Response; import java.util.List; @Component @@ -22,14 +20,60 @@ @Produces(MediaType.APPLICATION_JSON) public int getDno(@PathParam("rid") String rid,@PathParam("nickname") String nickname ) { + Integer dno = null; + RoomManager rm = RoomManager.getInstance(); Room room = rm.getRoom(rid); - Game game = room.getGame(); - DrawingController drawingController = game.getDrawingController(); + if(room != null) { - int dno = 0; - dno = drawingController.getDno(nickname); + Game game = room.getGame(); + DrawingController drawingController = game.getDrawingController(); + dno = drawingController.getDno(nickname); // dno = new Integer(drawingController.getDno(nickname)); + + if(dno == null ){ + + //プレイヤーがいなければエラー + var response = Response.status(Response.Status.NO_CONTENT); + response.status(404).entity("プレイヤーが存在しません"); + throw new WebApplicationException(response.build()); + } + + }else{ + //部屋がなければエラー + var response = Response.status(Response.Status.NO_CONTENT); + response.status(404).entity("部屋が存在しません"); + throw new WebApplicationException(response.build()); + } + return dno; } + + @GET + @Path("/{rid}/game/drawings/assignment/timer") + @Produces(MediaType.APPLICATION_JSON) + public Integer getTime(@PathParam("rid") String rid){ + + Integer countdown = null; + + RoomManager rm = RoomManager.getInstance(); + Room room = rm.getRoom(rid); + if(room != null) { + Game game = room.getGame(); + DrawingController drawingController = game.getDrawingController(); + + //絵を描ける時間を取得 + countdown = drawingController.getCountdown(); + }else{ + //部屋がなければエラー + var response = Response.status(Response.Status.NO_CONTENT); + response.status(404).entity("部屋が存在しません"); + throw new WebApplicationException(response.build()); + } + + + return countdown; + + + } }