public async void Enqueue(Message message) { if (_serviceBus == null) return; //fire & forget var bm = new BrokeredMessage(JsonConvert.SerializeObject(message)); bm.ContentType = "text/plain"; await _serviceBus.SendAsync(bm).ConfigureAwait(false); }
private bool OnMessageArrived(Message messageDto) { var userTag = new string[2]; try { using (var db = new ApplicationDbContext()) { var result = db.Users.FirstOrDefault(node => node.Id == messageDto.SenderId); userTag[0] = "username:"******"Some rando"; var senderId = 0; if (result != null) { username = result.NickName; senderId = result.Id; result.KinderPoints++; } userTag[1] = "from:" + senderId; var push = new PushObject() { Message = username + " has sent you an encrypted message!", FromId = senderId.ToString() }; var notification = new Dictionary<string, string> { { "message", JsonConvert.SerializeObject(push) } }; //await Notifications.Instance.Hub.SendTemplateNotificationAsync(notification, userTag); //await db.SaveChangesAsync(); } } catch (Exception ex) { // TODO: Log error. } return true; }
//Use AutoMapper? private IncomingMessage MessageDtoConverter(Message msg) { return new IncomingMessage { Text = msg.Text, GroupId = msg.GroupId, EncryptionKey = msg.EncryptionKey, Thumbnail = msg.Thumbnail, MessageToken = msg.MessageToken, FromUserName = msg.SenderName, FromUserId = msg.SenderId, ToUserId = msg.ReceiverId, MessageType = (MessageType)msg.MessageTypeId, EventId = msg.EventId, Time = msg.CreatedAt }; }
private void OnMessageProcessed(Message msg, bool isSent) { msg.IsSent = isSent; _processedMessagesQueue.Enqueue(msg); if (isSent) { //TODO: remove this line later _deliveryStatusEventManager.DeliverEventToDevice(new DeliveryNotification { MessageToken = msg.MessageToken, ReceiverDeviceId = msg.SenderDeviceId }); foreach (var senderDeviceId in _devicesRepository.GetDevices(msg.SenderId)) { if (senderDeviceId != msg.SenderDeviceId) _deliveryStatusEventManager.DeliverEventToDevice(new DeliveryNotification { MessageToken = msg.MessageToken, ReceiverDeviceId = senderDeviceId }); } } }
public SendMessageResponse SendMessage(ISession session, SendMessageRequest request) { var response = request.CreateResponse<SendMessageResponse>(); Logger.Info("SendMessage from Id={0} (Device={1}) to Id={2} ({3} devices)", session.UserId, session.DeviceId.Cut(), request.ReceiverUserId, request.Keys != null ? request.Keys.Count : -1); Dictionary<string, long> actualMessageReceiversDevices = null; Dictionary<string, byte[]> keys = request.Keys; if (request.GroupId != Guid.Empty)// group conversation { var groupChat = _groupChatsRepository.GetChat(request.GroupId); //sender is in the group? if (groupChat.Participants.All(i => i.UserId != session.UserId)) { response.Success = false; response.Error = Errors.YouAreNotParticipantOfThatGroup; return response; } if (keys == null) //means not encrypted { keys = groupChat.Participants .SelectMany(p => p.Devices) .Where(p => p != session.DeviceId) .Distinct() .ToDictionary<string, string, byte[]>(k => k, v => null); //null value means unencrypted } else { //it means we will check all provided devices below (see if (actualMessageReceiversDevices != null)) -- just to avoid copy-paste actualMessageReceiversDevices = new Dictionary<string, long>(); foreach (var groupChatParticipant in groupChat.Participants) { foreach (var device in groupChatParticipant.Devices) { actualMessageReceiversDevices[device] = groupChatParticipant.UserId; } } } } else // private conversation { if (request.ReceiverUserId == session.UserId) { response.Success = false; response.Error = Errors.SendMessage_ReceiverAndSenderAreSame; return response; } if (keys == null)//means not encrypted { keys = _devicesRepository.GetDevices(request.ReceiverUserId).ToDictionary<string, string, byte[]>(k => k, v => null); } else { //it means we will check all provided devices below (see if (actualMessageReceiversDevices != null)) -- just to avoid copy-paste actualMessageReceiversDevices = _devicesRepository.GetDevices(request.ReceiverUserId).ToDictionary(k => k, v => request.ReceiverUserId); } } if (actualMessageReceiversDevices != null) //TODO: uncoment later { var providedDevices = keys.Select(i => i.Key); List<string> union; List<string> notProvidedDevices; //conversation has more devices than user provided as targets List<string> wrongDevices; //some of the devices user provided are not members of that conversation actualMessageReceiversDevices.Select(i => i.Key) .FindIntersectionAndDifference(providedDevices, out union, out notProvidedDevices, out wrongDevices); if (notProvidedDevices.Any()) { response.Success = false; response.Error = Errors.SendMessage_ProvideKeysForTheseDevices; //we will help the user - provide public keys as well response.MissedDevicesWithPublicKeysToReEncrypt = notProvidedDevices .Where(d => session.DeviceId != d) .Select(d => new PublicKeyInfo { DeviceId = d, PublicKey = _devicesRepository.GetPublicKeyForDevice(d), UserId = actualMessageReceiversDevices[d] }) .ToList(); return response; } //cut receivers not in the conversation //TODO: uncomment it later /*foreach (var key in wrongDevices) { keys.Remove(key); }*/ } keys.Remove(session.DeviceId); if (keys.Count < 1) { response.Success = false; response.Error = Errors.SendMessage_ReceiversNotFound; return response; } foreach (var key in keys) { var innerMsg = new Message { SenderAccessToken = session.AccessToken, Text = request.Message, GroupId = request.GroupId, SenderId = session.UserId, SenderDeviceId = session.DeviceId, SenderName = request.SenderName, ReceiverId = request.ReceiverUserId, MessageTypeId = (int)request.MessageType, Thumbnail = request.Thumbnail, ReceiverDeviceId = key.Key, EncryptionKey = key.Value, MessageToken = request.MessageToken, }; _messageEventManager.DeliverEventToDevice(innerMsg); } return response; }