示例#1
0
        /// <summary>
        /// Inserts a chat message.
        /// </summary>
        /// <param name="chatRoom">The chat room which contains the chat message.</param>
        /// <param name="chatMessage">The chat message to add.</param>
        /// <param name="cancellationToken">A token to observe while waiting for the task to complete.</param>
        /// <returns>
        /// A task that represents the asynchronous operation.
        /// </returns>
        protected virtual async Task LogMessageAsync(ChatRoomInfo chatRoom, ChatMessageInfo chatMessage, CancellationToken cancellationToken)
        {
            ThrowIfDisposed();
            var logManager = GetLogManager();

            if (chatRoom == null)
            {
                throw new ArgumentNullException("chatRoom");
            }
            if (chatMessage == null)
            {
                throw new ArgumentNullException("chatMessage");
            }
            if (chatMessage.From == null)
            {
                throw new InvalidOperationException("The user 'from' is unspecified.");
            }
            if (chatMessage.To == null)
            {
                throw new InvalidOperationException("The user 'to' is unspecified.");
            }
            if (chatMessage.From.Admin)
            {
                await logManager.LogAsync(new EventItem
                {
                    AnonymId   = GuidUtility.NewSequentialGuid(),
                    ObjectType = ObjectType.Message,
                    ObjectId   = chatRoom.PageId,
                    Contact    = chatMessage.From.ContactId != null ? new AccountItem {
                        Id = (int)chatMessage.From.ContactId
                    } : null,
                    Project = chatRoom.ProjectId != null ? new UniqueItem {
                        Id = (int)chatRoom.ProjectId
                    } : null,
                    ClientId  = chatMessage.To.IPAddress,
                    CustomUri = chatMessage.To.NickName + " >>",
                    Message   = chatMessage.Message
                }, chatRoom.Users.Values, cancellationToken);
            }
            if (chatMessage.To.Admin)
            {
                await logManager.LogAsync(new EventItem
                {
                    AnonymId   = GuidUtility.NewSequentialGuid(),
                    ObjectType = ObjectType.Message,
                    ObjectId   = chatRoom.PageId,
                    Contact    = chatMessage.From.ContactId != null ? new AccountItem {
                        Id = (int)chatMessage.From.ContactId
                    } : null,
                    Project = chatRoom.ProjectId != null ? new UniqueItem {
                        Id = (int)chatRoom.ProjectId
                    } : null,
                    ClientId  = chatMessage.From.IPAddress,
                    CustomUri = "<< " + chatMessage.From.NickName,
                    Message   = chatMessage.Message
                }, chatRoom.Users.Values, cancellationToken);
            }
        }
 /// <summary>
 /// Removes a chat message.
 /// </summary>
 /// <param name="chatRoom">The chat room which contains the chat message.</param>
 /// <param name="chatMessage">The chat message to remove.</param>
 /// <param name="cancellationToken">A token to observe while waiting for the task to complete.</param>
 /// <returns>
 /// A task that represents the asynchronous operation.
 /// </returns>
 public virtual Task RemoveMessageAsync(ChatRoomInfo chatRoom, ChatMessageInfo chatMessage, CancellationToken cancellationToken)
 {
     ThrowIfDisposed();
     if (chatRoom == null)
     {
         throw new ArgumentNullException("chatRoom");
     }
     if (chatMessage == null)
     {
         throw new ArgumentNullException("chatMessage");
     }
     return(Task.FromResult(0));
 }
示例#3
0
        /// <summary>
        /// Removes a chat message.
        /// </summary>
        /// <param name="chatRoom">The chat room which contains the chat message.</param>
        /// <param name="chatMessage">The chat message to remove.</param>
        /// <param name="cancellationToken">A token to observe while waiting for the task to complete.</param>
        /// <returns>
        /// A task that represents the asynchronous operation.
        /// </returns>
        public virtual async Task RemoveMessageAsync(ChatRoomInfo chatRoom, ChatMessageInfo chatMessage, CancellationToken cancellationToken)
        {
            ThrowIfDisposed();
            var userMessage = GetUserMessageStore();

            if (chatRoom == null)
            {
                throw new ArgumentNullException("chatRoom");
            }
            if (chatMessage == null)
            {
                throw new ArgumentNullException("chatMessage");
            }
            await userMessage.RemoveMessageAsync(chatRoom, chatMessage, cancellationToken);

            await UpdateAsync(chatRoom, cancellationToken);
        }
示例#4
0
        /// <summary>
        /// Sends a message to the given user.
        /// </summary>
        /// <param name="userName">The recipient.</param>
        /// <param name="message">The message to post.</param>
        /// <returns>
        /// A <see cref="Task" />.
        /// </returns>
        public async Task SendMessage(string userName, string message)
        {
            var room = await GetCallerRoomAsync();

            if (room == null)
            {
                OnCallerError(ChatResources.RoomConnectionRequired);
                return;
            }
            var me = await GetCallerUserAsync(room);

            if (me == null)
            {
                OnCallerError(ChatResources.MessageSenderRequired);
                return;
            }
            var other = await ChatManager.GetUserByUserNameAsync(room, userName, CancellationToken.None);

            if (other == null)
            {
                OnCallerError(ChatResources.MessageRecipientRequired);
                return;
            }

            // Combine the connection ID lists because a user can connect
            // with other devices, browser tabs, and so on.
            var meConns = await ChatManager.GetConnectionsByUserAsync(me, CancellationToken.None);

            var otherConns = await ChatManager.GetConnectionsByUserAsync(other, CancellationToken.None);

            var connections = meConns.Union(otherConns).ToList();
            var chatMessage = new ChatMessageInfo {
                From = me, To = other, Message = message
            };
            await ChatManager.AddMessageAsync(room, chatMessage, CancellationToken.None);

            Clients.Clients(connections).messagereceived(chatMessage);
        }