|
|
@@ -698,6 +698,84 @@ public class OpenIMServiceImpl implements OpenIMService {
|
|
|
return R.ok();
|
|
|
}
|
|
|
|
|
|
+ @Override
|
|
|
+ public void deleteAndBlackBothWays(String userID1, String userID2) {
|
|
|
+ if (StringUtils.isBlank(userID1) || StringUtils.isBlank(userID2)) {
|
|
|
+ log.warn("双向拉黑参数无效 userID1={} userID2={}", userID1, userID2);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ log.info("用户互聊触发双向拉黑 userID1={} userID2={}", userID1, userID2);
|
|
|
+
|
|
|
+ boolean black12 = isAlreadyBlack(userID1, userID2);
|
|
|
+ boolean black21 = isAlreadyBlack(userID2, userID1);
|
|
|
+ if (black12 && black21) {
|
|
|
+ log.info("双方已互相拉黑,跳过处理 userID1={} userID2={}", userID1, userID2);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ // 未拉黑的一侧再拉黑
|
|
|
+ if (!black12) {
|
|
|
+ addBlackQuietly(userID1, userID2);
|
|
|
+ } else {
|
|
|
+ log.info("已拉黑,跳过 {}->{}", userID1, userID2);
|
|
|
+ }
|
|
|
+ if (!black21) {
|
|
|
+ addBlackQuietly(userID2, userID1);
|
|
|
+ } else {
|
|
|
+ log.info("已拉黑,跳过 {}->{}", userID2, userID1);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 判断 ownerUserID 是否已拉黑 blackUserID
|
|
|
+ */
|
|
|
+ private boolean isAlreadyBlack(String ownerUserID, String blackUserID) {
|
|
|
+ try {
|
|
|
+ Map<String, Object> body = new HashMap<>();
|
|
|
+ body.put("ownerUserID", ownerUserID);
|
|
|
+ body.put("userIDList", Collections.singletonList(blackUserID));
|
|
|
+ String result = imPost("/friend/get_specified_blacks", JSONUtil.toJsonStr(body));
|
|
|
+ OpenImResponseDTO responseDTO = JSONUtil.toBean(result, OpenImResponseDTO.class);
|
|
|
+ if (responseDTO == null || responseDTO.getErrCode() == null || responseDTO.getErrCode() != 0
|
|
|
+ || responseDTO.getData() == null) {
|
|
|
+ log.warn("查询黑名单失败 owner={} black={} result={}", ownerUserID, blackUserID, result);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ Object total = responseDTO.getData().get("total");
|
|
|
+ if (total != null) {
|
|
|
+ try {
|
|
|
+ if (Integer.parseInt(total.toString()) > 0) {
|
|
|
+ return true;
|
|
|
+ }
|
|
|
+ } catch (NumberFormatException ignored) {
|
|
|
+ // fall through
|
|
|
+ }
|
|
|
+ }
|
|
|
+ Object blacks = responseDTO.getData().get("blacks");
|
|
|
+ return blacks instanceof List && !((List<?>) blacks).isEmpty();
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("查询黑名单异常 owner={} black={}", ownerUserID, blackUserID, e);
|
|
|
+ return false;
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ private void addBlackQuietly(String ownerUserID, String blackUserID) {
|
|
|
+ try {
|
|
|
+ Map<String, Object> body = new HashMap<>();
|
|
|
+ body.put("ownerUserID", ownerUserID);
|
|
|
+ body.put("blackUserID", blackUserID);
|
|
|
+ String result = imPost("/friend/add_black", JSONUtil.toJsonStr(body));
|
|
|
+ // 已存在唯一索引冲突时视为成功,避免重复回调报错
|
|
|
+ if (result != null && (result.contains("E11000") || result.contains("duplicate key"))) {
|
|
|
+ log.info("拉黑已存在,忽略重复 {}->{} result={}", ownerUserID, blackUserID, result);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+ log.info("拉黑 {}->{} 结果={}", ownerUserID, blackUserID, result);
|
|
|
+ } catch (Exception e) {
|
|
|
+ log.warn("拉黑异常 {}->{}", ownerUserID, blackUserID, e);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
@Data
|
|
|
public static class UpdateUserInfo {
|
|
|
private String userID;
|