private async void SendMessageToAllMembers(IEnumerable <long> listUserId, DbMain.EFDbContext.ConversationReply reply) { List <ConversationReply> conversationReplies = new List <ConversationReply>(); List <DbMain.EFDbContext.ConversationReply> dbReplies = new List <DbMain.EFDbContext.ConversationReply>(); await Task.Run(() => { using (DbMain.EFDbContext.ChatEntities db = new DbMain.EFDbContext.ChatEntities()) { int status = (int)ConversationReplyStatus.Received; foreach (var item in listUserId) { var DBreply = new DbMain.EFDbContext.ConversationReply() { AuthorId = reply.AuthorId, Body = reply.Body, ConversationId = reply.ConversationId, ConversationReplyStatusId = status, ReceiverId = item }; db.ConversationReplies.Add(DBreply); dbReplies.Add(DBreply); } db.SaveChanges(); } }); for (int i = 0; i < listUserId.Count(); i++) { ChatServiceCallbackModel.SendMessageToUser(listUserId.ElementAt(i), new ConversationReply { Author = curUser.Login, Body = reply.Body, ConversationId = reply.ConversationId, SendingTime = DateTimeOffset.UtcNow, Status = ConversationReplyStatus.Received, Id = dbReplies[i].Id }); } }
public OperationResult <bool> InviteFriendToConversation(string Login, long conversationId) { Console.WriteLine("Invite to conversation"); try { using (DbMain.EFDbContext.ChatEntities db = new DbMain.EFDbContext.ChatEntities()) { var conv = db.Conversations.Include(x => x.ConversationMembers).FirstOrDefault(x => x.Id == conversationId); if (conv == null) { return(new OperationResult <bool>(false, false, "Conversation not found")); } var member = conv.ConversationMembers.FirstOrDefault(x => x.MemberId == curUser.Id); if (member == null) { return(new OperationResult <bool>(false, false, "You are not in conversation")); } var invitedUser = db.Users.FirstOrDefault(x => x.Login == Login); if (invitedUser == null) { return(new OperationResult <bool>(false, false, "User not found")); } var contact = db.Contacts.FirstOrDefault(x => (x.AdderId == curUser.Id && x.InvitedId == invitedUser.Id) || (x.AdderId == invitedUser.Id && x.InvitedId == curUser.Id) && x.RelationTypeId == (int)RelationStatus.Friendship); if (contact == null) { return(new OperationResult <bool>(false, false, "User not your friend")); } var convStatus = (ConversationType)conv.ConversationTypeId; if (convStatus == ConversationType.Dialog) { return(new OperationResult <bool>(false, false, "Can't add users to Dialog")); } var memberStatus = (ConversationMemberStatus)member.MemberStatusId; switch (memberStatus) { case ConversationMemberStatus.None: case ConversationMemberStatus.Blocked: case ConversationMemberStatus.ReadOnly: case ConversationMemberStatus.LeftConversation: return(new OperationResult <bool>(false, false, "No permission to add users")); case ConversationMemberStatus.Active: if (convStatus == ConversationType.OpenConversation) { return(new OperationResult <bool>(false, false, "No permission to add users")); } break; default: break; } db.ConversationMembers.Add(new DbMain.EFDbContext.ConversationMember() { AddedId = curUser.Id, ConversationId = conversationId, MemberId = invitedUser.Id, MemberStatusId = (int)ConversationMemberStatus.Active }); if (db.SaveChanges() > 0) { conv = db.Conversations.Include(x => x.ConversationMembers).FirstOrDefault(x => x.Id == conversationId); var members = conv.ConversationMembers.Select(x => x.User.Id).ToList(); members.Remove(curUser.Id); SendMessageToAllMembers(members, new DbMain.EFDbContext.ConversationReply() { AuthorId = curUser.Id, Body = $"{curUser.Name} Added {invitedUser.Name}", ConversationId = conversationId, ConversationReplyStatusId = (int)ConversationReplyStatus.SystemMessage }); //ChatServiceCallbackModel.SendMessageToGroup(members, new ConversationReply() //{ // Author = curUser.Login, // Body = $"{curUser.Name} Added {invitedUser.Name}", // ConversationId = conversationId, // SendingTime = DateTimeOffset.UtcNow, // Status = ConversationReplyStatus.SystemMessage //}); ChatServiceCallbackModel.AddingToConversation(curUser.Login, invitedUser.Id, new Conversation() { ConversationType = (ConversationType)conv.ConversationTypeId, Id = conv.Id, Descriptiom = conv.Description, Icon = conv.Icon, LastChange = DateTimeOffset.UtcNow, MyStatus = ConversationMemberStatus.Active, Name = conv.Name, ParticipantsLogin = conv.ConversationMembers.Select(x => x.User.Login).ToList() }); return(new OperationResult <bool>(true)); } return(new OperationResult <bool>(false, false, "Internal error")); } } catch (Exception ex) { return(new OperationResult <bool>(false, false, "Internal error")); } }