/// <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)); }
/// <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); }
/// <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); }