Wednesday, July 8, 2020

Signlar Chat Hub

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

Two Factor Authentication using .Net Core

Install Package dotnet add package GoogleAuthenticator --version 3.1.1 Model Changes public bool IsAuthenticatorReset { get; set; } public s...