|
@@ -0,0 +1,318 @@
|
|
|
+package com.example.gobangapi.utils;
|
|
|
+
|
|
|
+import com.alibaba.fastjson2.JSON;
|
|
|
+import com.example.gobangapi.config.Constant;
|
|
|
+import com.example.gobangapi.doman.GameMessage;
|
|
|
+import com.example.gobangapi.doman.GobangRoomItem;
|
|
|
+import com.example.gobangapi.doman.HallMessage;
|
|
|
+import com.example.gobangapi.doman.UserListItem;
|
|
|
+
|
|
|
+import javax.websocket.Session;
|
|
|
+import java.io.IOException;
|
|
|
+import java.util.*;
|
|
|
+import java.util.concurrent.ConcurrentHashMap;
|
|
|
+import java.util.concurrent.CopyOnWriteArrayList;
|
|
|
+
|
|
|
+public class GoBangUtils {
|
|
|
+
|
|
|
+ public static List<GobangRoomItem> room = Arrays.asList(new GobangRoomItem[]{
|
|
|
+ new GobangRoomItem(1), new GobangRoomItem(2), new GobangRoomItem(3),
|
|
|
+ new GobangRoomItem(4), new GobangRoomItem(5), new GobangRoomItem(6),
|
|
|
+ new GobangRoomItem(7), new GobangRoomItem(8), new GobangRoomItem(9)
|
|
|
+ });
|
|
|
+ public static CopyOnWriteArrayList<GobangRoomItem> rooms = new CopyOnWriteArrayList(room);
|
|
|
+ public static ConcurrentHashMap<String, String> hall = new ConcurrentHashMap();
|
|
|
+ public static ConcurrentHashMap<String, UserListItem> userList = new ConcurrentHashMap();
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 打开连接的时候 用户存储用户列表
|
|
|
+ * @param username
|
|
|
+ * @param session
|
|
|
+ */
|
|
|
+ public static void open(String username, Session session){
|
|
|
+ UserListItem userItem = userList.get(username);
|
|
|
+ if (Objects.isNull( userItem )) {
|
|
|
+ userItem = new UserListItem();
|
|
|
+ userItem.setUsername(username);
|
|
|
+ userItem.setSession(session);
|
|
|
+ userList.put( username, userItem );
|
|
|
+ } else {
|
|
|
+ try {
|
|
|
+ session.close();
|
|
|
+ } catch (IOException ignored) {
|
|
|
+ ignored.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 关闭的时候从用户列表删除用户
|
|
|
+ * @param session
|
|
|
+ */
|
|
|
+ public static void close( Session session ){
|
|
|
+ for (String key : userList.keySet()) {
|
|
|
+ if ( userList.get(key).getSession().equals(session.getId()) ) {
|
|
|
+ try {
|
|
|
+ userList.get(key).getSession().close();
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ userList.remove(key);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 处理消息
|
|
|
+ * @param message
|
|
|
+ * @param session
|
|
|
+ */
|
|
|
+ public static void onMsg(String message, Session session){
|
|
|
+ GameMessage revMessage = JSON.parseObject(message, GameMessage.class);
|
|
|
+ switch ( revMessage.getInstruct() ) {
|
|
|
+ /**
|
|
|
+ * 用户切入大厅
|
|
|
+ */
|
|
|
+ case Constant.HALL:
|
|
|
+ hallpush(session);
|
|
|
+ HallMessage hallMessage = new HallMessage();
|
|
|
+ hallMessage.setData(rooms);
|
|
|
+ hallMessage.setInstruct(Constant.HALL);
|
|
|
+ sendUser(hallMessage, session);
|
|
|
+ break;
|
|
|
+ /**
|
|
|
+ * 用户切入房间
|
|
|
+ */
|
|
|
+ case Constant.ROOM:
|
|
|
+ GameMessage gameMessage = new GameMessage();
|
|
|
+ GobangRoomItem room = getRoom(revMessage.getRoomId());
|
|
|
+ if ( Objects.isNull(room) ) {
|
|
|
+ System.out.println( "错误数据查不到房间:" + revMessage.getRoomId() );
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ roompush(session, revMessage.getRoomId());
|
|
|
+ gameMessage.setData(room.getData());
|
|
|
+ gameMessage.setRoom(room);
|
|
|
+ gameMessage.setInstruct(Constant.ROOM);
|
|
|
+ gameMessage.setRoomId(room.getRoomId());
|
|
|
+ sendUser(gameMessage, session);
|
|
|
+ break;
|
|
|
+ case Constant.BEGIN:
|
|
|
+ UserListItem user = getUser(session);
|
|
|
+ GobangRoomItem beginRoom = getRoom(user.getRoomId());
|
|
|
+ if ( (beginRoom.getBackSessionId().equals(session.getId()) ||
|
|
|
+ beginRoom.getWhiteSessionId().equals(session.getId())) ) {
|
|
|
+
|
|
|
+ if ( beginRoom.getBackSessionId().equals(session.getId()) ) {
|
|
|
+ beginRoom.setBackState(2);
|
|
|
+ } else if ( beginRoom.getWhiteSessionId().equals(session.getId()) ) {
|
|
|
+ beginRoom.setWhiteState(2);
|
|
|
+ }
|
|
|
+
|
|
|
+ if ( beginRoom.getBackState() == 2 && beginRoom.getWhiteState() == 2 ) {
|
|
|
+ if ( !beginRoom.getStatus().equals(1) ) {
|
|
|
+ beginRoom.setStatus(1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ beginRoom.setData(revMessage.getData() );
|
|
|
+
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ case Constant.POINT:
|
|
|
+ UserListItem pointUser = getUser(session);
|
|
|
+ GobangRoomItem pointRoom = getRoom(pointUser.getRoomId());
|
|
|
+ if ( (pointRoom.getBackSessionId().equals(session.getId()) ||
|
|
|
+ pointRoom.getWhiteSessionId().equals(session.getId())) ) {
|
|
|
+ if ( pointRoom.getBackSessionId().equals(session.getId()) ) {
|
|
|
+ if (pointRoom.getStatus() == 1) {
|
|
|
+ pointRoom.setData(revMessage.getData());
|
|
|
+ }
|
|
|
+ pointRoom.setStatus(2);
|
|
|
+ } else if ( pointRoom.getWhiteSessionId().equals(session.getId()) ) {
|
|
|
+ if (pointRoom.getStatus() == 2) {
|
|
|
+ pointRoom.setData(revMessage.getData());
|
|
|
+ }
|
|
|
+ pointRoom.setStatus(1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ break;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 进入房间
|
|
|
+ * @param session
|
|
|
+ */
|
|
|
+ public static void roompush(Session session, int roomId){
|
|
|
+ GobangRoomItem room = getRoom(roomId);
|
|
|
+ if ( Objects.isNull(room) ) {
|
|
|
+ System.out.println( "错误数据查不到房间:" + roomId );
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ UserListItem user = getUser(session);
|
|
|
+ roompop(session);
|
|
|
+ ArrayList<String> sids = room.getSid();
|
|
|
+ if ( Objects.nonNull(sids) ) {
|
|
|
+ sids.add(session.getId());
|
|
|
+ }
|
|
|
+ if ( Objects.isNull(room.getBackSessionId()) && Objects.nonNull(user) ) {
|
|
|
+ room.setBackUsername(user.getUsername());
|
|
|
+ room.setBackSessionId(user.getSession().getId());
|
|
|
+ room.setBackState(1);
|
|
|
+ } else if ( Objects.isNull(room.getWhiteSessionId()) && Objects.nonNull(user) ) {
|
|
|
+ room.setWhiteUsername(user.getUsername());
|
|
|
+ room.setWhiteSessionId(user.getSession().getId());
|
|
|
+ room.setWhiteState(1);
|
|
|
+ }
|
|
|
+ hallpop(session);
|
|
|
+ if ( Objects.nonNull(user) ) {
|
|
|
+ user.setPosition(Constant.ROOM);
|
|
|
+ user.setRoomId(roomId);
|
|
|
+ } else {
|
|
|
+ System.out.println( "错误用户---查不到用户:" + session.getId() );
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 进入大厅
|
|
|
+ * @param session
|
|
|
+ */
|
|
|
+ public static void hallpush(Session session){
|
|
|
+ hall.put(session.getId(), (new Date()).toString());
|
|
|
+ UserListItem user = getUser(session);
|
|
|
+ roompop(session);
|
|
|
+ if ( Objects.nonNull(user) ) {
|
|
|
+ user.setPosition(Constant.HALL);
|
|
|
+ user.setRoomId(0);
|
|
|
+ } else {
|
|
|
+ System.out.println( "错误用户---查不到用户:" + session.getId() );
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 离开房间
|
|
|
+ * @param session
|
|
|
+ */
|
|
|
+ private static void roompop(Session session){
|
|
|
+ for (GobangRoomItem room : rooms) {
|
|
|
+ ArrayList<String> sids = room.getSid();
|
|
|
+ if ( Objects.nonNull(sids) ) {
|
|
|
+ sids.removeIf(sid -> sid.equals(session.getId()));
|
|
|
+ }
|
|
|
+ if ( Objects.nonNull(room.getBackSessionId()) &&
|
|
|
+ room.getBackSessionId().equals(session.getId())) {
|
|
|
+ room.setBackUsername("");
|
|
|
+ room.setBackState(0);
|
|
|
+ room.setBackSessionId(null);
|
|
|
+ room.setStatus(0);
|
|
|
+ }
|
|
|
+ if ( Objects.nonNull(room.getWhiteSessionId()) &&
|
|
|
+ room.getWhiteSessionId().equals(session.getId())) {
|
|
|
+ room.setWhiteUsername("");
|
|
|
+ room.setWhiteState(0);
|
|
|
+ room.setWhiteSessionId(null);
|
|
|
+ room.setStatus(0);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 离开大厅
|
|
|
+ * @param session
|
|
|
+ */
|
|
|
+ private static void hallpop(Session session){
|
|
|
+ hall.remove(session.getId());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 发送消息
|
|
|
+ * @param o
|
|
|
+ * @param session
|
|
|
+ */
|
|
|
+ private static void sendUser( Object o, Session session){
|
|
|
+ try {
|
|
|
+ if ( Objects.isNull(session) || !session.isOpen() ) {
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ synchronized (session.getId()) {
|
|
|
+ session.getBasicRemote().sendText(JSON.toJSONString(o));
|
|
|
+ }
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 刷新房间数据
|
|
|
+ */
|
|
|
+ public static void sendRoomData(){
|
|
|
+ for (GobangRoomItem item: rooms) {
|
|
|
+ GameMessage gameMessage = new GameMessage();
|
|
|
+ gameMessage.setData(item.getData());
|
|
|
+ gameMessage.setRoom(item);
|
|
|
+ gameMessage.setInstruct(Constant.ROOM);
|
|
|
+ gameMessage.setRoomId(item.getRoomId());
|
|
|
+ ArrayList<String> sids = item.getSid();
|
|
|
+ if ( Objects.nonNull(sids) ) {
|
|
|
+ for (String sid : sids) {
|
|
|
+ sendUser(gameMessage, getUserBySid(sid));
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 刷新大厅数据
|
|
|
+ */
|
|
|
+ public static void sendHallData(){
|
|
|
+ HallMessage hallMessage = new HallMessage();
|
|
|
+ for (String sid: hall.keySet() ) {
|
|
|
+ hallMessage.setData(rooms);
|
|
|
+ hallMessage.setInstruct(Constant.HALL);
|
|
|
+ sendUser( hallMessage, getUserBySid(sid) );
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 根据sessionId 取Session
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private static Session getUserBySid(String sid) {
|
|
|
+ for (Map.Entry<String, UserListItem> item : userList.entrySet()) {
|
|
|
+ if ( item.getValue().getSession().getId().equals(sid)) {
|
|
|
+ return item.getValue().getSession();
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 用户列表查找用户
|
|
|
+ * @param session
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private static UserListItem getUser(Session session ){
|
|
|
+ for (String key : userList.keySet()) {
|
|
|
+ if ( userList.get(key).getSession().getId().equals(session.getId()) ) {
|
|
|
+ return userList.get(key);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 查找房间
|
|
|
+ * @param roomId
|
|
|
+ * @return
|
|
|
+ */
|
|
|
+ private static GobangRoomItem getRoom(int roomId) {
|
|
|
+ for (GobangRoomItem item: rooms) {
|
|
|
+ if ( item.getRoomId().equals(roomId) ) {
|
|
|
+ return item;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+}
|