اگر برای اولین بار پیامی را ارسال میکنید، برای شما session ایی ایجاد نشده است. در اینصورت مکان تقاضای مشتری از سایت http://ipinfo.io دریافت شده و به سرور ارسال میگردد و متد logvist سرور، تقاضای شروع مکالمه مشتری را به اطلاع تمام کارشناسان میرساند و وضعیت chatbox را تغییر میدهد.
اگر session برای مشتری تعریف شده باشد، مکالمه مشتری با کارشناس مربوطه انجام میگردد.
کارشناسان در صورت تمایل، شروع به مکالمه با کاربر مینمایند و مکالمه آغاز میگردد.با شروع مکالمه توسط کارشناس، متد acceptRequestChat سرور فراخوانی میشود.
پیامهای مناسب برای کارشناس مربوطه، برای مشتری و تمام کارشناسان (به تمام کارشناسان اطلاع داده میشود که مشتری با چه کارشناسی در حال مکالمه میباشد) ارسال میگردد و مقادیر مربوطه در دیتابیس ذخیره میگردد.
متد closeChat سرور فراخوانی میگردد. پیام مناسبی به مشتری و تمام کارشناسان ارسال میگردد.
مکالمه از کارشناس فعلی گرفته شده و به کارشناس جدید داده میشود؛ به همراه ارسال پیامهای مناسب به طرفهای مربوطه
از آنجاییکه اسم متدها کاملا گویا میباشد، به نظر نیازی به توضیح بیشتری ندارند.
var app = angular.module("app", ["SignalR", 'ngRoute', 'ngAnimate', 'ngSanitize', 'mgcrea.ngStrap', 'angular-smilies']);
app.config(["$routeProvider", "$provide", "$httpProvider", "$locationProvider",
function ($routeProvider, $provide, $httpProvider, $locationProvider) {
$routeProvider.
when('/', { templateUrl: 'app/views/home.html', controller: "HomeCtrl" }).
when('/agent', { templateUrl: 'app/views/agent.html', controller: "ChatCtrl" })
.otherwise({
redirectTo: "/"
});;
}]);
app.controller("HomeCtrl", ["$scope", function ($scope) {
$scope.title = "home";
}])
app.controller("ChatCtrl", ["$scope", "Hub", "$location", "$http", "$rootScope",
function ($scope, hub, $location, $http, $rootScope) {
if (!$scope.myHub) {
var chatKey = "angular-signalr";
var defaultCustomerUserName = null;
function getid(id) {
var find = false;
var position = null;
angular.forEach($scope.chatConversation, function (index, i) {
if (index.id === id && !find) {
find = true;
position = i;
return;
}
});
return position;
}
function apply() {
$scope.$apply();
}
$scope.boxheader = function () {
var height = 0;
$("#chat-box").slideToggle('slow', function () {
if ($("#chat-box-header").css("bottom") === "0px") {
height = $("#chat-box").height() + 20;
} else {
height = 0;
}
$("#chat-box-header").css("bottom", height);
});
};
var init = function () {
$scope.agent = {
id: "", name: "", isOnline: false
};
$rootScope.msg = "";
$scope.alarmStatus = false;
$scope.options = {
offlineTitle: "آفلاین",
onlineTitle: "آنلاین",
waitingForOperator: "لطفا منتظر بمانید تا به اپراتور وصل شوید",
emailSent: "ایمیل ارسال گردید",
emailFailed: "متاسفانه ایمیل ارسال نگردید",
logOut: "خروج",
setting: "تنظیمات",
conversion: "آرشیو",
edit: "ویرایش",
alarm: "قطع/وصل کردن صدا",
complete: "تکمیل",
pending: "منتظر ماندن",
reject: "عدم پذیرش",
lock: "آنلاین شدن",
unlock: "آفلاین شدن",
alarmOn: "روشن",
alarmOff: "خاموش",
upload: "آپلود"
};
$scope.chatConversation = [];
$scope.chatSessions = [];
$scope.customerVisit = [];
$scope.agentClientMsgs = [];
$scope.clientAgentMsg = [];
}();
//تعریف هاب به همراه متدهای آن
$scope.myHub = new hub("chatHub", {
listeners: {
"clientChat": function (id, agentName) {
$scope.clientAgentMsg.push({ name: agentName, msg: "با سلام در خدمت میباشم" });
$scope.chatTitle = "کارشناس: " + agentName;
$scope.pendingRequestChat = false;
sessionStorage.setItem(chatKey, id);
}, "agentChat": function (id, firstComment, customerName) {
var date = new Date();
var position = getid(id);
if (position > 0) {
$scope.chatSessions[position].length = $scope.chatConversation[position].length + 1;
$scope.chatSessions[position].date = date.toISOString();
return;
}
else {
$scope.chatConversation.push({
id: id,
sessions: [{
name: customerName,
msg: firstComment,
date: date
}],
agentName: $scope.agent.name,
customerName: customerName,
dateStartChat: date.getHours() + ":" + date.getMinutes(),
});
$scope.chatSessions.push({
id: id,
length: 1,
userName: customerName,
date: date.toISOString()
});
}
sessionStorage.setItem(chatKey, id);
apply();
},
//برروز رسانی لیست برای کارشناسان
"refreshChatWith": function (agentName, customerConnectionId) {
angular.forEach($scope.customerVisit, function (index, i) {
if (index.connectionId === customerConnectionId) {
$scope.customerVisit[i].chatWith = agentName;
}
});
apply();
},
//برروز رسانی لیست برای کارشناسان
"refreshLeaveChat": function (agentName, customerConnectionId) {
angular.forEach($scope.customerVisit, function (index, i) {
if (index.connectionId === customerConnectionId) {
$scope.customerVisit[i].chatWith =agentName + "---" + " به مکالمه خاتمه داده است ";
}
});
apply();
}
//وضعیت آنلاین بودن کارشناسان
, "onlineStatus": function (state) {
if (state) {
$scope.chatTitle = $scope.options.onlineTitle;
$scope.hasOnline = true;
$scope.hasOffline = false;
} else {
$scope.chatTitle = $scope.options.offlineTitle;
$scope.hasOffline = true;
$scope.hasOnline = false;
}
$scope.$apply()
}, "loginResult": function (status, id, name) {
if (status) {
$scope.agent.id = id;
$scope.agent.name = name;
$scope.agent.isOnline = true;
$scope.userIsLogin = $scope.agent;
$scope.$apply(function () {
$location.path("/agent");
});
} else {
$scope.agent = null;
toastr.error("کارشناسی با این مشخصات وجود ندارد");
return;
}
}, "newVisit": function (userName, city, country, chatWith, connectionId, firstComment) {
var exist = false;
angular.forEach($scope.customerVisit, function (index) {
if (index.connectionId === connectionId) {
exist = true;
return;
}
});
if (!exist) {
var date = new Date();
$scope.customerVisit.unshift({
userName: userName,
date: date,
city: city,
country: country,
chatWith: chatWith,
connectionId: connectionId,
firstComment: firstComment
});
if ($scope.alarmStatus) {
var snd = new Audio("/App/assets/sounds/Sedna.ogg");
snd.play();
}
toastr.success("تقاضای جدید دریافت گردید");
apply();
}
}, "addMessage": function (id, from, value) {
if ($scope.alarmStatus) {
var snd = new Audio("/App/assets/sounds/newmsg.mp3");
snd.play();
}
$scope.agentUserMsgs = [];
var date = new Date();
var position = getid(id);
if ($scope.chatConversation.length > 0 && position != null) {
$scope.chatConversation[position].sessions.push({ name: from, msg: value, date: date });
}
var item = $scope.chatConversation[position];
if (item) {
angular.forEach(item.sessions, function (index) {
$scope.agentUserMsgs.push({ name: index.name, msg: index.msg, date: date });
});
$scope.chatSessions[position].length = $scope.chatSessions[position].length + 1;
}
apply();
}, "clientAddMessage": function (id, from) {
if ($scope.alarmStatus) {
var snd = new Audio("/App/assets/sounds/newmsg.mp3");
snd.play();
}
$scope.clientAgentMsg.push({ name: id, msg: from });
apply();
}, "visitorSwitchConversation": function (id, customerName, sessions, sessionId) {
sessions = JSON.parse(sessions);
var date = new Date();
var sessionList = [];
angular.forEach(sessions, function (index) {
sessionList.push({
name: index.sender,
msg: index.body,
date: index.creationTime
});
});
$scope.chatConversation.push({
id: sessionId,
sessions: sessionList,
customerName: customerName,
dateStartChat: date.getHours() + ":" + date.getMinutes(),
agentName: $scope.agent.name
});
$scope.chatSessions.push({
id: sessionId,
length: sessions.length,
date: date
});
}, "receiveTicket": function (items) {
angular.forEach(JSON.parse(items), function (index) {
$scope.ticketList = [];
$scope.ticketList.push(index);
});
},
//آرشیو گفته گوهای کارشناس
"receiveHistory": function (items) {
$scope.agentHistory = [];
angular.forEach(JSON.parse(items), function (index) {
$scope.agentHistory.push(index);
});
apply();
},
//جزییات آرشیو گفتگوها
"detailsHistory": function (items) {
$scope.historyMsg = [];
angular.forEach(JSON.parse(items), function (index) {
$scope.historyMsg.push({ name: index.sender, msg: index.body, date: index.creationTime });
});
$("#detailsAgentHistory").modal();
apply();
},
//لیست کارشناسان آنلاین
"agentList": function (items) {
$scope.agentList = [];
angular.forEach(items, function (index) {
if ($scope.agent.name != index.Key) {
$scope.agentList.push({ name: index.Key, id: index.Value.ConnectionId });
}
});
$("#agentList").modal();
apply();
}
},
methods: ["agentConnect", "sendTicket", "requestChat", "clientSendMessage", "closeChat", "init", "logVisit",
"agentChangeStatus", "engageVisitor", "agentSendMessage", "transfer", "leaveChat", "acceptRequestChat",
"leaveChat", "detailsSessoinMessage", "showAgentList", "getAgentHistoryChat"
], errorHandler: function (error) {
console.error(error);
}
});
$scope.myHub.promise.done(function () {
$scope.myHub.init();
$scope.myHub.promise.done(function () { });
});
$scope.LeaveChat = function () {
$scope.myHub.LeaveChat();
};
$scope.loginAgent = function (userName) {
// username :security user username from agent role
if (userName == "hossein" || userName == "ali") {
$scope.myHub.promise.done(function () {
$scope.myHub.agentConnect(userName).then(function (result) {
$scope.agent.name = userName;
$scope.agent.isOnline = true;
});
});
}
};
$scope.requestChat = function (msg) {
if (!defaultCustomerUserName) {
//گرفتن کاربر لاگین شده
//ما از آرایه تصادفی استفاده میکنیم
var nameDefaultArray = [
'حسین', 'حسن', 'علی', 'عباس', 'زهرا', 'سمیه'
];
defaultCustomerUserName=nameDefaultArray[Math.floor(Math.random() * nameDefaultArray.length)];
}
var userName = defaultCustomerUserName;
if (!$scope.chatId) {
$scope.chatId = sessionStorage.getItem(chatKey);
$http.get("http://ipinfo.io")
.success(function (response) {
$scope.myHub.logVisit(response.city, response.country, msg, userName);
}).error(function (e, status, headers, config) {
$scope.myHub.logVisit("Tehran", "Ir", msg, userName)
});
$scope.myHub.requestChat(msg);
$scope.chatTitle = $scope.options.waitingForOperator;
$scope.pendingRequestChat = true;
} else {
$scope.myHub.clientSendMessage(msg, userName);
};
$scope.message = "";
};
$scope.acceptRequestChat = function (customerConnectionId, firstComment, customerName) {
$scope.myHub.acceptRequestChat(customerConnectionId, firstComment, customerName);
};
$scope.changeAgentStatus = function () {
$scope.agent.isOnline = !$scope.agent.isOnline;
$scope.myHub.agentChangeStatus($scope.agent.isOnline);
};
$scope.detailsChat = function (chatId, userName) {
$scope.agentUserMsgs = [];
angular.forEach($scope.chatConversation, function (index) {
if (index.id === chatId) {
$scope.dateStartChat = index.dateStartChat;
angular.forEach(index.sessions, function (value) {
$scope.agentUserMsgs.push({ name: value.name, msg: value.msg, date: value.date });
});
};
});
$scope.agentChatWithUser = chatId;
$scope.customerName = userName;
$("#agentUserChat").modal();
};
$scope.ticket = {
submit: function () {
var name = $scope.ticket.name;
var email = $scope.ticket.email;
var comment = $scope.ticket.comment;
$scope.myHub.sendTicket(name, email, comment);
}
};
$scope.showHistory = function () {
$scope.myHub.getAgentHistoryChat($scope.agent.name);
};
$scope.detailsChatHistory = function (id) {
$scope.myHub.detailsSessoinMessage(id, $scope.agent.id);
};
$scope.agentMsgToUser = function (msg) {
var chatId = $scope.agentChatWithUser;
var customerName = $scope.customerName;
if (!customerName) {
angular.forEach($scope.customerVisit, function (index) {
if (index.connectionId == chatId) {
customerName = index.userName;
}
});
}
if (chatId !== "" && msg !== "") {
$scope.myHub.agentSendMessage(chatId, msg, customerName);
}
//not bind to scope.msg! not correctly work
$scope.msg = "";
$("#post-msg").val("");
};
$scope.closeChat = function (chatId) {
var item = $scope.chatConversation[getid(chatId)];
$scope.myHub.closeChat(chatId);
};
$scope.engageVisitor = function (newAgentId) {
var customerId = $scope.customerId;
var customerName = $scope.customerName;
var clientSessionId = $scope.clientSessionId;
$scope.myHub.engageVisitor(newAgentId, customerId, customerName, clientSessionId);
$("[data-dismiss=modal]").trigger({ type: "click" });
};
$scope.selectVisitor = function (customerId, customerName, clientSessionId) {
$scope.customerId = customerId;
$scope.customerName = customerName;
$scope.clientSessionId = clientSessionId;
$scope.myHub.showAgentList();
};
$scope.setClass = function (item) {
if (item === "من")
return "question";
else
return "response";
};
$scope.setdirectionClass = function (item) {
if (item === $scope.agent.name)
return { "float": "left" };
else
return { "float": "right" };
};
$scope.setArrowClass = function (item) {
if (item === $scope.agent.name)
return "left-arrow";
else
return "right-arrow";
};
$scope.setAlarm = function () {
$scope.alarmStatus = !$scope.alarmStatus;
};
}
}]);
app.directive("showtab", function () {
return {
link: function (scope, element, attrs) {
element.click(function (e) {
e.preventDefault();
$(element).addClass("active");
$(element).tab("show");
});
}
};
});
//زمان ارسال پیام
app.directive("timeAgo", function ($q) {
return {
restrict: "AE",
scope: false,
link: function (scope, element, attrs) {
jQuery.timeago.settings.strings =
{
prefixAgo: null,
prefixFromNow: null,
suffixAgo: "پیش",
suffixFromNow: "از حالا",
seconds: "کمتر از یک دقیقه",
minute: "در حدود یک دقیقه",
minutes: "%d دقیقه",
hour: "حدود یگ ساعت",
hours: "حدود %d ساعت ",
day: "یک روز",
days: "%d روز",
month: "حدود یک ماه",
months: "%d ماه",
year: "حدود یک سال",
years: "%d سال",
wordSeparator: " ",
numbers: []
}
var parsedDate = $q.defer();
parsedDate.promise.then(function () {
jQuery(element).timeago();
});
attrs.$observe("title", function (newValue) {
parsedDate.resolve(newValue);
});
}
};
});
[HubName("chatHub")]
public class ChatHub : Microsoft.AspNet.SignalR.Hub
{
private readonly ApplicationDbContext _db = new ApplicationDbContext();
private static ConcurrentDictionary<string, UserInformation> _agents;
private static List<ChatSessionVm> _chatSessions;
private readonly JsonSerializerSettings _settings = new JsonSerializerSettings
{
ContractResolver = new CamelCasePropertyNamesContractResolver(),
ReferenceLoopHandling = ReferenceLoopHandling.Ignore
};
public void Init()
{
_chatSessions = _chatSessions ?? (_chatSessions = new List<ChatSessionVm>());
_agents = _agents ?? (_agents = new ConcurrentDictionary<string, UserInformation>());
Clients.Caller.onlineStatus(_agents.Count(x => x.Value.IsOnline) > 0);
}
public void AgentConnect(string userName)
{
//ما برای ساده کردن مقایسه ساده ای انجام دادیم فقط کاربر حسین یا علی میتواند کارشناس باشد
if (userName == "hossein" || userName == "ali")
{
var agent = new UserInformation();
if (_agents.Any(item => item.Key == userName))
{
agent = _agents[userName];
agent.ConnectionId = Context.ConnectionId;
}
else
{
agent.ConnectionId = Context.ConnectionId;
agent.UserName = userName;
agent.IsOnline = true;
_agents.TryAdd(userName, agent);
}
Clients.Caller.loginResult(true, agent.ConnectionId, agent.UserName);
Clients.All.onlineStatus(_agents.Count(x => x.Value.IsOnline) > 0);
}
else
{
Clients.Caller.loginResult(false, null, null);
}
}
public void AgentChangeStatus(bool status)
{
var agent = _agents.FirstOrDefault(x => x.Value.ConnectionId == Context.ConnectionId).Value;
if (agent == null) return;
agent.IsOnline = status;
Clients.All.onlineStatus(_agents.Count(x => x.Value.IsOnline) > 0);
}
public void LogVisit(string city, string country, string firstComment, string userName)
{
foreach (var agent in _agents)
{
Clients.Client(agent.Value.ConnectionId).newVisit(userName, city, country, null, Context.ConnectionId, firstComment);
}
}
public void AcceptRequestChat(string customerConnectionId, string body, string userName)
{
var agent = FindAgent(Context.ConnectionId);
var session = _chatSessions.FirstOrDefault(item => item.Key.Equals(agent.Key));
if (session == null)
{
_chatSessions.Add(new ChatSessionVm
{
Key = agent.Key,
Value = new List<string> { customerConnectionId }
});
}
else
{
session.Value.Add(customerConnectionId);
}
Clients.Client(Context.ConnectionId).agentChat(customerConnectionId, body, userName);
Clients.Client(customerConnectionId).clientChat(customerConnectionId, agent.Value.UserName);
foreach (var item in _agents.Where(item => item.Value.IsOnline))
{
Clients.Client(item.Value.ConnectionId).refreshChatWith(agent.Value.UserName, customerConnectionId);
}
_db.Sessions.Add(new Session
{
AgentName = agent.Key,
CustomerName = userName,
CreatedDateTime = DateTime.Now
});
_db.SaveChanges();
var message = new Message
{
CreationTime = DateTime.Now,
Sender = agent.Key,
Receiver = userName,
Body = body,
//ConnectionId = _agents.FirstOrDefault(item => item.Value.UserName == userName).Key,
Session = _db.Sessions.OrderByDescending(item => item.Id)
.FirstOrDefault(item => item.AgentName.Equals(agent.Key) && item.CustomerName.Equals(userName))
};
_db.Messages.Add(message);
_db.SaveChanges();
}
public void GetAgentHistoryChat(string userName)
{
var dic = new Dictionary<int, int>();
var lenght = 0;
var chats = _db.Sessions.OrderBy(item => item.Id).Include(item => item.Parent)
.Where(item => item.AgentName.Equals(userName)).ToList();
foreach (var session in chats)
{
Result(session, ref lenght);
dic.Add(session.Id, lenght);
lenght = 0;
}
if (!chats.Any()) return;
var historyResult = chats.Select(item => new AgentViewModel
{
Id = item.Id,
CustomerName = item.CustomerName,
Date = item.CreatedDateTime,
Lenght = dic.Any(di => di.Key.Equals(item.Id)) ? dic.FirstOrDefault(di => di.Key.Equals(item.Id)).Value : 0,
}).OrderByDescending(item => item.Id).ToList();
Clients.Caller.receiveHistory(JsonConvert.SerializeObject(historyResult, new Formatting(), _settings));
}
public void DetailsSessoinMessage(int sessionId, string agentId)
{
var session = _db.Sessions.FirstOrDefault(item => item.Id.Equals(sessionId));
if (session == null) return;
var list = new List<Message>();
GetAllMessages(session, list);
var result = JsonConvert.SerializeObject(list.OrderBy(item => item.Id), new Formatting(), _settings);
Clients.Client(Context.ConnectionId).detailsHistory(result);
}
public void ClientSendMessage(string body, string userName)
{
var session = _chatSessions.FirstOrDefault(item => item.Value.Contains(Context.ConnectionId));
if (session == null || session.Key == null) return;
var agentId = _agents.FirstOrDefault(item => item.Key.Equals(session.Key)).Value.ConnectionId;
Clients.Caller.clientAddMessage("من", body);
Clients.Client(agentId).addMessage(Context.ConnectionId, userName, body);
var message = new Message
{
Sender = FindAgent(agentId).Key,
Receiver = userName,
Body = body,
CreationTime = DateTime.Now,
Session = FindSession(userName, FindAgent(agentId).Key)
};
_db.Messages.Add(message);
_db.SaveChanges();
}
public void AgentSendMessage(string id, string body, string userName)
{
var agent = FindAgent(Context.ConnectionId);
Clients.Caller.addMessage(id, agent.Value.UserName, body);
Clients.Client(id).clientAddMessage(agent.Value.UserName, body);
var message = new Message
{
Sender = agent.Key,
Receiver = userName,
Body = body,
Session = FindSession(agent.Key, userName),
CreationTime = DateTime.Now
};
_db.Messages.Add(message);
_db.SaveChanges();
}
public void CloseChat(string id)
{
var findAgent = FindAgent(Context.ConnectionId);
var session = _chatSessions.FirstOrDefault(item => item.Value.Contains(id));
if (session == null) return;
Clients.Client(id).clientAddMessage(findAgent.Key, "مکالمه شما با کارشناس مربوطه به اتمام رسیده است");
foreach (var agent in _agents)
{
Clients.Client(agent.Value.ConnectionId).refreshLeaveChat(agent.Value.UserName, id);
}
_chatSessions.Remove(session);
}
public void RequestChat(string message)
{
Clients.Caller.clientAddMessage("من", message);
}
public void EngageVisitor(string newAgentId, string cumtomerId, string customerName,string clientSessionId)
{
#region remove session of current agent
var currentAgent = FindAgent(Context.ConnectionId);
var currentSession = _chatSessions.FirstOrDefault(item => item.Value.Contains(cumtomerId));
if (currentSession != null)
{
_chatSessions.Remove(currentSession);
}
#endregion
#region add session to new agent
var newAgent = FindAgent(newAgentId);
var newSession = _chatSessions.FirstOrDefault(item => item.Key.Equals(newAgent.Key));
if (newSession == null)
{
_chatSessions.Add(new ChatSessionVm
{
Key = newAgent.Key,
Value = new List<string> { cumtomerId }
});
}
else
{
newSession.Value.Add(cumtomerId);
}
#endregion
Clients.Client(currentAgent.Value.ConnectionId).addMessage(cumtomerId, newAgent.Key,
"ادامه مکالمه به کارشناس " + newAgent.Key + "مقابل منتقل شد");
Clients.Client(newAgentId).addMessage(cumtomerId, currentAgent.Key,
"لطفا مکالمه را ادامه دهید.با تشکر");
Clients.Client(cumtomerId).clientAddMessage(newAgent.Value.UserName,
"مکالمه شما با کارشناس زیر برقرار گردید" + newAgent.Key);
var session = _db.Sessions.FirstOrDefault
(item => item.AgentName.Equals(currentAgent.Value.UserName)
&& item.CustomerName.Equals(customerName));
if (session != null)
{
var sessionId = session.Id;
var messages = _db.Messages.Where(item => item.Session.Id.Equals(sessionId));
var result = JsonConvert.SerializeObject(messages, new Formatting(), _settings);
Clients.Client(newAgentId).visitorSwitchConversation
(Context.ConnectionId, customerName, result, clientSessionId);
}
foreach (var item in _agents.Where(item => item.Value.IsOnline))
{
Clients.Client(item.Value.ConnectionId).refreshChatWith(newAgent.Value.UserName, cumtomerId);
}
_db.Sessions.Add(new Session
{
AgentName = newAgent.Key,
CustomerName = customerName,
CreatedDateTime = DateTime.Now,
Parent = _db.Sessions.Where(item => item.AgentName.Equals(currentAgent.Key)
&& item.CustomerName.Equals(customerName)).OrderByDescending(item => item.Id).FirstOrDefault()
});
_db.SaveChanges();
}
public void ShowAgentList()
{
Clients.Caller.agentList(_agents.ToList());
}
public override Task OnDisconnected(bool stopCalled)
{
var id = Context.ConnectionId;
var isAgent = _agents != null && _agents.Any(item => item.Value.ConnectionId.Equals(id));
if (isAgent)
{
UserInformation agent;
var currentAgentConnectionId = FindAgent(id).Key;
if (currentAgentConnectionId == null)
return base.OnDisconnected(stopCalled);
if (_chatSessions.Any())
{
var sessions = _chatSessions.FirstOrDefault(item => item.Key.Equals(currentAgentConnectionId));
//اطلاع دادن به تمام کاربرانی که در حال مکالمه با کارشناس هستند
if (sessions != null)
{
var result = sessions.Value.ToList();
for (var i = 0; i < result.Count(); i++)
{
var localId = result[i];
Clients.Client(localId).clientAddMessage(currentAgentConnectionId, "ارتباط شما با مشاور مورد نظر قطع شده است");
}
}
}
_agents.TryRemove(currentAgentConnectionId, out agent);
Clients.All.onlineStatus(_agents.Count(x => x.Value.IsOnline) > 0);
Clients.Client(id).loginResult(false, null, null);
}
else
{
if (_chatSessions == null ||
!_chatSessions.Any(item => item.Value.Contains(id)
&& _agents == null))
return base.OnDisconnected(stopCalled);
var session = _chatSessions.FirstOrDefault(item => item.Value.Contains(id));
if (session == null)
return base.OnDisconnected(stopCalled);
var agentName = session.Key;
var agent = _agents.FirstOrDefault(item => item.Key.Equals(agentName));
if (agent.Key != null)
{
Clients.Client(agent.Value.ConnectionId).addMessage(id, "کاربر", "اتصال با کاربر قطع شده است");
}
}
return base.OnDisconnected(stopCalled);
}
private KeyValuePair<string, UserInformation> FindAgent(string connectionId)
{
return _agents.FirstOrDefault(item => item.Value.ConnectionId.Equals(connectionId));
}
private Session FindSession(string key, string userName)
{
return _db.Sessions.Where(item => item.AgentName.Equals(key) && item.CustomerName.Equals(userName))
.OrderByDescending(item => item.Id).FirstOrDefault();
}
private static void Result(Session parent, ref int lenght)
{
while (true)
{
if (parent == null)
return;
lenght += parent.Messages.Count();
parent = parent.Parent;
}
}
private static List<Message> GetAllMessages(Session node, List<Message> list)
{
if (node == null) return null;
list.AddRange(node.Messages);
if (node.Parent != null)
{
GetAllMessages(node.Parent, list);
}
return null;
}
}
فایل agent.html