xiongzhu %!s(int64=3) %!d(string=hai) anos
pai
achega
3c76d78647

+ 5 - 0
pom.xml

@@ -341,6 +341,11 @@
             <groupId>net.sf.ehcache</groupId>
             <artifactId>ehcache</artifactId>
         </dependency>
+
+        <dependency>
+            <groupId>com.squareup.okhttp3</groupId>
+            <artifactId>okhttp</artifactId>
+        </dependency>
     </dependencies>
 
 </project>

+ 12 - 0
src/main/java/com/izouma/yags/camp/api/ApiResponse.java

@@ -0,0 +1,12 @@
+package com.izouma.yags.camp.api;
+
+import lombok.Data;
+
+@Data
+public class ApiResponse<T> {
+    private Integer result;
+    private Integer returnCode;
+    private String  returnMsg;
+    private T       data;
+    private String  time;
+}

+ 37 - 0
src/main/java/com/izouma/yags/camp/api/ConfirmInfo.java

@@ -0,0 +1,37 @@
+package com.izouma.yags.camp.api;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class ConfirmInfo {
+    private Integer      other;
+    private Integer      couch;
+    private Integer      kol;
+    private Integer      official;
+    private Integer      media;
+    private Integer      daren;
+    private Integer      hongren;
+    private Integer      top;
+    private Integer      ydqs;
+    private Integer      club;
+    private Integer      superV;
+    private String       confirmdesc;
+    private Integer      player;
+    private Integer      bindStamp;
+    private Integer      author;
+    private Integer      trueAuthor;
+    private String       confirmicon;
+    private Integer      personal;
+    private Integer      tmpAuthor;
+    private List<Object> confirmsecondtag;
+    private Integer      realAuthor;
+    private Integer      jsonMemberSuper;
+    private Integer      trueMedia;
+    private List<Object> confirmsecondicon;
+    private Integer      platid;
+    private Integer      organized;
+    private Integer      zhubo;
+    private Integer      commentary;
+}

+ 29 - 0
src/main/java/com/izouma/yags/camp/api/HeroItem.java

@@ -0,0 +1,29 @@
+package com.izouma.yags.camp.api;
+
+import lombok.Data;
+
+@Data
+public class HeroItem {
+    private String  winNum;
+    private String  frequencyHeroUrl;
+    private String  heroIcon;
+    private Integer notSellFlag;
+    private Integer jinbiNum;
+    private Integer playNum;
+    private String  nickName;
+    private String  heroType;
+    private String  heroId;
+    private Integer heroFightPower;
+    private String  skilledLevel;
+    private String  url;
+    private String  heroUrl;
+    private Integer score;
+    private String  failNum;
+    private String  expireTime;
+    private Integer diamonNum;
+    private String  price;
+    private Integer dianquanNum;
+    private String  name;
+    private String  winRate;
+    private String  iRenew;
+}

+ 8 - 0
src/main/java/com/izouma/yags/camp/api/Matchlist.java

@@ -0,0 +1,8 @@
+package com.izouma.yags.camp.api;
+
+import lombok.Data;
+
+@Data
+public class Matchlist{
+
+}

+ 15 - 0
src/main/java/com/izouma/yags/camp/api/QueryRole.java

@@ -0,0 +1,15 @@
+package com.izouma.yags.camp.api;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class QueryRole {
+    private List<RoleItem> rolelist;
+    private List<Object>   shortCut;
+    private Rolecard       rolecard;
+    private Matchlist      matchlist;
+    private List<Object>   battleCard;
+    private List<HeroItem> herolist;
+}

+ 51 - 0
src/main/java/com/izouma/yags/camp/api/RoleItem.java

@@ -0,0 +1,51 @@
+package com.izouma.yags.camp.api;
+
+import lombok.Data;
+
+import java.util.List;
+
+@Data
+public class RoleItem {
+    private Integer      serverStatus;
+    private Object       medalInfo;
+    private String       icon;
+    private String       serverName;
+    private Integer      lu;
+    private ConfirmInfo  confirmInfo;
+    private Integer      serverId;
+    private Integer      notify;
+    private Integer      vipLevel;
+    private String       userLevel;
+    private String       areaName;
+    private String       nickname;
+    private String       roleIcon;
+    private Integer      gameOnline;
+    private String       uin;
+    private Integer      liveStatus;
+    private List<String> roleText;
+    private Integer      add;
+    private Integer      gameId;
+    private Integer      receive;
+    private Integer      level;
+    private String       roleId;
+    private String       openid;
+    private Integer      vest;
+    private Integer      sex;
+    private String       avatar;
+    private Integer      userId;
+    private Boolean      isMainUin;
+    private Integer      userconfirm;
+    private Integer      appOnline;
+    private String       areaId;
+    private String       roleDesc;
+    private String       roleJob;
+    private String       roleName;
+    private String       originalRoleId;
+    private String       userdesc;
+    private Integer      online;
+    private String       liveLink;
+    private Integer      isGameFriend;
+    private Integer      status;
+    private Integer      roleJobId;
+    private Integer      vv;
+}

+ 8 - 0
src/main/java/com/izouma/yags/camp/api/Rolecard.java

@@ -0,0 +1,8 @@
+package com.izouma.yags.camp.api;
+
+import lombok.Data;
+
+@Data
+public class Rolecard {
+
+}

+ 25 - 0
src/main/java/com/izouma/yags/converter/RecognitionResultConverter.java

@@ -0,0 +1,25 @@
+package com.izouma.yags.converter;
+
+import com.izouma.yags.dto.RecognitionResult;
+import org.apache.commons.lang3.StringUtils;
+
+import javax.persistence.AttributeConverter;
+
+public class RecognitionResultConverter implements AttributeConverter<RecognitionResult, String> {
+    @Override
+    public String convertToDatabaseColumn(RecognitionResult recognitionResult) {
+        if (recognitionResult == null) return null;
+        return recognitionResult.getMode() + "," + recognitionResult.isWin();
+    }
+
+    @Override
+    public RecognitionResult convertToEntityAttribute(String s) {
+        if (StringUtils.isBlank(s)) return null;
+        try {
+            String[] split = s.split(",");
+            return new RecognitionResult(split[0], Boolean.parseBoolean(split[1]));
+        } catch (Exception e) {
+            return null;
+        }
+    }
+}

+ 6 - 0
src/main/java/com/izouma/yags/domain/JoinRoom.java

@@ -1,5 +1,7 @@
 package com.izouma.yags.domain;
 
+import com.izouma.yags.converter.RecognitionResultConverter;
+import com.izouma.yags.dto.RecognitionResult;
 import com.izouma.yags.enums.JoinRoomStatus;
 import io.swagger.annotations.ApiModelProperty;
 import lombok.AllArgsConstructor;
@@ -50,4 +52,8 @@ public class JoinRoom extends BaseEntity {
     private String team;
 
     private String gameNickname;
+
+    @Convert(converter = RecognitionResultConverter.class)
+    private RecognitionResult recognitionResult;
+
 }

+ 2 - 0
src/main/java/com/izouma/yags/domain/Room.java

@@ -84,6 +84,8 @@ public class Room extends BaseEntity {
 
     private LocalDateTime startAt;
 
+    private LocalDateTime endAt;
+
     private LocalDateTime finishAt;
 
     private LocalDateTime cancelAt;

+ 11 - 0
src/main/java/com/izouma/yags/dto/RecognitionResult.java

@@ -0,0 +1,11 @@
+package com.izouma.yags.dto;
+
+import lombok.AllArgsConstructor;
+import lombok.Data;
+
+@Data
+@AllArgsConstructor
+public class RecognitionResult {
+    private String  mode;
+    private boolean win;
+}

+ 32 - 2
src/main/java/com/izouma/yags/service/RoomService.java

@@ -5,6 +5,7 @@ import com.alibaba.fastjson.JSONObject;
 import com.izouma.yags.config.Constants;
 import com.izouma.yags.domain.*;
 import com.izouma.yags.dto.PageQuery;
+import com.izouma.yags.dto.RecognitionResult;
 import com.izouma.yags.dto.RoomDetail;
 import com.izouma.yags.enums.JoinRoomStatus;
 import com.izouma.yags.enums.RoomStatus;
@@ -343,8 +344,37 @@ public class RoomService {
         }
     }
 
-    public boolean recognize(String screenShot) {
-        return Math.random() > 0.5;
+    public void uploadResultNew(Long userId, Long roomId, String screenShot) throws Exception {
+        Room room = roomRepo.findById(roomId).orElseThrow(new BusinessException("房间无记录"));
+        if (LocalDateTime.now().isBefore(room.getStartAt().plusMinutes(10))) {
+            throw new BusinessException("比赛时间过短:10分钟");
+        }
+        JoinRoom joinRoom = joinRoomRepo.findFirstByRoomIdAndUserId(roomId, userId).orElseThrow(new BusinessException("无记录"));
+        if (!(room.getStatus() == RoomStatus.GAMING || room.getStatus() == RoomStatus.AUDIT)) {
+            throw new BusinessException("当前房间状态无法上传截图");
+        }
+        String format;
+        if (Pattern.matches(".*\\.(jpg|jpeg)", screenShot.toLowerCase())) {
+            format = "jpg";
+        } else if (Pattern.matches(".*\\.png", screenShot.toLowerCase())) {
+            format = "png";
+        } else if (Pattern.matches(".*\\.bmp", screenShot.toLowerCase())) {
+            format = "bmp";
+        } else {
+            throw new BusinessException("截图格式不正确");
+        }
+        ByteArrayOutputStream os = new ByteArrayOutputStream();
+        ImageIO.write(ImageIO.read(new URL(screenShot)), format, os);
+        RecognitionResult recognitionResult = RecognizeUtil.recognize2(os.toByteArray());
+        joinRoom.setScreenShot(screenShot);
+        joinRoom.setRecognitionResult(recognitionResult);
+        joinRoomRepo.save(joinRoom);
+
+        room.setStatus(RoomStatus.AUDIT);
+        if (room.getEndAt() == null) {
+            room.setEndAt(LocalDateTime.now());
+        }
+        roomRepo.save(room);
     }
 
     public RoomDetail detail(Long id, boolean players) {

+ 32 - 0
src/main/java/com/izouma/yags/utils/RecognizeUtil.java

@@ -1,8 +1,10 @@
 package com.izouma.yags.utils;
 
 import com.alibaba.fastjson.JSON;
+import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.github.kevinsawicki.http.HttpRequest;
+import com.izouma.yags.dto.RecognitionResult;
 import lombok.extern.slf4j.Slf4j;
 
 import javax.imageio.ImageIO;
@@ -52,6 +54,36 @@ public class RecognizeUtil {
         return res;
     }
 
+    public static RecognitionResult recognize2(byte[] bytes) {
+        JSONObject res = JSON.parseObject(HttpRequest.post("http://120.77.252.240:9999/?threshold=0.4")
+                .contentType("raw")
+                .send(bytes)
+                .body());
+        log.info("recognize result={}", res);
+        try {
+            JSONArray results = res.getJSONArray("results");
+            Boolean win = null;
+            String mode = null;
+            for (int i = 0; i < results.size(); i++) {
+                JSONObject json = results.getJSONObject(i);
+                String name = json.getString("label");
+                double score = json.getDouble("confidence");
+                if ("胜利".equals(name) && score > 0.8) {
+                    win = true;
+                }
+                if (score > 0.8 && ("1v1".equals(name) || "2v2".equals(name) || "3v3".equals(name) || "5v5".equals(name))) {
+                    mode = name;
+                }
+            }
+            if (win != null && mode != null) {
+                return new RecognitionResult(mode, win);
+            }
+        } catch (Exception e) {
+            log.error("recognize error", e);
+        }
+        return null;
+    }
+
     public static void main(String[] args) throws IOException {
         ByteArrayOutputStream os = new ByteArrayOutputStream();
         ImageIO.write(ImageIO.read(new URL("https://cdn.raex.vip/image/2022-08-08-14-51-42lexfxYDl.jpg")), "jpg", os);

+ 32 - 0
src/test/java/com/izouma/yags/CommonTest.java

@@ -4,10 +4,15 @@ import com.alibaba.fastjson.JSON;
 import com.alibaba.fastjson.JSONArray;
 import com.alibaba.fastjson.JSONObject;
 import com.github.kevinsawicki.http.HttpRequest;
+import com.google.common.reflect.TypeToken;
+import com.google.gson.Gson;
+import com.izouma.yags.camp.api.ApiResponse;
+import com.izouma.yags.camp.api.QueryRole;
 import com.izouma.yags.dto.RaexUser;
 import com.izouma.yags.exception.BusinessException;
 import com.izouma.yags.utils.RaexUtils;
 import com.izouma.yags.utils.RecognizeUtil;
+import okhttp3.*;
 import org.apache.commons.io.FileUtils;
 import org.junit.jupiter.api.Test;
 import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
@@ -106,4 +111,31 @@ public class CommonTest {
                 .body());
         System.out.println(JSON.toJSONString(res, true));
     }
+
+    @Test
+    public void campApi() {
+        OkHttpClient client = new OkHttpClient();
+
+        RequestBody formBody = new FormBody.Builder()
+                .add("friendUserId", "377195948")
+                .add("gameId", "20001")
+                .add("token", "YGyWAchJ")
+                .add("userId", "436174868")
+                .build();
+        Request request = new Request.Builder()
+                .addHeader("userId", "436174868")
+                .addHeader("token", "YGyWAchJ")
+                .url("https://ssl.kohsocialapp.qq.com:10001/game/battleprofile")
+                .post(formBody)
+                .build();
+        try (Response response = client.newCall(request).execute()) {
+            Gson gson = new Gson();
+            String body = response.body().string();
+            ApiResponse<QueryRole> res = gson.fromJson(body, new TypeToken<ApiResponse<QueryRole>>() {
+            }.getType());
+            System.out.println(JSON.toJSONString(res, true));
+        } catch (IOException e) {
+            throw new RuntimeException(e);
+        }
+    }
 }