Bladeren bron

SocketIO push messages

version-14
Pratik Vyas 10 jaren geleden
bovenliggende
commit
f8bc9877b6
5 gewijzigde bestanden met toevoegingen van 59 en 36 verwijderingen
  1. +21
    -2
      frappe/async.py
  2. +1
    -26
      frappe/desk/page/messages/messages.js
  3. +0
    -4
      frappe/public/js/frappe/desk.js
  4. +16
    -0
      frappe/public/js/frappe/socket.js
  5. +21
    -4
      socketio.js

+ 21
- 2
frappe/async.py Bestand weergeven

@@ -9,7 +9,7 @@ import frappe
import os
import time
from functools import wraps
from frappe.utils import get_site_path
from frappe.utils import get_site_path, get_url
import json
from frappe import conf

@@ -174,8 +174,27 @@ def can_subscribe_doc(doctype, docname, sid):
raise PermissionError()
return True

@frappe.whitelist(allow_guest=True)
def get_user_info(sid):
from frappe.sessions import Session
session = Session(None).get_session_data()
return {
'user': session.user,
}

def new_comment(doc, event):
emit_via_redis('new_comment', doc.as_dict(), room=get_doc_room(doc.comment_doctype, doc.comment_docname))
if doc.comment_doctype == 'Message':
if doc.comment_docname == frappe.session.user:
message = doc.as_dict()
message['broadcast'] = True
emit_via_redis('new_message', message, room=get_url())
else:
emit_via_redis('new_message', doc.as_dict(), room=get_user_room(doc.comment_docname))
else:
emit_via_redis('new_comment', doc.as_dict(), room=get_doc_room(doc.comment_doctype, doc.comment_docname))

def get_doc_room(doctype, docname):
return ''.join(['doc:', doctype, '/', docname])

def get_user_room(user):
return ''.join(['user:', user])

+ 1
- 26
frappe/desk/page/messages/messages.js Bestand weergeven

@@ -37,7 +37,6 @@ frappe.desk.pages.Messages = Class.extend({

make: function() {
this.make_sidebar();
this.set_next_refresh();
},

make_sidebar: function() {
@@ -155,31 +154,7 @@ frappe.desk.pages.Messages = Class.extend({
});
},

refresh: function() {
// check for updates every 5 seconds if page is active
this.set_next_refresh();

if(!frappe.session_alive) {
// not in session
return;
}

if(frappe.get_route()[0]!="messages") {
// not on messages page
return;
}

if (this.list) {
this.list.run();
}
},

set_next_refresh: function() {
// 30 seconds
setTimeout("frappe.desk.pages.messages.refresh()", 30000);
},

////
refresh: function() {},

get_contact: function() {
var route = location.hash;


+ 0
- 4
frappe/public/js/frappe/desk.js Bestand weergeven

@@ -126,10 +126,6 @@ frappe.Application = Class.extend({

if(frappe.get_route()[0] != "messages") {
if(r.message.new_messages.length) {
$.each(r.message.new_messages, function(i, m) {
frappe.utils.notify(__("Message from {0}", [m.comment_by_fullname]),
m.comment);
});
frappe.utils.set_title_prefix("(" + r.message.new_messages.length + ")");
}
}


+ 16
- 0
frappe/public/js/frappe/socket.js Bestand weergeven

@@ -49,6 +49,22 @@ frappe.socket = {
cur_frm.comments.refresh();
}
});
frappe.socket.socket.on('new_message', function(comment) {
frappe.utils.notify(__("Message from {0}", [comment.comment_by_fullname]), comment.comment);
if ($(cur_page.page).data('page-route') === 'messages') {
console.log('messages page open');
var current_contact = $(cur_page.page).find('[data-contact]').data('contact');
var on_broadcast_page = current_contact === user;
if (current_contact == comment.owner || (on_broadcast_page && comment.broadcast)) {
var $row = $('<div class="list-row"/>');
frappe.desk.pages.messages.list.data.unshift(comment);
frappe.desk.pages.messages.list.render_row($row, comment);
frappe.desk.pages.messages.list.parent.prepend($row);
}
}
else {
}
});

},
setup_reconnect: function() {


+ 21
- 4
socketio.js Bestand weergeven

@@ -14,6 +14,22 @@ app.get('/', function(req, res){
});

io.on('connection', function(socket){
socket.join(socket.request.headers.origin);
var sid = cookie.parse(socket.request.headers.cookie).sid
if(!sid) {
return;
}
request.post('http://localhost:8000/api/method/frappe.async.get_user_info')
.type('form')
.send({
sid: sid
})
.end(function(err, res) {
if(res.status == 200) {
var room = get_user_room(res.body.message.user);
socket.join(room);
}
})
socket.on('task_subscribe', function(task_id) {
var room = 'task:' + task_id;
socket.join(room);
@@ -24,10 +40,6 @@ io.on('connection', function(socket){
send_existing_lines(task_id, socket);
})
socket.on('doc_subscribe', function(doctype, docname) {
var sid = cookie.parse(socket.request.headers.cookie).sid
if(!sid) {
return;
}
request.post('http://localhost:8000/api/method/frappe.async.can_subscribe_doc')
.type('form')
.send({
@@ -63,6 +75,7 @@ function send_existing_lines(task_id, socket) {
subscriber.on("message", function(channel, message) {
message = JSON.parse(message);
io.to(message.room).emit(message.event, message.message);
console.log(message.room, message.event, message.message)
});

subscriber.subscribe("events");
@@ -74,3 +87,7 @@ http.listen(3000, function(){
function get_doc_room(doctype, docname) {
return 'doc:'+ doctype + '/' + docname;
}

function get_user_room(user) {
return 'user:' + user;
}

Laden…
Annuleren
Opslaan