using AppletMvcService.Hanlder;
using AppletMvcService.Models;
using Microsoft.AspNet.SignalR;
using System;
using System.Collections.Generic;
using System.Linq;
using WX.CRM.Common;
namespace AppletMvcService
{
public class ChatHub : Hub
{
//public void Send(string name, string message)
//{
// Clients.All.broadcastMessage(name, message);
//}
///
/// 给客服发送消息
///
///
///
///
public static void SendAllMessage(string toUserId, string fromUserId, string message, string msgType, string accountnum, int isNew)
{
//CustoemrDetail detial = CustomerUsers.FirstOrDefault(m => m.OpenId == fromUserId);
UserDetail xx = ConnectedUsers[accountnum].FirstOrDefault(m => m.UserID == toUserId);
if (xx == null)
{
LogHelper.Info("工号:" + toUserId + "不在线,content:" + message + ",add unread msg");
return;
}
if (isNew == 1)
{
CustoemrDetail detial = new CustoemrDetail();
detial.OpenId = fromUserId;
detial.NickName = "客户";
detial.ConnectionId = fromUserId;
detial.HeaderUrl = "";
detial.LoginTime = DateTime.Now;
detial = MessageHandler.GetCustomerHeadInfo(detial);
//添加登陆者
MessageHandler.GetCustomerHeadInfo(detial);
Microsoft.AspNet.SignalR.GlobalHost.ConnectionManager.GetHubContext().Clients.Client(xx.ConnectionId).onNewUserConnected(fromUserId, fromUserId, detial.NickName, "微信", detial.HeaderUrl, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
}
Microsoft.AspNet.SignalR.GlobalHost.ConnectionManager.GetHubContext().Clients.Client(xx.ConnectionId).receivePrivateMessage(fromUserId, message, msgType);
}
#region Data Members
private static Dictionary> _connectedUsers;
public static Dictionary> ConnectedUsers
{
get
{
if (_connectedUsers == null || _connectedUsers.Count == 0)
{
_connectedUsers = MessageHandler.GetConnectedByRedis();
}
return ChatHub._connectedUsers;
}
set { ChatHub._connectedUsers = value; }
}
//public static List CustomerUsers = new List();//客户在线列表
//public static string ConectedEids = string.Empty;
#endregion
//心跳
public void Alive(string userId, string accountnum)
{
//LogHelper.Info("alive==========" + userId);
UserDetail xx = ConnectedUsers[accountnum].FirstOrDefault(m => m.UserID == userId);
Microsoft.AspNet.SignalR.GlobalHost.ConnectionManager.GetHubContext().Clients.Client(xx.ConnectionId).getAlive(userId);
}
///
/// 登录连线
///
/// 用户ID
/// 用户名
/// 部门名
/// 公众号
public void Connect(string userID, string userName, string deptName, string accountnum)
{
try
{
var id = Context.ConnectionId;
if (!ConnectedUsers.ContainsKey(accountnum))
ConnectedUsers.Add(accountnum, new List());
LogHelper.Info("登录系统!" + userID);
if (ConnectedUsers[accountnum].Count(x => x.ConnectionId == id) == 0)
{
if (ConnectedUsers[accountnum].Count(x => x.UserID == userID) > 0)
{
var items = ConnectedUsers[accountnum].Where(x => x.UserID == userID).ToList();
foreach (var item in items)
{
Clients.AllExcept(id).onUserDisconnected(item.ConnectionId, item.UserName);
}
ConnectedUsers[accountnum].RemoveAll(x => x.UserID == userID);
}
//ConectedEids += "[" + userID + "]";
//添加在线人员
UserDetail detial = new UserDetail { ConnectionId = id, UserID = userID, UserName = userName, DeptName = deptName, LoginTime = DateTime.Now };
ConnectedUsers[accountnum].Add(detial);
MessageHandler.AddConnectedToRedis(detial, accountnum);//--redis新增
// 反馈信息给登录者
Clients.Caller.onConnected(id, userName, MessageHandler.GetFriends(Convert.ToDecimal(userID), accountnum));
//LogHelper.Info(string.Format("ConnectionId = {0}, UserID = {1}, UserName = {2}, DeptName = {3}", id, userID, userName, deptName));
// 通知所有用户,有新用户连接
//Clients.AllExcept(id).onNewUserConnected(id, userID, userName, deptName, DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
}
}
catch (Exception ex)
{
LogHelper.Error(ex.ToString());
}
}
///
/// 发送私聊
///
/// 接收方用户连接ID
/// 内容
public void SendPrivateMessage(string toUserId, string message, int eid, string accountnum)
{
//string fromUserId = Context.ConnectionId;
//var toUser = ConnectedUsers.FirstOrDefault(x => x.ConnectionId == toUserId);
//var fromUser = ConnectedUsers.FirstOrDefault(x => x.ConnectionId == fromUserId);
//if (toUser != null && fromUser != null)
//{ // send to
MessageHandler.SendMsg(toUserId, message, eid, accountnum);
//Clients.Client(toUserId).receivePrivateMessage(fromUserId, fromUser.UserName, message);
// send to caller user
//Clients.Caller.sendPrivateMessage(toUserId, fromUser.UserName, message);
//}
//else
//{
// //表示对方不在线
// Clients.Caller.absentSubscriber();Class1.cs
//}
}
///
/// 批量发送
///
/// 接收人openID用“,”隔开
/// 消息
/// 公众号
public void SendQFMessage(string toUserIds, string message, int eid, string accountnum)
{
LogHelper.Info("批量发送消息:" + toUserIds + ",message:" + message + ",accountnum:" + accountnum);
if (string.IsNullOrEmpty(toUserIds))
{
return;
}
string[] openIds = toUserIds.Split(',');
foreach (string openId in openIds)
{
if (string.IsNullOrEmpty(openId))
continue;
MessageHandler.SendMsg(openId, message, eid, accountnum);
}
}
/////
///// 发送素材消息
/////
///// 目标人
///// 素材名称
///// 素材ID
///// 素材类型
///// 素材地址
///// 公众号
//public void SendSuCaiMessage(string toUserId, string name, string media_id, string sucaitype, string url, string accountnum)
//{
// if (sucaitype != "news")
// {
// ImageMsg msg = new ImageMsg();
// msg.media_id = media_id;
// MessageHandler.SendImgMsg(msg, sucaitype, toUserId, accountnum);
// //if (MessageHandler.IsNeedDownLoadSuCai(media_id))
// //{
// // string imagepath=MessageHandler.DownLoadSuCaiPath(media_id, url);
// // MessageHandler.appletmsg.WeapAddFilePath(0, media_id, imagepath);
// //}
// }
//}
///
/// 离线
///
public override System.Threading.Tasks.Task OnDisconnected(bool stopCalled)
{
try
{
//LogHelper.Error("有人离线了," + Context.ConnectionId);
foreach (var unn in ConnectedUsers)
{
//LogHelper.Error("公众号:" + unn.Key + ",在线人数:" + unn.Value.Count);
var item = unn.Value.FirstOrDefault(x => x.ConnectionId == Context.ConnectionId);
if (item != null)
{
MessageHandler.RemoveConnectedToRedis(item, unn.Key);//--redis新增
//ConectedEids.Replace("[" + item.UserID + "]", "");
//LogHelper.Info("客服离线:" + item.UserID);
//Clients.All.onUserDisconnected(item.ConnectionId, item.UserName); //调用客户端用户离线通知
ConnectedUsers[unn.Key].Remove(item);
break;
}
}
}
catch (Exception xx)
{
LogHelper.Error(xx.ToString());
}
return base.OnDisconnected(stopCalled);
}
}
}