1
0
mirror of https://github.com/chatopera/cosin.git synced 2025-08-01 16:38:02 +08:00

#75 处理AiUser

This commit is contained in:
Hai Liang Wang 2018-09-11 23:32:13 +08:00
parent 1891891e4a
commit 7bc572ae2e
4 changed files with 272 additions and 238 deletions

View File

@ -67,6 +67,7 @@ public class OnlineUserUtils {
/**
* 更新cache
*
* @param id
* @param cousultInvite
*/
@ -598,6 +599,7 @@ public class OnlineUserUtils {
*/
public static void offline(String user, String orgi) throws Exception {
if (UKDataContext.getContext() != null) {
try {
OnlineUser onlineUser = (OnlineUser) CacheHelper.getOnlineUserCacheBean().getCacheObject(user, orgi);
if (onlineUser != null) {
CousultInvite invite = OnlineUserUtils.cousult(onlineUser.getAppid(), onlineUser.getOrgi(), UKDataContext.getContext().getBean(ConsultInviteRepository.class));
@ -626,6 +628,11 @@ public class OnlineUserUtils {
}
}
}
} catch (ClassCastException e) {
// #TODO workaround for
// https://github.com/chatopera/cosin/issues/75
// AiUser is not saved, just remove from cache.
}
CacheHelper.getOnlineUserCacheBean().delete(user, orgi);
}
}

View File

@ -16,80 +16,93 @@
*/
package com.chatopera.cc.webim.util.server;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import com.chatopera.cc.webim.util.server.handler.ChatbotEventHandler;
import com.chatopera.cc.core.UKDataContext;
import com.chatopera.cc.webim.util.server.handler.AgentEventHandler;
import com.chatopera.cc.webim.util.server.handler.EntIMEventHandler;
import com.chatopera.cc.webim.util.server.handler.IMEventHandler;
import com.corundumstudio.socketio.SocketIONamespace;
import com.corundumstudio.socketio.SocketIOServer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Component;
import com.corundumstudio.socketio.SocketIONamespace;
import com.corundumstudio.socketio.SocketIOServer;
import com.chatopera.cc.core.UKDataContext;
import com.chatopera.cc.webim.util.server.handler.AgentEventHandler;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
@Component
public class ServerRunner implements CommandLineRunner {
private final SocketIOServer server;
private final SocketIONamespace imSocketNameSpace ;
private final SocketIONamespace agentSocketIONameSpace ;
private final SocketIONamespace entIMSocketIONameSpace ;
private final SocketIONamespace chatbotSocketIONameSpace ;
private final SocketIONamespace callCenterSocketIONameSpace ;
private final SocketIONamespace calloutSocketIONameSpace ;
private final SocketIONamespace imSocketNameSpace;
private final SocketIONamespace agentSocketIONameSpace;
private final SocketIONamespace entIMSocketIONameSpace;
private final SocketIONamespace chatbotSocketIONameSpace;
private final SocketIONamespace callCenterSocketIONameSpace;
private final SocketIONamespace calloutSocketIONameSpace;
@Autowired
public ServerRunner(SocketIOServer server) {
this.server = server;
imSocketNameSpace = server.addNamespace(UKDataContext.NameSpaceEnum.IM.getNamespace()) ;
agentSocketIONameSpace = server.addNamespace(UKDataContext.NameSpaceEnum.AGENT.getNamespace()) ;
entIMSocketIONameSpace = server.addNamespace(UKDataContext.NameSpaceEnum.ENTIM.getNamespace()) ;
chatbotSocketIONameSpace = server.addNamespace(UKDataContext.NameSpaceEnum.CHATBOT.getNamespace()) ;
imSocketNameSpace = server.addNamespace(UKDataContext.NameSpaceEnum.IM.getNamespace());
agentSocketIONameSpace = server.addNamespace(UKDataContext.NameSpaceEnum.AGENT.getNamespace());
entIMSocketIONameSpace = server.addNamespace(UKDataContext.NameSpaceEnum.ENTIM.getNamespace());
if(UKDataContext.model.get("sales") != null && UKDataContext.model.get("sales") == true){
if (UKDataContext.model.get("sales") != null && UKDataContext.model.get("sales") == true) {
calloutSocketIONameSpace = server.addNamespace(UKDataContext.NameSpaceEnum.CALLOUT.getNamespace());
} else {
calloutSocketIONameSpace = null;
}
if(UKDataContext.model.get("callcenter") !=null && UKDataContext.model.get("callcenter") == true){
callCenterSocketIONameSpace = server.addNamespace(UKDataContext.NameSpaceEnum.CALLCENTER.getNamespace()) ;
}else{
callCenterSocketIONameSpace = null ;
if (UKDataContext.model.get("callcenter") != null && UKDataContext.model.get("callcenter") == true) {
callCenterSocketIONameSpace = server.addNamespace(UKDataContext.NameSpaceEnum.CALLCENTER.getNamespace());
} else {
callCenterSocketIONameSpace = null;
}
if (UKDataContext.model.get("chatbot") != null && UKDataContext.model.get("chatbot") == true) {
chatbotSocketIONameSpace = server.addNamespace(UKDataContext.NameSpaceEnum.CHATBOT.getNamespace());
} else {
chatbotSocketIONameSpace = null;
}
}
@Bean(name="imNamespace")
public SocketIONamespace getIMSocketIONameSpace(SocketIOServer server ){
@Bean(name = "imNamespace")
public SocketIONamespace getIMSocketIONameSpace(SocketIOServer server) {
imSocketNameSpace.addListeners(new IMEventHandler(server));
return imSocketNameSpace ;
return imSocketNameSpace;
}
@Bean(name="agentNamespace")
public SocketIONamespace getAgentSocketIONameSpace(SocketIOServer server){
@Bean(name = "agentNamespace")
public SocketIONamespace getAgentSocketIONameSpace(SocketIOServer server) {
agentSocketIONameSpace.addListeners(new AgentEventHandler(server));
return agentSocketIONameSpace;
}
@Bean(name="entimNamespace")
public SocketIONamespace getEntIMSocketIONameSpace(SocketIOServer server){
@Bean(name = "entimNamespace")
public SocketIONamespace getEntIMSocketIONameSpace(SocketIOServer server) {
entIMSocketIONameSpace.addListeners(new EntIMEventHandler(server));
return entIMSocketIONameSpace;
}
@Bean(name="chatbotNamespace")
public SocketIONamespace getChatbotSocketIONameSpace(SocketIOServer server){
chatbotSocketIONameSpace.addListeners(new ChatbotEventHandler(server));
@Bean(name = "chatbotNamespace")
public SocketIONamespace getChatbotSocketIONameSpace(SocketIOServer server) {
if (UKDataContext.model.get("chatbot") != null && UKDataContext.model.get("chatbot") == true) {
Constructor<?> constructor;
try {
constructor = Class.forName("com.chatopera.cc.webim.util.server.handler.ChatbotEventHandler").getConstructor(new Class[]{SocketIOServer.class});
chatbotSocketIONameSpace.addListeners(constructor.newInstance(server));
} catch (NoSuchMethodException | SecurityException
| ClassNotFoundException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException e) {
e.printStackTrace();
}
}
return chatbotSocketIONameSpace;
}
@Bean(name="callCenterNamespace")
public SocketIONamespace getCallCenterIMSocketIONameSpace(SocketIOServer server){
if(UKDataContext.model.get("callcenter") !=null && UKDataContext.model.get("callcenter") == true){
@Bean(name = "callCenterNamespace")
public SocketIONamespace getCallCenterIMSocketIONameSpace(SocketIOServer server) {
if (UKDataContext.model.get("callcenter") != null && UKDataContext.model.get("callcenter") == true) {
Constructor<?> constructor;
try {
constructor = Class.forName("com.chatopera.cc.webim.util.server.handler.CallCenterEventHandler").getConstructor(new Class[]{SocketIOServer.class});
@ -102,9 +115,9 @@ public class ServerRunner implements CommandLineRunner {
return callCenterSocketIONameSpace;
}
@Bean(name="calloutNamespace")
public SocketIONamespace getCalloutIMSocketIONameSpace(SocketIOServer server){
if(UKDataContext.model.get("sales") !=null && UKDataContext.model.get("sales") == true){
@Bean(name = "calloutNamespace")
public SocketIONamespace getCalloutIMSocketIONameSpace(SocketIOServer server) {
if (UKDataContext.model.get("sales") != null && UKDataContext.model.get("sales") == true) {
Constructor<?> constructor;
try {
constructor = Class.forName("com.chatopera.cc.webim.util.server.handler.CalloutEventHandler").getConstructor(new Class[]{SocketIOServer.class});

View File

@ -44,39 +44,36 @@ import org.springframework.beans.factory.annotation.Autowired;
import java.net.InetSocketAddress;
import java.util.Date;
public class ChatbotEventHandler
{
public class ChatbotEventHandler {
protected SocketIOServer server;
@Autowired
public ChatbotEventHandler(SocketIOServer server)
{
this.server = server ;
public ChatbotEventHandler(SocketIOServer server) {
this.server = server;
}
@OnConnect
public void onConnect(SocketIOClient client)
{
public void onConnect(SocketIOClient client) {
try {
String user = client.getHandshakeData().getSingleUrlParam("userid") ;
String orgi = client.getHandshakeData().getSingleUrlParam("orgi") ;
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 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)){
if (StringUtils.isNotBlank(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())) {
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我来帮您解答问题");
} else {
outMessage.setMessage("欢迎使用华夏春松机器人客服!");
}
outMessage.setMessageType(UKDataContext.MessageTypeEnum.MESSAGE.toString());
@ -86,16 +83,16 @@ public class ChatbotEventHandler
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)) ;
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.setUsername(UKDataContext.GUEST_USER + "_" + UKTools.genIDByKey(aiUser.getId()));
aiUser.setChannel(UKDataContext.ChannelTypeEnum.WEBIM.toString());
AgentService agentService = ServiceQuene.processAiService(aiUser, orgi) ;
AgentService agentService = ServiceQuene.processAiService(aiUser, orgi);
aiUser.setAgentserviceid(agentService.getId());
CacheHelper.getOnlineUserCacheBean().put(user, aiUser, UKDataContext.SYSTEM_ORGI);
@ -109,16 +106,15 @@ public class ChatbotEventHandler
//添加@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) ;
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();
@ -126,38 +122,35 @@ public class ChatbotEventHandler
//消息接收入口网站有新用户接入对话
@OnEvent(value = "new")
public void onEvent(SocketIOClient client, AckRequest request, NewRequestMessage data)
{
public void onEvent(SocketIOClient client, AckRequest request, NewRequestMessage data) {
}
//消息接收入口坐席状态更新
@OnEvent(value = "agentstatus")
public void onEvent(SocketIOClient client, AckRequest request, AgentStatusMessage data)
{
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){
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()));
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));
} else if (!StringUtils.isBlank(data.getMessage()) && data.getMessage().length() > 300) {
data.setMessage(data.getMessage().substring(0, 300));
}
data.setSessionid(UKTools.getContextID(client.getSessionId().toString()));
/**
@ -168,9 +161,9 @@ public class ChatbotEventHandler
data.setAiid(aiid);
Object cacheData = (AiUser) CacheHelper.getOnlineUserCacheBean().getCacheObject(user,orgi) ;
if(cacheData!=null && cacheData instanceof AiUser){
AiUser aiUser = (AiUser)cacheData ;
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());
/**
@ -178,21 +171,20 @@ public class ChatbotEventHandler
*/
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){
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 ;
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);
}
}

View File

@ -253,7 +253,17 @@ public class IMController extends Handler {
*/
@RequestMapping("/online")
@Menu(type = "im", subtype = "online", access = true)
public SseEmitter callable(HttpServletRequest request, HttpServletResponse response, @Valid Contacts contacts, final @Valid String orgi, final @Valid String sessionid, @Valid String appid, final @Valid String userid, @Valid String sign, final @Valid String client, final @Valid String title, final @Valid String traceid) {
public SseEmitter callable(HttpServletRequest request,
HttpServletResponse response,
@Valid Contacts contacts,
final @Valid String orgi,
final @Valid String sessionid,
@Valid String appid,
final @Valid String userid,
@Valid String sign,
final @Valid String client,
final @Valid String title,
final @Valid String traceid) {
BlackEntity black = (BlackEntity) CacheHelper.getSystemCacheBean().getCacheObject(userid, orgi);
SseEmitter retSseEmitter = null;
if ((black == null || (black.getEndtime() != null && black.getEndtime().before(new Date())))) {
@ -288,9 +298,21 @@ public class IMController extends Handler {
contacts = processContacts(orgi, contacts, appid, userid);
}
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);
try {
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);
} catch (java.lang.ClassCastException e) {
// #TODO workaround for
// https://github.com/chatopera/cosin/issues/75
}
}
OnlineUserUtils.webIMClients.putClient(userid, new WebIMClient(userid, client, emitter));
}
}