Exemple #1
0
        public static void Initialize(IChatUserProvider userProvider, IChatRoomStorage storage)
        {
            if (initialized)
                return;

            timer = InitializeTimer(userProvider, storage);

            initialized = true;
        }
Exemple #2
0
        private static Timer InitializeTimer(IChatUserProvider userProvider, IChatRoomStorage storage)
        {
            var t = new Timer();

            t.AutoReset = true;
            t.Interval  = TimeSpan.FromMinutes(1).TotalMilliseconds;
            t.Elapsed  += (s, e) =>
            {
                if (timerLock)
                {
                    return;
                }

                try
                {
                    timerLock = true;
                    //TODO: make timeout configurable
                    var removedUsers = storage.RemoveInactiveUsers(TimeSpan.FromMinutes(1.0));

                    foreach (var userInRoom in removedUsers)
                    {
                        var userId = userInRoom.Key;
                        var roomId = userInRoom.Value;

                        var user = userProvider.GetUser(userId);

                        if (user != null)
                        {
                            storage.AddMessage(roomId, new Message
                            {
                                Content =
                                    string.Format("User {0} has left the chat. (timeout)",
                                                  user.DisplayName),
                                FromUserId  = userId,
                                MessageType = MessageTypeEnum.UserLeft,
                                Timestamp   = Miscellaneous.GetTimestamp()
                            });

                            if (storage.UnregisterUserBroadcasts(roomId, userId))
                            {
                                storage.AddMessage(roomId, new Message
                                {
                                    FromUserId  = userId,
                                    MessageType = MessageTypeEnum.StopVideoBroadcast,
                                    Timestamp   = Miscellaneous.GetTimestamp()
                                });
                            }
                        }
                    }
                }
                finally { timerLock = false; }
            };
            t.Start();
            return(t);
        }
Exemple #3
0
        public static void Initialize(IChatUserProvider userProvider, IChatRoomStorage storage)
        {
            if (initialized)
            {
                return;
            }

            timer = InitializeTimer(userProvider, storage);

            initialized = true;
        }
Exemple #4
0
        private static Timer InitializeTimer(IChatUserProvider userProvider, IChatRoomStorage storage)
        {
            var t = new Timer();
            t.AutoReset = true;
            t.Interval = TimeSpan.FromMinutes(1).TotalMilliseconds;
            t.Elapsed += (s, e) =>
                {
                    if (timerLock){return;}

                    try
                    {
                        timerLock = true;
                        //TODO: make timeout configurable
                        var removedUsers = storage.RemoveInactiveUsers(TimeSpan.FromMinutes(1.0));

                        foreach (var userInRoom in removedUsers)
                        {
                            var userId = userInRoom.Key;
                            var roomId = userInRoom.Value;

                            var user = userProvider.GetUser(userId);

                            if (user != null)
                            {
                                storage.AddMessage(roomId, new Message
                                {
                                    Content =
                                        string.Format("User {0} has left the chat. (timeout)",
                                        user.DisplayName),
                                    FromUserId = userId,
                                    MessageType = MessageTypeEnum.UserLeft,
                                    Timestamp = Miscellaneous.GetTimestamp()
                                });

                                if (storage.UnregisterUserBroadcasts(roomId, userId))
                                {
                                    storage.AddMessage(roomId, new Message
                                    {
                                        FromUserId = userId,
                                        MessageType = MessageTypeEnum.StopVideoBroadcast,
                                        Timestamp = Miscellaneous.GetTimestamp()
                                    });
                                }
                            }
                        }

                    }
                    finally { timerLock = false; }
                };
            t.Start();
            return t;
        }
 public MessengerCommand()
 {
     if (!importsSatisfied)
     {
         lock (Global.CompositionLock)
         {
             chatRoomStorage = Global.Container.Resolve<IChatRoomStorage>();
             chatUserProvider = Global.Container.Resolve<IChatUserProvider>();
             messengerProvider = Global.Container.Resolve<IMessengerPresenceProvider>();
         }
         importsSatisfied = true;
     }
 }
 public MessengerCommand()
 {
     if (!importsSatisfied)
     {
         lock (Global.CompositionLock)
         {
             chatRoomStorage   = Global.Container.Resolve <IChatRoomStorage>();
             chatUserProvider  = Global.Container.Resolve <IChatUserProvider>();
             messengerProvider = Global.Container.Resolve <IMessengerPresenceProvider>();
         }
         importsSatisfied = true;
     }
 }
        public ChatEngine()
        {
            if (!importsSatisfied)
            {
                lock (Global.CompositionLock)
                {
                    chatRoomProvider = Global.Container.Resolve<IChatRoomProvider>();
                    chatRoomStorage = Global.Container.Resolve<IChatRoomStorage>();
                    chatUserProvider = Global.Container.Resolve<IChatUserProvider>();
                    chatSettingsProvider = Global.Container.Resolve<IChatSettings>();
                    if (Global.Container.IsRegistered<IMessengerPresenceProvider>())
                        messengerProvider = Global.Container.Resolve<IMessengerPresenceProvider>();
                }
                importsSatisfied = true;
            }

            CleanTimedOutUsers.Initialize(chatUserProvider, chatRoomStorage);
        }
        public ChatEngine()
        {
            if (!importsSatisfied)
            {
                lock (Global.CompositionLock)
                {
                    chatRoomProvider     = Global.Container.Resolve <IChatRoomProvider>();
                    chatRoomStorage      = Global.Container.Resolve <IChatRoomStorage>();
                    chatUserProvider     = Global.Container.Resolve <IChatUserProvider>();
                    chatSettingsProvider = Global.Container.Resolve <IChatSettings>();
                    if (Global.Container.IsRegistered <IMessengerPresenceProvider>())
                    {
                        messengerProvider = Global.Container.Resolve <IMessengerPresenceProvider>();
                    }
                }
                importsSatisfied = true;
            }

            CleanTimedOutUsers.Initialize(chatUserProvider, chatRoomStorage);
        }
Exemple #9
0
        public void ProcessRequest(HttpContext context)
        {
            if (!importsSatisfied)
            {
                lock (Global.CompositionLock)
                {
                    chatRoomStorage = Global.Container.Resolve <IChatRoomStorage>();
                    chatSettings    = Global.Container.Resolve <IChatSettings>();
                }
                importsSatisfied = true;
            }

            var request = context.Request;
            var files   = request.Files;

            if (files.Count == 0)
            {
                ReturnResponse(context, "Please select a file!");
                return;
            }

            var fileName = Path.GetFileName(files[0].FileName);

            string token  = request.QueryString["token"];
            string userId = chatRoomStorage.GetUserIdByToken(token);

            if (!chatSettings.EnableFileTransfer)
            {
                return;
            }

            string chatRoomIdString = request.QueryString["chatRoomId"];
            string toUserId         = request.QueryString["toUserId"];

            if (String.IsNullOrWhiteSpace(chatRoomIdString))
            {
                return;
            }

            if (!chatRoomStorage.IsUserInRoom(chatRoomIdString, userId))
            {
                return;
            }

            string[] allowedExtensions = Settings.Default.SendFileAllowedExtensions.Split(',');
            bool     fileIsAllowed     = false;

            foreach (string extension in allowedExtensions)
            {
                if (fileName.ToLower().EndsWith("." + extension.Trim().ToLower()))
                {
                    fileIsAllowed = true;
                    break;
                }
            }

            if (!fileIsAllowed)
            {
                ReturnResponse(context, "The file type is not allowed!");
                return;
            }

            string userFilesPath = "UserFiles/" + userId;
            string userFilesDir  = context.Server.MapPath(userFilesPath);

            if (!Directory.Exists(userFilesDir))
            {
                Directory.CreateDirectory(userFilesDir);
            }

            string filename = fileName
                              .Replace('\\', '_').Replace('/', '_')
                              .Replace(' ', '_').Replace('\t', '_')
                              .Replace('-', '_').Replace('<', '_')
                              .Replace('>', '_');
            string fileUrl = VirtualPathUtility.ToAbsolute(String.Format("~/{0}", Path.Combine(userFilesPath, filename)));

            filename = userFilesDir + @"\" + filename;

            using (Stream file = File.OpenWrite(filename))
            {
                CopyStream(files[0].InputStream, file);
            }

            var  imageExtensions = new[] { "png", "gif", "bmp", "jpg" };
            bool fileIsImage     = false;

            foreach (string extension in imageExtensions)
            {
                if (filename.ToLower().EndsWith("." + extension.ToLower()))
                {
                    fileIsImage = true;
                    break;
                }
            }

            chatRoomStorage.AddMessage(chatRoomIdString, new Message
            {
                Content     = fileUrl,
                FromUserId  = userId,
                ToUserId    = toUserId,
                MessageType = fileIsImage ? MessageTypeEnum.SendImageFile :
                              MessageTypeEnum.SendFile,
                Timestamp = Miscellaneous.GetTimestamp()
            });

            ReturnResponse(context, String.Empty);
        }
        public void ProcessRequest(HttpContext context)
        {
            if (!importsSatisfied)
            {
                lock (Global.CompositionLock)
                {
                    chatRoomStorage = Global.Container.Resolve<IChatRoomStorage>();
                    chatSettings = Global.Container.Resolve<IChatSettings>();
                }
                importsSatisfied = true;
            }

            var request = context.Request;
            var files = request.Files;

            if (files.Count == 0)
            {
                ReturnResponse(context, "Please select a file!");
                return;
            }

            var fileName = Path.GetFileName(files[0].FileName);

            string token = request.QueryString["token"];
            string userId = chatRoomStorage.GetUserIdByToken(token);

            if (!chatSettings.EnableFileTransfer) return;

            string chatRoomIdString = request.QueryString["chatRoomId"];
            string toUserId = request.QueryString["toUserId"];

            if (String.IsNullOrWhiteSpace(chatRoomIdString))
            {
                return;
            }

            if (!chatRoomStorage.IsUserInRoom(chatRoomIdString, userId))
            {
                return;
            }

            string[] allowedExtensions = Settings.Default.SendFileAllowedExtensions.Split(',');
            bool fileIsAllowed = false;
            foreach (string extension in allowedExtensions)
            {
                if (fileName.ToLower().EndsWith("." + extension.Trim().ToLower()))
                {
                    fileIsAllowed = true;
                    break;
                }
            }

            if (!fileIsAllowed)
            {
                ReturnResponse(context, "The file type is not allowed!");
                return;
            }

            string userFilesPath = "UserFiles/" + userId;
            string userFilesDir = context.Server.MapPath(userFilesPath);
            if (!Directory.Exists(userFilesDir))
                Directory.CreateDirectory(userFilesDir);

            string filename = fileName
                .Replace('\\', '_').Replace('/', '_')
                .Replace(' ', '_').Replace('\t', '_')
                .Replace('-', '_').Replace('<', '_')
                .Replace('>', '_');
            string fileUrl = VirtualPathUtility.ToAbsolute(String.Format("~/{0}", Path.Combine(userFilesPath, filename)));
            filename = userFilesDir + @"\" + filename;

            using (Stream file = File.OpenWrite(filename))
            {
                CopyStream(files[0].InputStream, file);
            }

            var imageExtensions = new[] { "png", "gif", "bmp", "jpg" };
            bool fileIsImage = false;
            foreach (string extension in imageExtensions)
            {
                if (filename.ToLower().EndsWith("." + extension.ToLower()))
                {
                    fileIsImage = true;
                    break;
                }
            }

            chatRoomStorage.AddMessage(chatRoomIdString, new Message
            {
                Content = fileUrl,
                FromUserId = userId,
                ToUserId = toUserId,
                MessageType = fileIsImage ? MessageTypeEnum.SendImageFile :
                MessageTypeEnum.SendFile,
                Timestamp = Miscellaneous.GetTimestamp()
            });

            ReturnResponse(context, String.Empty);
        }