SocketIO push messages
This commit is contained in:
parent
264144c2db
commit
f8bc9877b6
5 changed files with 59 additions and 36 deletions
|
|
@ -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])
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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 + ")");
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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() {
|
||||
|
|
|
|||
25
socketio.js
25
socketio.js
|
|
@ -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;
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue