feat: adding chess function
This commit is contained in:
parent
8241ec01c9
commit
606406085e
BIN
.idea/.cache/.Apifox_Helper/.toolWindow.db
generated
Normal file
BIN
.idea/.cache/.Apifox_Helper/.toolWindow.db
generated
Normal file
Binary file not shown.
15
.idea/ApifoxUploaderProjectSetting.xml
generated
Normal file
15
.idea/ApifoxUploaderProjectSetting.xml
generated
Normal file
@ -0,0 +1,15 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ApifoxUploaderProjectSetting">
|
||||
<option name="apiAccessToken" value="APS-QWelq6AktQqByilNWeWZgKoPT7a4ml1d" />
|
||||
<option name="apiProjectIds">
|
||||
<array>
|
||||
<option value="<byte-array>rO0ABXNyADZjb20uaXRhbmdjZW50LmlkZWEucGx1Z2luLmFwaS5hY2NvdW50LlByb2plY3RBbmRNb2R1bGUAAAAAAAAAAQIAFVoABmVuYWJsZUwACG1vZHVsZUlkdAASTGphdmEvbGFuZy9TdHJpbmc7TAAGb3RoZXIxcQB+AAFMAAdvdGhlcjEwcQB+AAFMAAdvdGhlcjExcQB+AAFMAAdvdGhlcjEycQB+AAFMAAZvdGhlcjJxAH4AAUwABm90aGVyM3EAfgABTAAGb3RoZXI0cQB+AAFMAAZvdGhlcjVxAH4AAUwABm90aGVyNnEAfgABTAAGb3RoZXI3cQB+AAFMAAZvdGhlcjhxAH4AAUwABm90aGVyOXEAfgABTAAKcGF0aEJlZm9yZXEAfgABTAANcHJvamVjdEZvbGRlcnEAfgABTAAPcHJvamVjdEZvbGRlcklkcQB+AAFMAAlwcm9qZWN0SWRxAH4AAUwAC3Byb2plY3ROYW1lcQB+AAFMAAxzY2hlbWFGb2xkZXJxAH4AAUwACHNjaGVtYUlkcQB+AAF4cAB0AAZoaWRkZW5wcHBwcHBwcHBwcHB0AApwYXRoQmVmb3JldAANcHJvamVjdEZvbGRlcnQAD3Byb2plY3RGb2xkZXJJZHQAC3Byb2plY3ROYW1ldAAIaGlkZGVuSWR0AABxAH4ACQ==</byte-array>" />
|
||||
<option value="<byte-array>rO0ABXNyADZjb20uaXRhbmdjZW50LmlkZWEucGx1Z2luLmFwaS5hY2NvdW50LlByb2plY3RBbmRNb2R1bGUAAAAAAAAAAQIAFVoABmVuYWJsZUwACG1vZHVsZUlkdAASTGphdmEvbGFuZy9TdHJpbmc7TAAGb3RoZXIxcQB+AAFMAAdvdGhlcjEwcQB+AAFMAAdvdGhlcjExcQB+AAFMAAdvdGhlcjEycQB+AAFMAAZvdGhlcjJxAH4AAUwABm90aGVyM3EAfgABTAAGb3RoZXI0cQB+AAFMAAZvdGhlcjVxAH4AAUwABm90aGVyNnEAfgABTAAGb3RoZXI3cQB+AAFMAAZvdGhlcjhxAH4AAUwABm90aGVyOXEAfgABTAAKcGF0aEJlZm9yZXEAfgABTAANcHJvamVjdEZvbGRlcnEAfgABTAAPcHJvamVjdEZvbGRlcklkcQB+AAFMAAlwcm9qZWN0SWRxAH4AAUwAC3Byb2plY3ROYW1lcQB+AAFMAAxzY2hlbWFGb2xkZXJxAH4AAUwACHNjaGVtYUlkcQB+AAF4cAF0AAVjbHVic3BwcHBwcHBwcHBwcHQAAHQACeagueebruW9lXQAATB0AAc1NjAxNzQwdAAQSVRaWC1DbHViLVNlcnZlcnEAfgAFcQB+AAY=</byte-array>" />
|
||||
<option value="<byte-array>rO0ABXNyADZjb20uaXRhbmdjZW50LmlkZWEucGx1Z2luLmFwaS5hY2NvdW50LlByb2plY3RBbmRNb2R1bGUAAAAAAAAAAQIAFVoABmVuYWJsZUwACG1vZHVsZUlkdAASTGphdmEvbGFuZy9TdHJpbmc7TAAGb3RoZXIxcQB+AAFMAAdvdGhlcjEwcQB+AAFMAAdvdGhlcjExcQB+AAFMAAdvdGhlcjEycQB+AAFMAAZvdGhlcjJxAH4AAUwABm90aGVyM3EAfgABTAAGb3RoZXI0cQB+AAFMAAZvdGhlcjVxAH4AAUwABm90aGVyNnEAfgABTAAGb3RoZXI3cQB+AAFMAAZvdGhlcjhxAH4AAUwABm90aGVyOXEAfgABTAAKcGF0aEJlZm9yZXEAfgABTAANcHJvamVjdEZvbGRlcnEAfgABTAAPcHJvamVjdEZvbGRlcklkcQB+AAFMAAlwcm9qZWN0SWRxAH4AAUwAC3Byb2plY3ROYW1lcQB+AAFMAAxzY2hlbWFGb2xkZXJxAH4AAUwACHNjaGVtYUlkcQB+AAF4cAF0AApjbHVicy5tYWlucHBwcHBwcHBwcHBwdAAAdAAJ5qC555uu5b2VdAABMHQABzU2MDE3NDB0ABBJVFpYLUNsdWItU2VydmVycQB+AAVxAH4ABg==</byte-array>" />
|
||||
</array>
|
||||
</option>
|
||||
<option name="treeNodes" value="<byte-array>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</byte-array>" />
|
||||
<option name="treeNodesJTree" value="<byte-array>rO0ABXNyACFqYXZheC5zd2luZy50cmVlLkRlZmF1bHRUcmVlTW9kZWynvpEmGsXl2QMAA1oAEmFza3NBbGxvd3NDaGlsZHJlbkwADGxpc3RlbmVyTGlzdHQAJUxqYXZheC9zd2luZy9ldmVudC9FdmVudExpc3RlbmVyTGlzdDtMAARyb290dAAbTGphdmF4L3N3aW5nL3RyZWUvVHJlZU5vZGU7eHAAc3IAI2phdmF4LnN3aW5nLmV2ZW50LkV2ZW50TGlzdGVuZXJMaXN0kUjMLXPfDt4DAAB4cHB4c3IAJ2phdmF4LnN3aW5nLnRyZWUuRGVmYXVsdE11dGFibGVUcmVlTm9kZcRYv/zyqHHgAwADWgAOYWxsb3dzQ2hpbGRyZW5MAAhjaGlsZHJlbnQAEkxqYXZhL3V0aWwvVmVjdG9yO0wABnBhcmVudHQAIkxqYXZheC9zd2luZy90cmVlL011dGFibGVUcmVlTm9kZTt4cAFzcgAQamF2YS51dGlsLlZlY3RvctmXfVuAO68BAwADSQARY2FwYWNpdHlJbmNyZW1lbnRJAAxlbGVtZW50Q291bnRbAAtlbGVtZW50RGF0YXQAE1tMamF2YS9sYW5nL09iamVjdDt4cAAAAAAAAAACdXIAE1tMamF2YS5sYW5nLk9iamVjdDuQzlifEHMpbAIAAHhwAAAACnNxAH4ABgFzcQB+AAoAAAAAAAAAAXVxAH4ADQAAAApzcQB+AAYBcHEAfgAPdXEAfgANAAAAAnQACnVzZXJPYmplY3RzcgAuY29tLml0YW5nY2VudC5pZGVhLnBsdWdpbi5hcGkuYWNjb3VudC5UcmVlTm9kZQAAAAAAAAABAgALTAAHYWxsUGF0aHQAEkxqYXZhL2xhbmcvU3RyaW5nO0wACGNoaWxkcmVudAAPTGphdmEvdXRpbC9NYXA7TAAIZnVsbFBhdGhxAH4AFkwAA2tleXEAfgAWTAAEbmFtZXEAfgAWTAAIcGFyZW50SWRxAH4AFkwACXByb2plY3RJZHEAfgAWTAALcHJvamVjdE5hbWVxAH4AFkwABnRlYW1JZHEAfgAWTAAIdGVhbU5hbWVxAH4AFkwABHR5cGV0ADBMY29tL2l0YW5nY2VudC9pZGVhL3BsdWdpbi9hcGkvYWNjb3VudC9Ob2RlVHlwZTt4cHQAGeS4quS6uuWboumYny/kuKrkurrpobnnm65zcgAXamF2YS51dGlsLkxpbmtlZEhhc2hNYXA0wE5cEGzA+wIAAVoAC2FjY2Vzc09yZGVyeHIAEWphdmEudXRpbC5IYXNoTWFwBQfawcMWYNEDAAJGAApsb2FkRmFjdG9ySQAJdGhyZXNob2xkeHA/QAAAAAAAAHcIAAAAEAAAAAB4AHB0AAc1MzE5OTc1dAAW5Liq5Lq66aG555uuICg1MzE5OTc1KXQABzI5ODc1MzJ0AAc1MzE5OTc1dAAM5Liq5Lq66aG555uudAAHMjk4NzUzMnB+cgAuY29tLml0YW5nY2VudC5pZGVhLnBsdWdpbi5hcGkuYWNjb3VudC5Ob2RlVHlwZQAAAAAAAAAAEgAAeHIADmphdmEubGFuZy5FbnVtAAAAAAAAAAASAAB4cHQAB1BST0pFQ1R4cHBwcHBwcHBweHEAfgAJdXEAfgANAAAAAnEAfgAUc3EAfgAVdAAM5Liq5Lq65Zui6Zifc3EAfgAbP0AAAAAAAAB3CAAAABAAAAAAeABwdAAHMjk4NzUzMnQADOS4quS6uuWboumYn3BwcHQABzI5ODc1MzJ0AAzkuKrkurrlm6LpmJ9+cQB+ACR0AARURUFNeHNxAH4ABgFzcQB+AAoAAAAAAAAAAnVxAH4ADQAAAApzcQB+AAYBc3EAfgAKAAAAAAAAAAJ1cQB+AA0AAAAKc3EAfgAGAXBxAH4ANXVxAH4ADQAAAAJxAH4AFHNxAH4AFXQARU1ha2VNaW5lY3JhZnRHcmVhdEFnYWluVGVhbS9GaWxlTWFuYWdlci1WZXIyL+aWh+S7tuaTjeS9nOebuOWFs+aOpeWPo3NxAH4AGz9AAAAAAAAAdwgAAAAQAAAAAHgAdAAY5paH5Lu25pON5L2c55u45YWz5o6l5Y+jdAALNC42NzcyMzU4RTd0ABjmlofku7bmk43kvZznm7jlhbPmjqXlj6N0AAc1MzE5OTc4dAAJNTMxOTk3OC4wdAAQRmlsZU1hbmFnZXItVmVyMnBwfnEAfgAkdAAGRk9MREVSeHNxAH4ABgFwcQB+ADV1cQB+AA0AAAACcQB+ABRzcQB+ABV0AD9NYWtlTWluZWNyYWZ0R3JlYXRBZ2FpblRlYW0vRmlsZU1hbmFnZXItVmVyMi/nlKjmiLfnm7jlhbPmjqXlj6NzcQB+ABs/QAAAAAAAAHcIAAAAEAAAAAB4AHQAEueUqOaIt+ebuOWFs+aOpeWPo3QACzQuNjc3MjM4OEU3dAAS55So5oi355u45YWz5o6l5Y+jdAAHNTMxOTk3OHQACTUzMTk5NzguMHQAEEZpbGVNYW5hZ2VyLVZlcjJwcHEAfgBDeHBwcHBwcHBweHEAfgAydXEAfgANAAAAAnEAfgAUc3EAfgAVdAAsTWFrZU1pbmVjcmFmdEdyZWF0QWdhaW5UZWFtL0ZpbGVNYW5hZ2VyLVZlcjJzcQB+ABs/QAAAAAAAAHcIAAAAEAAAAAB4AHB0AAc1MzE5OTc4dAAaRmlsZU1hbmFnZXItVmVyMiAoNTMxOTk3OCl0AAcyOTg3NTM1dAAHNTMxOTk3OHQAEEZpbGVNYW5hZ2VyLVZlcjJ0AAcyOTg3NTM1cHEAfgAmeHNxAH4ABgFwcQB+ADJ1cQB+AA0AAAACcQB+ABRzcQB+ABV0ACxNYWtlTWluZWNyYWZ0R3JlYXRBZ2FpblRlYW0vSVRaWC1DbHViLVNlcnZlcnNxAH4AGz9AAAAAAAAAdwgAAAAQAAAAAHgAcHQABzU2MDE3NDB0ABpJVFpYLUNsdWItU2VydmVyICg1NjAxNzQwKXQABzI5ODc1MzV0AAc1NjAxNzQwdAAQSVRaWC1DbHViLVNlcnZlcnQABzI5ODc1MzVwcQB+ACZ4cHBwcHBwcHB4cQB+AAl1cQB+AA0AAAACcQB+ABRzcQB+ABV0ABtNYWtlTWluZWNyYWZ0R3JlYXRBZ2FpblRlYW1zcQB+ABs/QAAAAAAAAHcIAAAAEAAAAAB4AHB0AAcyOTg3NTM1dAAbTWFrZU1pbmVjcmFmdEdyZWF0QWdhaW5UZWFtcHBwdAAHMjk4NzUzNXQAG01ha2VNaW5lY3JhZnRHcmVhdEFnYWluVGVhbXEAfgAweHBwcHBwcHBweHB1cQB+AA0AAAACcQB+ABRzcQB+ABV0AARSb290cHB0AAEwcQB+AG9wcHBwcHEAfgAweHNxAH4ACgAAAAAAAAACdXEAfgANAAAACnQABHJvb3RxAH4ACXBwcHBwcHBweHg=</byte-array>" />
|
||||
</component>
|
||||
</project>
|
9
.idea/ITZX-Clubs-Home-Server.iml
generated
Normal file
9
.idea/ITZX-Clubs-Home-Server.iml
generated
Normal file
@ -0,0 +1,9 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<module type="JAVA_MODULE" version="4">
|
||||
<component name="NewModuleRootManager" inherit-compiler-output="true">
|
||||
<exclude-output />
|
||||
<content url="file://$MODULE_DIR$" />
|
||||
<orderEntry type="inheritedJdk" />
|
||||
<orderEntry type="sourceFolder" forTests="false" />
|
||||
</component>
|
||||
</module>
|
9
.idea/dataSources.xml
generated
9
.idea/dataSources.xml
generated
@ -1,25 +1,26 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="DataSourceManagerImpl" format="xml" multifile-model="true">
|
||||
<data-source source="LOCAL" name="itzx@wzpmc.cn" uuid="6d73dcf2-41f4-4403-89d0-be443cbd1b39">
|
||||
<data-source source="LOCAL" name="itzx@172.16.127.100" uuid="6d73dcf2-41f4-4403-89d0-be443cbd1b39">
|
||||
<driver-ref>mysql.8</driver-ref>
|
||||
<synchronize>true</synchronize>
|
||||
<imported>true</imported>
|
||||
<remarks>$PROJECT_DIR$/src/main/resources/application.properties</remarks>
|
||||
<jdbc-driver>com.mysql.cj.jdbc.Driver</jdbc-driver>
|
||||
<jdbc-url>jdbc:mysql://wzpmc.cn:3306/itzx</jdbc-url>
|
||||
<jdbc-url>jdbc:mysql://172.16.127.100:3306/itzx</jdbc-url>
|
||||
<jdbc-additional-properties>
|
||||
<property name="com.intellij.clouds.kubernetes.db.host.port" />
|
||||
<property name="com.intellij.clouds.kubernetes.db.enabled" value="false" />
|
||||
<property name="com.intellij.clouds.kubernetes.db.resource.type" value="Deployment" />
|
||||
<property name="com.intellij.clouds.kubernetes.db.container.port" />
|
||||
</jdbc-additional-properties>
|
||||
<working-dir>$ProjectFileDir$</working-dir>
|
||||
</data-source>
|
||||
<data-source source="LOCAL" name="0@server.wzpmc.cn" uuid="41d00101-c8a0-446a-a28b-8027776414f2">
|
||||
<data-source source="LOCAL" name="0@172.16.127.100" uuid="41d00101-c8a0-446a-a28b-8027776414f2">
|
||||
<driver-ref>redis</driver-ref>
|
||||
<synchronize>true</synchronize>
|
||||
<jdbc-driver>jdbc.RedisDriver</jdbc-driver>
|
||||
<jdbc-url>jdbc:redis://server.wzpmc.cn:6379/0</jdbc-url>
|
||||
<jdbc-url>jdbc:redis://172.16.127.100:6379/0</jdbc-url>
|
||||
<jdbc-additional-properties>
|
||||
<property name="com.intellij.clouds.kubernetes.db.host.port" />
|
||||
<property name="com.intellij.clouds.kubernetes.db.enabled" value="false" />
|
||||
|
3
.idea/inspectionProfiles/Project_Default.xml
generated
3
.idea/inspectionProfiles/Project_Default.xml
generated
@ -1,6 +1,9 @@
|
||||
<component name="InspectionProjectProfileManager">
|
||||
<profile version="1.0">
|
||||
<option name="myName" value="Project Default" />
|
||||
<inspection_tool class="AutoCloseableResource" enabled="true" level="WARNING" enabled_by_default="true">
|
||||
<option name="METHOD_MATCHER_CONFIG" value="java.util.Formatter,format,java.io.Writer,append,com.google.common.base.Preconditions,checkNotNull,org.hibernate.Session,close,java.io.PrintWriter,printf,java.io.PrintStream,printf,java.lang.foreign.Arena,ofAuto,java.lang.foreign.Arena,global,java.util.concurrent.ConcurrentHashMap,remove" />
|
||||
</inspection_tool>
|
||||
<inspection_tool class="IncorrectHttpHeaderInspection" enabled="true" level="WARNING" enabled_by_default="true">
|
||||
<option name="customHeaders">
|
||||
<set>
|
||||
|
12
.idea/misc.xml
generated
12
.idea/misc.xml
generated
@ -1,5 +1,17 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<project version="4">
|
||||
<component name="ASMSmaliIdeaPluginConfiguration">
|
||||
<asm skipDebug="true" skipFrames="true" skipCode="false" expandFrames="false" />
|
||||
<groovy codeStyle="LEGACY" />
|
||||
</component>
|
||||
<component name="EntryPointsManager">
|
||||
<list size="4">
|
||||
<item index="0" class="java.lang.String" itemvalue="jakarta.websocket.OnClose" />
|
||||
<item index="1" class="java.lang.String" itemvalue="jakarta.websocket.OnMessage" />
|
||||
<item index="2" class="java.lang.String" itemvalue="jakarta.websocket.OnOpen" />
|
||||
<item index="3" class="java.lang.String" itemvalue="jakarta.websocket.server.ServerEndpoint" />
|
||||
</list>
|
||||
</component>
|
||||
<component name="ExternalStorageConfigurationManager" enabled="true" />
|
||||
<component name="FrameworkDetectionExcludesConfiguration">
|
||||
<file type="web" url="file://$PROJECT_DIR$" />
|
||||
|
1
.idea/modules.xml
generated
1
.idea/modules.xml
generated
@ -2,7 +2,6 @@
|
||||
<project version="4">
|
||||
<component name="ProjectModuleManager">
|
||||
<modules>
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/modules/clubs.iml" filepath="$PROJECT_DIR$/.idea/modules/clubs.iml" />
|
||||
<module fileurl="file://$PROJECT_DIR$/.idea/modules/clubs.main.iml" filepath="$PROJECT_DIR$/.idea/modules/clubs.main.iml" />
|
||||
</modules>
|
||||
</component>
|
||||
|
@ -2,7 +2,6 @@ plugins {
|
||||
java
|
||||
id("org.springframework.boot") version "3.2.4"
|
||||
id("io.spring.dependency-management") version "1.1.4"
|
||||
id("org.graalvm.buildtools.native") version "0.9.28"
|
||||
id("org.asciidoctor.jvm.convert") version "3.3.2"
|
||||
id("org.springdoc.openapi-gradle-plugin") version "1.8.0"
|
||||
}
|
||||
|
@ -3,8 +3,10 @@ package org.mmga.clubs;
|
||||
import org.springframework.boot.SpringApplication;
|
||||
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||
import org.springframework.scheduling.annotation.EnableScheduling;
|
||||
import org.springframework.web.socket.config.annotation.EnableWebSocket;
|
||||
|
||||
@SpringBootApplication
|
||||
@EnableWebSocket
|
||||
@EnableScheduling
|
||||
public class ItzxClubsHomeServerApplication {
|
||||
public static void main(String[] args) {
|
||||
|
@ -13,7 +13,6 @@ public class CorsConfiguration implements WebMvcConfigurer {
|
||||
@Override
|
||||
public void addCorsMappings(CorsRegistry registry) {
|
||||
registry.addMapping("/**")
|
||||
.allowedOrigins("http://localhost:5173", "http://127.0.0.1:5173")
|
||||
.allowedMethods("*")
|
||||
.allowedHeaders("*")
|
||||
.exposedHeaders("*");
|
||||
|
@ -0,0 +1,13 @@
|
||||
package org.mmga.clubs.configuration;
|
||||
|
||||
import org.springframework.context.annotation.Bean;
|
||||
import org.springframework.context.annotation.Configuration;
|
||||
import org.springframework.web.socket.server.standard.ServerEndpointExporter;
|
||||
|
||||
@Configuration
|
||||
public class WebSocketConfiguration {
|
||||
@Bean
|
||||
public ServerEndpointExporter serverEndpointExporter() {
|
||||
return new ServerEndpointExporter();
|
||||
}
|
||||
}
|
158
src/main/java/org/mmga/clubs/controller/ChessController.java
Normal file
158
src/main/java/org/mmga/clubs/controller/ChessController.java
Normal file
@ -0,0 +1,158 @@
|
||||
package org.mmga.clubs.controller;
|
||||
|
||||
import com.alibaba.fastjson2.JSON;
|
||||
import com.alibaba.fastjson2.JSONException;
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||
import jakarta.annotation.Nullable;
|
||||
import jakarta.websocket.OnClose;
|
||||
import jakarta.websocket.OnMessage;
|
||||
import jakarta.websocket.OnOpen;
|
||||
import jakarta.websocket.Session;
|
||||
import jakarta.websocket.server.PathParam;
|
||||
import jakarta.websocket.server.ServerEndpoint;
|
||||
import lombok.NoArgsConstructor;
|
||||
import lombok.SneakyThrows;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.mmga.clubs.entities.chess.Room;
|
||||
import org.mmga.clubs.entities.chess.packet.*;
|
||||
import org.mmga.clubs.entities.chess.packet.request.CreateRoomRequest;
|
||||
import org.mmga.clubs.entities.chess.packet.request.PlaceChessPieceRequest;
|
||||
import org.mmga.clubs.entities.chess.packet.request.PlayerJoinRequest;
|
||||
import org.mmga.clubs.entities.chess.packet.request.RoomListRequest;
|
||||
import org.mmga.clubs.entities.user.User;
|
||||
import org.mmga.clubs.service.UserService;
|
||||
import org.mmga.clubs.utils.JwtUtils;
|
||||
import org.mmga.clubs.utils.WebSocketUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
import java.lang.reflect.Field;
|
||||
import java.util.Collection;
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
@Slf4j
|
||||
@Tag(name = "五子棋", description = "五子棋相关websocket接口")
|
||||
@ServerEndpoint("/chess/{token}")
|
||||
@Component
|
||||
@NoArgsConstructor
|
||||
public class ChessController {
|
||||
private static final ConcurrentHashMap<String, Session> sessions = new ConcurrentHashMap<>();
|
||||
private static final ConcurrentHashMap<String, User> users = new ConcurrentHashMap<>();
|
||||
private static final ConcurrentHashMap<UUID, Room> rooms = new ConcurrentHashMap<>();
|
||||
private static JwtUtils jwtUtils;
|
||||
private static UserService userService;
|
||||
|
||||
@Autowired
|
||||
public void setJwtUtils(JwtUtils jwtUtils) {
|
||||
ChessController.jwtUtils = jwtUtils;
|
||||
}
|
||||
|
||||
@Autowired
|
||||
public void setUserService(UserService userService) {
|
||||
ChessController.userService = userService;
|
||||
}
|
||||
|
||||
@SneakyThrows
|
||||
@OnOpen
|
||||
public void onOpen(Session session, @PathParam("token") String token) {
|
||||
Optional<Integer> i = jwtUtils.verifyTokenSafe(token);
|
||||
if (i.isEmpty()) {
|
||||
WebSocketUtils.sendPacket(new ErrorPacket("token验证失败!"), session);
|
||||
session.close();
|
||||
return;
|
||||
}
|
||||
String sessionId = session.getId();
|
||||
User user = userService.getUserById(i.get());
|
||||
WebSocketUtils.sendPacket(new UserInfoPacket(user), session);
|
||||
users.put(sessionId, user);
|
||||
sessions.put(sessionId, session);
|
||||
}
|
||||
|
||||
@OnMessage
|
||||
public void onMessage(String message, Session session) {
|
||||
try {
|
||||
JSONObject jsonObject = JSON.parseObject(message);
|
||||
Object response = handleMessage(jsonObject, session);
|
||||
if (response != null) {
|
||||
WebSocketUtils.sendPacket(response, session);
|
||||
}
|
||||
} catch (JSONException e) {
|
||||
WebSocketUtils.sendPacket(new ErrorPacket("JSON格式错误"), session);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@Nullable
|
||||
public Object handleMessage(JSONObject object, Session session) {
|
||||
String packetName = object.getString("name");
|
||||
if (packetName == null) return new ErrorPacket("错误的请求类型");
|
||||
try {
|
||||
Class<?> packetType = Class.forName("org.mmga.clubs.entities.chess.packet.request." + packetName + "Request");
|
||||
JSONObject payloadJson = object.getJSONObject("payload");
|
||||
if (payloadJson == null) {
|
||||
Field[] declaredFields = packetType.getDeclaredFields();
|
||||
if (declaredFields.length == 0) {
|
||||
payloadJson = new JSONObject();
|
||||
}
|
||||
}
|
||||
if (payloadJson == null) return new ErrorPacket("请求类型参数错误!");
|
||||
Object payload = payloadJson.to(packetType);
|
||||
String sessionId = session.getId();
|
||||
if (payload instanceof PlayerJoinRequest joinRequest) {
|
||||
Room roomByPlayer = getRoomByPlayer(sessionId);
|
||||
if (roomByPlayer != null) return new ErrorPacket("你已经加入过一个房间了");
|
||||
Room room = rooms.get(joinRequest.roomId());
|
||||
if (room == null) return new ErrorPacket("未知的房间");
|
||||
Optional<String> join = room.join(session, users.get(sessionId));
|
||||
if (join.isPresent()) return new ErrorPacket(join.get());
|
||||
room.broadcast(room.getRoomInfo(users));
|
||||
}
|
||||
if (payload instanceof RoomListRequest) {
|
||||
Collection<Room> values = rooms.values();
|
||||
return new RoomListPacket(values);
|
||||
}
|
||||
if (payload instanceof CreateRoomRequest) {
|
||||
Room room = new Room();
|
||||
UUID roomId = room.getId();
|
||||
rooms.put(roomId, room);
|
||||
return new RoomCreatedPacket(roomId);
|
||||
}
|
||||
if (payload instanceof PlaceChessPieceRequest placeChessPieceRequest) {
|
||||
int x = placeChessPieceRequest.x();
|
||||
int y = placeChessPieceRequest.y();
|
||||
Room roomByPlayer = getRoomByPlayer(sessionId);
|
||||
if (roomByPlayer == null) return new ErrorPacket("你还没加入房间呢");
|
||||
Optional<String> s = roomByPlayer.downPiece(x, y, sessionId);
|
||||
if (s.isPresent()) return new ErrorPacket(s.get());
|
||||
roomByPlayer.broadcast(roomByPlayer.getRoomInfo(users));
|
||||
}
|
||||
} catch (ClassNotFoundException e) {
|
||||
return new ErrorPacket("错误的请求类型");
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@Nullable
|
||||
private Room getRoomByPlayer(String id) {
|
||||
for (Room value : rooms.values()) {
|
||||
if (value.isIn(id)) return value;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
@OnClose
|
||||
public void onClose(Session session) {
|
||||
String sessionId = session.getId();
|
||||
Room roomByPlayer = this.getRoomByPlayer(sessionId);
|
||||
if (roomByPlayer != null) {
|
||||
roomByPlayer.leave(session);
|
||||
roomByPlayer.broadcast(roomByPlayer.getRoomInfo(users));
|
||||
}
|
||||
log.info("session closed {}", sessionId);
|
||||
sessions.remove(sessionId);
|
||||
users.remove(sessionId);
|
||||
}
|
||||
}
|
140
src/main/java/org/mmga/clubs/entities/chess/Room.java
Normal file
140
src/main/java/org/mmga/clubs/entities/chess/Room.java
Normal file
@ -0,0 +1,140 @@
|
||||
package org.mmga.clubs.entities.chess;
|
||||
|
||||
|
||||
import com.alibaba.fastjson2.annotation.JSONField;
|
||||
import jakarta.websocket.Session;
|
||||
import lombok.Data;
|
||||
import lombok.RequiredArgsConstructor;
|
||||
import org.mmga.clubs.entities.chess.packet.PlayerJoinRoomPacket;
|
||||
import org.mmga.clubs.entities.chess.packet.PlayerLeavePacket;
|
||||
import org.mmga.clubs.entities.chess.packet.PlayerSideAllocationPacket;
|
||||
import org.mmga.clubs.entities.chess.packet.RoomInfoPacket;
|
||||
import org.mmga.clubs.entities.user.User;
|
||||
import org.mmga.clubs.utils.WebSocketUtils;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.Objects;
|
||||
import java.util.Optional;
|
||||
import java.util.UUID;
|
||||
|
||||
@Data
|
||||
public class Room {
|
||||
private UUID id;
|
||||
private RoomState state;
|
||||
@JSONField(serialize = false, deserialize = false)
|
||||
private Session whiteSession;
|
||||
@JSONField(serialize = false, deserialize = false)
|
||||
private Session blackSession;
|
||||
@JSONField(serialize = false, deserialize = false)
|
||||
private byte[][] pieces;
|
||||
|
||||
public Room() {
|
||||
this.id = UUID.randomUUID();
|
||||
this.state = RoomState.CREATED;
|
||||
resetPieces();
|
||||
}
|
||||
|
||||
public void resetPieces() {
|
||||
this.pieces = new byte[16][16];
|
||||
for (int i = 0; i < 16; i++) {
|
||||
for (int j = 0; j < 16; j++) {
|
||||
this.pieces[i][j] = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isFull() {
|
||||
return Objects.nonNull(this.whiteSession) && Objects.nonNull(this.blackSession);
|
||||
}
|
||||
|
||||
public Optional<String> join(Session session, User user) {
|
||||
if (this.getState() == RoomState.GAMING) {
|
||||
return Optional.of("你所加入的房间正在游戏!");
|
||||
}
|
||||
if (this.isFull()) {
|
||||
return Optional.of("所加入的房间已满");
|
||||
}
|
||||
if (Objects.nonNull(this.whiteSession)) {
|
||||
WebSocketUtils.sendPacket(new PlayerSideAllocationPacket(false), session);
|
||||
WebSocketUtils.sendPacketIfPossible(new PlayerJoinRoomPacket(user, this), whiteSession);
|
||||
this.blackSession = session;
|
||||
this.setState(RoomState.GAMING);
|
||||
} else {
|
||||
WebSocketUtils.sendPacket(new PlayerSideAllocationPacket(true), session);
|
||||
WebSocketUtils.sendPacketIfPossible(new PlayerJoinRoomPacket(user, this), blackSession);
|
||||
this.whiteSession = session;
|
||||
this.setState(RoomState.WAITING);
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
public void leave(Session session) {
|
||||
String sessionId = session.getId();
|
||||
if (this.blackSession.getId().equals(sessionId)) {
|
||||
WebSocketUtils.sendPacket(new PlayerLeavePacket(sessionId), whiteSession);
|
||||
this.blackSession = null;
|
||||
this.setState(RoomState.WAITING);
|
||||
}
|
||||
if (this.whiteSession.getId().equals(sessionId)) {
|
||||
WebSocketUtils.sendPacket(new PlayerLeavePacket(sessionId), blackSession);
|
||||
this.whiteSession = null;
|
||||
this.setState(RoomState.WAITING);
|
||||
}
|
||||
}
|
||||
|
||||
public RoomInfoPacket getRoomInfo(Map<String, User> users) {
|
||||
Session whiteSession = this.getWhiteSession();
|
||||
Session blackSession = this.getBlackSession();
|
||||
User whiteUser = whiteSession != null ? users.get(whiteSession.getId()) : null;
|
||||
User blackUser = blackSession != null ? users.get(blackSession.getId()) : null;
|
||||
return new RoomInfoPacket(this.id, whiteUser, blackUser, this.state, pieces);
|
||||
}
|
||||
|
||||
public void broadcast(Object packet) {
|
||||
if (packet == null) return;
|
||||
WebSocketUtils.sendPacketIfPossible(packet, whiteSession);
|
||||
WebSocketUtils.sendPacketIfPossible(packet, blackSession);
|
||||
}
|
||||
|
||||
public boolean isIn(String sessionId) {
|
||||
return (Objects.nonNull(whiteSession) && whiteSession.getId().equals(sessionId)) || (Objects.nonNull(blackSession) && blackSession.getId().equals(sessionId));
|
||||
}
|
||||
|
||||
public Optional<String> downPiece(int x, int y, String sessionId) {
|
||||
if (!this.getState().equals(RoomState.GAMING)) return Optional.of("游戏暂未开始!");
|
||||
byte originalValue = this.pieces[y][x];
|
||||
if (originalValue != -1) return Optional.of("此位置已落子!");
|
||||
if (whiteSession.getId().equals(sessionId)) {
|
||||
this.pieces[y][x] = 1;
|
||||
} else {
|
||||
this.pieces[y][x] = 0;
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
public Optional<WinInfo> isWin() {
|
||||
return Optional.empty();
|
||||
}
|
||||
|
||||
public enum RoomState {
|
||||
CREATED,
|
||||
WAITING,
|
||||
GAMING
|
||||
}
|
||||
|
||||
@RequiredArgsConstructor
|
||||
public enum Faces {
|
||||
UP(0, 1),
|
||||
UP_RIGHT(1, 1),
|
||||
RIGHT(1, 0),
|
||||
DOWN_RIGHT(1, -1),
|
||||
DOWN(0, -1),
|
||||
DOWN_LEFT(-1, -1),
|
||||
LEFT(-1, 0),
|
||||
UP_LEFT(-1, 1);
|
||||
public final int xDelta, yDelta;
|
||||
}
|
||||
|
||||
public record WinInfo(Faces face, int originalX, int originalY, boolean isWhite) {
|
||||
}
|
||||
}
|
@ -0,0 +1,19 @@
|
||||
package org.mmga.clubs.entities.chess.packet;
|
||||
|
||||
import lombok.Data;
|
||||
|
||||
@Data
|
||||
public class BaseWebSocketPacket {
|
||||
private String name;
|
||||
private Object payload;
|
||||
|
||||
public BaseWebSocketPacket(Object payload) {
|
||||
Class<?> aClass = payload.getClass();
|
||||
this.name = aClass.getSimpleName().replace("Packet", "");
|
||||
this.payload = payload;
|
||||
}
|
||||
|
||||
public static BaseWebSocketPacket of(Object payload) {
|
||||
return new BaseWebSocketPacket(payload);
|
||||
}
|
||||
}
|
@ -0,0 +1,4 @@
|
||||
package org.mmga.clubs.entities.chess.packet;
|
||||
|
||||
public record ErrorPacket(String reason) {
|
||||
}
|
@ -0,0 +1,4 @@
|
||||
package org.mmga.clubs.entities.chess.packet;
|
||||
|
||||
public record OkPacket() {
|
||||
}
|
@ -0,0 +1,7 @@
|
||||
package org.mmga.clubs.entities.chess.packet;
|
||||
|
||||
import org.mmga.clubs.entities.chess.Room;
|
||||
import org.mmga.clubs.entities.user.User;
|
||||
|
||||
public record PlayerJoinRoomPacket(User user, Room room) {
|
||||
}
|
@ -0,0 +1,4 @@
|
||||
package org.mmga.clubs.entities.chess.packet;
|
||||
|
||||
public record PlayerLeavePacket(String player) {
|
||||
}
|
@ -0,0 +1,4 @@
|
||||
package org.mmga.clubs.entities.chess.packet;
|
||||
|
||||
public record PlayerLosePacket() {
|
||||
}
|
@ -0,0 +1,4 @@
|
||||
package org.mmga.clubs.entities.chess.packet;
|
||||
|
||||
public record PlayerSideAllocationPacket(boolean isWhite) {
|
||||
}
|
@ -0,0 +1,4 @@
|
||||
package org.mmga.clubs.entities.chess.packet;
|
||||
|
||||
public record PlayerWinPacket() {
|
||||
}
|
@ -0,0 +1,6 @@
|
||||
package org.mmga.clubs.entities.chess.packet;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
public record RoomCreatedPacket(UUID roomId) {
|
||||
}
|
@ -0,0 +1,9 @@
|
||||
package org.mmga.clubs.entities.chess.packet;
|
||||
|
||||
import org.mmga.clubs.entities.chess.Room;
|
||||
import org.mmga.clubs.entities.user.User;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
public record RoomInfoPacket(UUID roomId, User whiteUser, User blackUser, Room.RoomState state, byte[][] pieces) {
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
package org.mmga.clubs.entities.chess.packet;
|
||||
|
||||
import org.mmga.clubs.entities.chess.Room;
|
||||
|
||||
import java.util.Collection;
|
||||
|
||||
public record RoomListPacket(Collection<Room> rooms) {
|
||||
}
|
@ -0,0 +1,6 @@
|
||||
package org.mmga.clubs.entities.chess.packet;
|
||||
|
||||
import org.mmga.clubs.entities.user.User;
|
||||
|
||||
public record UserInfoPacket(User user) {
|
||||
}
|
@ -0,0 +1,4 @@
|
||||
package org.mmga.clubs.entities.chess.packet.request;
|
||||
|
||||
public record CreateRoomRequest() {
|
||||
}
|
@ -0,0 +1,4 @@
|
||||
package org.mmga.clubs.entities.chess.packet.request;
|
||||
|
||||
public record PlaceChessPieceRequest(int x, int y) {
|
||||
}
|
@ -0,0 +1,6 @@
|
||||
package org.mmga.clubs.entities.chess.packet.request;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
public record PlayerJoinRequest(UUID roomId) {
|
||||
}
|
@ -0,0 +1,4 @@
|
||||
package org.mmga.clubs.entities.chess.packet.request;
|
||||
|
||||
public record RoomListRequest() {
|
||||
}
|
@ -3,5 +3,5 @@ package org.mmga.clubs.entities.user;
|
||||
import io.swagger.v3.oas.annotations.media.Schema;
|
||||
|
||||
@Schema(description = "用户登录参数类")
|
||||
public record UserLoginVo(@Schema(description = "用户名", requiredMode = Schema.RequiredMode.REQUIRED) String username, @Schema(description = "用户密码(使用MD5摘要后的hex字符串)") String password, @Schema(description = "验证码密钥") String key, @Schema(description = "验证码") String code) {
|
||||
public record UserLoginVo(@Schema(description = "用户名", requiredMode = Schema.RequiredMode.REQUIRED) String username, @Schema(description = "用户密码(使用MD5摘要后的hex字符串)") String password/*, @Schema(description = "验证码密钥") String key, @Schema(description = "验证码") String code*/) {
|
||||
}
|
||||
|
@ -60,9 +60,9 @@ public class UserService {
|
||||
}
|
||||
|
||||
public BaseResponse<Boolean> login(UserLoginVo user, HttpServletResponse response) {
|
||||
if (verifyCodeService.invalid(user.key(), user.code())) {
|
||||
/*if (verifyCodeService.invalid(user.key(), user.code())) {
|
||||
return BaseResponse.failed(403, "验证码错误");
|
||||
}
|
||||
}*/
|
||||
UserVo userVo = userDao.getUser(user.username(), DigestUtils.sha1Hex(user.password()));
|
||||
User u = packageUser(userVo);
|
||||
if (response != null && u != null){
|
||||
|
@ -11,24 +11,36 @@ import org.springframework.stereotype.Component;
|
||||
|
||||
import java.security.interfaces.ECPrivateKey;
|
||||
import java.security.interfaces.ECPublicKey;
|
||||
import java.util.Optional;
|
||||
|
||||
@Component
|
||||
@Slf4j
|
||||
public class JwtUtils {
|
||||
private final ECPublicKey ecPublicKey;
|
||||
private final ECPrivateKey ecPrivateKey;
|
||||
|
||||
@Autowired
|
||||
public JwtUtils(ECPublicKey ecPublicKey, ECPrivateKey ecPrivateKey){
|
||||
public JwtUtils(ECPublicKey ecPublicKey, ECPrivateKey ecPrivateKey) {
|
||||
this.ecPublicKey = ecPublicKey;
|
||||
this.ecPrivateKey = ecPrivateKey;
|
||||
}
|
||||
public String createToken(User user){
|
||||
|
||||
public String createToken(User user) {
|
||||
String jwt = JWT.create().withClaim("uid", user.getId()).sign(Algorithm.ECDSA512(ecPublicKey, ecPrivateKey));
|
||||
log.debug("对用户:{},生成JWT:{}", user.getName(), jwt);
|
||||
return jwt;
|
||||
}
|
||||
|
||||
public Integer verifyToken(String token) throws JWTVerificationException {
|
||||
DecodedJWT verify = JWT.require(Algorithm.ECDSA512(ecPublicKey, ecPrivateKey)).build().verify(token);
|
||||
return verify.getClaim("uid").asInt();
|
||||
}
|
||||
|
||||
public Optional<Integer> verifyTokenSafe(String token) {
|
||||
try {
|
||||
return Optional.of(verifyToken(token));
|
||||
} catch (JWTVerificationException ignored) {
|
||||
}
|
||||
return Optional.empty();
|
||||
}
|
||||
}
|
||||
|
27
src/main/java/org/mmga/clubs/utils/WebSocketUtils.java
Normal file
27
src/main/java/org/mmga/clubs/utils/WebSocketUtils.java
Normal file
@ -0,0 +1,27 @@
|
||||
package org.mmga.clubs.utils;
|
||||
|
||||
import com.alibaba.fastjson2.JSONObject;
|
||||
import jakarta.annotation.Nullable;
|
||||
import jakarta.websocket.Session;
|
||||
import lombok.NonNull;
|
||||
import org.mmga.clubs.entities.chess.packet.BaseWebSocketPacket;
|
||||
|
||||
import java.util.Objects;
|
||||
|
||||
public class WebSocketUtils {
|
||||
public static void sendJsonMessage(@NonNull JSONObject message, @NonNull Session session) {
|
||||
session.getAsyncRemote().sendText(message.toJSONString());
|
||||
}
|
||||
public static void sendMessage(@NonNull Object object, @NonNull Session session) {
|
||||
sendJsonMessage(JSONObject.from(object), session);
|
||||
}
|
||||
|
||||
public static void sendPacket(@NonNull Object packet, @NonNull Session session) {
|
||||
sendMessage(BaseWebSocketPacket.of(packet), session);
|
||||
}
|
||||
|
||||
public static void sendPacketIfPossible(@NonNull Object packet, @Nullable Session session) {
|
||||
if (Objects.isNull(session)) return;
|
||||
sendPacket(packet, session);
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user