Просмотр исходного кода

Merge branch 'package' of GameCenter/game-center into dev

zhimo 1 год назад
Родитель
Сommit
364967b38d

+ 6 - 1
game-module/game-module-base/src/main/java/com/zanxiang/game/module/base/pojo/enums/ShellControlEnum.java

@@ -30,7 +30,12 @@ public enum ShellControlEnum {
     /**
      * 角色等级控制开启
      */
-    SHELL_CONTROL_LOW_LEVEL_OPEN(3, "角色等级控制开启");
+    SHELL_CONTROL_LOW_LEVEL_OPEN(3, "角色等级控制开启"),
+
+    /**
+     * 省份屏蔽
+     */
+    SHELL_CONTROL_PROV_OPEN(4, "省份屏蔽");
 
     /**
      * 壳包控制类型

+ 1 - 1
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/SDKApplication.java

@@ -23,7 +23,7 @@ public class SDKApplication {
 
     public static void main(String[] args) {
         SpringApplication.run(SDKApplication.class, args);
-        System.out.println("赞象SDK服务启动成功 <壳包屏蔽省份1> ( ´・・)ノ(._.`) \n" +
+        System.out.println("赞象SDK服务启动成功 <壳包屏蔽省份22> ( ´・・)ノ(._.`) \n" +
                 " ___________ _   __\n" +
                 "/  ___|  _  \\ | / /\n" +
                 "\\ `--.| | | | |/ / \n" +

+ 2 - 5
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/controller/InitController.java

@@ -14,8 +14,6 @@ import lombok.extern.slf4j.Slf4j;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.web.bind.annotation.*;
 
-import javax.servlet.http.HttpServletRequest;
-
 /**
  * @author : lingfeng
  * @time : 2023-01-03
@@ -45,9 +43,8 @@ public class InitController {
     @ApiOperation(value = "微信小游戏壳包控制开关")
     @GetMapping("/shell/switch")
     @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = Boolean.class)})
-    public ResultVO<Integer> getShellSwitch(@RequestParam String appId, @RequestParam String version,
-                                            HttpServletRequest request) {
-        Integer shellSwitch = gameAppletShellService.getShellSwitch(appId, version, request);
+    public ResultVO<Integer> getShellSwitch(@RequestParam String appId, @RequestParam String version) {
+        Integer shellSwitch = gameAppletShellService.getShellSwitch(appId, version);
         log.error("客保控制开关返回值, shellSwitch : {}", shellSwitch);
         return ResultVO.ok(shellSwitch);
     }

+ 5 - 2
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/controller/LoginController.java

@@ -18,6 +18,8 @@ import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.validation.annotation.Validated;
 import org.springframework.web.bind.annotation.*;
 
+import javax.servlet.http.HttpServletRequest;
+
 /**
  * @author : lingfeng
  * @time : 2022-06-21
@@ -37,8 +39,9 @@ public class LoginController {
     @ApiOperation(value = "微信小游戏code授权登录")
     @PostMapping("/wx/code")
     @ApiResponses(value = {@ApiResponse(code = 200, message = "成功", response = UserLoginVO.class)})
-    public ResultVO<UserLoginVO> loginWxCode(@Validated @RequestBody LoginVxCodeParam param, UserData userData) {
-        return registerLoginService.loginWxCode(param, userData);
+    public ResultVO<UserLoginVO> loginWxCode(@Validated @RequestBody LoginVxCodeParam param, UserData userData,
+                                             HttpServletRequest request) {
+        return registerLoginService.loginWxCode(param, userData, request);
     }
 
     @UnSignCheck

+ 3 - 3
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/IGameAppletShellService.java

@@ -18,17 +18,17 @@ public interface IGameAppletShellService extends IService<GameAppletShell> {
      *
      * @param appId   应用程序id
      * @param version 版本
-     * @param request 网络请求
      * @return {@link Integer}
      */
-    Integer getShellSwitch(String appId, String version, HttpServletRequest request);
+    Integer getShellSwitch(String appId, String version);
 
     /**
      * 获取用户壳开关
      *
      * @param user     用户
      * @param register 注册
+     * @param request  网络请求
      * @return {@link Integer}
      */
-    Integer getUserShellSwitch(User user, boolean register);
+    Integer getUserShellSwitch(User user, boolean register, HttpServletRequest request);
 }

+ 4 - 1
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/IRegisterLoginService.java

@@ -8,6 +8,8 @@ import com.zanxiang.game.module.sdk.pojo.param.UserData;
 import com.zanxiang.game.module.sdk.pojo.vo.UserLoginVO;
 import com.zanxiang.module.util.pojo.ResultVO;
 
+import javax.servlet.http.HttpServletRequest;
+
 /**
  * @author : lingfeng
  * @time : 2022-06-22
@@ -20,9 +22,10 @@ public interface IRegisterLoginService {
      *
      * @param param    : 授权参数
      * @param userData : 用户信息
+     * @param request  : 网络请求
      * @return {@link ResultVO}<{@link UserLoginVO}>
      */
-    ResultVO<UserLoginVO> loginWxCode(LoginVxCodeParam param, UserData userData);
+    ResultVO<UserLoginVO> loginWxCode(LoginVxCodeParam param, UserData userData, HttpServletRequest request);
 
     /**
      * 登录密码

+ 41 - 16
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/GameAppletShellServiceImpl.java

@@ -47,7 +47,7 @@ public class GameAppletShellServiceImpl extends ServiceImpl<GameAppletShellMappe
     private IUserCardService userCardService;
 
     @Override
-    public Integer getShellSwitch(String appId, String version, HttpServletRequest request) {
+    public Integer getShellSwitch(String appId, String version) {
         log.error("壳包接口收到请求, appId : {}, version : {}", appId, version);
         GameExt gameExt = gameExtService.getByGameAppId(appId);
         if (gameExt == null) {
@@ -62,16 +62,6 @@ public class GameAppletShellServiceImpl extends ServiceImpl<GameAppletShellMappe
         if (Objects.equals(gameAppletShell.getArraignVersion(), version)) {
             return ShellSwitchEnum.SHELL_SWITCH_OPEN.getShellSwitch();
         }
-        //省份屏蔽
-        if (Strings.isNotBlank(gameAppletShell.getProvShield())) {
-            try {
-                IpCheckResult result = userCardService.userIpCheck(IpUtil.getRealIp(request));
-                if (result.getData().getResult().getProv().contains(gameAppletShell.getProvShield())) {
-                    return ShellSwitchEnum.SHELL_SWITCH_OPEN.getShellSwitch();
-                }
-            } catch (Exception ignored) {
-            }
-        }
         //线上版本
         if (Objects.equals(gameAppletShell.getProVersion(), version)) {
             //申诉中, 返回申诉状态
@@ -99,7 +89,7 @@ public class GameAppletShellServiceImpl extends ServiceImpl<GameAppletShellMappe
     }
 
     @Override
-    public Integer getUserShellSwitch(User user, boolean register) {
+    public Integer getUserShellSwitch(User user, boolean register, HttpServletRequest request) {
         GameAppletShell gameAppletShell = super.getOne(new LambdaQueryWrapper<GameAppletShell>()
                 .eq(GameAppletShell::getGameId, user.getGameId()));
         //未设置, 统一返回关闭
@@ -120,12 +110,14 @@ public class GameAppletShellServiceImpl extends ServiceImpl<GameAppletShellMappe
         if (Objects.equals(proControlType, ShellControlEnum.SHELL_CONTROL_NEW_USER_OPEN.getShellControl())) {
             return register ? ShellSwitchEnum.SHELL_SWITCH_OPEN.getShellSwitch() : ShellSwitchEnum.SHELL_SWITCH_CLOSE.getShellSwitch();
         }
+
+        //查询用户角色列表
+        List<GameUserRole> gameUserRoleList = gameUserRoleService.list(new LambdaQueryWrapper<GameUserRole>()
+                .eq(GameUserRole::getUserId, user.getId())
+                .eq(GameUserRole::getGameId, user.getGameId()));
+
         //等级控制开启
         if (Objects.equals(proControlType, ShellControlEnum.SHELL_CONTROL_LOW_LEVEL_OPEN.getShellControl())) {
-            //查询用户角色等级
-            List<GameUserRole> gameUserRoleList = gameUserRoleService.list(new LambdaQueryWrapper<GameUserRole>()
-                    .eq(GameUserRole::getUserId, user.getId())
-                    .eq(GameUserRole::getGameId, user.getGameId()));
             //不存在角色的新用户, 开启
             if (CollectionUtils.isEmpty(gameUserRoleList)) {
                 return ShellSwitchEnum.SHELL_SWITCH_OPEN.getShellSwitch();
@@ -138,6 +130,39 @@ public class GameAppletShellServiceImpl extends ServiceImpl<GameAppletShellMappe
             }
             return ShellSwitchEnum.SHELL_SWITCH_CLOSE.getShellSwitch();
         }
+
+        //省份屏蔽
+        if (Objects.equals(proControlType, ShellControlEnum.SHELL_CONTROL_PROV_OPEN.getShellControl())) {
+            if (Strings.isBlank(gameAppletShell.getProvShield())) {
+                return ShellSwitchEnum.SHELL_SWITCH_CLOSE.getShellSwitch();
+            }
+            String prov = null;
+            try {
+                IpCheckResult result = userCardService.userIpCheck(IpUtil.getRealIp(request));
+                prov = result.getData().getResult().getProv();
+            } catch (Exception ignored) {
+            }
+            //未查询到归属地, 或者不包含屏蔽省份, 关闭壳包
+            if (prov == null || !prov.contains(gameAppletShell.getProvShield())) {
+                return ShellSwitchEnum.SHELL_SWITCH_CLOSE.getShellSwitch();
+            }
+            //未设置更多的等级限制, 直接进壳
+            if (gameAppletShell.getProControlLevel() == null) {
+                return ShellSwitchEnum.SHELL_SWITCH_OPEN.getShellSwitch();
+            }
+            //不存在角色的新用户, 开启
+            if (CollectionUtils.isEmpty(gameUserRoleList)) {
+                return ShellSwitchEnum.SHELL_SWITCH_OPEN.getShellSwitch();
+            }
+            //获取用户等级最高的角色
+            GameUserRole gameUserRole = gameUserRoleList.stream().max(Comparator.comparing(GameUserRole::getRoleLevel)).orElse(null);
+            //角色不存在, 或者等级小于等于控制等级
+            if (gameUserRole == null || gameUserRole.getRoleLevel() <= gameAppletShell.getProControlLevel()) {
+                return ShellSwitchEnum.SHELL_SWITCH_OPEN.getShellSwitch();
+            }
+            return ShellSwitchEnum.SHELL_SWITCH_CLOSE.getShellSwitch();
+        }
+
         log.error("壳包控制配置不存在, 默认进壳包, userId : {}, gameAppletShell : {}", user.getId(), JsonUtil.toString(gameAppletShell));
         return ShellSwitchEnum.SHELL_SWITCH_OPEN.getShellSwitch();
     }

+ 4 - 3
game-module/game-module-sdk/src/main/java/com/zanxiang/game/module/sdk/service/impl/LoginServiceImpl.java

@@ -31,6 +31,7 @@ import reactor.util.function.Tuple2;
 import reactor.util.function.Tuple3;
 import reactor.util.function.Tuples;
 
+import javax.servlet.http.HttpServletRequest;
 import java.time.LocalDateTime;
 import java.util.Map;
 import java.util.Objects;
@@ -104,7 +105,7 @@ public class LoginServiceImpl implements IRegisterLoginService {
 
     @Override
     @Transactional(rollbackFor = Exception.class)
-    public ResultVO<UserLoginVO> loginWxCode(LoginVxCodeParam param, UserData userData) {
+    public ResultVO<UserLoginVO> loginWxCode(LoginVxCodeParam param, UserData userData, HttpServletRequest request) {
         //验证登录ip是否封禁
         if (ipBanService.checkIpBan(userData)) {
             return ResultVO.fail(HttpStatusEnum.IP_HALT.getMsg());
@@ -134,7 +135,7 @@ public class LoginServiceImpl implements IRegisterLoginService {
             agentService.userAgentUpdate(user, userData.getChannel());
             //返回登录信息
             UserLoginVO userLoginVO = this.createUserLoginVO(user, userData);
-            userLoginVO.setAppletShellSwitch(gameAppletShellService.getUserShellSwitch(user, Boolean.FALSE));
+            userLoginVO.setAppletShellSwitch(gameAppletShellService.getUserShellSwitch(user, Boolean.FALSE, request));
             log.error("返回用户登录信息, userLoginVO : {}", JsonUtil.toString(userLoginVO));
             return ResultVO.ok(userLoginVO);
         }
@@ -142,7 +143,7 @@ public class LoginServiceImpl implements IRegisterLoginService {
         user = userCreateSave(userData, openId, null, null, openId, sessionKey);
         //返回登录信息
         UserLoginVO userLoginVO = this.createUserLoginVO(user, userData);
-        userLoginVO.setAppletShellSwitch(gameAppletShellService.getUserShellSwitch(user, Boolean.TRUE));
+        userLoginVO.setAppletShellSwitch(gameAppletShellService.getUserShellSwitch(user, Boolean.TRUE, request));
         log.error("返回用户登录信息, userLoginVO : {}", JsonUtil.toString(userLoginVO));
         return ResultVO.ok(userLoginVO);
     }