mirror of
https://github.com/chatopera/cosin.git
synced 2025-08-01 16:38:02 +08:00
#75 enable chatbox for chatbot in client HTML Pages
This commit is contained in:
parent
546b8e6ddc
commit
1891891e4a
@ -928,7 +928,7 @@ public class UKDataContext {
|
||||
}
|
||||
}
|
||||
|
||||
public enum AiType {
|
||||
public enum ChatbotType {
|
||||
SMARTAI,
|
||||
BUSINESSAI;
|
||||
|
||||
@ -938,7 +938,7 @@ public class UKDataContext {
|
||||
}
|
||||
|
||||
|
||||
public enum AiBussType {
|
||||
public enum ChatbotBussType {
|
||||
SALE,
|
||||
QUESURVEY;
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -22,7 +22,7 @@ import java.util.HashSet;
|
||||
|
||||
public class ChatbotUtils {
|
||||
public static final HashSet<String> VALID_LANGS = new HashSet<String>(Arrays.asList(new String[]{"zh_CN", "en_US"}));
|
||||
public static final String CHATBOT_FIRST = "客服机器人优先";
|
||||
public static final String CHATBOT_FIRST = "机器人客服优先";
|
||||
public static final String HUMAN_FIRST = "人工客服优先";
|
||||
public static final HashSet<String> VALID_WORKMODELS = new HashSet<String>(Arrays.asList(new String[]{CHATBOT_FIRST, HUMAN_FIRST}));
|
||||
|
||||
|
@ -1,200 +0,0 @@
|
||||
/*
|
||||
* Copyright (C) 2017 优客服-多渠道客服系统
|
||||
* Modifications copyright (C) 2018 Chatopera Inc, <https://www.chatopera.com>
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
package com.chatopera.cc.webim.util.server.handler;
|
||||
|
||||
import java.net.InetSocketAddress;
|
||||
import java.util.Date;
|
||||
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
|
||||
import com.corundumstudio.socketio.AckRequest;
|
||||
import com.corundumstudio.socketio.SocketIOClient;
|
||||
import com.corundumstudio.socketio.SocketIOServer;
|
||||
import com.corundumstudio.socketio.annotation.OnConnect;
|
||||
import com.corundumstudio.socketio.annotation.OnDisconnect;
|
||||
import com.corundumstudio.socketio.annotation.OnEvent;
|
||||
import com.chatopera.cc.core.UKDataContext;
|
||||
import com.chatopera.cc.util.IPTools;
|
||||
import com.chatopera.cc.util.UKTools;
|
||||
import com.chatopera.cc.util.client.NettyClients;
|
||||
import com.chatopera.cc.webim.service.acd.ServiceQuene;
|
||||
import com.chatopera.cc.webim.service.cache.CacheHelper;
|
||||
import com.chatopera.cc.webim.service.repository.ConsultInviteRepository;
|
||||
import com.chatopera.cc.webim.util.MessageUtils;
|
||||
import com.chatopera.cc.webim.util.OnlineUserUtils;
|
||||
import com.chatopera.cc.webim.util.router.OutMessageRouter;
|
||||
import com.chatopera.cc.webim.util.server.message.AgentStatusMessage;
|
||||
import com.chatopera.cc.webim.util.server.message.ChatMessage;
|
||||
import com.chatopera.cc.webim.util.server.message.NewRequestMessage;
|
||||
import com.chatopera.cc.webim.web.model.AgentService;
|
||||
import com.chatopera.cc.webim.web.model.AiUser;
|
||||
import com.chatopera.cc.webim.web.model.CousultInvite;
|
||||
import com.chatopera.cc.webim.web.model.MessageOutContent;
|
||||
|
||||
public class AiIMEventHandler
|
||||
{
|
||||
protected SocketIOServer server;
|
||||
|
||||
@Autowired
|
||||
public AiIMEventHandler(SocketIOServer server)
|
||||
{
|
||||
this.server = server ;
|
||||
}
|
||||
|
||||
@OnConnect
|
||||
public void onConnect(SocketIOClient client)
|
||||
{
|
||||
try {
|
||||
String user = client.getHandshakeData().getSingleUrlParam("userid") ;
|
||||
String orgi = client.getHandshakeData().getSingleUrlParam("orgi") ;
|
||||
// String session = client.getHandshakeData().getSingleUrlParam("session") ;
|
||||
String appid = client.getHandshakeData().getSingleUrlParam("appid") ;
|
||||
String aiid = client.getHandshakeData().getSingleUrlParam("aiid") ;
|
||||
// String agent = client.getHandshakeData().getSingleUrlParam("agent") ;
|
||||
// String skill = client.getHandshakeData().getSingleUrlParam("skill") ;
|
||||
|
||||
if(!StringUtils.isBlank(user)){
|
||||
// /**
|
||||
// * 加入到 缓存列表
|
||||
// */
|
||||
NettyClients.getInstance().putIMEventClient(user, client);
|
||||
MessageOutContent outMessage = new MessageOutContent() ;
|
||||
CousultInvite invite = OnlineUserUtils.cousult(appid , orgi, UKDataContext.getContext().getBean(ConsultInviteRepository.class));
|
||||
if(invite!=null && !StringUtils.isBlank(invite.getAisuccesstip())) {
|
||||
outMessage.setMessage(invite.getAisuccesstip());
|
||||
}else{
|
||||
outMessage.setMessage("欢迎使用优客服小E,我来帮您解答问题");
|
||||
}
|
||||
|
||||
outMessage.setMessageType(UKDataContext.MessageTypeEnum.MESSAGE.toString());
|
||||
outMessage.setCalltype(UKDataContext.CallTypeEnum.IN.toString());
|
||||
outMessage.setNickName("AI");
|
||||
outMessage.setCreatetime(UKTools.dateFormate.format(new Date()));
|
||||
|
||||
client.sendEvent(UKDataContext.MessageTypeEnum.STATUS.toString(), outMessage);
|
||||
|
||||
InetSocketAddress address = (InetSocketAddress) client.getRemoteAddress() ;
|
||||
String ip = UKTools.getIpAddr(client.getHandshakeData().getHttpHeaders(), address.getHostString()) ;
|
||||
AiUser aiUser = new AiUser(user, user, System.currentTimeMillis() , orgi,IPTools.getInstance().findGeography(ip)) ;
|
||||
aiUser.setSessionid(UKTools.getContextID(client.getSessionId().toString()));
|
||||
aiUser.setAppid(appid);
|
||||
aiUser.setAiid(aiid);
|
||||
aiUser.setUsername(UKDataContext.GUEST_USER+"_"+UKTools.genIDByKey(aiUser.getId()));
|
||||
aiUser.setChannel(UKDataContext.ChannelTypeEnum.WEBIM.toString());
|
||||
|
||||
AgentService agentService = ServiceQuene.processAiService(aiUser, orgi) ;
|
||||
aiUser.setAgentserviceid(agentService.getId());
|
||||
|
||||
CacheHelper.getOnlineUserCacheBean().put(user, aiUser, UKDataContext.SYSTEM_ORGI);
|
||||
|
||||
}
|
||||
} catch (Exception e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//添加@OnDisconnect事件,客户端断开连接时调用,刷新客户端信息
|
||||
@OnDisconnect
|
||||
public void onDisconnect(SocketIOClient client) throws Exception
|
||||
{
|
||||
String user = client.getHandshakeData().getSingleUrlParam("userid") ;
|
||||
String orgi = client.getHandshakeData().getSingleUrlParam("orgi") ;
|
||||
if(!StringUtils.isBlank(user)){
|
||||
NettyClients.getInstance().removeIMEventClient(user , UKTools.getContextID(client.getSessionId().toString()));
|
||||
AiUser aiUser = (AiUser) CacheHelper.getOnlineUserCacheBean().getCacheObject(user, orgi) ;
|
||||
if(aiUser!=null) {
|
||||
ServiceQuene.processAiService(aiUser, orgi) ;
|
||||
CacheHelper.getOnlineUserCacheBean().delete(user,UKDataContext.SYSTEM_ORGI) ;
|
||||
}
|
||||
}
|
||||
client.disconnect();
|
||||
}
|
||||
|
||||
//消息接收入口,网站有新用户接入对话
|
||||
@OnEvent(value = "new")
|
||||
public void onEvent(SocketIOClient client, AckRequest request, NewRequestMessage data)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
//消息接收入口,坐席状态更新
|
||||
@OnEvent(value = "agentstatus")
|
||||
public void onEvent(SocketIOClient client, AckRequest request, AgentStatusMessage data)
|
||||
{
|
||||
System.out.println(data.getMessage());
|
||||
}
|
||||
|
||||
//消息接收入口,收发消息,用户向坐席发送消息和 坐席向用户发送消息
|
||||
@OnEvent(value = "message")
|
||||
public void onEvent(SocketIOClient client, AckRequest request, ChatMessage data)
|
||||
{
|
||||
String orgi = client.getHandshakeData().getSingleUrlParam("orgi") ;
|
||||
String aiid = client.getHandshakeData().getSingleUrlParam("aiid") ;
|
||||
String user = client.getHandshakeData().getSingleUrlParam("userid") ;
|
||||
if(data.getType() == null){
|
||||
data.setType("message");
|
||||
}
|
||||
/**
|
||||
* 以下代码主要用于检查 访客端的字数限制
|
||||
*/
|
||||
CousultInvite invite = OnlineUserUtils.cousult(data.getAppid(),data.getOrgi(), UKDataContext.getContext().getBean(ConsultInviteRepository.class));
|
||||
if(invite!=null && invite.getMaxwordsnum() > 0) {
|
||||
if(!StringUtils.isBlank(data.getMessage()) && data.getMessage().length() > invite.getMaxwordsnum()){
|
||||
data.setMessage(data.getMessage().substring(0 , invite.getMaxwordsnum()));
|
||||
}
|
||||
}else if(!StringUtils.isBlank(data.getMessage()) && data.getMessage().length() > 300){
|
||||
data.setMessage(data.getMessage().substring(0 , 300));
|
||||
}
|
||||
data.setSessionid(UKTools.getContextID(client.getSessionId().toString()));
|
||||
/**
|
||||
* 处理表情
|
||||
*/
|
||||
data.setMessage(UKTools.processEmoti(data.getMessage()));
|
||||
data.setTousername(UKDataContext.ChannelTypeEnum.AI.toString());
|
||||
|
||||
data.setAiid(aiid);
|
||||
|
||||
Object cacheData = (AiUser) CacheHelper.getOnlineUserCacheBean().getCacheObject(user,orgi) ;
|
||||
if(cacheData!=null && cacheData instanceof AiUser){
|
||||
AiUser aiUser = (AiUser)cacheData ;
|
||||
data.setAgentserviceid(aiUser.getAgentserviceid());
|
||||
data.setChannel(aiUser.getChannel());
|
||||
/**
|
||||
* 一定要设置 ContextID
|
||||
*/
|
||||
data.setContextid(aiUser.getAgentserviceid());
|
||||
}
|
||||
MessageOutContent outMessage = MessageUtils.createAiMessage(data , data.getAppid() , data.getChannel() , UKDataContext.CallTypeEnum.IN.toString() , UKDataContext.AiItemType.USERINPUT.toString() , UKDataContext.MediaTypeEnum.TEXT.toString(), data.getUserid()) ;
|
||||
if(!StringUtils.isBlank(data.getUserid()) && UKDataContext.MessageTypeEnum.MESSAGE.toString().equals(data.getType())){
|
||||
if(!StringUtils.isBlank(data.getTouser())){
|
||||
OutMessageRouter router = null ;
|
||||
router = (OutMessageRouter) UKDataContext.getContext().getBean(data.getChannel()) ;
|
||||
if(router!=null){
|
||||
router.handler(data.getTouser(), UKDataContext.MessageTypeEnum.MESSAGE.toString(), data.getAppid(), outMessage);
|
||||
}
|
||||
}
|
||||
if(cacheData!=null && cacheData instanceof AiUser){
|
||||
AiUser aiUser = (AiUser)cacheData ;
|
||||
aiUser.setTime(System.currentTimeMillis());
|
||||
CacheHelper.getOnlineUserCacheBean().put(user, aiUser, UKDataContext.SYSTEM_ORGI);
|
||||
}
|
||||
}
|
||||
UKTools.ai(data);
|
||||
}
|
||||
}
|
@ -154,6 +154,7 @@ public class ApiChatbotController extends Handler {
|
||||
CousultInvite invite = OnlineUserUtils.cousult(c.getSnsAccountIdentifier(), c.getOrgi(), consultInviteRes);
|
||||
invite.setAi(isEnabled);
|
||||
consultInviteRes.save(invite);
|
||||
OnlineUserUtils.cacheCousult(invite);
|
||||
|
||||
resp.addProperty(RestUtils.RESP_KEY_RC, RestUtils.RESP_RC_SUCC);
|
||||
resp.addProperty(RestUtils.RESP_KEY_DATA, "完成。");
|
||||
@ -256,6 +257,7 @@ public class ApiChatbotController extends Handler {
|
||||
c.setUpdatetime(new Date());
|
||||
chatbotRes.save(c);
|
||||
consultInviteRes.save(invite);
|
||||
OnlineUserUtils.cacheCousult(invite);
|
||||
|
||||
return resp;
|
||||
}
|
||||
@ -321,7 +323,6 @@ public class ApiChatbotController extends Handler {
|
||||
resp.addProperty("totalElements", records.getTotalElements()); // 所有检索结果数量
|
||||
|
||||
return resp;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -360,6 +361,7 @@ public class ApiChatbotController extends Handler {
|
||||
invite.setAifirst(false);
|
||||
invite.setAiid(null);
|
||||
consultInviteRes.save(invite);
|
||||
OnlineUserUtils.cacheCousult(invite);
|
||||
}
|
||||
chatbotRes.delete(c);
|
||||
resp.addProperty(RestUtils.RESP_KEY_RC, RestUtils.RESP_RC_SUCC);
|
||||
@ -519,6 +521,7 @@ public class ApiChatbotController extends Handler {
|
||||
invite.setAiname(c.getName());
|
||||
invite.setAimsg(c.getWelcome());
|
||||
consultInviteRes.save(invite);
|
||||
OnlineUserUtils.cacheCousult(invite);
|
||||
chatbotRes.save(c);
|
||||
|
||||
JsonObject data = new JsonObject();
|
||||
|
@ -19,7 +19,6 @@ package com.chatopera.cc.webim.web.handler.apps.internet;
|
||||
|
||||
import com.chatopera.cc.core.UKDataContext;
|
||||
import com.chatopera.cc.util.*;
|
||||
import com.chatopera.cc.util.extra.DataExchangeInterface;
|
||||
import com.chatopera.cc.util.webim.WebIMClient;
|
||||
import com.chatopera.cc.webim.service.acd.ServiceQuene;
|
||||
import com.chatopera.cc.webim.service.cache.CacheHelper;
|
||||
@ -31,6 +30,8 @@ import com.chatopera.cc.webim.web.handler.Handler;
|
||||
import com.chatopera.cc.webim.web.model.*;
|
||||
import org.apache.commons.io.FileUtils;
|
||||
import org.apache.commons.lang.StringUtils;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.data.domain.Page;
|
||||
@ -57,13 +58,14 @@ import java.net.URLDecoder;
|
||||
import java.net.URLEncoder;
|
||||
import java.util.Date;
|
||||
import java.util.HashMap;
|
||||
import java.util.HashSet;
|
||||
import java.util.List;
|
||||
|
||||
@Controller
|
||||
@RequestMapping("/im")
|
||||
@EnableAsync
|
||||
public class IMController extends Handler {
|
||||
private final static Logger logger = LoggerFactory.getLogger(IMController.class);
|
||||
|
||||
|
||||
@Value("${uk.im.server.host}")
|
||||
private String host;
|
||||
@ -115,7 +117,7 @@ public class IMController extends Handler {
|
||||
@Valid String aiid) {
|
||||
ModelAndView view = request(super.createRequestPageTempletResponse("/apps/im/point"));
|
||||
String sessionid = request.getSession().getId();
|
||||
if (!StringUtils.isBlank(id)) {
|
||||
if (StringUtils.isNotBlank(id)) {
|
||||
view.addObject("hostname", request.getServerName());
|
||||
|
||||
SystemConfig systemConfig = UKTools.getSystemConfig();
|
||||
@ -147,15 +149,15 @@ public class IMController extends Handler {
|
||||
view.addObject("orgi", invite.getOrgi());
|
||||
view.addObject("appid", id);
|
||||
|
||||
if (!StringUtils.isBlank(aiid)) {
|
||||
if (StringUtils.isNotBlank(aiid)) {
|
||||
view.addObject("aiid", aiid);
|
||||
} else if (!StringUtils.isBlank(invite.getAiid())) {
|
||||
} else if (StringUtils.isNotBlank(invite.getAiid())) {
|
||||
view.addObject("aiid", invite.getAiid());
|
||||
}
|
||||
//记录用户行为日志
|
||||
UserHistory userHistory = new UserHistory();
|
||||
String url = request.getHeader("referer");
|
||||
if (!StringUtils.isBlank(url)) {
|
||||
if (StringUtils.isNotBlank(url)) {
|
||||
if (url.length() > 255) {
|
||||
userHistory.setUrl(url.substring(0, 255));
|
||||
} else {
|
||||
@ -177,7 +179,7 @@ public class IMController extends Handler {
|
||||
userHistory.setUsername(imUser.getUsername());
|
||||
userHistory.setOrgi(orgi);
|
||||
}
|
||||
if (!StringUtils.isBlank(title)) {
|
||||
if (StringUtils.isNotBlank(title)) {
|
||||
if (title.length() > 255) {
|
||||
userHistory.setTitle(title.substring(0, 255));
|
||||
} else {
|
||||
@ -229,7 +231,7 @@ public class IMController extends Handler {
|
||||
@Menu(type = "im", subtype = "inlist", access = true)
|
||||
public void inlist(HttpServletRequest request, HttpServletResponse response, @PathVariable String id, @Valid String userid) throws IOException {
|
||||
response.setHeader("Content-Type", "text/html;charset=utf-8");
|
||||
if (!StringUtils.isBlank(userid)) {
|
||||
if (StringUtils.isNotBlank(userid)) {
|
||||
BlackEntity black = (BlackEntity) CacheHelper.getSystemCacheBean().getCacheObject(userid, UKDataContext.SYSTEM_ORGI);
|
||||
if ((black != null && (black.getEndtime() == null || black.getEndtime().after(new Date())))) {
|
||||
response.getWriter().write("in");
|
||||
@ -257,7 +259,7 @@ public class IMController extends Handler {
|
||||
if ((black == null || (black.getEndtime() != null && black.getEndtime().before(new Date())))) {
|
||||
final SseEmitter emitter = new SseEmitter(30000L);
|
||||
if (CacheHelper.getSystemCacheBean().getCacheObject(userid, orgi) == null) {
|
||||
if (!StringUtils.isBlank(userid)) {
|
||||
if (StringUtils.isNotBlank(userid)) {
|
||||
emitter.onCompletion(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
@ -285,7 +287,7 @@ public class IMController extends Handler {
|
||||
if (invite != null && invite.isTraceuser()) {
|
||||
contacts = processContacts(orgi, contacts, appid, userid);
|
||||
}
|
||||
if (!StringUtils.isBlank(sign)) {
|
||||
if (StringUtils.isNotBlank(sign)) {
|
||||
OnlineUserUtils.online(super.getIMUser(request, sign, contacts != null ? contacts.getName() : null), orgi, sessionid, UKDataContext.OnlineUserTypeStatus.WEBIM.toString(), request, UKDataContext.ChannelTypeEnum.WEBIM.toString(), appid, contacts, invite);
|
||||
}
|
||||
|
||||
@ -325,10 +327,10 @@ public class IMController extends Handler {
|
||||
@Valid String purl) throws Exception {
|
||||
ModelAndView view = request(super.createRequestPageTempletResponse("/apps/im/index"));
|
||||
BlackEntity black = (BlackEntity) CacheHelper.getSystemCacheBean().getCacheObject(userid, UKDataContext.SYSTEM_ORGI);
|
||||
if (!StringUtils.isBlank(appid) && (black == null || (black.getEndtime() != null && black.getEndtime().before(new Date())))) {
|
||||
if (StringUtils.isNotBlank(appid) && (black == null || (black.getEndtime() != null && black.getEndtime().before(new Date())))) {
|
||||
CousultInvite invite = OnlineUserUtils.cousult(appid, orgi, inviteRepository);
|
||||
String userID = null;
|
||||
if (!StringUtils.isBlank(userid)) {
|
||||
if (StringUtils.isNotBlank(userid)) {
|
||||
userID = UKTools.genIDByKey(userid);
|
||||
} else {
|
||||
userID = UKTools.genIDByKey(sessionid);
|
||||
@ -338,8 +340,6 @@ public class IMController extends Handler {
|
||||
SessionConfig sessionConfig = ServiceQuene.initSessionConfig(orgi);
|
||||
|
||||
map.addAttribute("sessionConfig", sessionConfig);
|
||||
|
||||
|
||||
map.addAttribute("hostname", request.getServerName());
|
||||
|
||||
if (sslPort != null) {
|
||||
@ -361,16 +361,16 @@ public class IMController extends Handler {
|
||||
|
||||
map.addAttribute("ip", UKTools.md5(request.getRemoteAddr()));
|
||||
|
||||
if (!StringUtils.isBlank(traceid)) {
|
||||
if (StringUtils.isNotBlank(traceid)) {
|
||||
map.addAttribute("traceid", traceid);
|
||||
}
|
||||
if (!StringUtils.isBlank(exchange)) {
|
||||
if (StringUtils.isNotBlank(exchange)) {
|
||||
map.addAttribute("exchange", exchange);
|
||||
}
|
||||
if (!StringUtils.isBlank(title)) {
|
||||
if (StringUtils.isNotBlank(title)) {
|
||||
map.addAttribute("title", title);
|
||||
}
|
||||
if (!StringUtils.isBlank(traceid)) {
|
||||
if (StringUtils.isNotBlank(traceid)) {
|
||||
map.addAttribute("url", url);
|
||||
}
|
||||
|
||||
@ -382,9 +382,9 @@ public class IMController extends Handler {
|
||||
map.addAttribute("orgi", invite.getOrgi());
|
||||
map.addAttribute("inviteData", invite);
|
||||
|
||||
if (!StringUtils.isBlank(aiid)) {
|
||||
if (StringUtils.isNotBlank(aiid)) {
|
||||
map.addAttribute("aiid", aiid);
|
||||
} else if (!StringUtils.isBlank(invite.getAiid())) {
|
||||
} else if (StringUtils.isNotBlank(invite.getAiid())) {
|
||||
map.addAttribute("aiid", invite.getAiid());
|
||||
}
|
||||
|
||||
@ -394,24 +394,24 @@ public class IMController extends Handler {
|
||||
view = request(super.createRequestPageTempletResponse("/apps/im/leavemsg"));
|
||||
} else if (invite.isConsult_info()) { //启用了信息收集 , 从Request获取 , 或从 Cookies 里去
|
||||
//验证 OnlineUser 信息
|
||||
if (contacts != null && !StringUtils.isBlank(contacts.getName())) { //contacts用于传递信息,并不和 联系人表发生 关联,contacts信息传递给 Socket.IO,然后赋值给 AgentUser,最终赋值给 AgentService永久存储
|
||||
if (contacts != null && StringUtils.isNotBlank(contacts.getName())) { //contacts用于传递信息,并不和 联系人表发生 关联,contacts信息传递给 Socket.IO,然后赋值给 AgentUser,最终赋值给 AgentService永久存储
|
||||
consult = true;
|
||||
//存入 Cookies
|
||||
if (invite.isConsult_info_cookies()) {
|
||||
Cookie name = new Cookie("name", UKTools.encryption(URLEncoder.encode(contacts.getName(), "UTF-8")));
|
||||
response.addCookie(name);
|
||||
name.setMaxAge(3600);
|
||||
if (!StringUtils.isBlank(contacts.getPhone())) {
|
||||
if (StringUtils.isNotBlank(contacts.getPhone())) {
|
||||
Cookie phonecookie = new Cookie("phone", UKTools.encryption(URLEncoder.encode(contacts.getPhone(), "UTF-8")));
|
||||
phonecookie.setMaxAge(3600);
|
||||
response.addCookie(phonecookie);
|
||||
}
|
||||
if (!StringUtils.isBlank(contacts.getEmail())) {
|
||||
if (StringUtils.isNotBlank(contacts.getEmail())) {
|
||||
Cookie email = new Cookie("email", UKTools.encryption(URLEncoder.encode(contacts.getEmail(), "UTF-8")));
|
||||
email.setMaxAge(3600);
|
||||
response.addCookie(email);
|
||||
}
|
||||
if (!StringUtils.isBlank(contacts.getMemo())) {
|
||||
if (StringUtils.isNotBlank(contacts.getMemo())) {
|
||||
Cookie memo = new Cookie("memo", UKTools.encryption(URLEncoder.encode(contacts.getName(), "UTF-8")));
|
||||
memo.setMaxAge(3600);
|
||||
response.addCookie(memo);
|
||||
@ -424,7 +424,7 @@ public class IMController extends Handler {
|
||||
contacts = new Contacts();
|
||||
if (cookies != null) {
|
||||
for (Cookie cookie : cookies) {
|
||||
if (cookie != null && !StringUtils.isBlank(cookie.getName()) && !StringUtils.isBlank(cookie.getValue())) {
|
||||
if (cookie != null && StringUtils.isNotBlank(cookie.getName()) && StringUtils.isNotBlank(cookie.getValue())) {
|
||||
if (cookie.getName().equals("name")) {
|
||||
contacts.setName(URLDecoder.decode(UKTools.decryption(cookie.getValue()), "UTF-8"));
|
||||
}
|
||||
@ -450,33 +450,33 @@ public class IMController extends Handler {
|
||||
contacts = processContacts(invite.getOrgi(), contacts, appid, userid);
|
||||
}
|
||||
|
||||
if (!StringUtils.isBlank(client)) {
|
||||
if (StringUtils.isNotBlank(client)) {
|
||||
map.addAttribute("client", client);
|
||||
}
|
||||
if (!StringUtils.isBlank(skill)) {
|
||||
if (StringUtils.isNotBlank(skill)) {
|
||||
map.addAttribute("skill", skill);
|
||||
}
|
||||
if (!StringUtils.isBlank(agent)) {
|
||||
if (StringUtils.isNotBlank(agent)) {
|
||||
map.addAttribute("agent", agent);
|
||||
}
|
||||
|
||||
map.addAttribute("contacts", contacts);
|
||||
|
||||
if (!StringUtils.isBlank(type)) {
|
||||
if (StringUtils.isNotBlank(type)) {
|
||||
map.addAttribute("type", type);
|
||||
}
|
||||
IP ipdata = IPTools.getInstance().findGeography(UKTools.getIpAddr(request));
|
||||
map.addAttribute("skillList", OnlineUserUtils.organ(invite.getOrgi(), ipdata, invite, true));
|
||||
|
||||
if (invite != null && consult) {
|
||||
if (contacts != null && !StringUtils.isBlank(contacts.getName())) {
|
||||
if (contacts != null && StringUtils.isNotBlank(contacts.getName())) {
|
||||
nickname = contacts.getName();
|
||||
}
|
||||
map.addAttribute("username", nickname);
|
||||
if (UKDataContext.model.get("chatbot") != null &&
|
||||
StringUtils.isNotBlank(invite.getAiid()) &&
|
||||
invite.isAi() &&
|
||||
invite.isAifirst()) { //启用 AI , 并且 AI优先 接待
|
||||
((StringUtils.equals(ai, "true")) || (invite.isAifirst() && ai == null))) { //启用 AI , 并且 AI优先 接待
|
||||
HashMap<String, String> chatbotConfig = new HashMap<String, String>();
|
||||
chatbotConfig.put("botname", invite.getAiname());
|
||||
chatbotConfig.put("botid", invite.getAiid());
|
||||
@ -487,11 +487,11 @@ public class IMController extends Handler {
|
||||
map.addAttribute("chatbotConfig", chatbotConfig);
|
||||
}
|
||||
view = request(super.createRequestPageTempletResponse("/apps/im/chatbot/index"));
|
||||
if (CheckMobile.check(request.getHeader("User-Agent")) || !StringUtils.isBlank(mobile)) {
|
||||
if (CheckMobile.check(request.getHeader("User-Agent")) || StringUtils.isNotBlank(mobile)) {
|
||||
view = request(super.createRequestPageTempletResponse("/apps/im/chatbot/mobile")); //智能机器人 移动端
|
||||
}
|
||||
} else {
|
||||
if (CheckMobile.check(request.getHeader("User-Agent")) || !StringUtils.isBlank(mobile)) {
|
||||
if (CheckMobile.check(request.getHeader("User-Agent")) || StringUtils.isNotBlank(mobile)) {
|
||||
view = request(super.createRequestPageTempletResponse("/apps/im/mobile")); //WebIM移动端。再次点选技能组?
|
||||
}
|
||||
}
|
||||
@ -523,13 +523,16 @@ public class IMController extends Handler {
|
||||
|
||||
private Contacts processContacts(String orgi, Contacts contacts, String appid, String userid) {
|
||||
if (contacts != null) {
|
||||
if (contacts != null && (!StringUtils.isBlank(contacts.getName()) || !StringUtils.isBlank(contacts.getPhone()) || !StringUtils.isBlank(contacts.getEmail()))) {
|
||||
if (contacts != null &&
|
||||
(StringUtils.isNotBlank(contacts.getName()) ||
|
||||
StringUtils.isNotBlank(contacts.getPhone()) ||
|
||||
StringUtils.isNotBlank(contacts.getEmail()))) {
|
||||
StringBuffer query = new StringBuffer();
|
||||
query.append(contacts.getName());
|
||||
if (!StringUtils.isBlank(contacts.getPhone())) {
|
||||
if (StringUtils.isNotBlank(contacts.getPhone())) {
|
||||
query.append(" OR ").append(contacts.getPhone());
|
||||
}
|
||||
if (!StringUtils.isBlank(contacts.getEmail())) {
|
||||
if (StringUtils.isNotBlank(contacts.getEmail())) {
|
||||
query.append(" OR ").append(contacts.getEmail());
|
||||
}
|
||||
Page<Contacts> contactsList = contactsRes.findByOrgi(orgi, false, query.toString(), new PageRequest(0, 1));
|
||||
@ -542,7 +545,7 @@ public class IMController extends Handler {
|
||||
} else {
|
||||
contacts.setId(null);
|
||||
}
|
||||
if (contacts != null && !StringUtils.isBlank(contacts.getId())) {
|
||||
if (contacts != null && StringUtils.isNotBlank(contacts.getId())) {
|
||||
List<AgentUserContacts> agentUserContactsList = agentUserContactsRes.findByUseridAndOrgi(userid, orgi);
|
||||
if (agentUserContactsList.size() == 0) {
|
||||
AgentUserContacts agentUserContacts = new AgentUserContacts();
|
||||
@ -554,7 +557,7 @@ public class IMController extends Handler {
|
||||
agentUserContacts.setCreatetime(new Date());
|
||||
agentUserContactsRes.save(agentUserContacts);
|
||||
}
|
||||
} else if (!StringUtils.isBlank(userid)) {
|
||||
} else if (StringUtils.isNotBlank(userid)) {
|
||||
List<AgentUserContacts> agentUserContactsList = agentUserContactsRes.findByUseridAndOrgi(userid, orgi);
|
||||
if (agentUserContactsList.size() > 0) {
|
||||
AgentUserContacts agentUserContacts = agentUserContactsList.get(0);
|
||||
@ -578,10 +581,10 @@ public class IMController extends Handler {
|
||||
|
||||
view.addObject("ip", UKTools.md5(request.getRemoteAddr()));
|
||||
|
||||
if (!StringUtils.isBlank(skill)) {
|
||||
if (StringUtils.isNotBlank(skill)) {
|
||||
view.addObject("skill", skill);
|
||||
}
|
||||
if (!StringUtils.isBlank(agent)) {
|
||||
if (StringUtils.isNotBlank(agent)) {
|
||||
view.addObject("agent", agent);
|
||||
}
|
||||
|
||||
@ -589,10 +592,10 @@ public class IMController extends Handler {
|
||||
view.addObject("sessionid", request.getSession().getId());
|
||||
|
||||
view.addObject("id", id);
|
||||
if (!StringUtils.isBlank(ai)) {
|
||||
if (StringUtils.isNotBlank(ai)) {
|
||||
view.addObject("ai", ai);
|
||||
}
|
||||
if (!StringUtils.isBlank(exchange)) {
|
||||
if (StringUtils.isNotBlank(exchange)) {
|
||||
view.addObject("exchange", exchange);
|
||||
}
|
||||
|
||||
@ -608,13 +611,13 @@ public class IMController extends Handler {
|
||||
view.addObject("purl", purl);
|
||||
|
||||
|
||||
if (!StringUtils.isBlank(traceid)) {
|
||||
if (StringUtils.isNotBlank(traceid)) {
|
||||
view.addObject("traceid", traceid);
|
||||
}
|
||||
if (!StringUtils.isBlank(title)) {
|
||||
if (StringUtils.isNotBlank(title)) {
|
||||
view.addObject("title", title);
|
||||
}
|
||||
if (!StringUtils.isBlank(traceid)) {
|
||||
if (StringUtils.isNotBlank(traceid)) {
|
||||
view.addObject("url", url);
|
||||
}
|
||||
CousultInvite invite = OnlineUserUtils.cousult(appid, orgi, inviteRepository);
|
||||
@ -623,9 +626,9 @@ public class IMController extends Handler {
|
||||
view.addObject("orgi", invite.getOrgi());
|
||||
view.addObject("appid", appid);
|
||||
|
||||
if (!StringUtils.isBlank(aiid)) {
|
||||
if (StringUtils.isNotBlank(aiid)) {
|
||||
view.addObject("aiid", aiid);
|
||||
} else if (!StringUtils.isBlank(invite.getAiid())) {
|
||||
} else if (StringUtils.isNotBlank(invite.getAiid())) {
|
||||
view.addObject("aiid", invite.getAiid());
|
||||
}
|
||||
}
|
||||
@ -637,7 +640,7 @@ public class IMController extends Handler {
|
||||
@RequestMapping("/leavemsg/save")
|
||||
@Menu(type = "admin", subtype = "user")
|
||||
public ModelAndView leavemsgsave(HttpServletRequest request, @Valid String appid, @Valid LeaveMsg msg) {
|
||||
if (!StringUtils.isBlank(appid)) {
|
||||
if (StringUtils.isNotBlank(appid)) {
|
||||
SNSAccount snsAccount = snsAccountRepository.findBySnsid(appid);
|
||||
String orgi = snsAccount.getOrgi();
|
||||
CousultInvite invite = inviteRepository.findBySnsaccountidAndOrgi(appid, orgi);
|
||||
@ -671,10 +674,10 @@ public class IMController extends Handler {
|
||||
@RequestMapping("/satis")
|
||||
@Menu(type = "im", subtype = "satis", access = true)
|
||||
public void satis(HttpServletRequest request, HttpServletResponse response, @Valid AgentServiceSatis satis) throws Exception {
|
||||
if (satis != null && !StringUtils.isBlank(satis.getId())) {
|
||||
if (satis != null && StringUtils.isNotBlank(satis.getId())) {
|
||||
int count = agentServiceSatisRes.countById(satis.getId());
|
||||
if (count == 1) {
|
||||
if (!StringUtils.isBlank(satis.getSatiscomment()) && satis.getSatiscomment().length() > 255) {
|
||||
if (StringUtils.isNotBlank(satis.getSatiscomment()) && satis.getSatiscomment().length() > 255) {
|
||||
satis.setSatiscomment(satis.getSatiscomment().substring(0, 255));
|
||||
}
|
||||
satis.setSatisfaction(true);
|
||||
@ -691,7 +694,7 @@ public class IMController extends Handler {
|
||||
ModelAndView view = request(super.createRequestPageTempletResponse("/apps/im/upload"));
|
||||
UploadStatus upload = null;
|
||||
String fileName = null;
|
||||
if (imgFile != null && imgFile.getOriginalFilename().lastIndexOf(".") > 0 && !StringUtils.isBlank(userid)) {
|
||||
if (imgFile != null && imgFile.getOriginalFilename().lastIndexOf(".") > 0 && StringUtils.isNotBlank(userid)) {
|
||||
File uploadDir = new File(path, "upload");
|
||||
if (!uploadDir.exists()) {
|
||||
uploadDir.mkdirs();
|
||||
@ -714,7 +717,7 @@ public class IMController extends Handler {
|
||||
image = "/res/image.html?id=" + thumbnailsFileName;
|
||||
}
|
||||
if (paste == null) {
|
||||
if (!StringUtils.isBlank(channel)) {
|
||||
if (StringUtils.isNotBlank(channel)) {
|
||||
MessageUtils.uploadImage(image, fileid, (int) imgFile.getSize(), imgFile.getName(), channel, userid, username, appid, orgi);
|
||||
} else {
|
||||
MessageUtils.uploadImage(image, fileid, (int) imgFile.getSize(), imgFile.getName(), userid);
|
||||
@ -732,7 +735,7 @@ public class IMController extends Handler {
|
||||
file = "/res/file.html?id=" + id;
|
||||
}
|
||||
File tempFile = new File(imgFile.getOriginalFilename());
|
||||
if (!StringUtils.isBlank(channel)) {
|
||||
if (StringUtils.isNotBlank(channel)) {
|
||||
MessageUtils.uploadFile(file, (int) imgFile.getSize(), tempFile.getName(), channel, userid, username, appid, orgi, id);
|
||||
} else {
|
||||
MessageUtils.uploadFile(file, (int) imgFile.getSize(), tempFile.getName(), userid, id);
|
||||
@ -749,7 +752,7 @@ public class IMController extends Handler {
|
||||
String id = null;
|
||||
if (file.getSize() > 0) { //文件尺寸 限制 ?在 启动 配置中 设置 的最大值,其他地方不做限制
|
||||
String fileid = UKTools.md5(file.getBytes()); //使用 文件的 MD5作为 ID,避免重复上传大文件
|
||||
if (!StringUtils.isBlank(fileid)) {
|
||||
if (StringUtils.isNotBlank(fileid)) {
|
||||
AttachmentFile attachmentFile = new AttachmentFile();
|
||||
attachmentFile.setCreater(super.getUser(request).getId());
|
||||
attachmentFile.setOrgi(super.getOrgi(request));
|
||||
@ -767,7 +770,7 @@ public class IMController extends Handler {
|
||||
} else {
|
||||
attachmentFile.setTitle(uploadFile.getName());
|
||||
}
|
||||
if (!StringUtils.isBlank(attachmentFile.getFiletype()) && attachmentFile.getFiletype().indexOf("image") >= 0) {
|
||||
if (StringUtils.isNotBlank(attachmentFile.getFiletype()) && attachmentFile.getFiletype().indexOf("image") >= 0) {
|
||||
attachmentFile.setImage(true);
|
||||
}
|
||||
attachmentFile.setFileid(fileid);
|
||||
|
@ -264,14 +264,14 @@
|
||||
<img src="<#if inviteData?? && inviteData.consult_dialog_logo??>/res/image.html?id=${inviteData.consult_dialog_logo?url}<#else>/images/logo.png</#if>" style="height:30px;padding:10px;">
|
||||
<div class="ukefu-func-tab">
|
||||
<ul>
|
||||
<#if models?? && models["xiaoe"]?? && models["xiaoe"] == true && inviteData.ai && aiid??>
|
||||
<#if models?? && models["chatbot"]?? && models["chatbot"] == true && inviteData.ai && aiid??>
|
||||
<#if !exchange?? || exchange == "true">
|
||||
<li><a href="/im/index.html?appid=${appid!''}&orgi=${orgi!''}<#if aiid??>&aiid=${aiid}</#if>&ai=true<#if client??>&client=${client!''}</#if><#if type??>&type=text</#if><#if skill??>&skill=${skill!''}</#if><#if agent??>&agent=${agent!''}</#if><#if title??>&title=${title?url}</#if><#if url??>&url=${url?url}</#if><#if traceid??>&traceid=${traceid}</#if>&userid=${userid!''}&sessionid=${sessionid!''}&t=${.now?long}">智能客服</a></li>
|
||||
</#if>
|
||||
<li class="cur"><a href="javascript:void(0)">人工坐席</a></li>
|
||||
<li><a href="/im/index.html?appid=${appid!''}&orgi=${orgi!''}&ai=false<#if client??>&client=${client!''}</#if><#if type??>&type=text</#if><#if skill??>&skill=${skill!''}</#if><#if agent??>&agent=${agent!''}</#if><#if title??>&title=${title?url}</#if><#if url??>&url=${url?url}</#if><#if traceid??>&traceid=${traceid}</#if>&userid=${userid!''}&sessionid=${sessionid!''}&t=${.now?long}">人工坐席</a></li>
|
||||
</#if>
|
||||
<li class="cur"><a href="javascript:void(0)">智能坐席</a></li>
|
||||
<#else>
|
||||
<li class="cur"><a href="javascript:void(0)">人工坐席</a></li>
|
||||
</#if>
|
||||
<li class="cur"><a href="javascript:void(0)">智能坐席</a></li>
|
||||
</#if>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
|
@ -264,7 +264,7 @@
|
||||
<img src="<#if inviteData?? && inviteData.consult_dialog_logo??>/res/image.html?id=${inviteData.consult_dialog_logo?url}<#else>/images/logo.png</#if>" style="height:30px;padding:10px;">
|
||||
<div class="ukefu-func-tab">
|
||||
<ul>
|
||||
<#if models?? && models["xiaoe"]?? && models["xiaoe"] == true && inviteData.ai && aiid??>
|
||||
<#if models?? && models["chatbot"]?? && models["chatbot"] == true && inviteData.ai && aiid??>
|
||||
<#if !exchange?? || exchange == "true">
|
||||
<li><a href="/im/index.html?appid=${appid!''}&orgi=${orgi!''}<#if aiid??>&aiid=${aiid}</#if>&ai=true<#if client??>&client=${client!''}</#if><#if type??>&type=text</#if><#if skill??>&skill=${skill!''}</#if><#if agent??>&agent=${agent!''}</#if><#if title??>&title=${title?url}</#if><#if url??>&url=${url?url}</#if><#if traceid??>&traceid=${traceid}</#if>&userid=${userid!''}&sessionid=${sessionid!''}&t=${.now?long}">智能客服</a></li>
|
||||
</#if>
|
||||
|
@ -1,6 +1,6 @@
|
||||
{
|
||||
"info": {
|
||||
"_postman_id": "845f31e9-eedd-4168-b2d7-f56e7ff40f58",
|
||||
"_postman_id": "fa86aeb9-fcf2-4843-ab4c-c97132a46f8f",
|
||||
"name": "Chatopera_cc_v1",
|
||||
"description": "Chatopera Contact Center API",
|
||||
"schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json"
|
||||
@ -58,7 +58,10 @@
|
||||
"value": "{{AUTH}}"
|
||||
}
|
||||
],
|
||||
"body": {},
|
||||
"body": {
|
||||
"mode": "raw",
|
||||
"raw": ""
|
||||
},
|
||||
"url": {
|
||||
"raw": "http://{{IP}}:{{PORT}}/api/user",
|
||||
"protocol": "http",
|
||||
@ -533,7 +536,7 @@
|
||||
"header": [
|
||||
{
|
||||
"key": "authorization",
|
||||
"value": "b641622ea4c54f1e9e45520e7fed266b"
|
||||
"value": "{{AUTH}}"
|
||||
},
|
||||
{
|
||||
"key": "Content-Type",
|
||||
@ -542,7 +545,7 @@
|
||||
],
|
||||
"body": {
|
||||
"mode": "raw",
|
||||
"raw": "{\n \"ops\": \"create\",\n \"primaryLanguage\": \"zh_CN\",\n \"snsid\": \"104eac\",\n \"name\": \"小C\",\n \"baseUrl\": \"http://lhc-dev:8003\",\n \"description\": \"描述\",\n \"fallback\": \"我不理解。\",\n \"welcome\": \"你好\",\n \"workmode\": \"客服机器人优先\"\n}"
|
||||
"raw": "{\n \"ops\": \"create\",\n \"primaryLanguage\": \"zh_CN\",\n \"snsid\": \"104eac\",\n \"name\": \"小C\",\n \"baseUrl\": \"http://lhc-dev:8003\",\n \"description\": \"描述\",\n \"fallback\": \"我不理解。\",\n \"welcome\": \"你好\",\n \"workmode\": \"机器人客服优先\"\n}"
|
||||
},
|
||||
"url": {
|
||||
"raw": "http://{{IP}}:{{PORT}}/api/chatbot",
|
||||
@ -566,7 +569,7 @@
|
||||
"header": [
|
||||
{
|
||||
"key": "authorization",
|
||||
"value": "869c0e6dfd44421cabea7934d6fde218"
|
||||
"value": "{{AUTH}}"
|
||||
},
|
||||
{
|
||||
"key": "Content-Type",
|
||||
@ -624,6 +627,105 @@
|
||||
}
|
||||
},
|
||||
"response": []
|
||||
},
|
||||
{
|
||||
"name": "机器人客服:删除",
|
||||
"request": {
|
||||
"method": "POST",
|
||||
"header": [
|
||||
{
|
||||
"key": "authorization",
|
||||
"value": "{{AUTH}}"
|
||||
},
|
||||
{
|
||||
"key": "Content-Type",
|
||||
"value": "application/json"
|
||||
}
|
||||
],
|
||||
"body": {
|
||||
"mode": "raw",
|
||||
"raw": "{\n \"ops\": \"delete\",\n \"id\": \"fdf372d7ffb0456f8bd7fdfc1a054beb\"\n}"
|
||||
},
|
||||
"url": {
|
||||
"raw": "http://{{IP}}:{{PORT}}/api/chatbot",
|
||||
"protocol": "http",
|
||||
"host": [
|
||||
"{{IP}}"
|
||||
],
|
||||
"port": "{{PORT}}",
|
||||
"path": [
|
||||
"api",
|
||||
"chatbot"
|
||||
]
|
||||
}
|
||||
},
|
||||
"response": []
|
||||
},
|
||||
{
|
||||
"name": "机器人客服:启用",
|
||||
"request": {
|
||||
"method": "POST",
|
||||
"header": [
|
||||
{
|
||||
"key": "authorization",
|
||||
"value": "{{AUTH}}"
|
||||
},
|
||||
{
|
||||
"key": "Content-Type",
|
||||
"value": "application/json"
|
||||
}
|
||||
],
|
||||
"body": {
|
||||
"mode": "raw",
|
||||
"raw": "{\n \"ops\": \"enable\",\n \"id\": \"eb53580ddbe3473bb112ade4eeeb3b45\"\n}"
|
||||
},
|
||||
"url": {
|
||||
"raw": "http://{{IP}}:{{PORT}}/api/chatbot",
|
||||
"protocol": "http",
|
||||
"host": [
|
||||
"{{IP}}"
|
||||
],
|
||||
"port": "{{PORT}}",
|
||||
"path": [
|
||||
"api",
|
||||
"chatbot"
|
||||
]
|
||||
}
|
||||
},
|
||||
"response": []
|
||||
},
|
||||
{
|
||||
"name": "机器人客服:禁用",
|
||||
"request": {
|
||||
"method": "POST",
|
||||
"header": [
|
||||
{
|
||||
"key": "authorization",
|
||||
"value": "{{AUTH}}"
|
||||
},
|
||||
{
|
||||
"key": "Content-Type",
|
||||
"value": "application/json"
|
||||
}
|
||||
],
|
||||
"body": {
|
||||
"mode": "raw",
|
||||
"raw": "{\n \"ops\": \"disable\",\n \"id\": \"eb53580ddbe3473bb112ade4eeeb3b45\"\n}"
|
||||
},
|
||||
"url": {
|
||||
"raw": "http://{{IP}}:{{PORT}}/api/chatbot",
|
||||
"protocol": "http",
|
||||
"host": [
|
||||
"{{IP}}"
|
||||
],
|
||||
"port": "{{PORT}}",
|
||||
"path": [
|
||||
"api",
|
||||
"chatbot"
|
||||
]
|
||||
}
|
||||
},
|
||||
"response": []
|
||||
}
|
||||
],
|
||||
"event": [
|
||||
|
Loading…
x
Reference in New Issue
Block a user