Newer
Older
IrisServerWebSocket / src / main / java / com / ntlab / irisserver / websockets / GameStartWebSocket.java
Kota on 22 Dec 2022 5 KB ログ3
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];
        Integer state = Integer.parseInt(splitMessage[1]);
        
        // stateやnicknameが正常でなければ、何もしない
        if(state!=2||nickname==null) {
            session.getBasicRemote().sendText("nicknameかstateが空です、エラーエラー");
        } else {
            //stateを変更して、全体の画面を変更させるように導く処理
            session.getBasicRemote().sendText(nickname+state+"が正常に渡された!");
            session.getBasicRemote().sendText(rid);
            session.getBasicRemote().sendText(nickname);
            session.getBasicRemote().sendText(String.valueOf(state));

            RoomManager rm = RoomManager.getInstance();
            session.getBasicRemote().sendText(rm.toString());
            session.getBasicRemote().sendText(String.valueOf(rm));

            Room room = rm.getRoom(rid);
            session.getBasicRemote().sendText(String.valueOf(room));
            session.getBasicRemote().sendText(room.rid);
            session.getBasicRemote().sendText(room.getOwnerName());
            session.getBasicRemote().sendText(room.ownerName);

            // ここまで、room.ownerができていない。room.owner=nullになってる
            if(nickname.equals(room.ownerName)){ //nicknameがownerだった場合
                room.setState(state); //部屋の情報を変更
                String path;
                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);

                // 同じridのメンバーに一斉にメッセージ送って、画面を切り替えさせる
                // 本来はここに処理を書くべきではないかも。
                for(Map.Entry<String, Session> entry : sessionMap.entrySet()) {
                    if(entry.getKey().contains(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);
    }

}