SignalR_Hub.cs

82 lines | 2.572 kB Blame History Raw Download
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Microsoft.AspNet.SignalR;

using System.Threading.Tasks;
using SignaIR_Test.Models.Chat;
using Microsoft.AspNet.SignalR.Hubs;

namespace SignaIR_Test.Hubs
{
    [HubName("SignalR_Hub")]
    public class SignalR_Hub : Hub
    {
        static List<UserEntity> Users = new List<UserEntity>();
        static List<MessageEntity> Messages = new List<MessageEntity>();

        // Отправка сообщений
        public void Send(string name, string message)
        {
            var msg = new MessageEntity()
            {
                name = name,
                message = message
            };

            Messages.Add(msg);

            Clients.All.addMessage(msg.name, msg.message_WithDateTime);
        }

        // Подключение нового пользователя
        public void Connect(string userName)
        {
            var id = Context.ConnectionId;


            if (!Users.Any(x => x.ConnectionId == id))
            {
                Users.Add(new UserEntity { ConnectionId = id, Name = userName });

                // Посылаем данные пользователю
                Clients.Caller.onConnected(id, userName, Users);

                // Посылаем сообщение всем пользователям, кроме текущего
                Clients.AllExcept(id).onNewUserConnected(id, userName);


                if (Messages.Count != 0)
                {
                    //Отправить новому пользователю историю сообщений
                    foreach (var elem in Messages)
                    {
                        Clients.Caller.addMessage(elem.name, elem.message_WithDateTime);
                    }

                    Clients.Caller.ShowAlert(string.Format("Все сообщения загружены ({0})", Messages.Count));
                }
                else
                {
                    Clients.Caller.ShowAlert("Сообщений нет");
                }

            }
        }

        // Отключение пользователя
        public override Task OnDisconnected(bool stopCalled)
        {
            var item = Users.FirstOrDefault(x => x.ConnectionId == Context.ConnectionId);
            if (item != null)
            {
                Users.Remove(item);
                var id = Context.ConnectionId;
                Clients.All.onUserDisconnected(id, item.Name);
            }

            return base.OnDisconnected(stopCalled);
        }
    }
}