def add_conversation_message(self, conversation, newmessage): """ Sends a Carrot (TM) notification of a new conversation creation """ conversation_id = conversation.getIdentifier() participants_usernames = [user['username'] for user in conversation['participants']] self.client.conversations.create(conversation_id, users=participants_usernames) # Send a conversation creation notification to rabbit message = RabbitMessage() message.prepare(self.message_defaults) if newmessage['object']['objectType'] == 'note': data_message = {'text': newmessage['object']['content'],'message_id': newmessage['_id']} elif newmessage['object']['objectType'] == 'image': data_message = {'text': 'Add image', 'message_id': str(newmessage['_id'])} else: data_message = {} message.update({ "user": { 'username': self.request.actor['username'], 'displayname': self.request.actor['displayName'], }, "action": "add", "object": "message", "data": data_message }) self.client.send('conversations', json.dumps(message.packed), routing_key='{}.notifications'.format(conversation_id))
def notify_context_activity(self, activity): """ Sends a Carrot (TM) notification of a new post on a context """ message = RabbitMessage() message.prepare(self.message_defaults) if activity['object']['objectType'] == 'image': text = 'Add image' else: text = activity['object'].get('content', '') message.update({ "user": { 'username': self.request.actor['username'], 'displayname': self.request.actor['displayName'], }, "action": "add", "object": "activity", "data": { 'text': text, 'activityid': str(activity['_id']) } }) self.client.send('activity', json.dumps(message.packed), activity['contexts'][0]['hash'])
def process_message(self, stomp): """ Handle a decoded stomp message. We're assuming that stomp messages will ever contain a MaxCarrot message. Based on properties fn the latter, we'll execute proper actions. """ message = RabbitMessage.unpack(stomp.json) destination = re.search(r'([0-9a-f]+).(?:notifications|messages)', stomp.headers['destination']).groups()[0] if message['action'] == 'add' and message['object'] == 'message': sent = datetime.strptime(message['published'], '%Y-%m-%dT%H:%M:%S.%fZ') recv = datetime.utcnow() elapsed = abs((recv - sent).total_seconds()) self.received.append((message, elapsed)) #self.log('{}@{} ({:.3f}): {}'.format(message['user']['username'], destination, elapsed, message['data']['text'])) self.trigger('message_received', stomp) elif message['action'] == 'add' and message['object'] == 'conversation': self.log('{}@{}: Just started a chat'.format(message['user']['username'], destination)) self.trigger('conversation_started', stomp) elif message['action'] == 'ack' and message['object'] == 'message': sent = datetime.strptime(message['published'], '%Y-%m-%dT%H:%M:%S.%fZ') recv = datetime.utcnow() elapsed = abs((recv - sent).total_seconds()) self.acknowledged.append((message, elapsed)) self.trigger('message_ackd', stomp) else: print '\n{}\n'.format(message)
def notify_context_activity_comment(self, activity, comment): """ Sends a Carrot (TM) notification of a new post on a context """ message = RabbitMessage() message.prepare(self.message_defaults) message.update({ "user": { 'username': self.request.actor['username'], 'displayname': self.request.actor['displayName'], }, "action": "add", "object": "comment", "data": { 'text': comment['content'], 'activityid': str(activity['_id']), 'commentid': comment['id'] } }) self.client.send('activity', json.dumps(message.packed), activity['contexts'][0]['hash'])
def add_conversation(self, conversation): """ Sends a Carrot (TM) notification of a new conversation creation """ conversation_id = conversation.getIdentifier() participants_usernames = [user['username'] for user in conversation['participants']] self.client.conversations.create(conversation_id, users=participants_usernames) # Send a conversation creation notification to rabbit message = RabbitMessage() message.prepare(self.message_defaults) message.update({ "user": { 'username': self.request.actor['username'], 'displayname': self.request.actor['displayName'], }, "action": "add", "object": "conversation", "data": {} }) self.client.send('conversations', json.dumps(message.packed), routing_key='{}.notifications'.format(conversation_id))
def send_message(self, conversation, text): """ Sends a stomp message to a specific conversation """ message = RabbitMessage() message.prepare() message['source'] = 'test' message['data'] = {'text': text} message['action'] = 'add' message['object'] = 'message' message['user'] = {'username': self.username} if self.domain: message['domain'] = self.domain headers = { "destination": "/exchange/{}.publish/{}.messages".format(self.username, conversation), } # Convert json to text without blank space, and escape it json_message = json.dumps(message.packed, separators=(',', ':')) json_message = json_message.replace('"', '\\"') self.send(self.stomp.send_frame(headers, json_message)) self.trigger('message_sent')
def sync_acl(self, domain, context, username, tasks): """ Sends a Carrot (TM) notification of a new sync acl task """ # Send a conversation creation notification to rabbit message = RabbitMessage() message.prepare(self.message_defaults) message.update({ "user": { 'username': username, }, "domain": domain, "action": "modify", "object": "context", "data": { 'context': context, 'tasks': tasks } }) self.client.send('syncacl', json.dumps(message.packed), routing_key='')