using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.AspNet.SignalR;
using NOBOLO.Models;
using NOBOLO.Repository.Interface;
using NOBOLO.Repository.GRepository;
using NOBOLO.Repository.UnitOfWork;
using NOBOLO.Controllers.Enum;
using NOBOLO.Controllers.BusinessLayer.V1;
using NOBOLO.Library.Utilities;
namespace NOBOLO.Library.SignalR.hub
{
public class ChatHub : Hub
{
V1GeneralFunctions _V1Gen;
#region---Data Members---
//static List<tblSignalRUserDetail> ConnectedUsers = new List<tblSignalRUserDetail>();
//static List<tblSignalRMessageDetail> CurrentMessage = new List<tblSignalRMessageDetail>();
#endregion
private readonly IUnitOfWork _unitOfWork;
private GenericRepository<tblSignalRUserDetail> _UserDetailRepo;
private GenericRepository<tblSignalRMessageDetail> _MessageDetailRepo;
private GenericRepository<tblUser> _UserRepo;
private GenericRepository<tblUserSetting> _UserSettingRepo;
public ChatHub()
{
_unitOfWork = new UnitOfWork();
_UserDetailRepo = new GenericRepository<tblSignalRUserDetail>(_unitOfWork);
_MessageDetailRepo = new GenericRepository<tblSignalRMessageDetail>(_unitOfWork);
_UserRepo = new GenericRepository<tblUser>(_unitOfWork);
_V1Gen = new V1GeneralFunctions();
_UserSettingRepo = new GenericRepository<tblUserSetting>(_unitOfWork);
}
#region---Methods---
public void Connect(string UserName, int UserID, int ToUserID, int RequestID)
{
var id = Context.ConnectionId;
var User = _UserRepo.Repository.Get(x => x.UsersID == UserID);
if (_UserDetailRepo.Repository.Count(x => x.UserID == UserID && x.RecordStatus == RecordStatus.Active.ToString()) == 0)
{
_UserDetailRepo.Repository.Add(new tblSignalRUserDetail
{
ConnectionId = id,
UserName = UserName + "-" + UserID,
UserID = UserID,
PhotoURL = User != null ? User.ThumbnailURL : "",
RecordStatus = RecordStatus.Active.ToString(),
CreatedDate = DateTime.UtcNow,
ModifiedDate = DateTime.UtcNow
});
}
else
{
tblSignalRUserDetail userDetailEntity = _UserDetailRepo.Repository.Get(x => x.UserID == UserID && x.RecordStatus == RecordStatus.Active.ToString());
userDetailEntity.ConnectionId = id;
_UserDetailRepo.Repository.Update(userDetailEntity);
}
var _UserSetting = _UserSettingRepo.Repository.Get(x => x.UserID == User.UsersID);
_UserSetting.IsChatScreenON = false;
_UserSettingRepo.Repository.Update(_UserSetting);
var UserDetailObject = _UserDetailRepo.Repository.Get(x => x.UserID == UserID && x.RecordStatus == RecordStatus.Active.ToString());
if(UserDetailObject.PhotoURL != User.ThumbnailURL)
{
var UserDetailObjects = _UserDetailRepo.Repository.GetAll(x => x.UserID == UserID && x.RecordStatus == RecordStatus.Active.ToString());
foreach (var item in UserDetailObjects)
{
item.PhotoURL = User.ThumbnailURL;
}
_UserDetailRepo.Repository.Update(UserDetailObjects);
}
tblSignalRUserDetail CurrentUser = _UserDetailRepo.Repository.Get(u => u.ConnectionId == UserDetailObject.ConnectionId && u.RecordStatus == RecordStatus.Active.ToString());
// send to caller RequestInfoID
long FromUserId = UserID;
//long ToUserId = Convert.ToInt32(System.Web.HttpContext.Current.Session["ToUserId"].ToString());
//long RequestId = Convert.ToInt32(System.Web.HttpContext.Current.Session["RequestId"].ToString());
Clients.Caller.onConnected(CurrentUser.UserID.ToString(), CurrentUser.UserName, _UserDetailRepo.Repository.GetAll(x => x.RecordStatus == RecordStatus.Active.ToString() && (x.UserID == FromUserId || x.UserID == ToUserID)),
_MessageDetailRepo.Repository.GetAll(x => x.RecordStatus == RecordStatus.Active.ToString()
//&& (x.FromUserID == FromUserId || x.FromUserID == ToUserId
//|| x.ToUserID == FromUserId || x.ToUserID == ToUserIdis
&& x.RequestInfoID == RequestID
)
, CurrentUser.UserID);
// send to all except caller client
Clients.AllExcept(CurrentUser.ConnectionId).onNewUserConnected(CurrentUser.UserID.ToString(), CurrentUser.UserName, CurrentUser.UserID);
}
public void SendMessageToAll(string userName, string message)
{
// store last 100 messages in cache
//AddMessageinCache(userName, message);
// Broad cast message
//Clients.All.messageReceived(userName, message);
}
public void SendPrivateMessage(string toUserId, string message, string FromUserID
, int RequestID, string ToUserName, string FromUserName)
{
try
{
string fromconnectionid = Context.ConnectionId;
int InputFromUserID = Convert.ToInt32(FromUserID);
var FromUserIDObject = _UserDetailRepo.Repository.Get(u => u.UserID == InputFromUserID);
if (FromUserIDObject.ConnectionId != fromconnectionid)
{
FromUserIDObject.ConnectionId = fromconnectionid;
_UserDetailRepo.Repository.Update(FromUserIDObject);
}
string strfromUserId = FromUserIDObject.UserID.ToString();
int _fromUserId = 0;
int.TryParse(strfromUserId, out _fromUserId);
int _toUserId = 0;
int.TryParse(toUserId, out _toUserId);
tblSignalRUserDetail FromUser = _UserDetailRepo.Repository.Get(u => u.UserID == _fromUserId);
tblSignalRUserDetail ToUser = _UserDetailRepo.Repository.Get(x => x.UserID == _toUserId);
if (ToUser != null)
{
//foreach (var ToUser in ToUsers)
{
// send to //Chat Title
Clients.Client(ToUser.ConnectionId).sendPrivateMessage(_fromUserId.ToString(), FromUserName, ToUserName, message, FromUser.PhotoURL);
}
// send to caller user
//Clients.Caller.sendPrivateMessage(_toUserId.ToString(), FromUsers[0].UserName, message);
//ChatDB.Instance.SaveChatHistory(_fromUserId, _toUserId, message);
}
if (FromUser != null)
{
//foreach (var FromUser in FromUsers)
{
// send to caller user //Chat Title
Clients.Client(FromUser.ConnectionId).sendPrivateMessage(_toUserId.ToString(), FromUserName, ToUserName, message, FromUser.PhotoURL);
}
}
//if (ToUsers.Count() != 0 && FromUsers.Count != 0)
tblSignalRMessageDetail _MessageDeail = new tblSignalRMessageDetail
{
FromUserID = _fromUserId,
FromUserName = FromUserName,
ToUserID = _toUserId,
ToUserName = ToUserName,
Message = message,
RecordStatus = RecordStatus.Active.ToString(),
CreatedDate = DateTime.UtcNow,
ModifiedDate = DateTime.UtcNow,
RequestInfoID = RequestID,
FromPhotoURL = FromUser != null ? FromUser.PhotoURL : "",
ToPhotoURL = ToUser != null ? ToUser.PhotoURL : ""
};
AddMessageinCache(_MessageDeail);
var _UserSetting = _UserSettingRepo.Repository.Get(x => x.UserID == _toUserId);
if (_UserSetting != null)
{
if (_UserSetting.ChatNotifications == true && _UserSetting.IsChatScreenON == true)
{
_V1Gen.SendNotificationAsync(NotificationsMessages.ChatNotification.GetInt(), _fromUserId, _toUserId, RequestID, _MessageDeail.FromUserName + ": "+message, NotificationType.Message, EUserSettings.Nobolo);
}
}
}
catch { }
}
public void RequestLastMessage(int FromUserID, int ToUserID, int RequestID)
{
//List<tblSignalRMessageDetail> CurrentChatMessages = _MessageDetailRepo.Repository.GetAll(u => (u.FromUserID == FromUserID && u.ToUserID == ToUserID && u.RequestInfoID== RequestID) || (u.FromUserID == ToUserID && u.ToUserID == FromUserID && u.RequestInfoID == RequestID));
List<tblSignalRMessageDetail> CurrentChatMessages = _MessageDetailRepo.Repository.GetAll(u => u.RequestInfoID == RequestID);
//send to caller user
Clients.Caller.GetLastMessages(ToUserID, CurrentChatMessages);
}
public void SendUserTypingRequest(string toUserId)
{
string strfromUserId = _UserDetailRepo.Repository.Get(u => u.ConnectionId == Context.ConnectionId).UserID.ToString();
int _toUserId = 0;
int.TryParse(toUserId, out _toUserId);
List<tblSignalRUserDetail> ToUsers = _UserDetailRepo.Repository.GetAll(x => x.UserID == _toUserId);
foreach (var ToUser in ToUsers)
{
// send to
Clients.Client(ToUser.ConnectionId).ReceiveTypingRequest(strfromUserId);
}
}
//public override System.Threading.Tasks.Task OnDisconnected(bool stopCalled)
//{
// var item = _UserDetailRepo.Repository.Get(x => x.ConnectionId == Context.ConnectionId);
// if (item != null)
// {
// _UserDetailRepo.Repository.DeletePermanent(item.ID);
// if (_UserDetailRepo.Repository.GetAll(u => u.UserID == item.UserID).Count() == 0)
// {
// var id = item.UserID.ToString();
// Clients.All.onUserDisconnected(id, item.UserName);
// }
// }
// return base.OnDisconnected(stopCalled);
//}
#endregion
#region---private Messages---
private void AddMessageinCache(tblSignalRMessageDetail _MessageDetail)
{
_MessageDetailRepo.Repository.Add(_MessageDetail);
//if (_MessageDetailRepo.Repository.Count() > 100)
// _MessageDetailRepo.Repository.RemoveAt(0);
}
#endregion
//public void Send(string name, string message)
//{
// Clients.All.addNewMessageToPage(name, message);
//}
}
}
No comments:
Post a Comment