package com.ntlab.irisserver.websockets;
import com.ntlab.irisserver.entities.Game;
import com.ntlab.irisserver.entities.Room;
import com.ntlab.irisserver.models.KeywordManager;
import com.ntlab.irisserver.models.RoomManager;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import javax.websocket.*;
import javax.websocket.server.ServerEndpoint;
import javax.websocket.server.PathParam;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import java.util.Queue;
import java.util.concurrent.ConcurrentLinkedQueue;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
@ServerEndpoint("/game-start/{rid}")
public class GameStartWebSocket implements ApplicationContextAware {
private ApplicationContext applicationContext;
public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
this.applicationContext = applicationContext;
}
private static Map<String, Session> sessionMap = new HashMap();
static {
ScheduledExecutorService service = Executors.newSingleThreadScheduledExecutor();
}
@OnMessage
public String onMessage(Session session, String message, @PathParam("rid") String rid) throws IOException {
System.out.println("WebSocketで受信したメッセージ/ " + message);
// "nickname,state"がメッセージで渡される
String[] splitMessage = message.split(",");
String nickname = splitMessage[0];
int state = Integer.parseInt(splitMessage[1]);
// stateやnicknameが正常でなければ、何もしない
if(state!=2||nickname==null) {
session.getBasicRemote().sendText("nicknameかstateが空です、エラーエラー");
} else {
//stateを変更して、全体の画面を変更させるように導く処理
session.getBasicRemote().sendText(nickname+state+"が正常に渡された!");
RoomManager rm = RoomManager.getInstance();
Room room = rm.getRoom(rid);
session.getBasicRemote().sendText(room.rid);
session.getBasicRemote().sendText(room.getOwnerName());
session.getBasicRemote().sendText(room.ownerName);
if(nickname.equals(room.ownerName)){ //nicknameがownerだった場合
room.setState(state); //部屋の情報を変更
//String path;
// 下の1行でエラーが起こる。
//path = applicationContext.getResource("file:").getFile().getAbsolutePath()+"/apache-tomcat-9.0.10/webapps/irisdata/keywords.txt";
//KeywordManager km = KeywordManager.getInstance();
//String[] keywords = km.getKeywords(path);
//Game game = new Game(room, keywords);
session.getBasicRemote().sendText("3");
// 同じridのメンバーに一斉にメッセージ送って、画面を切り替えさせる
// 本来はここに処理を書くべきではないかも。
// ここいけてない
for(Map.Entry<String, Session> entry : sessionMap.entrySet()) {
session.getBasicRemote().sendText(entry.getKey());
if(entry.getKey().contains(room.rid)){
entry.getValue().getBasicRemote().sendText("changeState-2");
}
}
}
}
return "WebSocketでメッセージを受信しました!";
}
@OnError
public void onError(Throwable th, @PathParam("rid") String rid) {
System.out.println("WebSocketエラーが発生/ " + th.getMessage());
}
@OnOpen
public void onOpen(Session session, @PathParam("rid") String rid) throws IOException {
System.out.println("WebSocketセッション確立");
// ニックネームをクエリパラメータで受け取る処理
// 値がなければ、websocketを切断する
String nickname = null;
String[] queries = session.getQueryString().split("&");
for(String query: queries) {
if(query.contains("nickname=")){
nickname = query.replace("nickname=", "");
}
}
if(nickname==null) {
session.getBasicRemote().sendText("ニックネームのクエリが空だったので切断しました。");
session.close();
}
System.out.println(rid);
System.out.println(nickname);
sessionMap.put(rid+","+nickname, session);
System.out.println(sessionMap.size());
// 同じridのメンバーにメッセージを送る
for(Map.Entry<String, Session> entry : sessionMap.entrySet()) {
if(entry.getKey().contains(rid)){
entry.getValue().getBasicRemote().sendText("同じridに仲間が入ったよ。"+entry.getKey());
System.out.println(entry.getKey());
}
}
}
@OnClose
public void onClose(Session session, @PathParam("rid") String rid) {
System.out.println("WebSocketセッション終了");
String nickname = null;
String[] queries = session.getQueryString().split("&");
for(String query: queries) {
if(query.contains("nickname=")){
nickname = query.replace("nickname=", "");
}
}
sessionMap.remove(rid+","+nickname);
}
}