通话逻辑

This commit is contained in:
张良(004796)
2023-12-29 15:07:08 +08:00
parent 244fadd1e6
commit 3888da346c
10 changed files with 164 additions and 17 deletions

View File

@@ -0,0 +1,59 @@
package com.ruoyi.cai.trd;
import com.alibaba.fastjson2.JSONArray;
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.cai.util.RestTemplateUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import java.util.*;
@Component
public class Agora {
@Autowired
private AgoraProperties agoraProperties;
public String getAuthorizationHeader(){
// 拼接客户 ID 和客户密钥并使用 base64 编码
String plainCredentials = agoraProperties.getKey() + ":" + agoraProperties.getSecret();
String base64Credentials = new String(Base64.getEncoder().encode(plainCredentials.getBytes()));
// 创建 authorization header
return "Basic " + base64Credentials;
}
public List<String> getChannelUsers(String roomId){
String url = "http://api.sd-rtn.com/dev/v1/channel/user/%s/%s";
url = String.format(url, agoraProperties.getAppId(), roomId);
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("Authorization", getAuthorizationHeader());
HttpEntity httpEntity = new HttpEntity<>(headers);
JSONObject jsonobject = RestTemplateUtil.restTemplate.getForObject(url,JSONObject.class,httpEntity);
// "success":true,"data":{"channel_exist":true,"mode":2,"broadcasters":[1001,1025],"audience":[],"audience_total":0}}
if(jsonobject == null){
return Collections.emptyList();
}
JSONArray jsonArray = jsonobject.getJSONObject("data").getJSONArray("broadcasters");
return jsonArray.toJavaList(String.class);
}
public void closeChannel(String roomId){
String url = "http://api.sd-rtn.com/dev/v1/kicking-rule";
Map<String,Object> bodyData = new HashMap<>();
bodyData.put("appid",agoraProperties.getAppId());
bodyData.put("cname",roomId);
bodyData.put("time",0);
bodyData.put("privileges",Collections.emptyList());
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
headers.set("Authorization", getAuthorizationHeader());
HttpEntity httpEntity = new HttpEntity<>(bodyData, headers);
RestTemplateUtil.restTemplate.postForObject(url, httpEntity, JSONObject.class);
}
}

View File

@@ -0,0 +1,14 @@
package com.ruoyi.cai.trd;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@Component
@ConfigurationProperties(prefix = "agora")
public class AgoraProperties {
private String appId;
private String key;
private String secret;
}

View File

@@ -0,0 +1,18 @@
package com.ruoyi.cai.trd;
import lombok.Data;
@Data
public class ImDataRes {
private Integer type;
private ImData data;
@Data
public static class ImData {
private Integer callType;
private Integer status;
private String fromUid;
private String toUid;
private Integer callTime;
}
}

View File

@@ -0,0 +1,24 @@
package com.ruoyi.cai.trd;
public class ImMsgGen {
/**
* 通话通知
* @param status
* @param from
* @param to
* @param callTime
*/
public static ImDataRes callNotice(int status,String from,String to,int callTime){
ImDataRes imDataRes = new ImDataRes();
imDataRes.setType(15);
ImDataRes.ImData imData = new ImDataRes.ImData();
imData.setCallType(1);
imData.setStatus(status);
imData.setFromUid(from);
imData.setToUid(to);
imData.setCallTime(callTime);
imDataRes.setData(imData);
return imDataRes;
}
}

View File

@@ -0,0 +1,77 @@
package com.ruoyi.cai.trd;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.UUID;
import com.alibaba.fastjson2.JSON;
import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.cai.util.RestTemplateUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
@Component
public class Yunxin {
@Autowired
private YunxinProperties yunxinProperties;
private final static String SEND_URL = "https://api.netease.im/nimserver/msg/sendMsg.action";
private final static String SEND_ATTR_URL = "https://api.netease.im/nimserver/msg/sendAttachMsg.action";
public void sendTo(String toUid,Object data,String fromUid){
Map<String,Object> option = new HashMap<>();
option.put("push",true); // 该消息是否需要APNS推送或安卓系统通知栏推送
option.put("roam",false); // 该消息是否需要漫游需要app开通漫游消息功能
option.put("history",false); // 该消息是否存云端历史
option.put("sendersync",false); // 该消息是否需要发送方多端同步
option.put("route",false); // 该消息是否需要抄送第三方 (需要app开通消息抄送功能)
Map<String,Object> bodyData = new HashMap<>();
bodyData.put("from", StringUtils.isBlank(fromUid) ? yunxinProperties.getDefaultFromUid() :fromUid);
bodyData.put("ope", 0);
bodyData.put("to", toUid);
bodyData.put("type", 100);
bodyData.put("body", JSON.toJSONString(data));
bodyData.put("option", JSON.toJSONString(option));
String nonce = UUID.fastUUID().toString();
String curTime = DateUtil.currentSeconds() + "";
HttpHeaders headers = new HttpHeaders();
headers.add("AppKey",yunxinProperties.getAppKey());
headers.add("Nonce", nonce);
headers.add("CurTime", curTime);
headers.add("CheckSum", yunxinProperties.getAppSecret()+nonce+curTime);
HttpEntity httpEntity = new HttpEntity<>(bodyData, headers);
RestTemplateUtil.restTemplate.postForObject(SEND_URL,httpEntity, JSONObject.class);
}
public void sendAttachMsg(String toUid,Object data,String fromUid){
Map<String,Object> option = new HashMap<>();
option.put("push",true); // 该消息是否需要APNS推送或安卓系统通知栏推送
option.put("roam",false); // 该消息是否需要漫游需要app开通漫游消息功能
option.put("history",false); // 该消息是否存云端历史
option.put("sendersync",false); // 该消息是否需要发送方多端同步
option.put("route",false); // 该消息是否需要抄送第三方 (需要app开通消息抄送功能)
Map<String,Object> bodyData = new HashMap<>();
bodyData.put("from", StringUtils.isBlank(fromUid) ? yunxinProperties.getDefaultFromUid() :fromUid);
bodyData.put("ope", 0);
bodyData.put("to", toUid);
bodyData.put("type", 100);
bodyData.put("body", JSON.toJSONString(data));
bodyData.put("option", JSON.toJSONString(option));
String nonce = UUID.fastUUID().toString();
String curTime = DateUtil.currentSeconds() + "";
HttpHeaders headers = new HttpHeaders();
headers.add("AppKey",yunxinProperties.getAppKey());
headers.add("Nonce", nonce);
headers.add("CurTime", curTime);
headers.add("CheckSum", yunxinProperties.getAppSecret()+nonce+curTime);
HttpEntity httpEntity = new HttpEntity<>(bodyData, headers);
RestTemplateUtil.restTemplate.postForObject(SEND_ATTR_URL,httpEntity, JSONObject.class);
}
}

View File

@@ -0,0 +1,15 @@
package com.ruoyi.cai.trd;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@Component
@ConfigurationProperties(prefix = "yunxin")
public class YunxinProperties {
private String appKey;
private String appSecret;
private String defaultFromUid;
}